<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6607326891425643981</id><updated>2011-12-13T08:15:28.256-08:00</updated><title type='text'>Manolo Carrasco Moñino (Tux &amp; Tuna)</title><subtitle type='html'>I'm an engineer and a scientific interested in Technology, Mathematics, Chemistry and Physics. I work as a system and software architect learning every day from others. I love the Open Source movement and I contribute with it writing code, testing projects, reporting bugs and submitting patches. 
Also I love Music. I've played in different bands and I've taught music to children for years.  
I'm married and I've got three lovely children.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-521755268694215085</id><published>2011-06-21T07:55:00.000-07:00</published><updated>2011-12-13T08:04:25.458-08:00</updated><title type='text'>Enabling Desktop Notifications in IE with chromeframe</title><content type='html'>Chrome comes with interesting features to improve the user experience. One of them is the 'Desktop Notifications', which allows you to display nice notifications in your desktop using javascript.&lt;br /&gt;&lt;br /&gt;Gmail was one of the first applications making use of it, but there are many other applications like &lt;a href="http://talkwheel.com/"&gt;Talkwheel&lt;/a&gt; using it.&amp;nbsp; These applications are able to detect when the user is running chrome and they offer a link to the user to enable the feature.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-Vir99eMqoOM/TgBsSoB5AKI/AAAAAAAAA7o/fOywCMwt_1g/s1600/notification.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;img alt="" src="data:image/png;base64,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" /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Unfortunately there are many companies which only permit the usage of IE in their desktops, if this is your case, don't worry, there is a nice project called chromeframe which embeds the chrome engine in IE as an extension, making IE render faster, perform better when executing javascript, and adding many html5 features like canvas, svg, etc.&lt;/div&gt;&lt;br /&gt;A last problem, is that chromeframe has a bug which prevents to show the info bar to authorise websites to use notifications, so you have to follow these steps to enable&amp;nbsp; notifications in IE:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open IE and Install chromeframe from this &lt;a href="http://www.google.com/chromeframe/"&gt;URL&lt;/a&gt;, if you did not it before. &lt;/li&gt;&lt;li&gt;Add the entry below to your windows registry. You can do either, import the key by clicking over this &lt;a href="http://gwt-workshop.googlecode.com/files/chframe.reg"&gt;link&lt;/a&gt;, or run 'regedit' and add the entry by hand as is shown in the screenshot below.&amp;nbsp; &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;HKCU\Software\Google\ChromeFrame\AllowUnsafeURLs=dword:1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-mR68D_-rLu4/TgBsT2Q6bjI/AAAAAAAAA-c/vOXhd17h8M8/s1600/regedit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-mR68D_-rLu4/TgBsT2Q6bjI/AAAAAAAAA-c/vOXhd17h8M8/s1600/regedit.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Now you can open the chrome settings page just typing: &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;gcf:chrome://settings/content&lt;/span&gt; in the url box.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-DcT1sFhcXjM/TgBsS5xXgyI/AAAAAAAAA-c/ep-YcwyxOiM/s1600/config.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-DcT1sFhcXjM/TgBsS5xXgyI/AAAAAAAAA-c/ep-YcwyxOiM/s1600/config.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Finally you have to enable notifications.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RVme-EzB0IA/TgBsTU6cONI/AAAAAAAAA-c/hACinD0A8q0/s1600/allownoti.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-RVme-EzB0IA/TgBsTU6cONI/AAAAAAAAA-c/hACinD0A8q0/s1600/allownoti.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It seems that FireFox will support 'Desktop notifications' soon, since it is part of the html5 specification, in the meanwhile you can install the&lt;a href="http://code.google.com/p/ff-html5notifications/"&gt; ff-html5notification&lt;/a&gt; plugin by clicking on this &lt;a href="http://cyril.me/dl/h5n/ff-html5notifications-latest-fx.xpi"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mR68D_-rLu4/TgBsT2Q6bjI/AAAAAAAAA70/DZw_H9KthQ0/s1600/regedit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-521755268694215085?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/521755268694215085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/521755268694215085'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2011/06/enabling-desktop-notifications-in-ie.html' title='Enabling Desktop Notifications in IE with chromeframe'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-mR68D_-rLu4/TgBsT2Q6bjI/AAAAAAAAA-c/vOXhd17h8M8/s72-c/regedit.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-616980746062175943</id><published>2011-01-22T00:19:00.000-08:00</published><updated>2011-12-13T08:08:05.856-08:00</updated><title type='text'>GwtQuery CSS Selectors Performance</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.08in; }a:link {  }&lt;/style&gt;  &lt;br /&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span lang="en-AU"&gt;Lately I've&lt;/span&gt; been working on the &lt;span style="color: navy;"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a href="http://gwtquery.googlecode.com/"&gt;gwtquery&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt; opensource project, a rewrite in Gwt of the popular jquery javascript library.  &lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;Like jquery, which helps javascript developers to handle DOM elements and events, gquery helps java developers to do the same, and both share the same API with almost the same methods and behaviour.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;One of the most powerful features in jquery is the ability to select elements using css selectors. In this matter, gquery improves the performance using two gwt techniques:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;Generating permutations and  selecting the more suitable engine selector for each browser .&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;Being able to analyse the css  selector at compile-time and optimize the generated code.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0in;"&gt;Based on these, Gquery generates the most appropriate strategy for each browser, not only considering performance but the final javascript size.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;One of the tasks I've faced along this time working with gquery, is to improve the performance of selectors adding new engines, testing them, and choosing the faster one for each browser.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;br /&gt;There is a &lt;span style="color: navy;"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a href="http://gwtquery.googlecode.com/svn/trunk/demos/gwtquery.samples.GwtQueryBench/GwtQueryBench.html?ask=false"&gt;benchmarking&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt; application in gwtquery to compare the performance between each engine implementation. It is inspired in the &lt;a href="http://mootools.net/slickspeed/"&gt;Slickspeed&lt;/a&gt; test, taking from it the list of selectors to compare and the DOM document.  &lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;I have run this benchmark in several combinations of browsers and operating systems, and finally I have put the results into a &lt;span style="color: navy;"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a href="https://docs.google.com/uc?id=0B-VpARgldYW0NjVmMTg0OTItY2E1MS00Y2E5LTgyOTktNzIzMzRiMTNkYzhi&amp;amp;export=download&amp;amp;hl=en_US"&gt;spreadsheet&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt; to easily compare it and generate some charts.&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.08in; }h2 { margin-bottom: 0.08in; }h2.western { font-family: "Arial",sans-serif; font-size: 14pt; font-style: italic; }h2.cjk { font-family: "DejaVu Sans"; font-size: 14pt; font-style: italic; }h2.ctl { font-family: "DejaVu Sans"; font-size: 14pt; font-style: italic; }&lt;/style&gt;  &lt;/div&gt;&lt;h2 class="western"&gt;Premises&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;I have used the browsers most used  nowadays, and the operating systems I have in my virtualbox  machines.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;I have selected a bunch of the  most popular javascript frameworks (jquery_1.3.1, dojo_1.4.3,  prototype_1.6.0.3) and javascript selectors (sizzle_1.0,  domassistant_2.7).&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;Gquery can run in two modes,  &lt;i&gt;gwt_compiled&lt;/i&gt; meaning that the compiler is able to parse each  selector used in the application and generate optimized js code, and  &lt;i&gt;gwt_dynamic&lt;/i&gt; which evaluates selectors in runtime time like  the rest of libraries.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;In browsers where native  optimizations are not available, Gquery falls back  to a pure JSNI implementation based on Sizzle.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;During my testing, I realised that  there are browsers performing worse than others, so  I had to make  three groups, and each group has a different time scale to easily  see the results.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;Newer IE8 releases comes with a  native selector which is only available in standard mode.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;The unit used in all tables and  charts is the &lt;i&gt;millisecond&lt;/i&gt;, meaning the accumulated time spent to run  each single slickspeed css selector.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 class="western" style="page-break-before: always;"&gt;Comparison between frameworks&lt;/h2&gt;&lt;div style="margin-bottom: 0in;"&gt;This table shows the results of my tests. As you can see, gwtquery in compiled mode always beats, and in general gwtquery dynamic performs better than any other library.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tPPOkAYy3B8/TTqL4EFoGvI/AAAAAAAAA-c/Ozui0SrDV_M/s1600/gq-0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://4.bp.blogspot.com/-tPPOkAYy3B8/TTqL4EFoGvI/AAAAAAAAA-c/Ozui0SrDV_M/s400/gq-0.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-rC2OO4ZtuLM/TTqL6L83BNI/AAAAAAAAA-c/jH5F6rQZpDM/s1600/gq-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="352" src="http://2.bp.blogspot.com/-rC2OO4ZtuLM/TTqL6L83BNI/AAAAAAAAA-c/jH5F6rQZpDM/s400/gq-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.08in; }h2 { margin-bottom: 0.08in; }h2.western { font-family: "Arial",sans-serif; font-size: 14pt; font-style: italic; }h2.cjk { font-family: "DejaVu Sans"; font-size: 14pt; font-style: italic; }h2.ctl { font-family: "DejaVu Sans"; font-size: 14pt; font-style: italic; }&lt;/style&gt;  &lt;/div&gt;&lt;h2 class="western"&gt;Comparison between browsers:&lt;/h2&gt;&lt;div style="margin-bottom: 0in;"&gt;This table demonstrates that there are browsers performing better than others. In general, opera, chrome, safari and firefox-3.6 handle DOM selectors very well, firefox-3.0 and IE8 (in standars mode) performs acceptable, and other versions of IE performs quite bad.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-o1Am_wq1ClI/TTqL9fIHa_I/AAAAAAAAA-c/6dW8GxdihKw/s1600/gq-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://2.bp.blogspot.com/-o1Am_wq1ClI/TTqL9fIHa_I/AAAAAAAAA-c/6dW8GxdihKw/s320/gq-2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tuLZpRxT3Yo/TTqMAQrwsDI/AAAAAAAAA-c/b5H2q1bh4w4/s1600/gq-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="117" src="http://4.bp.blogspot.com/-tuLZpRxT3Yo/TTqMAQrwsDI/AAAAAAAAA-c/b5H2q1bh4w4/s320/gq-3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;style type="text/css"&gt;p { margin-bottom: 0.08in; }h2 { margin-bottom: 0.08in; }h2.western { font-family: "Arial",sans-serif; font-size: 14pt; font-style: italic; }h2.cjk { font-family: "DejaVu Sans"; font-size: 14pt; font-style: italic; }h2.ctl { font-family: "DejaVu Sans"; font-size: 14pt; font-style: italic; }&lt;/style&gt;  &lt;br /&gt;&lt;h2 class="western"&gt;Conclusions&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;GwtQuery in compiled mode is the faster javascript library to  select dom elements.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;GwtQuery dynamic selectors are, in most cases, faster or  equal than any other library.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;GwtQuery performs better than its brother jQuery.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sizzle is faster than other libraries, this is the reason why  gwtquery fall back js implementation is based on it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The javascript produced by the Gwt compiler performs well,  and normally better than the javascript written by hand.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There are considerable differences between the performance of  different browsers. The most significant is the behaviour of IE,  although last changes introduced in IE8 are promising.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Gecko browsers perform worst than browsers based on webkit,  nevertheless the version used in FF-3.6 has many improvements.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-616980746062175943?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/616980746062175943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/616980746062175943'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2011/01/gwtquery-css-selectors-performance.html' title='GwtQuery CSS Selectors Performance'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-tPPOkAYy3B8/TTqL4EFoGvI/AAAAAAAAA-c/Ozui0SrDV_M/s72-c/gq-0.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-6719497428305437425</id><published>2010-11-24T05:37:00.000-08:00</published><updated>2011-12-13T08:08:51.095-08:00</updated><title type='text'>Minino linux 1.2 comes with LXP wm.</title><content type='html'>Some time ago I was involved in a project to develop a Linux windows manager almost identical to Windows XP, I took as base icewm and developed LookXP a.k.a. &lt;a href="http://lxp.sf.net/"&gt;LXP&lt;/a&gt;.&lt;br /&gt;The main reason to do that was to install computers in public areas like hotels and business centers, and most people don't realise any difference with the computers they were in the habit of using.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://minino.galpon.org/"&gt;Minino&lt;/a&gt; which is a Spanish pet name for little cats, is a lightweight linux distribution thought to be installed in computers with low resources and especially designed for schools, it is easy to use, it is plenty of features, and it is supported by many Spanish foundations and organizations.&lt;br /&gt;In its last release, Minino developers have decided to include LXP because it has few resources requirements, and it is fully configurable. They have made a good work creating a new customized theme as you can see in this screen-shot:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WrN8W9ckARI/TO0IMpXsoII/AAAAAAAAA-c/PrvdBns7B60/s1600/minino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="476" src="http://3.bp.blogspot.com/-WrN8W9ckARI/TO0IMpXsoII/AAAAAAAAA-c/PrvdBns7B60/s640/minino.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;You can download and try Minino from &lt;a href="http://minino.galpon.org/wiki/doku.php?id=galpon_minino_characteristics"&gt;here.&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you are curious, here you have a screen-shot of LXP running a XP theme:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DSTHCcsjGLg/TO0U2rSO97I/AAAAAAAAA-c/y9X7aHJxM08/s1600/lxp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/-DSTHCcsjGLg/TO0U2rSO97I/AAAAAAAAA-c/y9X7aHJxM08/s640/lxp.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-6719497428305437425?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6719497428305437425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6719497428305437425'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/11/minino-distribution-12-comes-with-lxp.html' title='Minino linux 1.2 comes with LXP wm.'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-WrN8W9ckARI/TO0IMpXsoII/AAAAAAAAA-c/PrvdBns7B60/s72-c/minino.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-1216964701780546478</id><published>2010-10-27T06:58:00.000-07:00</published><updated>2011-01-22T02:02:48.553-08:00</updated><title type='text'>Giving a GWT talk in Castellon</title><content type='html'>This week I'm giving a conference in the event 'IV Encuentros de Programadores Java'. &lt;br /&gt;&lt;br /&gt;This year the topic of the event is RIA applications, a matter awakening much interest lately.&lt;br /&gt;&lt;br /&gt;If you are interested in the event visit this &lt;a href="http://decharlas.com/"&gt;page&lt;/a&gt; to register. Also, you should &lt;a href="http://www.paradigmatecnologico.com/blog/trabajar-gwt-configurar-entorno-crear-proyecto-maven/"&gt;pre-configure&lt;/a&gt; your laptop to attend the workshop.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;[EDITED]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/resources/gwt/gwt.pdf" target="_blank"&gt;Presentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/resources/gwt/ejercicios.pdf" target="_blank"&gt;Examples plan&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/resources/gwt/proyecto.zip" target="_blank"&gt;Examples sources&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://player.vimeo.com/video/16528719?portrait=0" target="_blank"&gt;Video&lt;/a&gt;&lt;/li&gt;&lt;iframe frameborder="0" height="366" src="http://player.vimeo.com/video/16528719?portrait=0" width="478"&gt;&lt;/iframe&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-1216964701780546478?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/1216964701780546478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/1216964701780546478'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/10/giving-gwt-talk-in-castellon.html' title='Giving a GWT talk in Castellon'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-8557516546425258835</id><published>2010-07-09T11:19:00.000-07:00</published><updated>2010-10-07T02:05:02.275-07:00</updated><title type='text'>Using maven with the milestone of GWT-2.1.0</title><content type='html'>Gwt version 2.1.0 is coming soon with many improvements, as I already said in other &lt;a href="http://www.blogger.com/"&gt;post&lt;/a&gt;, now it is possible to create a new maven project using the provided command webAppCreator.&lt;br /&gt;&lt;br /&gt;But right now, there are a couple of things you must put in your pom in order to use the new feature:&lt;br /&gt;&lt;ol&gt;&lt;li&gt; You have to add the Gwt repository until the new release was published in the Central maven repositories.&lt;/li&gt;&lt;li&gt;You have to use the snapshot version of the maven-gwt-plugin since the last version does not recognize 2.1.0 as a valid gwt version.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;NOTE: &lt;/b&gt;You have to camellize the tags because blogger sometimes convert it to lowercase. &lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;dependency&gt;&lt;br /&gt;    &lt;groupid&gt;com.google.gwt&lt;/groupid&gt;&lt;br /&gt;    &lt;artifactid&gt;gwt-user&lt;/artifactid&gt;&lt;br /&gt;    &lt;version&gt;2.1-SNAPSHOT&lt;/version&gt;&lt;br /&gt;    &lt;scope&gt;provided&lt;/scope&gt;&lt;br /&gt;  &lt;/dependency&gt;&lt;br /&gt;&lt;br /&gt;  &lt;repositories&gt;&lt;br /&gt;    &lt;repository&gt;&lt;br /&gt;      &lt;id&gt;gwt.milestone&lt;/id&gt;&lt;br /&gt;      &lt;url&gt;http://google-web-toolkit.googlecode.com/svn/2.1.0.M3/gwt/maven&lt;/url&gt;&lt;br /&gt;    &lt;/repository&gt;&lt;br /&gt;  &lt;/repositories&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pluginrepositories&gt;&lt;br /&gt;    &lt;pluginrepository&gt;&lt;br /&gt;      &lt;id&gt;codehaus.snapshots&lt;/id&gt;&lt;br /&gt;      &lt;url&gt;http://snapshots.repository.codehaus.org/&lt;/url&gt;&lt;br /&gt;    &lt;/pluginrepository&gt;&lt;br /&gt;  &lt;/pluginrepositories&gt;&lt;br /&gt;&lt;br /&gt;  &lt;build&gt;&lt;br /&gt;    &lt;plugins&gt;&lt;br /&gt;      &lt;plugin&gt;&lt;br /&gt;        &lt;groupid&gt;org.codehaus.mojo&lt;/groupid&gt;&lt;br /&gt;        &lt;artifactid&gt;gwt-maven-plugin&lt;/artifactid&gt;&lt;br /&gt;        &lt;version&gt;1.3-SNAPSHOT&lt;/version&gt;&lt;br /&gt;        [...]&lt;br /&gt;      &lt;/plugin&gt;&lt;br /&gt;    &lt;/plugins&gt;&lt;br /&gt;  &lt;/build&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-8557516546425258835?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/8557516546425258835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/8557516546425258835'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/07/using-maven-with-milestones-of-gwt-210.html' title='Using maven with the milestone of GWT-2.1.0'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-780380154461579208</id><published>2010-06-22T01:11:00.000-07:00</published><updated>2010-10-07T02:55:39.131-07:00</updated><title type='text'>Counting lines of code</title><content type='html'>A mate of mine asked me how could he count the lines of a project. I said that an easy way is just to use &lt;b&gt;unix&lt;/b&gt; command line utilities and I proposed just this line:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;find . -name *.java -exec grep -v -P \&lt;br /&gt;    "^[\s]*(\*|//|/\*|import|$)" \&lt;br /&gt;    '{}' ';' | wc -l&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But what does it?&lt;br /&gt;- First if finds all java files an print them to the standard output.&lt;br /&gt;- Then it removes empty, import and comment lines.&lt;br /&gt;- Finally it count the lines.&lt;br /&gt;&lt;br /&gt;After a while, I though that &lt;b&gt;perl&lt;/b&gt; could be used to discard comments more accurately. So I produced this command line replacing grep by perl:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;find . -name "*.java" -exec perl -n -e \&lt;br /&gt;   '$i=1 if(/^\s*\/\*/);print $_ if(!$i &amp;amp;&amp;amp; !/^\s*(\/\/|import|$)/);$i=0 if($i &amp;amp;&amp;amp; /\*\//)' \&lt;br /&gt;   '{}' ';' | wc -l&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally someone pointed to me to check &lt;b&gt;sloccount&lt;/b&gt;, a command-line tool able not only to count lines but also to estimate the effort and the cost in dollars. Take a look to the results of the gwtupload library:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ sloccount gwtupload-project&lt;br /&gt;[...] &lt;br /&gt;SLOC Directory SLOC-by-Language (Sorted)&lt;br /&gt;4346    samples-gae     java=3966,xml=380&lt;br /&gt;3048    core            java=2956,xml=92&lt;br /&gt;1360    jsupload        java=608,perl=551,xml=201&lt;br /&gt;704     gae             java=614,xml=81,sh=9&lt;br /&gt;615     samples         java=403,xml=212&lt;br /&gt;569     tomcat          xml=569&lt;br /&gt;512     top_dir         xml=482,sh=30&lt;br /&gt;&lt;br /&gt;Totals grouped by language (dominant language first):&lt;br /&gt;java:          8547 (76.63%)&lt;br /&gt;xml:           2017 (18.08%)&lt;br /&gt;perl:           551 (4.94%)&lt;br /&gt;sh:              39 (0.35%)&lt;br /&gt;&lt;br /&gt;Total Physical Source Lines of Code (SLOC)                = 11,154&lt;br /&gt;Development Effort Estimate, Person-Years (Person-Months) = 2.52 (30.20)&lt;br /&gt; (Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))&lt;br /&gt;Schedule Estimate, Years (Months)                         = 0.76 (9.13)&lt;br /&gt; (Basic COCOMO model, Months = 2.5 * (person-months**0.38))&lt;br /&gt;Estimated Average Number of Developers (Effort/Schedule)  = 3.31&lt;br /&gt;Total Estimated Cost to Develop                           = $ 339,973&lt;br /&gt; (average salary = $56,286/year, overhead = 2.40).&lt;br /&gt;[...]&lt;br /&gt;Please credit this data as "generated using David A. Wheeler's 'SLOCCount'."&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-780380154461579208?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/780380154461579208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/780380154461579208'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/06/counting-lines-of-code.html' title='Counting lines of code'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-3291859280823935676</id><published>2010-06-21T23:45:00.000-07:00</published><updated>2010-06-21T23:48:39.132-07:00</updated><title type='text'>Podcasts about Security</title><content type='html'>A podcast in two parts has been published at Javahispano. In this podcast Abraham, Jorge and me talk about different kinds of vulnerabilities, anecdotes, and many interesting issues related with the security not only at big Companies or in the Internet, but those problems at home (wifi, phising, etc).&lt;br /&gt;The podcasts are a bit large, but quite fun.&lt;br /&gt;&lt;br /&gt;We spoke in Spanish and you can get they from these links: &lt;a href="http://www.javahispano.org/contenidos/es/javahispano_podcast__086__introduccion_a_la_seguridad_informatica_i/"&gt;Part_I&lt;/a&gt; &amp;amp; &lt;a href="http://www.javahispano.org/contenidos/es/javahispano_podcast__087__introduccion_a_la_seguridad_informatica_ii/?menuId=JH_PODCASTS"&gt;Part_II&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope you like them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-3291859280823935676?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/3291859280823935676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/3291859280823935676'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/06/podcasts-about-security.html' title='Podcasts about Security'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-1968898623252811975</id><published>2010-05-25T11:56:00.000-07:00</published><updated>2010-05-25T12:05:38.665-07:00</updated><title type='text'>Latest GWT 'webAppCreator' is able to produce maven projects.</title><content type='html'>"webAppCreator" is the utility provided by GWT to create new projects. It creates a new module with the name and namespace the user desires and put enought stuff to start a new GWT project: static html page, css sheet, entry point, rpcs, tests, ant and eclipse configuraion files, and so on.&lt;br /&gt;&lt;br /&gt;I have missed ever in this tool the ability to setup the pom.xml file for a maven project. Maven is widely used in most java projects, and it was a pain to create your pom.xml file from scratch each time you create a new GWT project.&lt;br /&gt;&lt;br /&gt;Last time I gave a talk about the basis of GWT I had to explain how to do this by hand, and I said that It would be easy to add this feature, so I went ahead with it and I produced a &lt;a href="http://code.google.com/p/google-web-toolkit/source/detail?r=8207#"&gt;patch &lt;/a&gt;which has been included lately in the GWT core.&lt;br /&gt;&lt;br /&gt;Although the feature will not be abailable until the next GWT release, fortunately &lt;a href="http://code.google.com/intl/es/webtoolkit/download_2_1_m1.html"&gt;GWT-2.1.0&lt;/a&gt; is comming soon since millestone one has been already published.&lt;br /&gt;&lt;br /&gt;To start a new GWT project from scratch just type:&lt;br /&gt;&lt;pre class="linux"&gt;$ webAppCreator -maven -noant com.example.MyApplication&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-1968898623252811975?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/1968898623252811975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/1968898623252811975'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/05/latest-gwt-webappcreator-is-able-to.html' title='Latest GWT &apos;webAppCreator&apos; is able to produce maven projects.'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-4079931085763375553</id><published>2010-05-09T23:28:00.000-07:00</published><updated>2011-12-13T08:10:43.683-08:00</updated><title type='text'>GWT MVP, blending stuff: presenter, dispatch, gin, guice, tests, maven</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Lately, GWT is being considered one of the best alternatives to produce large client side web applications. Maybe, the main reason to this is the use of patterns like Model-View-Presenter (MVP), EventBus, Command-Pattern, etc, which makes the Gwt development really easy and fast.&lt;br /&gt;These rules and best practices were presented by Ray Ryan at last &lt;a href="http://code.google.com/intl/es/events/io/2009/sessions/GoogleWebToolkitBestPractices.html"&gt;Google I/O&lt;/a&gt;, and the main consecuence was the growth of nice libraries which incredibly help you to produce huge Gwt applications.&lt;br /&gt;&lt;br /&gt;Unfortunately there is not good documentation nor examples to learn how to blend all these components in your project. Taking the project &lt;a href="http://james.apache.org/hupa"&gt;Hupa&lt;/a&gt; as a reference, I have re-factored the Google &lt;a href="http://code.google.com/intl/es/webtoolkit/articles/mvp-architecture.html"&gt; Contacts&lt;/a&gt; MVP project in order to show how to integrate &lt;a href="http://code.google.com/p/gwt-presenter/"&gt;gwt-presenter,&lt;/a&gt; &lt;a href="http://code.google.com/p/gwt-dispatch/"&gt;gwt-dispatch&lt;/a&gt;, &lt;a href="http://code.google.com/p/google-gin/"&gt;google-gin&lt;/a&gt; and &lt;a href="http://code.google.com/p/google-guice/"&gt;google-guice&lt;/a&gt;. I have coded JRE tests covering all the presenters, and GWT tests to demonstrate that views and RPCs can also be tested with functional tests. I have put everything in a project handled with maven  and eclipse. &lt;br /&gt;&lt;br /&gt;I prepared this work to my last Gwt presentation and it is shared in google code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="linux"&gt;svn checkout http://gwt-workshop.&lt;wbr&gt;&lt;/wbr&gt;googlecode.com/svn/trunk/GwtWsMvpContacts&lt;br /&gt;mvn clean test gwt:run package&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The main reason to adopt this patterns is the ability to tests almost the code of your application in the JVM. This report in Hudson demonstrate that almost everything can be tested in GWT.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ODn1sTunO2I/S-epRXor9sI/AAAAAAAAA-c/LomygE7rT7E/s1600/Emma-GwtWsMvp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="476" src="http://2.bp.blogspot.com/-ODn1sTunO2I/S-epRXor9sI/AAAAAAAAA-c/LomygE7rT7E/s640/Emma-GwtWsMvp.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-4079931085763375553?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4079931085763375553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4079931085763375553'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/05/gwt-mvp-blending-stuff-gwt-presenter.html' title='GWT MVP, blending stuff: presenter, dispatch, gin, guice, tests, maven'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ODn1sTunO2I/S-epRXor9sI/AAAAAAAAA-c/LomygE7rT7E/s72-c/Emma-GwtWsMvp.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-8439121412319975730</id><published>2010-04-05T01:09:00.000-07:00</published><updated>2010-04-05T01:12:38.564-07:00</updated><title type='text'>Spanish translation of Hudson</title><content type='html'>Many weeks ago I started the task of&amp;nbsp;&lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Internationalization"&gt;translating&lt;/a&gt; Hudson to Spanish.&lt;br /&gt;Although it is a hard work it has helped me to know and understand all the corners of this awesome CI application.&lt;br /&gt;&lt;br /&gt;Instead of having an unique repository of key-values pairs, Hudson has hundreds of internationalizable files distributed along the sources which you have to copy and edit by hand, making the work very heavy.&lt;br /&gt;This was the reason why I decided to code a small tool: &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Translation+Tool"&gt;translation-tool.pl&lt;/a&gt; which has helped me a lot, and which is able to look for missing keys and files, print statistics about the progress, batch edition, and much more.&lt;br /&gt;&lt;br /&gt;Another problem in translating an application is to find the adequate words in your language to express the original idea; for instance the words `build`, `Dashboard`, `fingerprint` in English sound weird in Spanish for this context. I have written a &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Spanish+Translation"&gt;wiki page&lt;/a&gt; with the status of the Spanish translation where people can leave their opinions and suggestions, so if you speak Spanish, please feel free to collaborate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-8439121412319975730?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/8439121412319975730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/8439121412319975730'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/04/spanish-translation-of-hudson.html' title='Spanish translation of Hudson'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-4884505064751919566</id><published>2010-03-16T02:14:00.000-07:00</published><updated>2010-03-16T02:16:10.865-07:00</updated><title type='text'>Podcasts in JavaHispano</title><content type='html'>&lt;a href="http://javahispano.org/"&gt;JavaHispano.org&lt;/a&gt; is one of the best sites in Internet about technologies related with java.&amp;nbsp;The site uses Spanish as the official language because there are many people interested in technologies which are not good at English.&amp;nbsp;One of the best points in the site are the podcasts they normally publish once a week.&lt;br /&gt;&lt;br /&gt;JavaHispano guys have given me the&amp;nbsp;opportunity to collaborate with them and I have participated in two podcasts, one about &lt;a href="http://www.javahispano.org/contenidos/es/javahispano_podcast__073__programacion_con_gwt_google_web_toolkit/"&gt;GWT&lt;/a&gt; and another about &lt;a href="http://www.javahispano.org/contenidos/es/javahispano_podcast__078__introduccion_a_integracion_continua/?menuId=JH_PODCASTS"&gt;Continuous Integration&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I&amp;nbsp;encourage them to continue doing this invaluable&amp;nbsp;work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-4884505064751919566?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4884505064751919566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4884505064751919566'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/03/podcasts-in-javahispano.html' title='Podcasts in JavaHispano'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-7440110047351249225</id><published>2010-03-11T07:32:00.000-08:00</published><updated>2010-03-11T07:34:28.770-08:00</updated><title type='text'>Jetty includes my fix for a bug in URL session tracking</title><content type='html'>Months ago I sent a &lt;a href="http://jira.codehaus.org/browse/JETTY-1133"&gt;patch&lt;/a&gt; to jetty guys which fixes an issue I spotted related with the URL session tracking.&lt;br /&gt;Basically the the origin of the problem was that Jetty didn't expect more than one parameter in the URI part reserved for the session identifier, even though there are several applications using this part for handling special&amp;nbsp;parameters, and not only the session id.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-7440110047351249225?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7440110047351249225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7440110047351249225'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/03/jetty-includes-my-fix-for-bug-in-url.html' title='Jetty includes my fix for a bug in URL session tracking'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-7423416773241127483</id><published>2010-03-06T01:25:00.000-08:00</published><updated>2010-03-06T01:30:00.614-08:00</updated><title type='text'>Hudson JMeter-plugin renamed to Performance-plugin</title><content type='html'>JMeter-plugin is a nice way of running jmeter tests and publishing the performance data in Hudson, take a look to this&amp;nbsp;&lt;a href="http://manolocarrasco.blogspot.com/2009/12/hudsons-jmeter-plugin-030-released.html"&gt;post&lt;/a&gt;&amp;nbsp;I did sometime ago.&lt;br /&gt;Said that, the good news are that we have added to the plugin the ability to collect and parse data from other sources like junit xml reports, and &amp;nbsp;this is the reason why the plugin has been renamed to &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Performance+Plugin"&gt;Performance-plugin&lt;/a&gt;&amp;nbsp;which is a more generic name.&lt;br /&gt;In the plugin's page you have a procedure to migrate your existing data from jmeter to performance plugin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-7423416773241127483?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7423416773241127483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7423416773241127483'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/03/hudson-jmeter-plugin-renamed-to.html' title='Hudson JMeter-plugin renamed to Performance-plugin'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-3362222648796430846</id><published>2010-02-22T14:36:00.000-08:00</published><updated>2011-12-13T08:15:28.263-08:00</updated><title type='text'>Running and monitoring batch processes in Hudson</title><content type='html'>Hudson is not only an excellent tool for running and monitoring software builds, but also for running any periodic process: software updates, batch and maintenance scripts, backups, etc.&lt;br /&gt;&lt;br /&gt;Last week I participated in a 'javahispano.org' podcast where I talked about the goodness of Continuous Integration and Hudson, and I said that it is recommendable to move most automatic maintenance scripts from crontabs to Hudson.&lt;br /&gt;&lt;br /&gt;This can be easily achieved by writing a simple shell script which contains the set of processes to execute periodically and which saves results into junit reports, so that Hudson will be able to record the exit status, the standard and error outputs,&amp;nbsp; and the time lasted by each command, as is shown in this screenshot:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-AcEgY-CNeQM/S4LodyCe1zI/AAAAAAAAA-c/yR-uldINJkQ/s1600/sh2ju-5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://4.bp.blogspot.com/-AcEgY-CNeQM/S4LodyCe1zI/AAAAAAAAA-c/yR-uldINJkQ/s640/sh2ju-5.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I use a simple shell script library I wrote time ago. It generates a junit report using the same technique that surefire does in maven putting all xml files in a folder. You can get the script library from &lt;a href="http://code.google.com/p/shell2junit/downloads/list"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The usage of the library is very easy, just include it at the beginning of your shell script and call the method 'juLog' each time you want to report anything to Hudson.&amp;nbsp; I think a simple example is a bit more instructive:&lt;br /&gt;&lt;br /&gt;&lt;pre class="ror" name="code"&gt;#/bin/sh&lt;br /&gt;&lt;br /&gt;#### Include the library&lt;br /&gt;. `dirname $0`/sh2ju.sh&lt;br /&gt;&lt;br /&gt;#### Clean old reports&lt;br /&gt;juLogClean&lt;br /&gt;#### Success command&lt;br /&gt;juLog  -name=myTrueCommand true&lt;br /&gt;#### Failure&lt;br /&gt;juLog  -name=myFalseCommand false&lt;br /&gt;#### Sleep&lt;br /&gt;juLog  -name=mySleepCommand sleep 5&lt;br /&gt;#### The test fails because the word 'world' is found in command output&lt;br /&gt;juLog  -name=myErrorCommand -ierror=world   echo Hello World&lt;br /&gt;#### A sql command&lt;br /&gt;juLog  -name=mySqlCommand psql -h localhost -U postgres -c 'select now()'&lt;br /&gt;#### A call to a customized method&lt;br /&gt;myCmd() {&lt;br /&gt;   ls -l $*&lt;br /&gt;   return 0&lt;br /&gt;}&lt;br /&gt;juLog  -name=myCustomizedMethod myCmd '*.sh'&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally configure Hudson folowing these steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create a free-style project&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-f5iO-B_GDuo/S4Ln_yacuDI/AAAAAAAAA-c/E8T83RA7FAI/s1600/sh2ju-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://2.bp.blogspot.com/-f5iO-B_GDuo/S4Ln_yacuDI/AAAAAAAAA-c/E8T83RA7FAI/s640/sh2ju-1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Put your script and the library in SCM&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ND7pIRF4SZA/S4LoN_78AoI/AAAAAAAAA-c/3DTiOLVnIfs/s1600/sh2ju-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="122" src="http://2.bp.blogspot.com/-ND7pIRF4SZA/S4LoN_78AoI/AAAAAAAAA-c/3DTiOLVnIfs/s640/sh2ju-2.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Chosse execute a shell as build method&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-vRTPlvIn990/S4LoTAi8otI/AAAAAAAAA-c/OUglpGkkG38/s1600/sh2ju-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="82" src="http://1.bp.blogspot.com/-vRTPlvIn990/S4LoTAi8otI/AAAAAAAAA-c/OUglpGkkG38/s640/sh2ju-3.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Run it periodically&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-u74KTpsonfw/S4NzkRibVKI/AAAAAAAAA-c/aGfP0f7fxns/s1600/sh2ju-6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="90" src="http://1.bp.blogspot.com/-u74KTpsonfw/S4NzkRibVKI/AAAAAAAAA-c/aGfP0f7fxns/s640/sh2ju-6.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Publish Junit results&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--YsQ7smk8MM/S4LoY2a-rjI/AAAAAAAAA-c/scWdSEN61_Q/s1600/sh2ju-4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="48" src="http://2.bp.blogspot.com/--YsQ7smk8MM/S4LoY2a-rjI/AAAAAAAAA-c/scWdSEN61_Q/s640/sh2ju-4.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-3362222648796430846?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/3362222648796430846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/3362222648796430846'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/02/hudson-publish-bach.html' title='Running and monitoring batch processes in Hudson'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-AcEgY-CNeQM/S4LodyCe1zI/AAAAAAAAA-c/yR-uldINJkQ/s72-c/sh2ju-5.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-1048579130658129823</id><published>2010-01-07T01:12:00.000-08:00</published><updated>2010-01-07T01:35:00.715-08:00</updated><title type='text'>Hudson and Jetty, avoiding the error: IllegalStateException, Form too large</title><content type='html'>Hudson comes packed in an 'out of the box' war file which works fine just putting it in the 'webapps' folder of any servlet container. Unfortunately jetty has a restriction which makes some hudson's features fail, this constrain is the max size allowed for a posted form request, which comes configured with a default value of 200,000 Bytes, since hudson sends sometimes ajax requests quite larger. This failure produces messages in jetty log files like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="linux"&gt;java.lang.IllegalStateException: Form too large 218722&gt;200000&lt;br /&gt; at org.eclipse.jetty.server.Request.extractParameters(Request.java:256)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To avoid this error, just create a configuration file for hudson in the contexts folder of jetty: &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Configure class="org.eclipse.jetty.webapp.WebAppContext"&amp;gt;&lt;br /&gt;  &amp;lt;Set name="contextPath"&amp;gt;/hudson&amp;lt;/Set&amp;gt;&lt;br /&gt;  &amp;lt;Set name="war"&amp;gt;&amp;lt;Systemproperty name="jetty.home" default="."/&amp;gt;/webapps/hudson.war&amp;lt;/Set&amp;gt;&lt;br /&gt;  &amp;lt;Set name="maxFormContentSize" type="int"&amp;gt;600000&amp;lt;/Set&amp;gt;&lt;br /&gt; &amp;lt;/Configure&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-1048579130658129823?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/1048579130658129823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/1048579130658129823'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2010/01/hudson-and-jetty-avoiding-error.html' title='Hudson and Jetty, avoiding the error: IllegalStateException, Form too large'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-2425466974983784495</id><published>2009-12-19T23:09:00.000-08:00</published><updated>2011-12-13T08:02:10.893-08:00</updated><title type='text'>Hudson's Jmeter plugin 0.3.0 released</title><content type='html'>I'm pleased to announce release 0.3.0 of Hudson's Jmeter plugin. It includes some fixes, and very cool features. For instance, the plugin is now able to handle multiple tests in the same job and it can be configured using threshold parameters to mark a build as unstable or failed.&lt;br /&gt;&lt;br /&gt;The simpler way to use it is with ant, follow these simple steps to create a new job:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Install jMeter an run it in graphic mode.&lt;/li&gt;&lt;li&gt;Create as many jmeter tests as services you want to check, and add to each test the assertions which would make it fail. &lt;/li&gt;&lt;li&gt;Put all these tests together in the folder 'test/jmeter'&lt;/li&gt;&lt;li&gt;Create a build.xml specifying the path to jmeter:&lt;/li&gt;&lt;/ul&gt;&lt;pre class="xml" name="code"&gt;&amp;lt;project default="all"&amp;gt;&lt;br /&gt;  &amp;lt;property name="jmeter-home" location="/usr/local/jmeter"/&amp;gt;&lt;br /&gt;  &amp;lt;path id="ant.jmeter.classpath"&amp;gt;&lt;br /&gt;    &amp;lt;pathelement&lt;br /&gt;       location="${jmeter-home}/extras/ant-jmeter-1.0.9.jar" /&amp;gt;&lt;br /&gt;  &amp;lt;/path&amp;gt;&lt;br /&gt;  &amp;lt;taskdef&lt;br /&gt;    name="jmeter"&lt;br /&gt;    classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"&lt;br /&gt;    classpathref="ant.jmeter.classpath" /&amp;gt;&lt;br /&gt;  &amp;lt;target name="clean"&amp;gt;&lt;br /&gt;    &amp;lt;delete dir="results"/&amp;gt;&lt;br /&gt;    &amp;lt;delete file="jmeter.log"/&amp;gt;&lt;br /&gt;    &amp;lt;mkdir dir="results/jtl"/&amp;gt;&lt;br /&gt;    &amp;lt;mkdir dir="results/html"/&amp;gt;&lt;br /&gt;  &amp;lt;/target&amp;gt;&lt;br /&gt;  &amp;lt;target name="test" depends="clean"&amp;gt;&lt;br /&gt;    &amp;lt;jmeter&lt;br /&gt;       jmeterhome="${jmeter-home}"&lt;br /&gt;       resultlogdir="results/jtl"&amp;gt;&lt;br /&gt;      &amp;lt;testplans dir="test/jmeter" includes="*.jmx"/&amp;gt;&lt;br /&gt;    &amp;lt;/jmeter&amp;gt;&lt;br /&gt;  &amp;lt;/target&amp;gt;&lt;br /&gt;  &amp;lt;target name="report" depends="test"&amp;gt;&lt;br /&gt;    &amp;lt;xslt&lt;br /&gt;       basedir="results/jtl"&lt;br /&gt;       destdir="results/html"&lt;br /&gt;       includes="*.jtl"&lt;br /&gt;       style="${jmeter-home}/extras/jmeter-results-detail-report_21.xsl"/&amp;gt;&lt;br /&gt;  &amp;lt;/target&amp;gt;&lt;br /&gt;  &amp;lt;target name="all" depends="report"/&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;In Hudson, create a new free-style software project and configure it:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-c7nL-xzqHlQ/Sy3ZO7AopCI/AAAAAAAAA-c/zqHnAaRYjnw/s1600/jmeter.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-c7nL-xzqHlQ/Sy3ZO7AopCI/AAAAAAAAA-c/zqHnAaRYjnw/s1600/jmeter.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-2425466974983784495?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2425466974983784495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2425466974983784495'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/12/hudsons-jmeter-plugin-030-released.html' title='Hudson&apos;s Jmeter plugin 0.3.0 released'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-c7nL-xzqHlQ/Sy3ZO7AopCI/AAAAAAAAA-c/zqHnAaRYjnw/s72-c/jmeter.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-2671905700203604046</id><published>2009-12-07T01:24:00.000-08:00</published><updated>2009-12-07T02:01:02.003-08:00</updated><title type='text'>Apache-Hupa webmail</title><content type='html'>Hupa is the name of Apache-James' webmail. The name has been selected in respect to the American tribe, and it means in its native language &lt;i&gt;'the tribe on both ways'&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;This cool webmail is being developed using java in the server side and GWT for the javascript, and the idea is to have an open-source email client with most of the best characteristics of gmail and usable with any email server. &lt;br /&gt;&lt;br /&gt;Right now, Hupa supports IMAP message sources and it performances well, but it is thought to support any James-server storage system in order to improve speed and produce an out-of-the-box package which includes james email server and the webmail.&lt;br /&gt;&lt;br /&gt;There is not any official version yet, but the svn code is quite usable. If you want to play with Hupa, you can get the code from &lt;a href="https://svn.apache.org/repos/asf/james/hupa/trunk"&gt; svn&lt;/a&gt; and package the application with maven. Take a look to the README.txt file in the root folder in order to know how to configure it to use your own server. By default it comes configured to use gmail imap enabled accounts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-2671905700203604046?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2671905700203604046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2671905700203604046'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/12/apache-hupa-webmail.html' title='Apache-Hupa webmail'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-2628761003033835456</id><published>2009-11-23T03:14:00.000-08:00</published><updated>2009-12-02T13:57:19.422-08:00</updated><title type='text'>Become a Hudson committer</title><content type='html'>As you know, weeks ago I sent a large patch modifing Hudson's jmeter plugin. I wrote an entry in this blog explaining what this patch does. Hudson's guys have accepted it, and they have given me write access to the repository.&lt;br /&gt;&lt;br /&gt;Definitively, I think that the fact of allowing people to commit code easily, helps opensource growth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-2628761003033835456?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2628761003033835456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2628761003033835456'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/11/im-hudson-committer.html' title='Become a Hudson committer'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-6564286928374699033</id><published>2009-11-23T02:39:00.000-08:00</published><updated>2009-11-24T10:47:02.113-08:00</updated><title type='text'>Apache Software Foundation (ASF) Committer</title><content type='html'>I'm pleased to announce that I've become being an &lt;a href="http://people.apache.org/committers.html"&gt;ASF committer&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;I've been contributing actively in &lt;a href="http://james.apache.org/hupa/index.html"&gt;Hupa&lt;/a&gt; project last months. Hupa is a webmail client written in java and it uses the most innovative technologies in Rich Internet Applications (RIA) design: Google web tookkit (GWT) and Model View Presenter (MVP). The project has been included in the &lt;a href="http://james.apache.org/"&gt;Apache-James&lt;/a&gt; project recently.&lt;br /&gt;&lt;br /&gt;I want to thank to Norman Maurer and the other James team members for selecting me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-6564286928374699033?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6564286928374699033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6564286928374699033'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/11/apache-software-foundation-asf.html' title='Apache Software Foundation (ASF) Committer'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-9218077010335508150</id><published>2009-11-15T15:28:00.000-08:00</published><updated>2009-11-19T03:28:37.267-08:00</updated><title type='text'>GWT: Client-side vs Server-side locale selection</title><content type='html'>&lt;span id="goog_1258321744106"&gt;&lt;/span&gt;&lt;span id="goog_1258321744107"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;When you deploy a GWT application which uses I18N, gwt's compiler generates a file for each browser-language pair. So, before the application is loaded, it is necessary to load a minimal amount of javascript code which figures out which is the appropriate file for this user to load.&lt;br /&gt;&lt;br /&gt;Right now, the Gwt algorithm used for language detection, only considers the language parameter in the url, the locale meta-tag,&amp;nbsp; and the javascript variable __gwt_Locale. With these options, the developer has to provide whether links to the user to select the adequate language, or server-side code able to read the Accept-Language header, which has to be called before the gwt application is loaded.&amp;nbsp; Take a look to this &lt;a href="http://cyrillakech.blogspot.com/2009_01_01_archive.html"&gt;post&lt;/a&gt; to know exactly how to do the server-side language detection.&lt;br /&gt;&lt;br /&gt;However, it is possible to know the language the user is using asking the browser as is explained in this &lt;a href="http://stackoverflow.com/questions/1043339/javascript-for-detecting-browser-language-preference"&gt;page&lt;/a&gt;.&lt;br /&gt;The language reported by the browser is just the language used for the application (menus, messages, etc), and not the Accept-Language header, but it covers a hight percentage of cases. It works fine when an user selects the language at login time in linux, Mac, other un*x, and with the default user's language in windows.&lt;br /&gt;&lt;br /&gt;So, simply adding the code below to your .gwt.xml file, your application will select the correct language for most user cases, and you don't need to add complex stuff to do the selection in server side.&lt;br /&gt;&lt;br /&gt;I have sent a &lt;a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=4228"&gt;patch&lt;/a&gt; to gwt guys which I expect could be included soon in the official trunk. &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="html"&gt;&amp;lt;property-provider name="locale"&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;      try {&lt;br /&gt;      var locale;&lt;br /&gt;      // Look for the locale as a url argument&lt;br /&gt;      if (locale == null) {&lt;br /&gt;        var args = location.search;&lt;br /&gt;        var startLang = args.indexOf("locale=");&lt;br /&gt;        if (startLang &amp;gt;= 0) {&lt;br /&gt;          var language = args.substring(startLang);&lt;br /&gt;          var begin = language.indexOf("=") + 1;&lt;br /&gt;          var end = language.indexOf("&amp;amp;");&lt;br /&gt;          if (end == -1) {&lt;br /&gt;            end = language.length;&lt;br /&gt;          }&lt;br /&gt;          locale = language.substring(begin, end);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;      if (locale == null) {&lt;br /&gt;        // Look for the locale on the web page&lt;br /&gt;        locale = __gwt_getMetaProperty("locale")&lt;br /&gt;      }&lt;br /&gt;      if (locale == null) {&lt;br /&gt;        // Look for an override computed by other means in the selection script&lt;br /&gt;        locale = $wnd['__gwt_Locale'];&lt;br /&gt;      }&lt;br /&gt;      if (locale == null) {&lt;br /&gt;        // Use the browser's locale&lt;br /&gt;        locale = navigator.browserLanguage ? navigator.browserLanguage : navigator.language;&lt;br /&gt;        if (locale != null) {&lt;br /&gt;           locale = locale.replace(/-/g, '_');&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;      if (locale == null) {&lt;br /&gt;        return "default";&lt;br /&gt;      }&lt;br /&gt;      while (!__gwt_isKnownPropertyValue("locale",  locale)) {&lt;br /&gt;        var lastIndex = locale.lastIndexOf("_");&lt;br /&gt;        if (lastIndex == -1) {&lt;br /&gt;              locale = "default";&lt;br /&gt;          break;&lt;br /&gt;        } else {&lt;br /&gt;          locale = locale.substring(0,lastIndex);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;      return locale;&lt;br /&gt;    } catch(e){&lt;br /&gt;      alert("Unexpected exception in locale detection, using default: " + e);&lt;br /&gt;      return "default";&lt;br /&gt;    }&lt;br /&gt;  ]]&amp;gt;&lt;br /&gt;  &amp;lt;/property-provider&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-9218077010335508150?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/9218077010335508150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/9218077010335508150'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/11/gwt-client-side-vs-server-side-locale.html' title='GWT: Client-side vs Server-side locale selection'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-6500460912121278561</id><published>2009-11-04T15:05:00.000-08:00</published><updated>2009-12-02T09:21:52.824-08:00</updated><title type='text'>Jetty bug in url session tracking</title><content type='html'>Jetty is an amazing servlet container with an excellent architecture and splendid code. But it is not free of bugs. Weeks ago when I was working on porting an old application, which has been running in Tomcat for years, to Jetty, I realised that the code about tracking sessions using url instead of cookies is erroneous.&lt;br /&gt;&lt;br /&gt;The origin of the problem is that Jetty doesn't expect more than one parameter in the url part reserved for the session identifier. &lt;br /&gt;&lt;br /&gt;For instance, this url is correctly handled: &lt;br /&gt;&lt;pre class="linux"&gt;http://www.example.com/MyApp/MyAction.do;jsessionid=blablabla?query_string &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But this one fails:&lt;br /&gt;&lt;pre class="linux"&gt;http://www.example.com/MyApp/MyAction.do;jsessionid=blablabla;ramdomstr=123123?query_string &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I've &lt;a href="http://jira.codehaus.org/browse/JETTY-1133"&gt;reported&lt;/a&gt; this problem to Jetty's guys.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-6500460912121278561?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6500460912121278561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6500460912121278561'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/11/jetty-bug-with-url-session-tracking.html' title='Jetty bug in url session tracking'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-9122002502270694732</id><published>2009-09-15T02:13:00.000-07:00</published><updated>2009-12-20T01:52:33.707-08:00</updated><title type='text'>Tip: Enabling JSP support in Jetty.7.0.0</title><content type='html'>Jetty7, doesn't enable jsp support by default, so after one hour trying to understand what was happening, I got the reason. &lt;br /&gt;&lt;br /&gt;If you get jetty from &lt;a href=http://www.eclipse.org/jetty/downloads.php &gt;eclipse's site&lt;/a&gt;, it doesn't come with the needed jsp libraries, so you have to put these libraries manually or  download jetty with jsp libraries from &lt;a href=http://dist.codehaus.org/jetty/&gt;codehaus&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But, this is not enough, if you start the server you get an error like this:&lt;br /&gt;&lt;pre class="linux"&gt;INFO::NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So you have to enable jsp support in jetty passing additional undocumented options to the jetty start script:&lt;br /&gt;&lt;pre class="linux"&gt;$ java -jar jetty.jar OPTIONS=Server,jsp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The best option to start jetty and customize it is using the provided script: bin/jetty.sh. But you have to do these steps:&lt;br /&gt;&lt;br /&gt;&lt;pre class="linux"&gt;# change the permissions of the provided script.&lt;br /&gt; $ chmod u+x bin/jetty.sh&lt;br /&gt;&lt;br /&gt; # create a file where you can put customized options.&lt;br /&gt; $ cat /etc/default/jetty&lt;br /&gt;JETTY_PORT=80&lt;br /&gt;JETTY_HOME=/usr/local/jetty&lt;br /&gt;JAVA_OPTIONS="$JAVA_OPTIONS -Dartifactory.home=/mirai/DATA/artifactory"&lt;br /&gt;JETTY_ARGS=OPTIONS=Server,jsp&lt;br /&gt; &lt;br /&gt; # create the link in /etc/init.d&lt;br /&gt; $ sudo ln -s /usr/local/jetty/bin/jetty.sh /etc/init.d/jetty&lt;br /&gt;&lt;br /&gt; # use this script to start/stop/restart the server&lt;br /&gt; $ /etc/init.d/jetty &amp;lt;start|stop|restart&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-9122002502270694732?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/9122002502270694732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/9122002502270694732'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/09/tip-enabling-jsp-support-in-jetty700.html' title='Tip: Enabling JSP support in Jetty.7.0.0'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-800024150998860718</id><published>2009-09-03T09:51:00.000-07:00</published><updated>2010-06-17T23:46:59.836-07:00</updated><title type='text'>Contributing Hudson plugins</title><content type='html'>Hudson is a Continuous Integration software that makes the developer's life easier. I don't believe it is better than CruiseControl, but at least, it is more friendly configurable. &lt;br /&gt;It's plenty of plugins which add hudson tons of features. Most of then are well developed, documented and tested, but there are several ones which have a lack of features.&lt;br /&gt;&lt;br /&gt;Lately I've been playing and installing hudson-jmeter plugin in order to monitor my Company's web servers. Even though this is a cool plugin, it is incomplete because it is only able to store and display statistics in the case of success builds. &lt;br /&gt;But what I wanted was to have an easy way to monitor my services and a simple page where I can view the history of performance and availability.&lt;br /&gt;&lt;br /&gt;Finally I've decided to modify the plugin, and I've added a new feature which sets a build as unstable or failure, based in the percentage of errors reported by jmeter. I've sent &lt;a href="https://hudson.dev.java.net/issues/show_bug.cgi?id=4388"&gt;this patch&lt;/a&gt; to hudson guys. The patch also includes some fixes to the code.&lt;br /&gt;&lt;br /&gt;Update: (Dec-2009), jmeter plugin v0.3.0 includes this feature, and I became a committer of Hudson.&lt;br /&gt;Update: (May-2010), jmeter plugin doesn't exist any more, now it is called performance plugin because it handles jmeter and junit reports, and it it ready to add more parsers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-800024150998860718?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/800024150998860718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/09/contributing-with-hudson-plugins.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/800024150998860718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/800024150998860718'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/09/contributing-with-hudson-plugins.html' title='Contributing Hudson plugins'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-994592361057713698</id><published>2009-09-02T02:22:00.000-07:00</published><updated>2009-09-02T02:40:09.128-07:00</updated><title type='text'>Ruby's open-uri fails when handling secure redirections</title><content type='html'>I've realised that when the target server responds with a redirection to a https uri, ruby fails with the message:&lt;br /&gt;&lt;pre class="linux"&gt;&lt;br /&gt;(RuntimeError) redirection forbidden:&lt;br /&gt;     http://hudson.gotdns.com/latest/hudson.war&lt;br /&gt;  -&gt; https://hudson.dev.java.net/files/documents/2402/142380/hudson.war&lt;br /&gt;[...]/ruby/1.8/open-uri.rb:174:in `open_loop'&lt;br /&gt;[...]/ruby/1.8/open-uri.rb:132:in `open_uri'&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It's due to a paranoid check that rails do to avoid redirections to private stuff like 'file://'. But, this check uses a incomplete regular expression:&lt;br /&gt;&lt;br /&gt;&lt;pre class="linux"&gt;&lt;br /&gt;[...]&lt;br /&gt;  unless OpenURI.redirectable?(uri, redirect)&lt;br /&gt;    raise "redirection forbidden: #{uri} -&gt; #{redirect}"&lt;br /&gt;  end&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;def OpenURI.redirectable?(uri1, uri2) # :nodoc:&lt;br /&gt;  # This test is intended to forbid a redirection from http://... to&lt;br /&gt;  # file:///etc/passwd.&lt;br /&gt;  # However this is ad hoc.  It should be extensible/configurable.&lt;br /&gt;  uri1.scheme.downcase == uri2.scheme.downcase ||&lt;br /&gt;  (/\A(?:http|ftp)\z/i =~ uri1.scheme &amp;amp;&amp;amp; /\A(?:http|ftp)\z/i =~ uri2.scheme)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;I've opened a &lt;a href="http://redmine.ruby-lang.org/issues/show/2027"&gt;ticket&lt;/a&gt; and sent a patch to the ruby core team reporting this issue.&lt;br /&gt;&lt;br /&gt;But the questions are: is this check needed?, why don't check just the presence of file:// in the url?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-994592361057713698?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/994592361057713698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/09/ruby-open-uri-fails-with-secure.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/994592361057713698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/994592361057713698'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/09/ruby-open-uri-fails-with-secure.html' title='Ruby&apos;s open-uri fails when handling secure redirections'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-4437865003916614206</id><published>2009-08-30T02:24:00.000-07:00</published><updated>2009-09-01T00:09:35.255-07:00</updated><title type='text'>Gwt's site publishes my article 'Exporting gwt libraries to Javascript'</title><content type='html'>My &lt;a href="http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_en"&gt;article&lt;/a&gt; about exporting gwt libraries into javascript has been selected to be included in the google-web-toolkit's &lt;a href="http://code.google.com/intl/es-ES/webtoolkit/articles.html"&gt;articles&lt;/a&gt; section. &lt;br /&gt;&lt;br /&gt;Thanks to Sumit Chandel, the google's guy who has included the article in the site, and who I had the pleasure of knowing last Google Developer Day in Madrid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-4437865003916614206?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/4437865003916614206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/08/gwt-site-publishes-my-article.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4437865003916614206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4437865003916614206'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/08/gwt-site-publishes-my-article.html' title='Gwt&apos;s site publishes my article &apos;Exporting gwt libraries to Javascript&apos;'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-7402075052345847178</id><published>2009-08-26T03:07:00.000-07:00</published><updated>2009-08-30T02:36:47.623-07:00</updated><title type='text'>Apache web server's code includes my patch for sticky sessions</title><content type='html'>Months ago, I submitted a patch to apache's guys which fixed a bug related with the session tracking in apache installations using mod_balancer_proxy and serving java applications deployed in a tomcat cluster which is configured to use url sessions instead of the cookies ones.&lt;br /&gt;&lt;br /&gt;You can see the ticket I &lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=45158"&gt;opened  here&lt;/a&gt;. And the applied &lt;a href="http://svn.apache.org/viewvc?view=rev&amp;revision=686809"&gt;patch here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-7402075052345847178?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/7402075052345847178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/08/my-patch-for-apache-web-server-was.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7402075052345847178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7402075052345847178'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/08/my-patch-for-apache-web-server-was.html' title='Apache web server&apos;s code includes my patch for sticky sessions'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-8997757422158883043</id><published>2009-08-01T01:41:00.000-07:00</published><updated>2009-08-26T03:22:38.173-07:00</updated><title type='text'>Tutorial about producing JavaScript libraries using Gwt</title><content type='html'>When I published a &lt;a href="http://www.javahispano.org/contenidos/es/creando_librerias_javascript_desde_gwt_11/"&gt;comment in javahispano.org&lt;/a&gt; about using gwt to produce javascript libraries, people asked me to write a tutorial explaining the process, because gwt-exporter was not documented at all.&lt;br /&gt;&lt;br /&gt;Now, and based on the experience I have got exporting my Gwt projects (gwtchismes and gwtupload), I have written a detailed tutorial in &lt;a href="http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_en"&gt;English&lt;/a&gt; and &lt;a href="http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_es"&gt;Spanish&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-8997757422158883043?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_en' title='Tutorial about producing JavaScript libraries using Gwt'/><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/8997757422158883043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/08/tutorial-about-producing-javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/8997757422158883043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/8997757422158883043'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/08/tutorial-about-producing-javascript.html' title='Tutorial about producing JavaScript libraries using Gwt'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-2160003767767139069</id><published>2009-08-01T01:06:00.000-07:00</published><updated>2009-08-01T01:56:56.247-07:00</updated><title type='text'>Contributing GwtQuery</title><content type='html'>GwtQuery is an awesome library, written by Ray Cromwell, which allows to do progressive javascript enhancement in Gwt.&lt;br /&gt;&lt;br /&gt;Months ago I had to use it in a project, but those days gwtquery had a lack of the most useful jquery's methods, mainly due that it was just a prototype exhibited in the &lt;a href="http://www.google.es/url?sa=t&amp;amp;source=web&amp;amp;oi=video_result&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D2ScPbu8ga1Q&amp;amp;ei=IvlzSq3yF4OZjAew5OSnBg&amp;amp;usg=AFQjCNEm97sTHecCXPySjPDHimxlnAmogA&amp;amp;sig2=uJOiwKVqHjua4TJJdrOsAA"&gt;Google I/O 2008&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;Then, I decided to add all of the core methods present in jquery and I modified a considerable amount of code including effects, event handling, testing, etc. At the end I produced a patch with about 2500 lines which I sent to Ray, and he included in May 2009.&lt;br /&gt;&lt;br /&gt;In the Google I/O 2009, Cromwell gave a &lt;a href="http://www.youtube.com/watch?v=sl5em1UPuoI&amp;amp;hl=es"&gt;conference&lt;/a&gt; speaking exclusively about gwtquery and he included me in his &lt;a href="http://pds12.egloos.com/pds/200906/09/15/Th_0115_ProgressivelyEnhanceAJAXApplicationswithGoogleWebToolkitandGQuery.pdf"&gt;credits&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now I'm planning to contribute this project more frequently.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-2160003767767139069?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/2160003767767139069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/08/contributing-gwtquery.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2160003767767139069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2160003767767139069'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/08/contributing-gwtquery.html' title='Contributing GwtQuery'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-6226983725638218031</id><published>2009-07-23T09:23:00.000-07:00</published><updated>2009-07-24T01:43:59.860-07:00</updated><title type='text'>Configure blogger to use code highlight syntax</title><content type='html'>Despite the fact that Blogger doesn't support code coloring, you can do it putting javascript in your pages.&lt;br /&gt;&lt;br /&gt;Modify your blog's template in order to use an external javascript library which parses the html document and does the work. &lt;br /&gt;&lt;br /&gt;This is the configuration needed for using &lt;a href="http://syntaxhighlighter.googlecode.com"&gt;syntaxhighlighter&lt;/a&gt;.&lt;br /&gt;Replace 'HOST' by 'http://syntaxhighlighter.googlecode.com/svn/trunk' to use the last version, or deploy these files in your own website.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&amp;lt;link href='HOST/Styles/SyntaxHighlighter.css' &lt;br /&gt;         rel='stylesheet' type='text/css'/&amp;gt;&lt;br /&gt;&amp;lt;script src='HOST/Scripts/shCore.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script src='HOST/Scripts/shBrushCss.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script src='HOST/Scripts/shBrushJava.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script src='HOST/Scripts/shBrushJScript.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script src='HOST/Scripts/shBrushXml.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script src='HOST/Scripts/shBrushPhp.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script src='HOST/Scripts/shBrushRuby.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script src='HOST/Scripts/shBrushCpp.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script class='javascript'&amp;gt;&lt;br /&gt;  dp.SyntaxHighlighter.ClipboardSwf = "HOST/Scripts/clipboard.swf";&lt;br /&gt;  dp.SyntaxHighlighter.BloggerMode();&lt;br /&gt;  dp.SyntaxHighlighter.HighlightAll("code");&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then, wrap your code using &amp;lt;pre&amp;gt; tags with the appropriate name and class attributes set,  and take care replacing all '&lt;' by '&amp;amp;lt;' and '&gt;' by '&amp;amp;gt;'&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="html"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre name="code" class="html"&amp;gt;&lt;br /&gt;[...]&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre name="code" class="javascript"&amp;gt;&lt;br /&gt;[...]&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now a trick: if you don't want to lose these changes when you change your base template, add a HTML/Javascript widget without any description to your footer, and put there the javascript code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-6226983725638218031?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/6226983725638218031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/configure-blogger-to-use-code-highlight.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6226983725638218031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6226983725638218031'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/configure-blogger-to-use-code-highlight.html' title='Configure blogger to use code highlight syntax'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-6595745488843200562</id><published>2009-07-21T02:57:00.000-07:00</published><updated>2009-07-22T02:28:00.800-07:00</updated><title type='text'>open-uri in ruby doesn't support multiline headers</title><content type='html'>Working with recipes in Automateit, I've released that the download() method fails when I try to download and install jetty from its repository server.&lt;br /&gt;After some frustration, and some time tcpdumping and diving in the ruby sources, I realised that open-uri is raising an exception because the jetty mirror I'm using is sending a multi line header response. This is the server's response with the problematic header:&lt;br /&gt;&lt;pre style="background: black; color: white;"&gt;&lt;br /&gt;$ wget -S http://eclipse.ialto.org/jetty/7.0.0.M4/dist/jetty-distribution-7.0.0.M4.zip&lt;br /&gt;HTTP/1.0 200 OK&lt;br /&gt;Date: Tue, 21 Jul 2009 10:01:39 GMT&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Server: Eclipse mirror service provided by &amp;lt;a style='font-weight: bold; color: [...]&lt;br /&gt; &amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Length: 7735180 (7.4M) [application/zip]&lt;br /&gt;Saving to: `jetty-distribution-7.0.0.M4.zip'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At the beginning I suspected that this was an illegal response, but it is not. RFC 2616 in the &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2"&gt;message headers&lt;/a&gt; specification says that &lt;span style="font-style: italic;"&gt;'values for headers can contain new lines if they begin with a space or tabulator character'&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;As you can see in this piece of code, the problem is that ruby reads the response line by line, and checks whether each line is valid, even though it has to read blocks ending with a new-line and a non space character, and do the check.&lt;br /&gt;&lt;pre style="background: black; color: white;"&gt;&lt;br /&gt;file: net/http.rb &lt;br /&gt;lines: 2032-2040&lt;br /&gt;&lt;br /&gt;def each_response_header(sock)&lt;br /&gt;   while true&lt;br /&gt;     line = sock.&lt;span style="color: red;"&gt;readuntil&lt;/span&gt;("&lt;span style="color: green"&gt;\n&lt;/span&gt;", true).sub(/\s+\z/, '')&lt;br /&gt;     break if line.empty?&lt;br /&gt;     m = /\A([^:]+):\s*/.match(line) or&lt;br /&gt;         puts HTTPBadResponse, 'wrong header line format'&lt;br /&gt;     yield m[1], m.post_match if (m)&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I've opened a &lt;a href="http://redmine.ruby-lang.org/issues/show/1796"&gt;bug&lt;/a&gt; with this problem in the ruby ticket system. Now it is time to know how long these tickets take to be fixed &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;:-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-6595745488843200562?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/6595745488843200562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/ruby-open-uri-doesnt-support-multiline.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6595745488843200562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6595745488843200562'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/ruby-open-uri-doesnt-support-multiline.html' title='open-uri in ruby doesn&apos;t support multiline headers'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-6121130006479004801</id><published>2009-07-20T01:09:00.000-07:00</published><updated>2009-07-21T03:27:04.288-07:00</updated><title type='text'>Slow alt-tab in Ubuntu 9.04 with intel graphic card</title><content type='html'>After updating to Ubuntu 9.04, my laptop became so slow, specially the alt-tabing action in the gnome desktop.&lt;br /&gt;Then, I started a little investigation trying to figure out what was going on, and I realised that most CPU time was spent by Xorg server. So, I suspected that something in the graphic acceleration was happening.&lt;br /&gt;After some time googling, I read that intel graphics driver has been actively modified in order to introduce better acceleration and memory management code, these modifications has implied to remove the legacy acceleration code.&lt;br /&gt;Unfortunately these new features are not enabled by default because of stability.&lt;br /&gt;Enabling the new and faster acceleration method (UXA) my laptop increases the performance considerably and I've not released any problem.&lt;br /&gt;So if you have an Intel integrated  graphics chip, add this line to the Device section in your /etc/X11/xorg.conf file:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: black; color: white"&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;[...]&lt;br /&gt;   &lt;span style="color: red"&gt;Option        "AccelMethod" "uxa"&lt;/span&gt;&lt;br /&gt;EndSection&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-6121130006479004801?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/6121130006479004801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/slow-alt-tab-in-ubuntu-904.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6121130006479004801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6121130006479004801'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/slow-alt-tab-in-ubuntu-904.html' title='Slow alt-tab in Ubuntu 9.04 with intel graphic card'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-4161113463905275614</id><published>2009-07-18T23:44:00.000-07:00</published><updated>2009-07-18T23:49:24.494-07:00</updated><title type='text'>GWTUpload released</title><content type='html'>I'm pleased to announce GWTUpload &amp;amp; JsUpload.&lt;br /&gt;&lt;p&gt;GWTUpload &lt;&lt;a target="_blank" rel="nofollow" href="http://code.google.com/p/gwtupload/"&gt;http://code.google.com/p/gwtupload/&lt;/a&gt;&gt; is a library for uploading files to web servers, showing a progress bar with real information about the process (file size, bytes transferred, etc). It uses AJAX requests to ask the web server for the upload progress. It has two components written in java, the server side with servlet and utility classes, and the gwt client side.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;JsUpload is the client library but compiled and exported into javascript, so users that don't develop in java can use it directly in web pages. It provides a server program written in perl which can be installed in any web server as a cgi-bin script.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-4161113463905275614?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/4161113463905275614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/gwtupload-released.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4161113463905275614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4161113463905275614'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/gwtupload-released.html' title='GWTUpload released'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-2167072280440636831</id><published>2009-07-01T07:54:00.000-07:00</published><updated>2009-07-02T01:23:34.902-07:00</updated><title type='text'>Pergola</title><content type='html'>Today, I'm really angry because the builders that are making a pergola on my garden are doing everything wrong. I've published a blog relating this &lt;span class="clickable" onclick="'dr4sdgryt(event,"&gt;&lt;span class="q"&gt;botched job.&lt;/span&gt;&lt;/span&gt;&lt;span class="clickable" onclick="'dr4sdgryt(event,"&gt;&lt;span class="q"&gt; You can read more details  in this &lt;a href="http://la-elegancia-de-la-madera.blogspot.com/"&gt;page&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-2167072280440636831?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/2167072280440636831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/pergola.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2167072280440636831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/2167072280440636831'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/pergola.html' title='Pergola'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-7444541442402788522</id><published>2009-07-01T07:45:00.000-07:00</published><updated>2009-07-01T07:53:21.577-07:00</updated><title type='text'>Editing remote files with eclipse</title><content type='html'>Exploring and editing remote filesystems from eclipse is nice and easy to use.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add a new software update site: http://download.eclipse.org/dsdp/tm/updates/&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install RSE_Runtime from this repository&lt;/li&gt;&lt;li&gt;Add a new view to your workspace: Remote Systems&lt;/li&gt;&lt;li&gt;Add new servers to the view using the different options available: dstore, ssh, sftp, ftp, etc. I prefer to use ssh because it is available in all linuxes I manage.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-7444541442402788522?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/7444541442402788522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/editing-remote-files-with-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7444541442402788522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7444541442402788522'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/07/editing-remote-files-with-eclipse.html' title='Editing remote files with eclipse'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-4092409491949150994</id><published>2009-05-12T13:43:00.000-07:00</published><updated>2009-07-24T00:17:56.992-07:00</updated><title type='text'>Remove the awful Windows XP WGA screen in one minute</title><content type='html'>Of course, I do not use windows at all, but a friend of me asked me to help him to remove the WGA (Windows Genuine Advantage) screen &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;:-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I typed these bunch of commands and the problem was fixed.&lt;br /&gt;&lt;br /&gt;&lt;pre class="linux"&gt;&lt;br /&gt;c:&lt;br /&gt;cd windows\system32&lt;br /&gt;ren WgaLogon.exe WgaLogon.exe_&lt;br /&gt;ren WgaTray.exe WgaTray.exe_&lt;br /&gt;Regsvr32 %Windir%\system32\LegitCheckControl.dll /u&lt;br /&gt;shutdown -r -t 0&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-4092409491949150994?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/4092409491949150994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/05/remove-awful-wga-in-one-minute.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4092409491949150994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4092409491949150994'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/05/remove-awful-wga-in-one-minute.html' title='Remove the awful Windows XP WGA screen in one minute'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-4114912112028880805</id><published>2009-04-25T00:08:00.000-07:00</published><updated>2009-05-12T14:22:11.229-07:00</updated><title type='text'>Use GWT to produce pure JavaScript libraries</title><content type='html'>I've released my first release of &lt;a href="http://code.google.com/p/gwtchismes/wiki/JsChismes_Documentation"&gt;JsChismes&lt;/a&gt; which is the result of compiling and exporting the code of the  &lt;a href="http://code.google.com/p/gwtchismes"&gt;gwtchismes&lt;/a&gt; library in order to populate its classes and methods into native javascript. So the widgets can be used in html pages using pure javascript,  and the  goal is that the set of widgets can now be used directly in html pages without the need of knowing anything about gwt and java at all.&lt;br /&gt;&lt;br /&gt;The main advantage of using this GWT to produce javascript libraries is that the developer can use the power of java tools (IDE, refactoring, namespaces, reuse, debug, testing, coverage, etc.) to develop his library/application without worrying about the well known javascript problems (versioning of files, obfuscate, optimize, browser compatibility, etc). Then non-java developers (ruby, php ..) and designers can use the library in their pages with a little effort.&lt;br /&gt;&lt;br /&gt;This technique is easier since Ray Cromwell's &lt;a href="http://code.google.com/p/gwt-exporter/"&gt;gwt-export&lt;/a&gt; library makes it pretty simple.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-4114912112028880805?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/4114912112028880805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/04/jschismes-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4114912112028880805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/4114912112028880805'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/04/jschismes-released.html' title='Use GWT to produce pure JavaScript libraries'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-6904576500753241049</id><published>2009-04-08T23:31:00.000-07:00</published><updated>2009-04-09T23:35:25.529-07:00</updated><title type='text'>Defective method in prototype: cumulativeOffSet</title><content type='html'>&lt;span style="font-family:arial;"&gt;Prototype is one of the most popular javasctipt libraries, nevertheless it has faulty methods.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Based on the documentation, cumulativeOffSet is supposed to return the real position of an element from the top left corner of the document, it works fine in most cases, but when a border is added to a parent element, the element is displaced to a new position which prototype is unable to consider. However, other javascript libraries like jQuery or Gwt returns the correct position.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I've opened a prototype ticket reporting this wrong behaviour, and I've submited a patch which fixes it: &lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="https://prototype.lighthouseapp.com/projects/8886/tickets/603-cumulativeoffset-results-are-wrong-when-offsetparent-uses-borders#ticket-603-3"&gt;cumulativeOffset patch&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-family:arial;"&gt;Example:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Normal nested div&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="div1" style="background: pink none repeat scroll 0% 0%; position: relative; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 100px; left: 10px;"&gt;&lt;br /&gt;&lt;div id="div2" style="background: red none repeat scroll 0% 0%; position: relative; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 100px; left: 10px; top: 10px;"&gt;X&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$('div2').cumulativeOffset()[0] -&gt; x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Adding a 10px border to the parent element, the nested div is moved 10px in the document&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="div1-b" style="border: 10px solid grey; background: pink none repeat scroll 0% 0%; position: relative; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 100px; left: 10px; top: 40px;"&gt;&lt;br /&gt;&lt;div id="div2-b" style="background: red none repeat scroll 0% 0%; position: relative; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 100px; left: 10px; top: 10px;"&gt;X&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$('div2').cumulativeOffset()[0] -&gt; x&lt;br /&gt;This is wrong because the correct value is (x+10)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-6904576500753241049?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/6904576500753241049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2009/04/defective-cumulativeoffset-in-prototype.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6904576500753241049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/6904576500753241049'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2009/04/defective-cumulativeoffset-in-prototype.html' title='Defective method in prototype: cumulativeOffSet'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-405318468555274611</id><published>2008-11-19T07:50:00.000-08:00</published><updated>2008-11-19T10:18:03.970-08:00</updated><title type='text'>Automating system administration tasks</title><content type='html'>I've been searching for tools to simplify system administration tasks that I've been doing using shell/perl scripts for years. I was looking for something allowing me to create receipts and to launch parallel processes over several machines at the same time without much effort.&lt;br /&gt;I have found several tools that match my needs: Capistrano, Webistrano, Puppet, Zenworks, Cfengine, AutomateIt, Bcfg2, Landscape, Func, Smartfrog. &lt;br /&gt;&lt;br /&gt;Eventually I've decided to use AutomateIt because:&lt;br /&gt;- It uses a standard language: ruby.&lt;br /&gt;- It's so easy to distribute/group your tasks into projects.&lt;br /&gt;- There are drivers for most unix flavors  &lt;br /&gt;- There is no need to start any daemon. It uses ssh.&lt;br /&gt;- It is ideal not only for administration tasks but also for compiling, testing and deployment ones&lt;br /&gt;&lt;br /&gt;Visit &lt;a href="http://automateit.org"&gt;AutomateIt&lt;/a&gt; site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-405318468555274611?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/405318468555274611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2008/11/automating-system-administration-tasks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/405318468555274611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/405318468555274611'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2008/11/automating-system-administration-tasks.html' title='Automating system administration tasks'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-8243165657554550873</id><published>2008-10-17T08:29:00.000-07:00</published><updated>2009-07-24T00:12:03.456-07:00</updated><title type='text'>Move your projects from CVS to SVN</title><content type='html'>If you want to migrate all your projects from CVS to SVN and maintain the same structure, just install &lt;a href="http://cvs2svn.tigris.org/"&gt;cvs2svn &lt;/a&gt; and run it for each of your projects:&lt;br /&gt;&lt;pre class="linux"&gt;&lt;br /&gt;# SVN_DIR -&gt; Folder where the svn is going to be&lt;br /&gt;# CVS_DIR -&gt; Folder with the cvs stuff&lt;br /&gt;# Project -&gt; Name of each project&lt;br /&gt;# create the target directory if it doesn't exist&lt;br /&gt;mkdir -p SVN_DIR&lt;br /&gt;# run this command for each project&lt;br /&gt;cvs2svn -s  SVN_DIR --existing-svnrepos CVS_DIR/Project  \&lt;br /&gt;                    --trunk=Project/trunk \&lt;br /&gt;                    --branches=Project/branches \&lt;br /&gt;                    --tags=Projet/tags \&lt;br /&gt;                    --encoding=utf-8&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-8243165657554550873?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/8243165657554550873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2008/10/move-your-projects-from-cvs-to-svn.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/8243165657554550873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/8243165657554550873'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2008/10/move-your-projects-from-cvs-to-svn.html' title='Move your projects from CVS to SVN'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-7922513155163169452</id><published>2008-10-14T15:02:00.000-07:00</published><updated>2009-04-16T23:11:10.420-07:00</updated><title type='text'>GWTChismes Collection for GWT 1.5</title><content type='html'>I've released a new version of the gwtchismes library. GWTChismes is a collection of useful widgets for the Google web toolkit. The idea to create this collection comes because I wanted a simple library to put the widgets that I create for my GWT projects. Please take a look to the &lt;a href="http://code.google.com/p/gwtchismes"&gt;gwtchismes site&lt;/a&gt; for more information&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-7922513155163169452?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/7922513155163169452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2008/10/gwtchismes-collection-for-gwt-15.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7922513155163169452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/7922513155163169452'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2008/10/gwtchismes-collection-for-gwt-15.html' title='GWTChismes Collection for GWT 1.5'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6607326891425643981.post-960655876421235521</id><published>2007-12-09T14:36:00.000-08:00</published><updated>2008-10-14T15:10:07.744-07:00</updated><title type='text'>LXP:  linux with a XP look and feel</title><content type='html'>LXP was my first project for the  internet comunity.&lt;br /&gt;It is a windows manager derived from icewm and other tools.&lt;br /&gt;The result is a desktop identical to windows XP.&lt;br /&gt;&lt;a href="http://lxp.sourceforge.net"&gt;http://lxp.sf.net&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6607326891425643981-960655876421235521?l=manolocarrasco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://manolocarrasco.blogspot.com/feeds/960655876421235521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://manolocarrasco.blogspot.com/2007/12/lxp-xp-look-in-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/960655876421235521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6607326891425643981/posts/default/960655876421235521'/><link rel='alternate' type='text/html' href='http://manolocarrasco.blogspot.com/2007/12/lxp-xp-look-in-linux.html' title='LXP:  linux with a XP look and feel'/><author><name>Manolo</name><uri>http://www.blogger.com/profile/17048078201279823626</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_fsrb0LpZTs0/SvH_gvgqkUI/AAAAAAAAA0I/-WcpW2WuoVs/S220/me-children1.jpg'/></author><thr:total>0</thr:total></entry></feed>
