<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkAEQX87fyp7ImA9WhRUF0k.&quot;"><id>tag:blogger.com,1999:blog-36547168</id><updated>2012-01-28T09:51:40.107+01:00</updated><category term="feeds" /><category term="domain model" /><category term="slides" /><category term="cli" /><category term="javascript" /><category term="news" /><category term="debugging" /><category term="web" /><category term="books" /><category term="apple" /><category term="phpunit" /><category term="captchas" /><category term="methodology" /><category term="doctrine" /><category term="about" /><category term="api" /><category term="open source" /><category term="zone" /><category term="http" /><category term="ab" /><category term="software development" /><category term="job" /><category term="nakedphp" /><category term="agile" /><category term="zen" /><category term="practical php patterns" /><category term="tdd" /><category term="performance" /><category term="off topic" /><category term="vim" /><category term="productivity" /><category term="review" /><category term="learning" /><category term="hardware" /><category term="database" /><category term="humor" /><category term="linux" /><category term="apache" /><category term="dependency injection" /><category term="math" /><category term="operating systems" /><category term="basic" /><category term="scalability" /><category term="java" /><category term="refactoring" /><category term="php" /><category term="engineering" /><category term="patterns" /><category term="roundup" /><category term="politics" /><category term="sqlite" /><category term="deployment" /><category term="graphics" /><category term="oop" /><category term="libraries" /><category term="mvc" /><category term="solid" /><category term="pretotyping" /><category term="php testing series" /><category term="social networks" /><category term="ddd" /><category term="april fools" /><category term="zend framework" /><category term="dynamyc languages" /><category term="twitter" /><category term="functional programming" /><category term="orm" /><category term="design" /><category term="naked objects" /><category term="standards" /><category term="whodisagreeswithme" /><category term="version control" /><category term="pomodoro" /><category term="testing" /><category term="automation" /><category term="questions" /><category term="conferences" /><category term="university" /><category term="svn" /><title>Invisible to the eye</title><subtitle type="html">A journey in web development, [computer] science, engineering:&lt;br&gt;
getting to know what lies under the hood &lt;em&gt;-- Giorgio Sironi&lt;/em&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://giorgiosironi.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/03558287012747987157</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>353</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/InvisibleToTheEye" /><feedburner:info uri="invisibletotheeye" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>InvisibleToTheEye</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;AkADQXk6cSp7ImA9WhRVFk8.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-1676101743098369104</id><published>2012-01-15T12:59:00.001+01:00</published><updated>2012-01-15T12:59:30.719+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-15T12:59:30.719+01:00</app:edited><title>Weekly roundup: the coming war</title><content type="html">&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="background-color: white; font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;"&gt;Now, it may seem like SOPA is the end game in a long fight over copyright, and the Internet, and it may seem like if we defeat SOPA, we'll be well on our way to securing the freedom of PCs and networks. But as I said at the beginning of this talk, this isn't about copyright, because the copyright wars are just the 0.9 beta version of the long coming war on computation. -- Cory Doctorow&lt;/span&gt;&lt;/blockquote&gt;
&lt;span class="Apple-style-span" style="background-color: white; font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;"&gt;I advise you to read the &lt;a href="https://github.com/jwise/28c3-doctorow/blob/master/transcript.md"&gt;full transcript of Cory Doctorow's talk&lt;/a&gt;&amp;nbsp;(or watch &lt;a href="http://craphound.com/?p=3848"&gt;the video&lt;/a&gt;)&amp;nbsp;&lt;i&gt;The Coming War on General Purpose Computation&lt;/i&gt; to get a feel of where the closed&amp;amp;special purpose devices trend may head (or is already heading) in the future. Sacrificing Turing-completeness is something no engineer can dream for.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="background-color: white; font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="background-color: white; font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;"&gt;Here are my articles published this week on DZone.&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-push-0"&gt;Practical PHP Refactoring: Push Down Field&lt;/a&gt;&amp;nbsp;explains how to move a field down into a class hierarchy to simplify the involved superclasses.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/object-oriented-clojure"&gt;Object-oriented Clojure&lt;/a&gt;&amp;nbsp;is a tutorial on how to use Java objects from Clojure and how to define new interfaces and classes (actually protocols and records).&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-41"&gt;Practical PHP Refactoring: Extract Subclass&lt;/a&gt;&amp;nbsp;explains how to extract a new subclass, something we assumed already existed in the previous articles of the series.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/openclosed-principle-real"&gt;Open/Closed Principle on real world code&lt;/a&gt;&amp;nbsp;is an implementation of the Command pattern in PHPUnit_Selenium, displaying production code instead of the usual self-contained examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-1676101743098369104?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/Fm3Tp5145Kk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/1676101743098369104/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=1676101743098369104" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/1676101743098369104?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/1676101743098369104?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/Fm3Tp5145Kk/weekly-roundup-coming-war.html" title="Weekly roundup: the coming war" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2012/01/weekly-roundup-coming-war.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQNQHc-eyp7ImA9WhRVEE8.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-6571676339793822068</id><published>2012-01-08T12:49:00.004+01:00</published><updated>2012-01-08T12:49:51.953+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-08T12:49:51.953+01:00</app:edited><title>Weekly roundup: Wirfs-Brock's book</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://wirfs-brock.com/DesignBooks.html" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://wirfs-brock.com/Images/book_cover_1.jpg" width="161" /&gt;&lt;/a&gt;&lt;/div&gt;
I have started reading &lt;a href="http://wirfs-brock.com/DesignBooks.html"&gt;Rebecca Wirfs-Brock's 2003 book&lt;/a&gt;, cited by XPers as one of the books that teach the lost art of object-oriented design. So far I have filled one page of notes while reading the first chapter, and reached the first code sample on Double Dispatch; it's a very dense book.&lt;br /&gt;
It's too soon to tell if this book's content is obvious or mind-blowing - but it can succeed in instilling a design mindset different from the modern OOP one; for example, based on roles and responsibilities instead of "records with functions attached to their heads".&lt;br /&gt;
&lt;br /&gt;
These are my articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-pull-1"&gt;Practical PHP Refactoring: Pull Up Constructor Body&lt;/a&gt;&amp;nbsp;completes the miniseries on pulling up duplication into a superclass, as one of the ways to eliminate it.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/tdd-multithreaded-applications"&gt;TDD for multithreaded applications&lt;/a&gt;&amp;nbsp;is my attempt at test-drive the design of a distributed applications without resorting to sleep() calls and non-deterministic tests.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-push"&gt;Practical PHP Refactoring: Push Down Method&lt;/a&gt;&amp;nbsp;is one of two articles on simplifying superclasses by pushing down pieces of code that are specific to a subclass.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/web-application-clojure"&gt;Web application in Clojure: the starting point&lt;/a&gt;&amp;nbsp;is an howto for using Ring, the equivalent of the Servlet API in the Clojure world. I probably will try out higher-level tools in the next weeks, like Compojure or Noir.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-6571676339793822068?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/12Um_09yF7U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/6571676339793822068/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=6571676339793822068" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/6571676339793822068?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/6571676339793822068?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/12Um_09yF7U/weekly-roundup-wirfs-brocks-book.html" title="Weekly roundup: Wirfs-Brock's book" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>1</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2012/01/weekly-roundup-wirfs-brocks-book.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUMRnY_eyp7ImA9WhRWFE8.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-8941870622053604540</id><published>2012-01-01T14:08:00.001+01:00</published><updated>2012-01-01T14:08:07.843+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-01T14:08:07.843+01:00</app:edited><title>Biweekly roundup: waterfall resolutions</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-mf5yIORjEQ8/TwBaqNynrfI/AAAAAAAAApc/hMGcQo_bZIw/s1600/382750_2644548084791_1588293761_2369901_144295034_n.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-mf5yIORjEQ8/TwBaqNynrfI/AAAAAAAAApc/hMGcQo_bZIw/s200/382750_2644548084791_1588293761_2369901_144295034_n.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
No new year's resolution for me; I've come to think they have the trait of a waterfall process: what if you realize the established goal is revelaed to be not so good for you? Even with "universally" recognized beneficial habits, you may discover they're not so important after a change in priorities. Exercising every day may be superceeded by practising a sport; learning a new programming language may be by a new job where you specialize in a single one. To me, it sounds waterfall-ish to establish an yearly goal and work towards it without revising the situation at least monthly.&lt;br /&gt;
&lt;br /&gt;
By the way, in the last two weeks of the year I have published a few articles on DZone that may interest you.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-39"&gt;Practical PHP Refactoring: Replace Error Code with Exception&lt;/a&gt;&amp;nbsp;explains how to write object-oriented PHP also in dealing with errors.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/spark-micro-framework"&gt;The Spark micro framework&lt;/a&gt;&amp;nbsp;is a concise, self-contained framework for quickly develop Java web applications.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-40"&gt;Practical PHP Refactoring: Replace Exception with Test&lt;/a&gt;&amp;nbsp;attempts to avoid unnecessary exceptions when an error condition can be early detected.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/3d-experience-browser-threejs"&gt;3D experience in a browser with Three.js&lt;/a&gt;&amp;nbsp;is a review of a library for building 3D scenes in a browser over WebGL, the canvas element or SVG.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-pull"&gt;Practical PHP Refactoring: Pull Up Field&lt;/a&gt;&amp;nbsp;explains how to eliminate the duplication of a field within an inheritance hierarchy.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/clojure-libraries-and-builds"&gt;Clojure libraries and builds with Leiningen&lt;/a&gt;&amp;nbsp;explains how to pull Clojure and Java libraries and compile with them from the command line, like you could do with Ant and Maven.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-pull-0"&gt;Practical PHP Refactoring: Pull Up Method&lt;/a&gt;&amp;nbsp;explains the use of inheritance to eliminate the duplication of a method.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/open-source-php-projects-2011"&gt;Open source PHP projects of 2011&lt;/a&gt;&amp;nbsp;is a non-scientific review of the most popular and exciting projects in the PHP landscape.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-8941870622053604540?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/-q8u13fL_jk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/8941870622053604540/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=8941870622053604540" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/8941870622053604540?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/8941870622053604540?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/-q8u13fL_jk/biweekly-roundup-waterfall-resolutions.html" title="Biweekly roundup: waterfall resolutions" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-mf5yIORjEQ8/TwBaqNynrfI/AAAAAAAAApc/hMGcQo_bZIw/s72-c/382750_2644548084791_1588293761_2369901_144295034_n.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2012/01/biweekly-roundup-waterfall-resolutions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QFQHc9fCp7ImA9WhRXEk0.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-6235626196103221044</id><published>2011-12-18T12:54:00.001+01:00</published><updated>2011-12-18T12:55:11.964+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-18T12:55:11.964+01:00</app:edited><title>Biweekly roundup: more and more languages</title><content type="html">I am a PHP developer and a student by day, but I don't want to limit my options: I'm currently experimenting with Clojure and exercising with Rails. Each new language or platform teach us something general about programming; I advise you to &lt;b&gt;abandon any prejudice&lt;/b&gt; if you decide to dive into a new language in your practice time (which for a PHPer programming Ruby is essential.)&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Here are my articles published in the last two weeks.&lt;/div&gt;
&lt;a href="http://css.dzone.com/articles/what-i-learned-global-day-code"&gt;What I learned in the Global Day of Code Retreat&lt;/a&gt;&amp;nbsp;is a summary of my experience at the Code Retreat in Milan during the Decembed edition.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-36"&gt;Practical PHP Refactoring: Remove Setting Method&lt;/a&gt;&amp;nbsp;is about guaranteeing immutability or simplifying the interface of an object by throwing away a method.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/testing-and-specifying"&gt;Testing and specifying JavaScript code with Jasmine&lt;/a&gt;&amp;nbsp;is an example of usage of the popular BDD JavaScript testing framework.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-hide-0"&gt;Practical PHP Refactoring: Hide Method&lt;/a&gt;&amp;nbsp;is about information hiding: limiting the scope of a method to be able to easily evolve it later.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-37"&gt;Practical PHP Refactoring: Replace Constructor with Factory Method&lt;/a&gt;&amp;nbsp;transforms a giant constructor into several well-named Factory Methods.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/rails-point-view-php-developer"&gt;Rails from the point of view of a PHP developer&lt;/a&gt;&amp;nbsp;is about me trying out Rails 3 (again, without prejudices).&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-38"&gt;Practical PHP Refactoring: Encapsulate Downcast (and Wrapping)&lt;/a&gt;&amp;nbsp;is about the PHP version of downcasting: converting primitives and wrapping them in Value Objects.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/jquery-plugins-jstestdriver"&gt;jQuery plugins with jsTestDriver&lt;/a&gt;&amp;nbsp;is an example of real world JavaScript development with TDD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-6235626196103221044?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/r4OI6p5IKw0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/6235626196103221044/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=6235626196103221044" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/6235626196103221044?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/6235626196103221044?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/r4OI6p5IKw0/biweekly-roundup-more-and-more.html" title="Biweekly roundup: more and more languages" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/12/biweekly-roundup-more-and-more.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQBQnczfSp7ImA9WhRQEE8.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-3064826331194786807</id><published>2011-12-04T19:22:00.001+01:00</published><updated>2011-12-04T19:29:13.985+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-04T19:29:13.985+01:00</app:edited><title>Weekly roundup: the code retreat</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://en.wikipedia.org/wiki/File:Gospers_glider_gun.gif" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="144" src="http://upload.wikimedia.org/wikipedia/commons/e/e5/Gospers_glider_gun.gif" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
Yesterday was the Global Day of Code Retreat, an event where local groups of developers get together to hone their skills. It consists of six iterations of solving a problem (simulating the &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"&gt;Game of Life&lt;/a&gt;) in pairs, where at the end of each hour the code is deleted and the pairs mixed. This combination enforces a focus on the method, not on the result; and allows to try out many different approaches (outside in, bottom up, functional and object-oriented languages, using no &lt;i&gt;else&lt;/i&gt; or primitive types, closed eyes and an hand tied behind your back...)&lt;br /&gt;
&lt;br /&gt;
I will write more about the experience in Milan in the next days on DZone. Here are my articles published in the past week.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-34"&gt;Practical PHP Refactoring: Replace Parameter with Method&lt;/a&gt;&amp;nbsp;is about simplifying a method's argument list by eliminating premature parameterization.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/clojure-dummies-kata-0"&gt;Clojure for dummies: a kata&lt;/a&gt;&amp;nbsp;is the FizzBuzz problem implemented in Clojure, a now-popular Lisp dialect.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-35"&gt;Practical PHP Refactoring: Introduce Parameter Object&lt;/a&gt;&amp;nbsp;is about replacing a list of parameters with a single object.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/drag-and-drop-uploading"&gt;HTML5 Drag and Drop uploading&lt;/a&gt;&amp;nbsp;outlines how this technique works, when it breaks and how you can get it in your application in a few minutes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-3064826331194786807?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/QvDtEhr9nXE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/3064826331194786807/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=3064826331194786807" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/3064826331194786807?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/3064826331194786807?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/QvDtEhr9nXE/weekly-roundup-code-retreat.html" title="Weekly roundup: the code retreat" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/12/weekly-roundup-code-retreat.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEMR3w8eyp7ImA9WhRRF0s.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-6853881570819751101</id><published>2011-12-01T18:05:00.001+01:00</published><updated>2011-12-01T18:31:26.273+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-01T18:31:26.273+01:00</app:edited><title>XPUG Milano, November 30th</title><content type="html">Yesterday &lt;a href="http://twitter.com/ramtop"&gt;Uberto Barbini&lt;/a&gt;&amp;nbsp;held the second part of his &lt;a href="http://www.slideshare.net/ubertobarbini/boost-youroopwithfp-10235357"&gt;Agile Day presentation&lt;/a&gt; at the eXtreme Programming user group in Milan. Here are the topics of the talk and the discussion, that you can also follow on the slide deck.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.agilemovement.it/video/boost-your-oop-with-fp"&gt;At the conference&lt;/a&gt;&amp;nbsp;(video in Italian), Uberto covered only part of the presentation, so he restarted from the half presentation check:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;many bugs are caused by shared, inconsistene state&lt;/li&gt;
&lt;li&gt;the procedural paradigm doesn't care how you organize state&lt;/li&gt;
&lt;li&gt;OOP encapsulates state inside objects&lt;/li&gt;
&lt;li&gt;functional programming expels state from pure functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
An example of OOP went wrong was a MyBag object which allows read and write access to any item inside. The Singleton pattern used for no reason and the absence of any form of Dependency Injection are other common pitfalls: just because a piece of code contains many classes and methods it does not mean it is object-oriented.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;The Blackboard&lt;/b&gt;
&lt;br /&gt;
&lt;div&gt;
An interesting thing came up while this non-OO code was presented to us: we cannot judge a design without knowing which is the underlying problem it solves. While changing class names simplifies a slide, the same &lt;b&gt;Blackboard metaphor&lt;/b&gt; can be implemented with wildly different results:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;in the case of a list of actions to perform, it couples the actions in a certain order; the first or second action populates the blackboard for the other ones and cannot be moved.&lt;/li&gt;
&lt;li&gt;in a distributed scenario, it decouples different processes from knowing the rest of the system, and allows new configurations.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Yet the scenarios are identical if not for the names of classes and methods.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
The presentation went on to compare the&lt;b&gt; object-oriented and functional approach as different tools for solving different problems&lt;/b&gt;: they are not always in competition, but code can contain a mix of both according to the problem at hand. For example, Uberto cited simulations as a really natural place for objects, and transformations of data into different formats (XML, JSON) as a call for pure functions.&lt;/div&gt;
&lt;div&gt;
This reminded me of the &lt;a href="http://en.wikipedia.org/wiki/Expression_problem"&gt;Expression Problem&lt;/a&gt; and of how new requirements favor either the functional or object-oriented solution.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Rebecca's book&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
I'm not sure I will understand the Centralized/Dispersed/Delegate control comparisons before reading Rebecca Wirfs-Brock's book on design, but an issue that came up is that this kind of books is disappearing, despite being very handy in teaching design. Today we see &lt;b&gt;many technical books&lt;/b&gt; which teach how to code in Java or Clojure or Ruby, but &lt;b&gt;not book on how to model and solve problems&lt;/b&gt; with code.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Elegance and familiarity&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
A final note is Rick Hickey's (inventor of Clojure) quotation:&lt;/div&gt;
&lt;blockquote class="tr_bq"&gt;
Elegance and familiarity are orthogonal.&lt;/blockquote&gt;
Just because we see functional code as strange and different from the object-oriented approach, &lt;b&gt;it does not mean it's inelegant&lt;/b&gt;: probably just that we are not familiar with it. It is &lt;a href="http://en.wikipedia.org/wiki/Open/closed_principle"&gt;closed&lt;/a&gt; against different changes than the equivalent OO solution; and a functional programmer will see our objects as inelegant too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-6853881570819751101?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/w6bIWJi7gBA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/6853881570819751101/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=6853881570819751101" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/6853881570819751101?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/6853881570819751101?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/w6bIWJi7gBA/xpug-milano-november-30th.html" title="XPUG Milano, November 30th" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/12/xpug-milano-november-30th.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMEQno-cCp7ImA9WhRRF0g.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-8966806246749186919</id><published>2011-12-01T17:31:00.001+01:00</published><updated>2011-12-01T17:53:23.458+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-01T17:53:23.458+01:00</app:edited><title>PHPUnit_Selenium 1.1.1 has been released</title><content type="html">Yesterday Sebastian reviewed my &lt;a href="https://github.com/sebastianbergmann/phpunit-selenium"&gt;PHPUnit_Selenium&lt;/a&gt; master branch and release a new package in the phpunit PEAR channel. You can install it along with PHPUnit easily:&lt;br /&gt;
&lt;pre&gt;$ sudo pear install phpunit/PHPUnit_Selenium&lt;/pre&gt;
Before this release, PHPUnit_Selenium was broken when used with PHPUnit 3.6.&lt;br /&gt;
&lt;br /&gt;
I'm closing several more issues and I plan to cover with tests the 2K lines of code contained in the package: &lt;b&gt;currently the test coverage is terrible&lt;/b&gt;. After the current features are covered, we can start thinking about supporting the Selenium 2 API (based on WebDriver). In any case, I will keep backward compatibility: support for WebDriver will come with another base Testcase Class.&lt;br /&gt;
If you want to contribute, consider providing tests for the functionality you are using. For example, the following areas are uncovered:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;running Selenese tests&lt;/li&gt;
&lt;li&gt;all the &lt;a href="http://css.dzone.com/books/practical-php-testing/practical-php-testing-patterns-28"&gt;Custom Assertion&lt;/a&gt; methods&lt;/li&gt;
&lt;li&gt;running tests in multiple browsers.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Acceptable tests comprehend an HTML page to use as a target and the actual test, written in Selenese or using PHPUnit_SeleniumTestCase. If you want your pull request to be immediately accepted, &lt;b&gt;provide a test&lt;/b&gt; along with the rest of the code. You can take some inspiration from the existing ones in the Tests folder, which will serve as examples.&lt;br /&gt;
&lt;br /&gt;
There is an undocumented, experimental feature in this release: call &lt;b&gt;PHPUnit_Extensions_SeleniumTestCase::shareSession(true)&lt;/b&gt; in your bootstrap and the browser session will be shared between tests; a new session will be restarted only after non successful tests.&lt;br /&gt;
&amp;nbsp;It will be up to you to reset the state of the browser to perform new tests, and will leave the browser windows open after the end of the run: it's called experimental for a reason.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-8966806246749186919?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/-eZsdAjnCdg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/8966806246749186919/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=8966806246749186919" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/8966806246749186919?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/8966806246749186919?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/-eZsdAjnCdg/phpunitselenium-111-has-been-released.html" title="PHPUnit_Selenium 1.1.1 has been released" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>1</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/12/phpunitselenium-111-has-been-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IFRXg_cCp7ImA9WhRRFE0.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-8627871893239700763</id><published>2011-11-27T15:40:00.001+01:00</published><updated>2011-11-27T15:51:54.648+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-27T15:51:54.648+01:00</app:edited><title>Weekly roundup: PHPUnit_Selenium</title><content type="html">I am now the maintainer of &lt;a href="https://github.com/sebastianbergmann/phpunit-selenium"&gt;PHPUnit_Selenium&lt;/a&gt;, the PHP library for writing PHPUnit test cases that make use of Selenium RC to drive a real browser (usually to perform end-to-end tests). PHPUnit will continue shipping the library, and PHPUnit_Extensions_SeleniumTestCase will continue to be compatible with the Api in the manual.&lt;br /&gt;
Right now, you should use PHPUnit_Selenium in tandem with Selenium 2. Selenium 2 integrates WebDriver (not supported yet from PHP code) and implements the old Selenium RC Api, so it will continue to work and be maintained. If you encounter a backward compatibility break, &lt;a href="https://github.com/sebastianbergmann/phpunit-selenium/issues?sort=comments&amp;amp;direction=desc&amp;amp;state=open"&gt;open an issue&lt;/a&gt;.&lt;br /&gt;
PHPUnit_Selenium was not maintained and &lt;b&gt;was broken in PHPUnit 3.6&lt;/b&gt;; with the next release, it will resume working. I'm integrating all sort of pull requests initiated during 2011, so if you want to contribute or to merge back one of your forks, you will be welcome!&lt;br /&gt;
&lt;br /&gt;
Here are my original articles published this week.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-32"&gt;Practical PHP Refactoring: Replace Parameter with Explicit Methods&lt;/a&gt;&amp;nbsp;explains how to break up a method into a few, finer-grained ones.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/setting-lamp-box-puppet"&gt;Setting up a LAMP box with Puppet&lt;/a&gt;&amp;nbsp;is an how to on writing Puppet manifests for provisioning packages and services like Apache, PHP and MySql in a machine (instead of writing long scripts containing apt-get, yum and /etc/init.d/ calls).&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-33"&gt;Practical PHP Refactoring: Preserve Whole Object&lt;/a&gt;&amp;nbsp;explains how to pass an entire object to a method instead of extracting its state and passing a series of variables.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/phonegap-native-applications"&gt;PhoneGap: native applications written in HTML&lt;/a&gt;&amp;nbsp;is a review of a mobile application frameworks which promises to wrap your Ajax-based applications into an Android or iOS one.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-8627871893239700763?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/N5IRex6oTw8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/8627871893239700763/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=8627871893239700763" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/8627871893239700763?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/8627871893239700763?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/N5IRex6oTw8/weekly-roundup-phpunitselenium.html" title="Weekly roundup: PHPUnit_Selenium" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/11/weekly-roundup-phpunitselenium.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UCSXY7eCp7ImA9WhRSF0Q.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-2687575739797338431</id><published>2011-11-20T14:13:00.001+01:00</published><updated>2011-11-20T14:21:08.800+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-20T14:21:08.800+01:00</app:edited><title>Weekly roundup: Italian Agile Day</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.agileday.it/front/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-rglTYLyRiGI/Tsj97J1B96I/AAAAAAAAAlo/vSnA3GWtDsg/s1600/549241.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
Yesterday I followed via streaming the 8th edition of the &lt;a href="http://www.agileday.it/front/"&gt;Italian Agile Day&lt;/a&gt;, since I was unable to go to Rome for the event. If you speak Italian, stay tuned as many talks have been recorded and will be published (the event does not seek profit.)&lt;br /&gt;
Of course I missed the networking dimension of such a big event, but at least I enjoyed some talks on methodology while I am mostly a technical person. Look for the bottleneck!&lt;br /&gt;
&lt;br /&gt;
Here are my original articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-30"&gt;Practical PHP Refactoring: Separate Query from Modifier&lt;/a&gt;&amp;nbsp;is about respecting the Command/Query Separation principle.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/selenium-2-php-code"&gt;Selenium 2 from PHP code&lt;/a&gt;&amp;nbsp;explains which options you have right now for accessing the Selenium 2 (WebDriver) Api from a PHP script.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-31"&gt;Practical PHP Refactoring: Parameterize Method&lt;/a&gt;&amp;nbsp;explains how to unify different versions of a method in a single one with more parameters.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/creating-virtual-server"&gt;Creating a virtual server with Vagrant: a practical walkthrough&lt;/a&gt;&amp;nbsp;is an howto for making Vagrant build a virtual machine with your OS and software of choice, instead of creating that machine and go through the installation process of an .iso image yourself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-2687575739797338431?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/dDs0ZtuS6s8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/2687575739797338431/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=2687575739797338431" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/2687575739797338431?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/2687575739797338431?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/dDs0ZtuS6s8/weekly-roundup-italian-agile-day.html" title="Weekly roundup: Italian Agile Day" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-rglTYLyRiGI/Tsj97J1B96I/AAAAAAAAAlo/vSnA3GWtDsg/s72-c/549241.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/11/weekly-roundup-italian-agile-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAGR3s8cCp7ImA9WhRSEUU.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-2538839094352957580</id><published>2011-11-13T12:59:00.001+01:00</published><updated>2011-11-13T13:18:46.578+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-13T13:18:46.578+01:00</app:edited><title>Weekly roundup: universal software development rules</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-QXjqdT1o_HE/Tr-1iKkzuNI/AAAAAAAAAks/-YD2d8lDBMg/s1600/600px-Half-completed_manual_soldering_of_surface_mount_MQFP_integrated_circuit.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-QXjqdT1o_HE/Tr-1iKkzuNI/AAAAAAAAAks/-YD2d8lDBMg/s200/600px-Half-completed_manual_soldering_of_surface_mount_MQFP_integrated_circuit.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
This week, Kevin Schroeder from Zend &lt;a href="http://www.eschrade.com/page/what-programming-rules-should-you-always-follow/"&gt;collected responses&lt;/a&gt; to his tweet asking what are the universal software development rules. My take, cited there, is that there not many &lt;i&gt;universal&lt;/i&gt;&amp;nbsp;practices that you can follow. There are many conflicting metrics to measure the quality of a software piece, and their relative importance depends on the domain in which we are in.&lt;br /&gt;
For example, in development of embedded systems (which do not even run on general purpose microprocessors), many "clean code" practices like&amp;nbsp;&lt;i&gt;Don't Repeat Yourself&lt;/i&gt; and &lt;i&gt;Keep It Simple Stupid&lt;/i&gt; are subverted. We may replicate the code for an operation to parallelize it and lower the response time of the system; we may micro-optimize operators and substitute multiplications with binary shifts. Power, energy and cost of a circuit come into play more than expressiveness of the code...&lt;br /&gt;
&lt;br /&gt;
These are my original articles published this week on DZone.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-add"&gt;Practical PHP Refactoring: Add Parameter&lt;/a&gt;&amp;nbsp;is about adding an explicit parameter to a method instead of trying to look it up in a singleton or in some other place by itself.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/eventual-consistency"&gt;Eventual consistency is everywhere in the real world&lt;/a&gt;&amp;nbsp;contains a few examples of how eventual consistency (popularized in the programming world by NoSQL solutions) make many businesses work.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-29"&gt;Practical PHP Refactoring: Remove Parameter&lt;/a&gt;&amp;nbsp;is about simplifying a method by removing a parameter which is not needed anymore.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/web-applications-play"&gt;Web applications with the Play framework&lt;/a&gt;&amp;nbsp;is a primer for the usage of &lt;i&gt;a clean alternative to bloated enterprise Java stacks&lt;/i&gt;. And it supports Scala, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-2538839094352957580?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/vDfbf9s5W9I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/2538839094352957580/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=2538839094352957580" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/2538839094352957580?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/2538839094352957580?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/vDfbf9s5W9I/weekly-roundup-universal-software.html" title="Weekly roundup: universal software development rules" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-QXjqdT1o_HE/Tr-1iKkzuNI/AAAAAAAAAks/-YD2d8lDBMg/s72-c/600px-Half-completed_manual_soldering_of_surface_mount_MQFP_integrated_circuit.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/11/weekly-roundup-universal-software.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AGSHc9fyp7ImA9WhRTFUU.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-3171508940457304536</id><published>2011-11-06T13:15:00.002+01:00</published><updated>2011-11-06T13:15:29.967+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-06T13:15:29.967+01:00</app:edited><title>Weekly roundup: a short Pomodoro presentation</title><content type="html">Here is my Pomodoro Technique short presentation held at &lt;a href="http://www.phpday.it/"&gt;phpDay&lt;/a&gt; 2011 in Verona. It's not the same as the full one at PHP Barcelona, but it contains some frequently asked questions about Pomodoros along with some handy tricks.&lt;br /&gt;
Remember that English is not my native language. :)&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="225" src="http://player.vimeo.com/video/29773575?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;a href="http://vimeo.com/29773575"&gt;Giorgio Sironi - An year of pomodoros - phpday2011&lt;/a&gt; from &lt;a href="http://vimeo.com/grusp"&gt;GrUSP&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Here are also my original articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-27"&gt;Practical PHP Refactoring: Introduce Assertion&lt;/a&gt;&amp;nbsp;is about the ancient usage of assertions, when they were embedded in production code instead of being segregated in an external test suite.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/php-java-application-server"&gt;PHP on a Java application server&lt;/a&gt;&amp;nbsp;is our experience with Quercus for running a PHP application on Resin. TL;DR: not really working.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-28"&gt;Practical PHP Refactoring: Rename Method&lt;/a&gt;&amp;nbsp;is about making method calls easier to follow: when a method's name is really explanatory you don't have to read into its body to understand what it does.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/using-virtual-machine-play"&gt;Using a virtual machine to play with multiple versions of PHP&lt;/a&gt;&amp;nbsp;is a tutorial on setting up a VirtualBox machine with PHP 5.4 (the newest unstable version).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-3171508940457304536?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/qUHmfpkqbtU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/3171508940457304536/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=3171508940457304536" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/3171508940457304536?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/3171508940457304536?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/qUHmfpkqbtU/weekly-roundup-short-pomodoro.html" title="Weekly roundup: a short Pomodoro presentation" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/11/weekly-roundup-short-pomodoro.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAARn47fCp7ImA9WhdaGUU.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-844988158383101790</id><published>2011-10-30T16:15:00.001+01:00</published><updated>2011-10-30T16:15:47.004+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-30T16:15:47.004+01:00</app:edited><title>Weekly roundup: the Pomodoro Technique in Barcelona</title><content type="html">Here are the slides of my talk &lt;i&gt;The Pomodoro Technique&lt;/i&gt; at PHP Barcelona last Friday. If you have found it interesting, remember to &lt;a href="http://joind.in/talk/view/4321"&gt;rate the talk on joind.in&lt;/a&gt;. I'd like to thank all the staff (who also gave away a &lt;i&gt;Pomodoro Technique Illustrated&lt;/i&gt; book) and the audience, which was very interested and involved in the topic.&lt;br /&gt;
&lt;div class="prezi-player"&gt;
&lt;style media="screen" type="text/css"&gt;
.prezi-player { width: 550px; } .prezi-player-links { text-align: center; }
&lt;/style&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="400" id="prezi_g4mvjus8yxsg" name="prezi_g4mvjus8yxsg" width="550"&gt;&lt;param name="movie" value="http://prezi.com/bin/preziloader.swf"/&gt;

&lt;param name="allowfullscreen" value="true"/&gt;

&lt;param name="allowscriptaccess" value="always"/&gt;

&lt;param name="bgcolor" value="#ffffff"/&gt;

&lt;param name="flashvars" value="prezi_id=g4mvjus8yxsg&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"/&gt;

&lt;embed id="preziEmbed_g4mvjus8yxsg" name="preziEmbed_g4mvjus8yxsg" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="550" height="400" bgcolor="#ffffff" flashvars="prezi_id=g4mvjus8yxsg&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;div class="prezi-player-links"&gt;
&lt;a href="http://prezi.com/g4mvjus8yxsg/the-pomodoro-technique/" title="
                            
                            No description
                            
                        "&gt;The Pomodoro Technique&lt;/a&gt; on &lt;a href="http://prezi.com/"&gt;Prezi&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
Here are my original articles that I published this week before the conference.
&lt;br /&gt;
&lt;span class="Apple-style-span" style="background-color: white; font-family: arial, verdana, helvetica, sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-25"&gt;Practical PHP Refactoring: Replace Conditional with Polymorphism&lt;/a&gt;&amp;nbsp;is the cornerstore of the elimination of conditionals.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/getting-started-selenium-2"&gt;Getting started with Selenium 2&lt;/a&gt;&amp;nbsp;is a primer for the usage of WebDriver, only with the official Java bindings for now.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-26"&gt;Practical PHP Refactoring: Introduce Null Object&lt;/a&gt;&amp;nbsp;explains the creation of an object dedicated to special cases.&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://css.dzone.com/articles/ive-had-enough-running-scala"&gt;I've had enough of running Scala in a terminal, let's try with a web application&lt;/a&gt;&amp;nbsp;is the first step in my quest to develop for the web in Scala.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-844988158383101790?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/P2pNX2iV23g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/844988158383101790/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=844988158383101790" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/844988158383101790?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/844988158383101790?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/P2pNX2iV23g/weekly-roundup-pomodoro-technique-in.html" title="Weekly roundup: the Pomodoro Technique in Barcelona" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/10/weekly-roundup-pomodoro-technique-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4GQHw4eSp7ImA9WhdaE0U.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-7997742408655338115</id><published>2011-10-23T18:38:00.002+02:00</published><updated>2011-10-23T18:38:41.231+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-23T18:38:41.231+02:00</app:edited><title>Weekly roundup: going to Barcelona</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-74DeIRn7eA8/TqRC9kkWVJI/AAAAAAAAAgU/loC0BGtpr5k/s1600/pedrera2.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-74DeIRn7eA8/TqRC9kkWVJI/AAAAAAAAAgU/loC0BGtpr5k/s200/pedrera2.jpg" width="150" /&gt;&lt;/a&gt;&lt;/div&gt;
I'm leaving for Barcelona on Thursday afternoon for the PHP Barcelona 2011 conference and I will hold my talk on the Pomodoro Technique on Friday morning. Feel free to ping me if you will be there, I like to discuss about the themes treated in my writings. :)&lt;br /&gt;
&lt;br /&gt;
These are my original articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-23"&gt;Practical PHP Refactoring: Remove Control Flag&lt;/a&gt;&amp;nbsp;is about refactoring from a boolean variable to statements like &lt;i&gt;break&lt;/i&gt; and &lt;i&gt;continue&lt;/i&gt;.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/look-dart-eyes-oo-programmer"&gt;A look at Dart from the eyes of an OO programmer&lt;/a&gt;&amp;nbsp;is my opinion on Dart.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-24"&gt;Practical PHP Refactoring: Replace Nested Conditionals with Guard Clauses&lt;/a&gt;&amp;nbsp;explains how to simplify a complex conditional before starting to extract objects.&lt;br /&gt;&lt;a href="http://css.dzone.com/articles/tell-dont-ask-case-web-service"&gt;Tell, Don't Ask in the case of a web service&lt;/a&gt;&amp;nbsp;is a practical case of changing a design from a getter-based style to a &lt;a href="http://pragprog.com/articles/tell-dont-ask"&gt;Tell Don't Ask&lt;/a&gt; one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-7997742408655338115?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/pfP5_yrwHAQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/7997742408655338115/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=7997742408655338115" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/7997742408655338115?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/7997742408655338115?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/pfP5_yrwHAQ/weekly-roundup-going-to-barcelona.html" title="Weekly roundup: going to Barcelona" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-74DeIRn7eA8/TqRC9kkWVJI/AAAAAAAAAgU/loC0BGtpr5k/s72-c/pedrera2.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/10/weekly-roundup-going-to-barcelona.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQMRXg9fip7ImA9WhdbF0g.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-1083002944452661437</id><published>2011-10-16T11:23:00.001+02:00</published><updated>2011-10-16T11:29:44.666+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-16T11:29:44.666+02:00</app:edited><title>Weekly roundup: hardware design vs. Continuous Integration</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://en.wikipedia.org/wiki/File:153056995_5ef8b01016_o.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="154" src="http://upload.wikimedia.org/wikipedia/commons/c/c7/153056995_5ef8b01016_o.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
I'm taking a course in ubiquitous computing where we are studying hardware design. It's interesting how a common methodology reminds me of waterfall - each phase from the behavioral specification to the logical synthesis (where you decide how many and, or and not to use) contains a thorough verification step.&lt;br /&gt;
The reason is simple - the last phase, the actual production of a custom integrated circuit is very costly (hundreds of thousands of Euros). So iterating a design including this phase is not possible at all.&lt;br /&gt;
In software, it's a bit different. We can afford a dedicated server that builds our application dozens of time each day.&lt;br /&gt;
&lt;br /&gt;
Here are my original articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-21"&gt;Practical PHP Refactoring: Consolidate Conditional Expression&lt;/a&gt; is about extracting code from conditionals and applying polymorphism when possible.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/what-i-have-learned-ddd-day"&gt;What I have learned at DDD Day&lt;/a&gt; is about my experience at a conference on enterprise software, mostly oriented to .NET.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-22"&gt;Practical PHP Refactoring: Consolidate Duplicate Conditional Fragments&lt;/a&gt; is about avoiding duplication even in ifs.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/oauth-headless-applications"&gt;OAuth in headless applications&lt;/a&gt; explains how to access Facebook, LinkedIn and other Apis when the user can't continuously authorize your application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-1083002944452661437?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/--tau_v0fXY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/1083002944452661437/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=1083002944452661437" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/1083002944452661437?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/1083002944452661437?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/--tau_v0fXY/weekly-roundup-hardware-design-vs.html" title="Weekly roundup: hardware design vs. Continuous Integration" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/10/weekly-roundup-hardware-design-vs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcHRXkycCp7ImA9WhdbE08.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-5452158462356268128</id><published>2011-10-11T10:50:00.000+02:00</published><updated>2011-10-11T10:50:34.798+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-11T10:50:34.798+02:00</app:edited><title>DDD Day slides</title><content type="html">Here are my slides (if you can call them &lt;i&gt;slides&lt;/i&gt;) for the DDD Day of Saturday in Bologna. The audio+slides playback will be available in the next weeks.&lt;br /&gt;
Note that the talk was oriented to an audience who knows what Domain-Driven Design is, but hasn't really worked with PHP yet (Java and C# developers).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="prezi-player"&gt;
&lt;style media="screen" type="text/css"&gt;
.prezi-player { width: 550px; } .prezi-player-links { text-align: center; }
&lt;/style&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="400" id="prezi_guji7cuqxd3l" name="prezi_guji7cuqxd3l" width="550"&gt;&lt;param name="movie" value="http://prezi.com/bin/preziloader.swf"/&gt;
&lt;param name="allowfullscreen" value="true"/&gt;
&lt;param name="allowscriptaccess" value="always"/&gt;
&lt;param name="bgcolor" value="#ffffff"/&gt;
&lt;param name="flashvars" value="prezi_id=guji7cuqxd3l&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"/&gt;
&lt;embed id="preziEmbed_guji7cuqxd3l" name="preziEmbed_guji7cuqxd3l" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="550" height="400" bgcolor="#ffffff" flashvars="prezi_id=guji7cuqxd3l&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;div class="prezi-player-links"&gt;
&lt;a href="http://prezi.com/guji7cuqxd3l/ddd-in-php/" title="
                            
                            Domain-Driven Design transported into the PHP realm: dynamic and interpreted language, short-lived objects...
                            
                        "&gt;DDD in PHP&lt;/a&gt; on &lt;a href="http://prezi.com/"&gt;Prezi&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-5452158462356268128?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/FobkYewcyac" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/5452158462356268128/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=5452158462356268128" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/5452158462356268128?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/5452158462356268128?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/FobkYewcyac/ddd-day-slides.html" title="DDD Day slides" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/10/ddd-day-slides.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUAQX88eCp7ImA9WhdbEUo.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-1230357249461566096</id><published>2011-10-09T16:57:00.000+02:00</published><updated>2011-10-09T16:57:20.170+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-09T16:57:20.170+02:00</app:edited><title>Weekly roundup: DDD Day</title><content type="html">&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Cza0Pk7bcDE/TpG1zDITvbI/AAAAAAAAAfQ/NdkevxhOJow/s1600/302140_184021985008574_131584716918968_391679_1280413770_n.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="214" src="http://4.bp.blogspot.com/-Cza0Pk7bcDE/TpG1zDITvbI/AAAAAAAAAfQ/NdkevxhOJow/s320/302140_184021985008574_131584716918968_391679_1280413770_n.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From this photo, you almost cannot see that I was rasmussed by &lt;a href="http://twitter.com/#!/gregyoung"&gt;Greg Young&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
I've returned from the DDD Day, the Italian conference on Domain-Driven Design. I learned some concrete tips ad techniques in spite of the event being oriented to .NET and frequented by C# and Java programmers.&lt;br /&gt;
In fact, as &lt;a href="http://twitter.com/#!/ziobrando"&gt;Alberto Brandolini&lt;/a&gt; said in the morning, DDD is also about the method, not really about the technology; and the differences in technology between imperative object-oriented languages such as C# and PHP are not so high.&lt;br /&gt;
&lt;br /&gt;
Here are my original articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-19"&gt;Practical PHP Refactoring: Replace Subclass with Fields&lt;/a&gt; is about the inverse move of &lt;i&gt;refactoring from type codes&lt;/i&gt;.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/goal-software-development"&gt;The Goal of software development&lt;/a&gt; is an exposition of Goldratt's work applied to software development.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-20"&gt;Practical PHP Refactoring: Decompose Conditional&lt;/a&gt; is the first article about dealing with ifs and possibly targeting polymorphism.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/temporal-correlation-git"&gt;Temporal correlation in Git repositories&lt;/a&gt; contains the code for discovering which classes usually change together in the history of your codebase.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-1230357249461566096?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/udfPFkGUpt0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/1230357249461566096/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=1230357249461566096" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/1230357249461566096?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/1230357249461566096?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/udfPFkGUpt0/weekly-roundup-ddd-day.html" title="Weekly roundup: DDD Day" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Cza0Pk7bcDE/TpG1zDITvbI/AAAAAAAAAfQ/NdkevxhOJow/s72-c/302140_184021985008574_131584716918968_391679_1280413770_n.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/10/weekly-roundup-ddd-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4HQno6cSp7ImA9WhdUFUk.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-346742242619983829</id><published>2011-10-02T11:15:00.001+02:00</published><updated>2011-10-02T11:15:33.419+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-02T11:15:33.419+02:00</app:edited><title>Bi-weekly roundup: DDD in PHP</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://ddd-day.it/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-CXVhFSuvNV4/TnXoalbdPEI/AAAAAAAAAds/z5gpX8t0gj8/s200/logo.png" width="180" /&gt;&lt;/a&gt;&lt;/div&gt;
I'm wrapping up my presentation for the &lt;a href="http://ddd-day.it/"&gt;DDD Day&lt;/a&gt; in Bologna and beginning rehearsals. Since I am involved in the project as a software architect, I will talk mostly about the technical side (it's DDD in PHP, not DDD in transportation and rental companies.) Wit respect to Java and C#, we will take a look at the differences in the language, in the platform where they are run and in the Domain Model.&lt;br /&gt;
See you in Bologna on October 8th.&lt;br /&gt;
&lt;br /&gt;
Here are my original articles published in the last two weeks.&lt;br /&gt;
&lt;b&gt;First week&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-15"&gt;Practical PHP Refactoring: Replace Record with Data Class&lt;/a&gt; is about substituting data structures provided by the language or libraries with an object coded on your own.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-google-api"&gt;Practical Google+ Api&lt;/a&gt;&amp;nbsp;is a guide to get you up and running in coding for an application using Google+ as a data source.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-16"&gt;Practical PHP Refactoring: Replace Type Code with Class&lt;/a&gt;&amp;nbsp;is about substituting a field value with a new object.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/phar-php-libraries-single-file"&gt;Phar: PHP libraries included with a single file&lt;/a&gt; is self-explanatory: Phar is the equivalent of Jar for the PHP world.&lt;br /&gt;
&lt;b&gt;Second week&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-17"&gt;Practical PHP Refactoring: Replace Type Code with Subclasses&lt;/a&gt; expands on the type code miniseries, by adding subclasses to the one containing the problematic field.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/cross-site-request-forgery"&gt;Cross-Site Request Forgery explained&lt;/a&gt; is my take on this security issue, providing three ways documented in the literature to avoid it.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-18"&gt;Practical PHP Refactoring: Replace Type Code with State or Strategy&lt;/a&gt; is the third option for eliminating a type code: transforming its values in a hierarchy of State objects.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/pretotyping-complete-example"&gt;Pretotyping: a complete example&lt;/a&gt; describes my experience with &lt;a href="http://giorgiosironi.blogspot.com/2011/08/pretotyping-who-disagrees-with-me.html"&gt;Who Disagrees With Me?&lt;/a&gt; and all the data I collected, which suggests a very focused audience but a descending trend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-346742242619983829?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/OdiC4pbieto" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/346742242619983829/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=346742242619983829" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/346742242619983829?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/346742242619983829?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/OdiC4pbieto/bi-weekly-roundup-ddd-in-php.html" title="Bi-weekly roundup: DDD in PHP" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-CXVhFSuvNV4/TnXoalbdPEI/AAAAAAAAAds/z5gpX8t0gj8/s72-c/logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/10/bi-weekly-roundup-ddd-in-php.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIBR3k7fip7ImA9WhdVF0U.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-7284658752105658118</id><published>2011-09-23T15:29:00.001+02:00</published><updated>2011-09-23T15:29:16.706+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-23T15:29:16.706+02:00</app:edited><title>Who disagrees with me? Fourth and final issue</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s320/logo_wdwm.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s320/logo_wdwm.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
I've just sent the fourth edition of the &lt;a href="http://giorgiosironi.blogspot.com/2011/08/pretotyping-who-disagrees-with-me.html"&gt;Who disagrees with me?&lt;/a&gt; newsletter, a pretotype for an aggregator of challenging links aimed to burst the &lt;a href="http://en.wikipedia.org/wiki/Filter_bubble"&gt;filter bubble&lt;/a&gt;&amp;nbsp;and &lt;a href="http://en.wikipedia.org/wiki/Confirmation_bias"&gt;confirmation bias&lt;/a&gt;. If that sounds obscure, consider as an example picking a PHP programmer like me and showing him where Ruby (or Java, or JavaScript) beats its preferred language. Ignoring the fact does not make the PHP programmer any better...&lt;br /&gt;
With this fourth edition I conclude the experiment of the newsletter and start thinking about a web application; I will take a look at analytics and subscriptions/unsubscriptions to see what has been the level of interest in the last weeks to see if the idea can be pursue further.&lt;br /&gt;
Please your opinions and criticism about &lt;i&gt;Who disagrees with me?&lt;/i&gt; and these four issues in the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-7284658752105658118?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/4M-5kzg_u9Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/7284658752105658118/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=7284658752105658118" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/7284658752105658118?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/7284658752105658118?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/4M-5kzg_u9Q/who-disagrees-with-me-fourth-and-final.html" title="Who disagrees with me? Fourth and final issue" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s72-c/logo_wdwm.gif" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/09/who-disagrees-with-me-fourth-and-final.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcMQH09fSp7ImA9WhdVE0g.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-301978033964664233</id><published>2011-09-18T14:47:00.001+02:00</published><updated>2011-09-18T14:48:01.365+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T14:48:01.365+02:00</app:edited><title>Weekly roundup: speaking at DDD Day</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://ddd-day.it/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-CXVhFSuvNV4/TnXoalbdPEI/AAAAAAAAAds/z5gpX8t0gj8/s200/logo.png" width="180" /&gt;&lt;/a&gt;&lt;/div&gt;
On October 8th I will speak at &lt;a href="http://ddd-day.it/"&gt;DDD Day&lt;/a&gt; in Bologna, an Italian event for Domain-Driven Design practitioners. The topic of the talk is DDD in PHP: which part of the approach changes with the programming language and platform, and which stay the same.&lt;br /&gt;
The abstract (in Italian, as for the talk) follows.&lt;br /&gt;
&lt;blockquote&gt;
Cosa cambia nell'applicare Domain-Driven Design quando si passa da un linguaggio fortemente tipato e compilato come C# o Java ad uno dinamico  e interpretato come PHP? Ci sono differenze ancora più subdole: il tempo di residenza degli oggetti in memoria è molto diverso, così come il livello di sviluppo degli ORM; per non parlare della differenza di mentalità fra gli sviluppatori, abituati a siti pubblici invece che a domini (applicativi) aziendali.
Passare ad un linguaggio veramente diverso ci fa capire quali sono le parti di DDD che importano solo dal punto di vista tecnico (che quindi possiamo trascurare), e quali sono invece i concetti che non cambiano mai.&lt;/blockquote&gt;
Here are also the links to my articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-13"&gt;Practical PHP Refactoring: Encapsulate Field&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/backbonejs-mvc-javascript"&gt;Backbone.js: MVC in JavaScript&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-14"&gt;Practical PHP Refactoring: Encapsulate Collection&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/web-typography-2011"&gt;Web typography in 2011&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-301978033964664233?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/lyAWvxxEr1Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/301978033964664233/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=301978033964664233" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/301978033964664233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/301978033964664233?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/lyAWvxxEr1Y/weekly-roundup-speaking-at-ddd-day.html" title="Weekly roundup: speaking at DDD Day" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-CXVhFSuvNV4/TnXoalbdPEI/AAAAAAAAAds/z5gpX8t0gj8/s72-c/logo.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/09/weekly-roundup-speaking-at-ddd-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIDRnk6cSp7ImA9WhdVEUo.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-5070720052114596143</id><published>2011-09-16T13:29:00.003+02:00</published><updated>2011-09-16T13:29:37.719+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-16T13:29:37.719+02:00</app:edited><title>Who disagrees with me? Third issue</title><content type="html">


&lt;div class="separator" style="clear: both; text-align: center;"&gt;

&lt;a href="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s320/logo_wdwm.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s320/logo_wdwm.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
I've just sent to subscribers the third issue of &lt;a href="http://giorgiosironi.blogspot.com/2011/08/pretotyping-who-disagrees-with-me.html"&gt;Who disagrees with me?&lt;/a&gt;, the newsletter providing a weekly article guaranteed to challenge the assumptions of your preferred programming language. There are still 5 different editions - PHP, Ruby, C/C++, Java and JavaScript.&lt;br /&gt;
Last week I got a feedback on Google+ about subscribing to multiple &lt;i&gt;Preferred technologies&lt;/i&gt;. It would definitely be handy, but I can't change the setting now without losing the data from already subscribing people. It's something to keep in mind in case this becomes something more than a newsletter.&lt;br /&gt;
&lt;b&gt;&lt;a href="http://tinyurl.com/whodisagreeswithmesubscription"&gt;Who disagrees with me subscription&lt;/a&gt;&lt;/b&gt;


&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-5070720052114596143?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/i1PmRxABm6A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/5070720052114596143/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=5070720052114596143" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/5070720052114596143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/5070720052114596143?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/i1PmRxABm6A/who-disagrees-with-me-third-issue.html" title="Who disagrees with me? Third issue" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s72-c/logo_wdwm.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/09/who-disagrees-with-me-third-issue.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEERXoyeip7ImA9WhdWF0s.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-4533187850069947937</id><published>2011-09-11T19:36:00.005+02:00</published><updated>2011-09-11T19:36:44.492+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-11T19:36:44.492+02:00</app:edited><title>Weekly roundup: ergonomics</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.osha.gov/SLTC/etools/computerworkstations/images/comp_pointer_toofar.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="140" src="http://www.osha.gov/SLTC/etools/computerworkstations/images/comp_pointer_toofar.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
I've been using a mouse not at the same height as my keyboard for years: it took different pains and a transition to Vim (where the mouse is useless) to realize that the ergonomics of my main workstation was not excellent.&lt;br /&gt;
OSHA (I trust the US government on these issues more than the Chinese one) &lt;a href="http://www.osha.gov/SLTC/etools/computerworkstations/checklist.html"&gt;has a checklist&lt;/a&gt; for checking your own work desk, along with links to further explanations and pictures of good and bad setups.&lt;br /&gt;
&lt;br /&gt;
While you're checking and avoiding a Carpal Tunnel Syndrome, take also a look at my original articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-11"&gt;Practical PHP Refactoring: Change Bidirectional Association to Unidirectional&lt;/a&gt; &lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/all-git-hooks-you-need"&gt;All the Git hooks you need&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-12"&gt;Practical PHP Refactoring: Replace Magic Number with Symbolic Constant&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/future-javascript-today"&gt;Future JavaScript, today: Google's Traceur&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-4533187850069947937?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/19ri3nqZ0XE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/4533187850069947937/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=4533187850069947937" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/4533187850069947937?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/4533187850069947937?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/19ri3nqZ0XE/weekly-roundup-ergonomics.html" title="Weekly roundup: ergonomics" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/09/weekly-roundup-ergonomics.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAERXs4cCp7ImA9WhdWFUo.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-9042565145334508794</id><published>2011-09-09T14:51:00.000+02:00</published><updated>2011-09-09T14:51:44.538+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-09T14:51:44.538+02:00</app:edited><title>Who disagrees with me? Second issue</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s320/logo_wdwm.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s320/logo_wdwm.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
I've just sent to subscribers the second issue of &lt;a href="http://giorgiosironi.blogspot.com/2011/08/pretotyping-who-disagrees-with-me.html"&gt;Who disagrees with me?&lt;/a&gt;, the newsletter providing a weekly article guaranteed to challenge the assumptions of your preferred programming language.&lt;br /&gt;
After two weeks and a half from the launch of the &lt;a href="http://www.pretotyping.org/"&gt;pretotype&lt;/a&gt;, the newsletter has grown to 5 of the 6 technologies available: there is a C, Java, JavaScript, PHP and Ruby edition.&lt;br /&gt;
I plan to prepare two more issues for the coming weeks before wrapping up the experiment. The result would be either the start of a new website or the end of the service, depending on user response (that's you!).&lt;br /&gt;
&lt;b&gt;&lt;a href="http://tinyurl.com/whodisagreeswithmesubscription"&gt;Who disagrees with me subscription&lt;/a&gt;&lt;/b&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-9042565145334508794?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/861FGI4fi2Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/9042565145334508794/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=9042565145334508794" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/9042565145334508794?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/9042565145334508794?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/861FGI4fi2Q/who-disagrees-with-me-second-issue.html" title="Who disagrees with me? Second issue" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s72-c/logo_wdwm.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/09/who-disagrees-with-me-second-issue.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQBRHg4eip7ImA9WhdWE00.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-3246811716749253369</id><published>2011-09-06T13:07:00.000+02:00</published><updated>2011-09-06T13:09:15.632+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-06T13:09:15.632+02:00</app:edited><title>Automatically assign constructor parameters to private properties</title><content type="html">In Scala, a JVM language, constructor parameters become private fields of the class, by default:&lt;br /&gt;
&lt;pre class="scala"&gt;&lt;span style="color: #140dcc;"&gt;class&lt;/span&gt; &lt;span style="color: #2e7c0f;"&gt;Person&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;age:&lt;span style="color: purple;"&gt;Int&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;
  &lt;span style="color: #140dcc;"&gt;def&lt;/span&gt; &lt;span style="color: #2e7c0f;"&gt;grow&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; = &lt;span class="br0"&gt;{&lt;/span&gt;
    age += &lt;span style="color: #cb0710;"&gt;1&lt;/span&gt;
  &lt;span class="br0"&gt;}&lt;/span&gt;
&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/pre&gt;
I find it handy, as I always use private properties which are the target of dependency injection, in particular constructor injection.&lt;br /&gt;
Here's how to emulate this functionality in PHP, with great hacks. I post this code here so it won't be lost in the interwebs.&lt;br /&gt;
&lt;script src="https://gist.github.com/1197279.js"&gt;
 
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-3246811716749253369?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/iUIzVfxak7U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/3246811716749253369/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=3246811716749253369" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/3246811716749253369?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/3246811716749253369?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/iUIzVfxak7U/in-scala-jvm-language-constructor.html" title="Automatically assign constructor parameters to private properties" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>7</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/09/in-scala-jvm-language-constructor.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YMSHk_fip7ImA9WhdWEUk.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-5374576393205567236</id><published>2011-09-04T16:06:00.000+02:00</published><updated>2011-09-04T16:06:29.746+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-04T16:06:29.746+02:00</app:edited><title>Weekly roundup: speaking at PBC 2011</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://phpconference.es/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="64" src="http://phpconference.es/wp-content/uploads/PHPBarcelonaConference2011_500x100.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
There is no official schedule yet, but speakers are beginning to confirm their presence to PHP Barcelona 2011. &lt;a href="http://twitter.com/#%21/phpbarcelona/status/109662560432820226"&gt;I will be there&lt;/a&gt;, with my talk on the &lt;a href="http://www.pomodorotechnique.com/"&gt;Pomodoro Technique&lt;/a&gt;, a time management tool inspired by eXtreme Programming/Agile methodologies and widely diffused also outside of the software development field.&lt;br /&gt;
I also have seen confirming &lt;a href="http://twitter.com/juokaz"&gt;Juozas Kaziukenas&lt;/a&gt;, &lt;a href="http://twitter.com/shochdoerfer%20"&gt;Stephan Hochdörfer&lt;/a&gt;, and &lt;a href="http://twitter.com/_md"&gt;Marcelo Duarte&lt;/a&gt; from iBuildings. See you all in October in Barcelona!&lt;br /&gt;
&lt;br /&gt;
Meanwhile, here are my original articles published this week on DZone.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-9"&gt;Practical PHP Refactoring: Duplicate Observed Data&lt;/a&gt; is a refactoring associated with moving fields from the presentation layer to the domain one, in the cases where their values take part to the execution of some logic, like validation or a change in state.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/theres-no-reason-not-switch"&gt;There's no reason not to switch to DocBlox&lt;/a&gt; is an overview of an Api documentation generator for PHP 5.3, which together with &lt;a href="https://github.com/theseer/phpdox"&gt;phpdox&lt;/a&gt; will replace the older phpDocumentor, not maintained anymore.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/practical-php-refactoring-10"&gt;Practical PHP Refactoring: Change Unidirectional Association to Bidirectional&lt;/a&gt; targets the transformation of a pointer between two objects in a bidirectional reference, where each object can navigate the graph towards the other.&lt;br /&gt;
&lt;a href="http://css.dzone.com/articles/offline-web-applications"&gt;Offline web applications: a working example&lt;/a&gt; is, in fact, a working example of an HTML5  application that you can load in the browser once and then use forever after severing the connection with the server, or closing and reopening the browser. The goal of course, is to make a comparison with native mobile applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-5374576393205567236?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/WETdns1Bt1A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/5374576393205567236/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=5374576393205567236" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/5374576393205567236?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/5374576393205567236?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/WETdns1Bt1A/weekly-roundup-speaking-at-pbc-2011.html" title="Weekly roundup: speaking at PBC 2011" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><thr:total>2</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/09/weekly-roundup-speaking-at-pbc-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08BQHwycCp7ImA9WhdXGUg.&quot;"><id>tag:blogger.com,1999:blog-36547168.post-1728365856344523194</id><published>2011-09-02T12:37:00.000+02:00</published><updated>2011-09-02T12:37:31.298+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-02T12:37:31.298+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="whodisagreeswithme" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="pretotyping" /><title>Who disagrees with me? First issue</title><content type="html">&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s1600/logo_wdwm.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="160" src="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s320/logo_wdwm.gif" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;I've just sent to subscribers the first issue of &lt;a href="http://giorgiosironi.blogspot.com/2011/08/pretotyping-who-disagrees-with-me.html"&gt;&lt;i&gt;Who disagrees with me?&lt;/i&gt;&lt;/a&gt;, a service providing a weekly link to an article guaranteed to challenge your thinking.&lt;br /&gt;
For example, readers who have subscribed to the PHP edition (selecting PHP as their preferred technology) are getting an article describing an advanced feature of Ruby that PHP lacks by construction.&lt;br /&gt;
&lt;br /&gt;
If you want to jump on board, &lt;a href="http://tinyurl.com/whodisagreeswithmesubscription"&gt;subscribe&lt;/a&gt;. I am pretotyping this service by selecting links manually: if there is a recurring interest in the list, I will transform it into a website covering other areas too (economics, or maybe music).&lt;br /&gt;
&lt;b&gt;&lt;a href="http://tinyurl.com/whodisagreeswithmesubscription"&gt;Who disagrees with me subscription&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/36547168-1728365856344523194?l=giorgiosironi.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/InvisibleToTheEye/~4/BN4jVUXCFHg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://giorgiosironi.blogspot.com/feeds/1728365856344523194/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=36547168&amp;postID=1728365856344523194" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/1728365856344523194?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/36547168/posts/default/1728365856344523194?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/InvisibleToTheEye/~3/BN4jVUXCFHg/who-disagrees-with-me-first-issue.html" title="Who disagrees with me? First issue" /><author><name>Giorgio</name><uri>http://www.blogger.com/profile/12689416577856305650</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_8AyqsjOhFcI/SlEFshkLH7I/AAAAAAAAAAM/5awqfKhHAtc/S220/io_jamaica.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-3bm5xTIFLLo/TmCxfOsfVKI/AAAAAAAAAdg/kN69G-tqDk8/s72-c/logo_wdwm.gif" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://giorgiosironi.blogspot.com/2011/09/who-disagrees-with-me-first-issue.html</feedburner:origLink></entry></feed>

