<?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-34409529</id><updated>2011-11-01T12:01:30.012Z</updated><category term='linux'/><category term='thesis'/><category term='cmake'/><category term='sound'/><category term='java'/><category term='history'/><category term='graphics'/><category term='programing'/><category term='fun'/><category term='blog'/><category term='work'/><category term='rant'/><category term='hardware'/><category term='life'/><category term='gnome'/><title type='text'>Nuno Sousa's Corner</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>80</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34409529.post-2135408540960870769</id><published>2011-10-05T12:41:00.000+01:00</published><updated>2011-10-05T12:41:12.000+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>OpenClock and Gentoo</title><content type='html'>&lt;a href="http://www.openclonk.org/"&gt;OpenClonk&lt;/a&gt; is an open source game that has been in development for some time. Its fun and free.&lt;br /&gt;&lt;br /&gt;I downloaded a binary some time ago and started using it, but the latest release just doesn't work on my &lt;a href="http://www.gentoo.org/"&gt;Gentoo&lt;/a&gt; machine in binary form. After some digging I didn't found an ebuild for this release, just for the live version. So I wrote my own and added to &lt;a href="https://bugs.gentoo.org/show_bug.cgi?id=348149"&gt;Gentoo's bug database&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I learned a few things along the way but didn't get it as clean as I wanted. If someone knows how to convince cmake to install to a different directory than the prefix used it would be great. I ended up doing a patch for the generated &lt;i&gt;cmake_install.cmake&lt;/i&gt;. If anyone knows how to avoid that patch I would appreciate the help.&lt;br /&gt;&lt;br /&gt;Here is a preview of the game:&lt;br /&gt;&lt;center&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/zydiZSXpn0w" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-2135408540960870769?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.openclonk.org/' title='OpenClock and Gentoo'/><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/2135408540960870769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=2135408540960870769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2135408540960870769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2135408540960870769'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2011/10/openclock-and-gentoo.html' title='OpenClock and Gentoo'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/zydiZSXpn0w/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-1195657242560223258</id><published>2011-04-05T17:58:00.002+01:00</published><updated>2011-04-05T18:07:33.485+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Hidden Features...</title><content type='html'>I bought a Samsung SyncMaster XL2370HD recently. It has more than what I needed but I couldn't find one without the features I didn't need (HDTV) for a cheaper price so I bought it.&lt;br /&gt;&lt;br /&gt;I honestly though about returning it because the colours and fonts were horrible when I first connected my laptop through HDMI. I played a &lt;span style="font-weight:bold;"&gt;LOT&lt;/span&gt; with the settings but didn't get anything good. I finally solved the issue by renaming the source.&lt;br /&gt;&lt;br /&gt;That's right: you go the options, rename the source HDMI to PC and everything should start to working perfectly. They should call this feature "Source Fixer" instead of "Name Editor" as it turns off many of the "default" processing features that I don't need.&lt;br /&gt;&lt;br /&gt;So, if you had a problem with weird colours or fonts in your monitor when using an HDMI cable try to rename the source HDMI. It is called "Edit Name" in my monitor and it will show you a list of devices (it won't allow you to input one). Just choose PC and it will work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-1195657242560223258?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/1195657242560223258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=1195657242560223258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1195657242560223258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1195657242560223258'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2011/04/hidden-features.html' title='Hidden Features...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-1274152877891880071</id><published>2011-01-20T09:47:00.001Z</published><updated>2011-10-05T12:56:49.947+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>More on Jack...</title><content type='html'>Well, jack isn't working well with non jack applications. The jack-plug doesn't always work and I can't get it to be stable. I'll continue to look into it. If I find anything I'll post it here. For now I'll use jack with applications that support jack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-1274152877891880071?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/1274152877891880071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=1274152877891880071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1274152877891880071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1274152877891880071'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2011/01/more-on-jack.html' title='More on Jack...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7405493843676288677</id><published>2011-01-19T11:51:00.002Z</published><updated>2011-01-19T12:00:16.663Z</updated><title type='text'>Enhanced security in Chromium</title><content type='html'>I moved away from &lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox&lt;/a&gt; to &lt;a href="http://code.google.com/chromium/"&gt;Chromium&lt;/a&gt; (the open source part of &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt;). When I moved I search for all the extensions I used in Firefox. One of them was &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/flashblock/"&gt;Flashblock&lt;/a&gt;. There is also a &lt;a href="https://chrome.google.com/extensions/detail/gofhjkjmkpinhpoiabjplobcaignabnl"&gt;Flashblock for Google Chrome&lt;/a&gt; but I wanted to block all plugins until I say so.&lt;br /&gt;&lt;br /&gt;Luckily, Google Chrome has that option. Just got to &lt;a href="about:flags"&gt;about:flags&lt;/a&gt; and enable on the Click to Play flag (this is available in the latest beta of Google Chrome 9, I don't know about the stable Google Chrome 8). Restart the Browser so the flag comes into use. Then enable click to play for the plugins as follows: Open the Preferences, go to "Under the Hood", Right under the "Privacy" click the button "Content Settings...". Then select "Plug-ins" and choose the brand new "Click to play" option.&lt;br /&gt;&lt;br /&gt;When you open pages with plugins an icon will appear in the address bar indicating that plugins were blocked. You can use the icon and enable all the plugins for the page, but I prefer the Click to Play: Google Chrome will put a gray area with a large puzzle peace icon on it. When you hover the mouse on it the mouse changes and an indication appears saying "Click to run this plug-in" with the name of the plug-in under it. If you want just click it. You can also you the icon on the address bar to always allow plugins on certain domains (like &lt;a href="http://www.youtube.com/"&gt;Youtube&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7405493843676288677?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7405493843676288677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7405493843676288677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7405493843676288677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7405493843676288677'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2011/01/enhanced-security-in-chromium.html' title='Enhanced security in Chromium'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3129863018035537765</id><published>2011-01-19T11:28:00.005Z</published><updated>2011-10-05T12:57:03.337+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Using jack to record telcos and screen</title><content type='html'>At my job we use &lt;a href="http://en.wikipedia.org/wiki/Voice_over_IP"&gt;VOIP&lt;/a&gt; regularly when making conferences or simply calling a colleague. We also have a screen sharing tool that we use to share the screen to remote participants. This is also used to make remote training sessions. What I've been missing is a way to record both the shared screen and sound for later viewing. I hacked jack a little in the past but didn't manage to get it working. I've been having some free time so I decided to hack it today and I finally got it working. So, from the start.&lt;br /&gt;&lt;br /&gt;Gentoo's &lt;a href="http://en.gentoo-wiki.com/wiki/JACK"&gt;JACK guide on the wiki&lt;/a&gt; is not bad but I honestly didn't pay much attention to it. I have the &lt;i&gt;jack&lt;/i&gt; use flag enabled globally so it was time to get it going.&lt;br /&gt;&lt;br /&gt;First I emerged &lt;a href="http://qjackctl.sourceforge.net/"&gt;qjackctl&lt;/a&gt;. It is nice program that sits on the tray area (I have it default to hidden) that starts the jack daemon and that allows you to control what is connected to where. I also emerged alsa-plugins to get the alsa-jack plugin. Finally I emerge &lt;a href="http://jamin.sourceforge.net/"&gt;jamin&lt;/a&gt;. I need it just to be able to get the output back in :-)&lt;br /&gt;&lt;br /&gt;I configured also to use the jack plug by default. This can be done by creating a ".asoundrc" file in your home folder with the following content:&lt;br /&gt;&lt;pre&gt;pcm.!default {&lt;br /&gt;        type plug&lt;br /&gt;        slave { pcm "jack" }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;pcm.jack {&lt;br /&gt;        type jack&lt;br /&gt;        playback_ports {&lt;br /&gt;                0 system:playback_1&lt;br /&gt;                1 system:playback_2&lt;br /&gt;        }&lt;br /&gt;        capture_ports {&lt;br /&gt;                0 system:capture_1&lt;br /&gt;                1 system:capture_2&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;I also keep a ".asound_nojack" file that has the jackplug but doesn't turn it to the default audio output for alsa.&lt;br /&gt;&lt;pre&gt;pcm.jackplug {&lt;br /&gt;        type plug&lt;br /&gt;        slave { pcm "jack" }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;pcm.jack {&lt;br /&gt;        type jack&lt;br /&gt;        playback_ports {&lt;br /&gt;                0 system:playback_1&lt;br /&gt;                1 system:playback_2&lt;br /&gt;        }&lt;br /&gt;        capture_ports {&lt;br /&gt;                0 system:capture_1&lt;br /&gt;                1 system:capture_2&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;With that in place any application that does not support jack but support alsa will still work.&lt;br /&gt;&lt;br /&gt;qjackctl has &lt;a href="http://qjackctl.sourceforge.net/qjackctl-ss1.html"&gt;several windows&lt;/a&gt;, one of them is the Connections. I use it to reroute sound before recording.&lt;br /&gt;&lt;br /&gt;What I do is start jamin, redirect all the bits I want to record to jasmin and disconnect them from the system output. Then start &lt;a href="http://recordmydesktop.sourceforge.net/"&gt;qt-recordmydesktop&lt;/a&gt; and point it to use the jamin output as audio source when recording. Here are screenshots of the important bits.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_cPXUCYbNnhA/TTbPrNsD8GI/AAAAAAAAASE/FcyU3TnLBlA/s1600/Connections.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5563862730978619490" src="http://4.bp.blogspot.com/_cPXUCYbNnhA/TTbPrNsD8GI/AAAAAAAAASE/FcyU3TnLBlA/s320/Connections.png" style="cursor: hand; cursor: pointer; display: block; height: 163px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_cPXUCYbNnhA/TTbP5-lymrI/AAAAAAAAASM/lRwIebZ6F9Q/s1600/RecordMyDesktop.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5563862984623823538" src="http://2.bp.blogspot.com/_cPXUCYbNnhA/TTbP5-lymrI/AAAAAAAAASM/lRwIebZ6F9Q/s320/RecordMyDesktop.png" style="cursor: hand; cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 175px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Importante Note:&lt;/b&gt; &lt;a href="http://recordmydesktop.sourceforge.net/"&gt;recordmydesktop&lt;/a&gt; has a bug that makes it complain that it has no jack support, even though the use flag is turned on. This is &lt;a href="http://bugs.gentoo.org/283489"&gt;fixed upstream&lt;/a&gt; and available in Gentoo as a backport but you will have to unmask the package (0.3.8.1-r4 works at the time I wrote this).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTE:&lt;/b&gt; This isn't working very well... see &lt;a href="http://nuno-sousa-corner.blogspot.com/2011/01/more-on-jack.html"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3129863018035537765?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3129863018035537765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3129863018035537765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3129863018035537765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3129863018035537765'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2011/01/using-jack-to-record-telcos-and-screen.html' title='Using jack to record telcos and screen'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_cPXUCYbNnhA/TTbPrNsD8GI/AAAAAAAAASE/FcyU3TnLBlA/s72-c/Connections.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3235691006479026012</id><published>2010-12-29T17:59:00.002Z</published><updated>2011-10-05T12:57:23.115+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Howto make your private VM Cluster, Part III</title><content type='html'>Continuing with my &lt;a href="http://nuno-sousa-corner.blogspot.com/2010/12/howto-make-your-private-vm-cluster-part_29.html"&gt;saga&lt;/a&gt;, next up is &lt;a href="http://www.drbd.org/"&gt;DRBD&lt;/a&gt;. I'm using DRBD because I also want to test it as a viable alternative for &lt;i&gt;network raid&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;To use DRBD I first created a LVM volume to use:&lt;br /&gt;&lt;pre&gt;lvcreate -n drbd-demo -L 100M internal-hd&lt;/pre&gt;Then I configured DRBD on both nodes, fortunately gentoo simplifies a great part of the process (you have to do this on &lt;b&gt;both&lt;/b&gt; nodes):&lt;br /&gt;&lt;pre&gt;cd /etc&lt;br /&gt;cp /usr/share/doc/drbd-*/drbd.conf.bz2 .&lt;br /&gt;bunzip2 drbd.conf.bz2&lt;/pre&gt;Then I created a wwwdata resource by first configuring it (again on &lt;b&gt;both&lt;/b&gt; nodes). This is done by creating a file /etc/drbd.d/wwwdata.res with the contents:&lt;br /&gt;&lt;pre&gt;resource wwwdata {&lt;br /&gt;    meta-disk internal;&lt;br /&gt;    device    /dev/drbd1;&lt;br /&gt;    syncer {&lt;br /&gt;        verify-alg sha1;&lt;br /&gt;    }&lt;br /&gt;    net {&lt;br /&gt;        allow-two-primaries;&lt;br /&gt;    }&lt;br /&gt;    on node1 {&lt;br /&gt;        disk    /dev/mapper/internalhd-drbd--demo;&lt;br /&gt;        address 192.168.100.10:7789;&lt;br /&gt;    }&lt;br /&gt;    on node2 {&lt;br /&gt;        disk    /dev/mapper/internalhd-drbd--demo;&lt;br /&gt;        address 192.168.100.11:7789;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;I added the drbd module to the /etc/modules.autoload.d/kernel-2.6 on both nodes.&lt;br /&gt;&lt;br /&gt;Finally I started drbd on node 1 as follows:&lt;br /&gt;&lt;pre&gt;drbdadm create-md www-data&lt;br /&gt;modprobe drbd&lt;br /&gt;drbdadm up wwwdata&lt;/pre&gt;And on node 2 as follows:&lt;br /&gt;&lt;pre&gt;drbdadm --force create-md www-data&lt;br /&gt;modprobe drbd&lt;br /&gt;drbdadm up wwwdata&lt;/pre&gt;I then used node 1 as reference for the data:&lt;br /&gt;&lt;pre&gt;drbdadm -- --overwrite-data-of-peer primary wwwdata&lt;/pre&gt;I monitored the sync process until it was completed with:&lt;br /&gt;&lt;pre&gt;watch cat /proc/drbd&lt;/pre&gt;When completed I created the file system and populated it with an index.html file indicating the cluster:&lt;br /&gt;&lt;pre&gt;mkfs.ext4 /dev/drbd1&lt;br /&gt;mount /dev/drbd1 /mnt&lt;br /&gt;# Create a index.html&lt;br /&gt;umount /dev/drbd1&lt;/pre&gt;I configured the cluster to use drbd as follows (this will enter the crm shell but don't panic):&lt;br /&gt;&lt;pre&gt;crm&lt;br /&gt;cib new drbd&lt;br /&gt;configure primitive WebData ocf:linbit:drbd params drbd_resource=wwwdata op monitor interval=30s&lt;br /&gt;configure ms WebDataClone WebData meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true&lt;br /&gt;cib commit drbd&lt;br /&gt;quit&lt;/pre&gt;After this I configured a WebFS service so the lighttpd will serve from the DRBD mounted volume.&lt;br /&gt;&lt;pre&gt;crm&lt;br /&gt;cib new webfs&lt;br /&gt;configure primitive WebFS ocf:heartbeat:Filesystem params device="/dev/drbd/by-res/wwwdata" directory="/var/www/localhost/htdocs" fstype="ext4"&lt;br /&gt;configure colocation WebFS-on-WebData inf: WebFS WebDataClone:Master&lt;br /&gt;configure order WebFS-after-WebData inf: WebDataClone:promote WebFS:start&lt;br /&gt;configure colocation WebSite-with-WebFS inf: WebSite WebFS&lt;br /&gt;configure order WebSite-after-WebFS inf: WebFS WebSite&lt;br /&gt;cib commit webfs&lt;br /&gt;quit&lt;/pre&gt;After this, if you go to your cluster web page (http://192.168.100.20) you will see the contents of the index.html that you created for the cluster.&lt;br /&gt;&lt;br /&gt;You can use "crm_mon" to monitor the cluster and look at /var/log/message to view error messages. To simulate a full service relocation go the the node were the services are running and issue "crm node standby" this will put the current node on standby forcing the services to be moved to the other node. After that you can do "crm node online" to bring the node back online.&lt;br /&gt;&lt;br /&gt;This concludes this series. Maybe I'll put up another on to have nfs use the drbd, depends on free time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3235691006479026012?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3235691006479026012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3235691006479026012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3235691006479026012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3235691006479026012'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/12/howto-make-your-private-vm-cluster-part_1497.html' title='Howto make your private VM Cluster, Part III'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7307147297090293511</id><published>2010-12-29T17:26:00.003Z</published><updated>2011-10-05T12:57:14.908+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Howto make your private VM Cluster, Part II</title><content type='html'>In the &lt;a href="http://nuno-sousa-corner.blogspot.com/2010/12/howto-make-your-private-vm-cluster-part.html"&gt;previous entry&lt;/a&gt; I showed how to build the basic structure for your own private VM Cluster. Today I'm going to show you how to create a cluster with two VMs that provides High-Availability for a WebServer using &lt;a href="http://www.drbd.org/"&gt;DRBD&lt;/a&gt; to replicate the Web Site.&lt;br /&gt;&lt;br /&gt;First you need to create a virtual machine. I decided to create a VM with &lt;a href="http://www.gentoo.org/"&gt;Gentoo&lt;/a&gt;. I will use LVM to keep the partition to use for drbd small since this is a simple test.&lt;br /&gt;&lt;br /&gt;I created a qemu-img for a base gentoo installation (my goal is to install gentoo on the VM and then reuse it as base for the other VMs). To create the image just run:&lt;br /&gt;&lt;pre&gt;qemu-img create -f qcow2 gentoo.qcow2 10G&lt;/pre&gt;I started the VM using that image and followed &lt;a href="http://www.gentoo.org/doc/en/handbook/handbook-x86.xml"&gt; Gentoo's installation guide&lt;/a&gt;. My partition scheme was 100Mb (boot), 512Mb (swap), 5Gb (root), rest for lvm.&lt;br /&gt;&lt;br /&gt;I used the gentoo-sources, configuring all virtio devices, drbd and the device-mapper. I configured genkernel to use lvm so it detects the lvm volumes at boot. I used grub and added all the genkernel options.&lt;br /&gt;&lt;br /&gt;Remember that if you use the minimal installation CD the hard disk will be called sda but after setting up virtio in the kernel it will be called vda. I created a generic startvm script that will provide the disk and network card using virtio. I called it startVM: &lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;&lt;span style="color: orangered;"&gt;#&lt;/span&gt;&lt;span style="color: orangered;"&gt;!/bin/&lt;/span&gt;&lt;span style="color: cyan;"&gt;bash&lt;/span&gt;&lt;span style="color: orangered;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: lightsteelblue;"&gt;set&lt;/span&gt; -x&lt;br /&gt;&lt;br /&gt;&lt;span style="color: cyan;"&gt;if&lt;/span&gt; [[ $# != 2 &amp;amp;&amp;amp; $# != 3 ]]; &lt;span style="color: cyan;"&gt;then&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: lightsteelblue;"&gt;echo&lt;/span&gt; &lt;span style="color: lightsalmon;"&gt;"Usage: startVM &amp;lt;mac&amp;gt; &amp;lt;hda&amp;gt; [cdrom]"&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: cyan;"&gt;exit&lt;/span&gt; 1&lt;br /&gt;&lt;span style="color: cyan;"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orangered;"&gt;# &lt;/span&gt;&lt;span style="color: orangered;"&gt;Get the location of the script&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;SCRIPT&lt;/span&gt;=&lt;span style="color: salmon;"&gt;`readlink -f $0`&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;SCRIPT_PATH&lt;/span&gt;=&lt;span style="color: salmon;"&gt;`dirname $SCRIPT`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orangered;"&gt;# &lt;/span&gt;&lt;span style="color: orangered;"&gt;Create tap interface so that the script /etc/qemu-ifup can bridge it&lt;/span&gt;&lt;span style="color: orangered;"&gt;# &lt;/span&gt;&lt;span style="color: orangered;"&gt;before qemu starts&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;USERID&lt;/span&gt;=&lt;span style="color: salmon;"&gt;`whoami`&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;IFACE&lt;/span&gt;=&lt;span style="color: salmon;"&gt;`sudo tunctl -b -u $USERID`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orangered;"&gt;# &lt;/span&gt;&lt;span style="color: orangered;"&gt;Setup KVM parameters&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;CPUS&lt;/span&gt;=&lt;span style="color: lightsalmon;"&gt;"-smp 8"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;MEMORY&lt;/span&gt;=&lt;span style="color: lightsalmon;"&gt;"-m 1G"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;MACADDRESS&lt;/span&gt;=$&lt;span style="color: #eedd82;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;HDA&lt;/span&gt;=$&lt;span style="color: #eedd82;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: cyan;"&gt;if&lt;/span&gt; [[ $# == 3 ]]; &lt;span style="color: cyan;"&gt;then&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;CDROM&lt;/span&gt;=&lt;span style="color: lightsalmon;"&gt;"-cdrom $3"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: cyan;"&gt;else&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;CDROM&lt;/span&gt;=&lt;span style="color: lightsalmon;"&gt;""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: cyan;"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;NET&lt;/span&gt;=&lt;span style="color: lightsalmon;"&gt;"-net nic -net tap,script=/etc/qemu-ifup"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orangered;"&gt;# &lt;/span&gt;&lt;span style="color: orangered;"&gt;Start kvm&lt;/span&gt;kvm $&lt;span style="color: #eedd82;"&gt;CPUS&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;MEMORY&lt;/span&gt; -drive &lt;span style="color: #eedd82;"&gt;file&lt;/span&gt;=$&lt;span style="color: #eedd82;"&gt;HDA&lt;/span&gt;,&lt;span style="color: #eedd82;"&gt;if&lt;/span&gt;=virtio,&lt;span style="color: #eedd82;"&gt;boot&lt;/span&gt;=on $&lt;span style="color: #eedd82;"&gt;CDROM&lt;/span&gt; -net nic,&lt;span style="color: #eedd82;"&gt;model&lt;/span&gt;=virtio,&lt;span style="color: #eedd82;"&gt;macaddr&lt;/span&gt;=$&lt;span style="color: #eedd82;"&gt;MACADDRESS&lt;/span&gt; -net tap,&lt;span style="color: #eedd82;"&gt;ifname&lt;/span&gt;=$&lt;span style="color: #eedd82;"&gt;IFACE&lt;/span&gt;,&lt;span style="color: #eedd82;"&gt;script&lt;/span&gt;=$&lt;span style="color: #eedd82;"&gt;SCRIPT_PATH&lt;/span&gt;/qemu-ifup&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orangered;"&gt;# &lt;/span&gt;&lt;span style="color: orangered;"&gt;kvm has stopped - remove tap tap interface&lt;/span&gt;sudo tunctl -d $&lt;span style="color: #eedd82;"&gt;IFACE&lt;/span&gt; &amp;amp;&amp;gt; /dev/null&lt;/pre&gt;After successfully booting to the Gentoo VM I halted the VM to create another disk image. I may want to reuse this vanilla Gentoo VM in the future so I created another disk image taking this vanilla one as base as follows:&lt;br /&gt;&lt;pre&gt;qemu-img create -f qcow2 -o backing_file=gentoo.qcow2 gentoo-drbd.qcow2&lt;/pre&gt;Then I started the VM with the new script with: &lt;br /&gt;&lt;pre&gt;startVM DE:AD:BE:EF:E3:1D gentoo-drbd.qcow2&lt;/pre&gt;The MAC Address will be important later.&lt;br /&gt;&lt;br /&gt;Now I installed all the packages that I will be needing for each node in the cluster. The goal is to avoid having to build them many times and to reuse this image for all nodes. Basic steps are as follows: &lt;br /&gt;&lt;pre&gt;emerge -av telnet-bsd drbd lvm2 pacemaker lighttpd&lt;br /&gt;eselect python set python2.6&lt;br /&gt;pvcreate /dev/vda4&lt;br /&gt;vgcreate internalhd /dev/vda4&lt;/pre&gt;I changed python to 2.6 because pacemaker requires it. I added the following to /etc/hosts to avoid doing it everyware:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;192.168.100.10 node1&lt;br /&gt;192.168.100.11 node2&lt;br /&gt;192.168.100.20 cluster&lt;/pre&gt;Next I created an image for the two nodes as follows:&lt;br /&gt;&lt;pre&gt;qemu-img create -f qcow2 -o backing_file=gentoo-drbd.qcow2 gentoo-drbd-node1.qcow2&lt;br /&gt;cp gentoo-drbd-node1.qcow2 gentoo-drbd-node2.qcow2&lt;/pre&gt;Then I created to scripts, one to start each VM. The contents are as follows (for node2 you &lt;b&gt;must&lt;/b&gt; change the mac address):  &lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;&lt;span style="color: orangered;"&gt;#&lt;/span&gt;&lt;span style="color: orangered;"&gt;!/bin/&lt;/span&gt;&lt;span style="color: cyan;"&gt;bash&lt;/span&gt;&lt;span style="color: orangered;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: lightsteelblue;"&gt;set&lt;/span&gt; -x&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orangered;"&gt;# &lt;/span&gt;&lt;span style="color: orangered;"&gt;Get the location of the script&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;SCRIPT&lt;/span&gt;=&lt;span style="color: salmon;"&gt;`readlink -f $0`&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;SCRIPT_PATH&lt;/span&gt;=&lt;span style="color: salmon;"&gt;`dirname $SCRIPT`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;startVM DE:AD:BE:EF:E3:1D gentoo-drbd-node1.qcow2&lt;/pre&gt;I then configured static IPs for each node, that is: edit /etc/conf.d/hostname to be either node1 or node2 and the contents of /etc/conf.d/net to be:&lt;br /&gt;&lt;pre&gt;config_eth0=( "192.168.100.10/24" )&lt;br /&gt;routes_eth0=( "default via 192.168.100.1" )&lt;/pre&gt;For node 2 the IP ends in 11. Next I confired corosync. This must be done on both nodes:&lt;br /&gt;&lt;pre&gt;cd /etc/corosync&lt;br /&gt;cp corosync.conf.example to corosync.conf&lt;/pre&gt;Edit the corosync.conf file and make the bindnetaddr be the IP address of the node. And add the pacemaker service by adding the following to the end of the file:&lt;br /&gt;&lt;pre&gt;service {&lt;br /&gt;   name: pacemaker&lt;br /&gt;   ver: 0&lt;br /&gt;}&lt;/pre&gt;I started corosync on both nodes and marked it to start on boot:&lt;br /&gt;&lt;pre&gt;/etc/init.d/corosync start&lt;br /&gt;rc-update add corosync default&lt;/pre&gt;Then I proceded to congiure the cluster. First I turned of &lt;a href="http://en.wikipedia.org/wiki/STONITH"&gt;STONITH&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;crm configure property stonith-enabled=false&lt;/pre&gt;Then I created the Virtual IP for the Cluster:&lt;br /&gt;&lt;pre&gt;crm configure primitive ClusterIP ocf:hertbeat:IPaddr2 params ip=192.168.100.20 cidr_netmask=32 op monitor interval=30s&lt;/pre&gt;Marked the cluster to runt with two nodes (without quorom, please don't discuss this in the comments) and for resource stickiness (to avoid having the resources move around if not needed):&lt;br /&gt;&lt;pre&gt;crm configure property no-quorum-policy=ignore&lt;br /&gt;crm configure rsc_defaults resource-stickiness=100&lt;/pre&gt;I added lighttpd as a service. First I created index.html on both nodes and different so that I can check if things are working. Next I created the service in the cluster: &lt;br /&gt;&lt;pre&gt;crm configure primtive WebSite lsb:lighttpd op monitor interval=30s&lt;br /&gt;crm configure colocation website-with-ip INFINITY: WebSite ClusterIP&lt;br /&gt;crm configure order lighttpd-after-ip mandatory: ClusterIP WebSite&lt;/pre&gt;&lt;br /&gt;You can test and access the cluster address (http://192.168.100.20) to see whose answering. You can stop the corosync service to view the service migrate between nodes.&lt;br /&gt;&lt;br /&gt;Next up DRBD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7307147297090293511?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7307147297090293511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7307147297090293511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7307147297090293511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7307147297090293511'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/12/howto-make-your-private-vm-cluster-part_29.html' title='Howto make your private VM Cluster, Part II'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8777839829202566408</id><published>2010-12-28T12:22:00.004Z</published><updated>2010-12-28T22:06:26.517Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Howto make your private VM Cluster, Part I</title><content type='html'>I wanted to make some experiments with &lt;a href="http://www.drbd.org/"&gt;DRBD&lt;/a&gt;, &lt;a href="http://www.linux-ha.org/wiki/Pacemaker"&gt;pacemaker&lt;/a&gt; and others. The goal is to test a few configurations for an high availability scenario. Since I don't want to make changes to my machine the solution is to use Virtual Machines. I decided to go all open source and use &lt;a href="http://www.linux-kvm.org/"&gt;KVM&lt;/a&gt;. Since I want more that a single VM I decided to setup a private bridge to which all the VMs would connect. The bridge would provide DHCP and DNS services and NAT + Firewall to the internet.&lt;br /&gt;&lt;br /&gt;I use &lt;a href="http://www.gentoo.org/"&gt;Gentoo&lt;/a&gt;. If you use another distribution or firewall tool you should adapt these instructions and scripts to fit your needs.&lt;br /&gt;&lt;br /&gt;First I created a script that sets up my bridge. The script is as follows (I called it setupBridge):&lt;pre style="color: #ffffff; background-color: #000000;"&gt;&lt;span style="color: #ff4500;"&gt;#&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;!/bin/&lt;/span&gt;&lt;span style="color: #00ffff;"&gt;bash&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #b0c4de;"&gt;set&lt;/span&gt; -x&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Setup the bridge&lt;br /&gt;&lt;/span&gt;sudo brctl addbr br0&lt;br /&gt;sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0 up&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Launch DNS and DHCP Server on br0&lt;br /&gt;&lt;/span&gt;sudo dnsmasq -q -a 192.168.100.1 --dhcp-range=192.168.100.50,192.168.100.150,forever --pid-file=/tmp/br0-dnsmasq.pid&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Launch updated firewall configuration&lt;br /&gt;&lt;/span&gt;sudo firehol /home/nsousa/KVM/firehol-br0.conf start&lt;/pre&gt;The bridge is created and I give it the 192.168.100.1 ip address. I use dnsmasq to provide DNS and DHCP. The DHCP provided addresses will be from 192.168.100.50 to 150. Finally I adapt the firewall using &lt;a href="http://firehol.sourceforge.net/"&gt;firehol&lt;/a&gt;. Here is the firehold configuration file (firehol-br0.conf): &lt;pre style="color: #ffffff; background-color: #000000;"&gt;&lt;span style="color: #eedd82;"&gt;version&lt;/span&gt; 5&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Allow all traffic in the Bridge&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;interface&lt;/span&gt; br0 bridge&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;server&lt;/span&gt; all accept&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;client&lt;/span&gt; all accept&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Accept all client traffic on any interface&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;interface&lt;/span&gt; any world&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;client&lt;/span&gt; all accept&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;NAT to the internet&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;router&lt;/span&gt; bridge2internet inface eth0 outface br0&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;masquerade&lt;/span&gt; reverse&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;client&lt;/span&gt; all accept&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Bridge Routing&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;router&lt;/span&gt; bridge-routing inface br0 outface br0&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;server&lt;/span&gt; all accept&lt;br /&gt;    &lt;span style="color: #eedd82;"&gt;client&lt;/span&gt; all accept&lt;br /&gt;&lt;/pre&gt;This basically allows the VMs to connect to any service running on br0 (the host). It allows any one to connect to anyone as client (so the host can go to the internet). Finally it sets up NAT using masquerade so the VMs can use the bridge to access the internet, but as clients only.&lt;br /&gt;&lt;br /&gt;To undo all these changes I have a script that tears all this setup down. I called it teardownBridge and here are its contents: &lt;pre style="color: #ffffff; background-color: #000000;"&gt;&lt;span style="color: #ff4500;"&gt;#&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;!/bin/&lt;/span&gt;&lt;span style="color: #00ffff;"&gt;bash&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #b0c4de;"&gt;set&lt;/span&gt; -x&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Stop DHCP and DNS Server&lt;br /&gt;&lt;/span&gt;sudo kill -15 &lt;span style="color: #fa8072;"&gt;`cat /tmp/br0-dnsmasq.pid`&lt;/span&gt;&lt;br /&gt;sudo rm /tmp/br0-dnsmasq.pid&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Stop the bridge&lt;br /&gt;&lt;/span&gt;sudo ifconfig br0 down&lt;br /&gt;sudo brctl delbr br0&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Reset the firewall&lt;br /&gt;&lt;/span&gt;sudo firehol /etc/firehol/firehol.conf start&lt;br /&gt;&lt;/pre&gt;Before moving to the script that starts one VM I first need to show the script that sets up the interface for qemu to use (I called it qemu-ifup): &lt;pre style="color: #ffffff; background-color: #000000;"&gt;&lt;span style="color: #ff4500;"&gt;#&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;!/bin/&lt;/span&gt;&lt;span style="color: #00ffff;"&gt;bash&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #b0c4de;"&gt;set&lt;/span&gt; -x&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #00ffff;"&gt;if &lt;/span&gt;&lt;span style="color: #b0c4de;"&gt;test&lt;/span&gt; $(&lt;span style="color: #fa8072;"&gt;/sbin/ifconfig&lt;/span&gt; | grep -c $&lt;span style="color: #eedd82;"&gt;1&lt;/span&gt;) -gt 0; &lt;span style="color: #00ffff;"&gt;then&lt;/span&gt;&lt;br /&gt;    sudo /sbin/brctl delif br0 $&lt;span style="color: #eedd82;"&gt;1&lt;/span&gt;&lt;br /&gt;    sudo /sbin/ifconfig $&lt;span style="color: #eedd82;"&gt;1&lt;/span&gt; down&lt;br /&gt;&lt;span style="color: #00ffff;"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sudo /sbin/ifconfig $&lt;span style="color: #eedd82;"&gt;1&lt;/span&gt; 0.0.0.0 promisc up&lt;br /&gt;sudo /sbin/brctl addif br0 $&lt;span style="color: #eedd82;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; The goal here is to add the tap device created to the bridge. I first remove it if it is already there.&lt;br /&gt;&lt;br /&gt;Last but not least the script that starts a VM. This script sets up a tap device for the current user, configures KVM start-up parameters and starts KVM. When KVM ends it removes the tap device to keep the system clean. Here is the contents of the script adapted to use a hard disk and the minimal install cd for gentoo (I called it startVM):  &lt;pre style="color: #ffffff; background-color: #000000;"&gt;&lt;span style="color: #ff4500;"&gt;#&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;!/bin/&lt;/span&gt;&lt;span style="color: #00ffff;"&gt;bash&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #b0c4de;"&gt;set&lt;/span&gt; -x&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Create tap interface so that the script /etc/qemu-ifup can bridge it&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;before qemu starts&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;USERID&lt;/span&gt;=&lt;span style="color: #fa8072;"&gt;`whoami`&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;IFACE&lt;/span&gt;=&lt;span style="color: #fa8072;"&gt;`sudo tunctl -b -u $USERID`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Setup KVM parameters&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;MEMORY&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-m 512"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;IMGPATH&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"/home/nsousa/KVM"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;IMAGE&lt;/span&gt;=gentoo.qcow2&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;CDROM&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-cdrom /home/nsousa/Downloads/install-x86-minimal-20101123.iso"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;MACADDRESS&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"DE:AD:BE:EF:5D:A3"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #eedd82;"&gt;NET&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-net nic -net tap,script=/etc/qemu-ifup"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Start kvm&lt;br /&gt;&lt;/span&gt;kvm $&lt;span style="color: #eedd82;"&gt;MEMORY&lt;/span&gt; -hda $&lt;span style="color: #eedd82;"&gt;IMGPATH&lt;/span&gt;/$&lt;span style="color: #eedd82;"&gt;IMAGE&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;CDROM&lt;/span&gt; -net nic,&lt;span style="color: #eedd82;"&gt;macaddr&lt;/span&gt;=$&lt;span style="color: #eedd82;"&gt;MACADDRESS&lt;/span&gt; -net tap,&lt;span style="color: #eedd82;"&gt;ifname&lt;/span&gt;=$&lt;span style="color: #eedd82;"&gt;IFACE&lt;/span&gt;,&lt;span style="color: #eedd82;"&gt;script&lt;/span&gt;=/home/nsousa/KVM/qemu-ifup&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff4500;"&gt;# &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;kvm has stopped - remove tap tap interface&lt;br /&gt;&lt;/span&gt;sudo tunctl -d $&lt;span style="color: #eedd82;"&gt;IFACE&lt;/span&gt; &amp;amp;&amp;gt; /dev/null&lt;br /&gt;&lt;/pre&gt;Next step is to make a minimal gentoo installation on a VM to use as base for all the VMs in the cluster. I'll probably refactor the startVM script to separate the common parts (the private parts will be the disk image to use and MAC Address).&lt;br /&gt;&lt;br /&gt;Stay tuned for more updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8777839829202566408?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8777839829202566408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8777839829202566408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8777839829202566408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8777839829202566408'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/12/howto-make-your-private-vm-cluster-part.html' title='Howto make your private VM Cluster, Part I'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3966257292542875356</id><published>2010-09-15T21:52:00.003+01:00</published><updated>2010-09-15T22:03:07.064+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Laptop Power Saving</title><content type='html'>Today I had an issue updating the kernel on my company's laptop. I ended up reconfiguring it from strach istead of doing the oldconfig option (make oldconfig didn't ask anything but the kernel hard locked on boot). I took the oportunity to try to get a more duration out of the battery. How? By consuming less power.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lesswatts.org/projects/powertop/"&gt;PowerTop&lt;/a&gt; came in and lend a helping hand but it was not sufficient. When I enabled USB Suspend (CONFIG_USB_SUSPEND) the keyboard didn't work well. I have a keyboard, mouse and webcam connected to a hub that I use when I'm on my desk. Everything was working, power was being saving, even for the keyboard. The problem was that when the keyboard entered power saving mode and I pressed a key the first key that I pressed would be lost. The &lt;a href="http://www.mjmwired.net/kernel/Documentation/usb/power-management.txt#243"&gt;documentation&lt;/a&gt; talks about this issue but I didn't want to loose on the opportunity to increase my laptop's autonomy. Solution: udev to the rescue.&lt;br /&gt;&lt;br /&gt;I created a udev rule that detects the USB Keyboard (by vendor and product id, maybe someday I'll connect to a keyboard without a problem). When the keyboard is connect it disables auto suspend just for the keyboard. Here is how I've done it (&lt;i&gt;Note&lt;/i&gt;:I'm using Gentoo, but this should work on any linux, with more or less salt).&lt;br /&gt;&lt;br /&gt;I created a udev rule in "/etc/udev/rules.d/92-usb-autosuspendfix.rules" with the following contents:&lt;pre&gt;SUBSYSTEMS=="usb", ATTRS{idVendor}=="04f2", ATTRS{idProduct}=="0403",&lt;br /&gt;    RUN+="/etc/fixes/disableKeyBoardAutoSuspend.sh 04f2 0403"&lt;/pre&gt;The "/etc/fixes/disableKeyBoardAutoSuspend.sh" script does the whole magic. It search for the usb device in the sysfs and toggles the power control to on (it defaults to auto if the device supports power control).&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;cd /sys/bus/usb/devices/&lt;br /&gt;for device in `ls`; do&lt;br /&gt;  if [ -f $device/idVendor ]; then&lt;br /&gt;    if [ -f $device/idProduct ]; then&lt;br /&gt;      vendor=`cat $device/idVendor`&lt;br /&gt;      product=`cat $device/idProduct`&lt;br /&gt;      if [ "$1 $2" == "$vendor $product" ]; then&lt;br /&gt;        echo "Disable power for device $vendor:$product."&lt;br /&gt;        cd $device/power&lt;br /&gt;        echo on &gt; level&lt;br /&gt;      fi&lt;br /&gt;    fi&lt;br /&gt;  fi&lt;br /&gt;done&lt;/pre&gt;Hope this helps you. Maybe we should start a blacklist of USB devices that don't work well with power control.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3966257292542875356?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3966257292542875356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3966257292542875356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3966257292542875356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3966257292542875356'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/09/laptop-power-saving.html' title='Laptop Power Saving'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4905104430180796739</id><published>2010-09-10T12:45:00.002+01:00</published><updated>2010-09-10T12:47:20.161+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>When hackers have fun!</title><content type='html'>Today I was building the RRDTool from source and I noticed the output of the configuration part was ordering a CD.&lt;pre&gt;config.status: executing po-directories commands&lt;br /&gt;config.status: creating po/POTFILES&lt;br /&gt;config.status: creating po/Makefile&lt;br /&gt;config.status: executing default commands&lt;br /&gt;checking in... and out again&lt;br /&gt;ordering CD from http://tobi.oetiker.ch/wish .... just kidding ;-)&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;Config is DONE!&lt;br /&gt;&lt;/pre&gt;This shows that hackers love to play ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4905104430180796739?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4905104430180796739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4905104430180796739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4905104430180796739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4905104430180796739'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/09/when-hackers-have-fun.html' title='When hackers have fun!'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7407552675933529213</id><published>2010-05-08T15:22:00.001+01:00</published><updated>2010-05-08T15:24:03.027+01:00</updated><title type='text'>A new Laptop</title><content type='html'>I just got a bran new Sony Vaio VPCF11Z1E as part of a compensation of making the b2b web site for my family's company. It comes preloaded with Windows 7 that I intend to leave there just in case. I'll put any special instruction on getting it running with  Gentoo, my Linux distribution of choice, but first I like to talk about the hands on experience with such a computer.&lt;br /&gt;&lt;br /&gt;I decided to turn it on and let Windows 7 do its thing. After all, it has 500Gb of disk space and the goal is to replace my old broken laptop that served me for almost 10 years and that one had a 80Gb hard disk. So, if I leave windows with 100 Gb of disk space it should be more than sufficient.&lt;br /&gt;&lt;br /&gt;After turning on the PC I decided to follow the guideline and let windows and Sony's update tools run. It took an amazing 4 hours to download and install everything. I have an ADSL connection that could do 24Mbit/s but since I'm far away from the phone box it only does 8Mbit/s. What Amazed me is that just for Sony's updates it had to download almost 1Gb of data. I mean, it is a brand new laptop couldn't be updated already?&lt;br /&gt;&lt;br /&gt;After all these updates I decided I should also create the recovery disks. You see, way back when I bought my old laptop it came with recovery disks, recovery disks and a whole lot more things. Today the laptops don't have recovery disks but recovery partitions. The disks you have to create them your self (another 2 ours to the mix) or to order and pay for them.&lt;br /&gt;&lt;br /&gt;I call this a bad user experience. I brand new top of the line computer and I needed to go by 4 dvds and invest over 6 hours just to get it to a point that it is ready for usage if you follow the guidelines.&lt;br /&gt;&lt;br /&gt;On top of that these people are getting more stupid every day. I was going to use windows disk management tool to shrink the windows partition to say 100Gb and I found out some nice gems. First the recovery partition is in the beginning of the disk. I though the faster part of the hard drive was its beginning, but I must be wrong, the Internet and all those that discuss there must also be wrong. You see, someone at Sony decided to put the recovery partition in the beginning of the drive. Strange because all laptops I saw until today had this partition at the end of the hard drive. To make things worse there is another 100Mb partition after that one and then comes the rest of the disk. What is the 100Mb partition used for? Well, it is called the System Rescue partition and it is the one with the boot flag. I assume this has the software Sony uses to recover the computer.&lt;br /&gt;&lt;br /&gt;To culminate my disappointment windows is reporting that it can only shrink the partition to 244G. I'll try shrinking it, then defrag it and then shrinking it again. If it doesn't work it seems I'll be putting the recovery partition to the test because I'm going to delete the partition and use the recovery to get windows to use only 100G or so. I mean, it has 49Gb of used disk space and it is a clean install with updates. What the hell is this thing doing? And 49Gb just for the operating system with a browser, demo of Office an little more? That is more than bloat!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7407552675933529213?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7407552675933529213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7407552675933529213' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7407552675933529213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7407552675933529213'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/05/new-laptop.html' title='A new Laptop'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6908765049143209525</id><published>2010-04-13T22:28:00.003+01:00</published><updated>2011-10-05T12:59:02.931+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><title type='text'>GWT Part II: From Ant to Maven</title><content type='html'>In the &lt;a href="/2010/04/gwt-start-up-improving-ant-build-file.html"&gt;last entry&lt;/a&gt; I showed how to get started with GWT and get a nicer build file with Ant. In this entry I'll explain the process of moving from Ant to Maven.&lt;br /&gt;&lt;br /&gt;My goal here is to take advantage of all of Maven's features while still maintaining a workable project configuration that I can use from a command line and from Eclipse. GWT's tools generate an Eclipse project but don't do other things like, for instance, adding dependencies to the Eclipse project when you add them to the build file. Maybe you can do this using Apache's &lt;a href="http://ant.apache.org/ivy/"&gt;Ivy&lt;/a&gt;. I haven't tried it, maybe I will someday if I end up hitting a wall using Maven...&lt;br /&gt;&lt;br /&gt;First thing to do is to rearrange our source code. Maven expects things to be on different paths and we will have to do that. I started by moving all java source code to a newly created "src/main/java". I'm using git so I just did:&lt;pre&gt;$ mkdir -p src/main/java&lt;br /&gt;$ git mv src/org src/main/java/org&lt;br /&gt;&lt;/pre&gt;I had to do a similar step for the unit tests:&lt;pre&gt;$ mkdir -p src/test/java&lt;br /&gt;$ git mv test/org src/test/java&lt;br /&gt;$ rmdir test&lt;br /&gt;&lt;/pre&gt; Finally I had to move the war file to the folder maven expects the WAR resources to be int. It is also a simple move operation:&lt;pre&gt;$ mkdir -p src/main/webapp&lt;br /&gt;$ git mv war/* src/main/webapp/&lt;br /&gt;$ rmdir war&lt;br /&gt;$ git rm -f src/main/webapp/WEB-INF/lib/gwt-servlet.jar&lt;br /&gt;&lt;/pre&gt;I also removed the &lt;i&gt;gwt-servlet.jar&lt;/i&gt; file that was added by the GWT tools as maven will take care of it for me.&lt;br /&gt;&lt;br /&gt;Maven supports resources and resource filtering but GWT has special needs. This means that GWT's XML files for the source code need to reside on the same code as the java files, something that is not usual in Maven projects. But I had to do this for the test resources, that is, for the GWT xml file used in the tests. That was relatively simple:&lt;pre&gt;$ mkdir -p src/test/resources/org/nuno/backoffice&lt;br /&gt;$ git mv src/test/java/org/nuno/backoffice/BackOfficeJUnit.gwt.xml src/test/resources/org/nuno/backoffice&lt;/pre&gt;But this is not sufficient. The naming convention for unit tests are different. We want to support plain old unit tests and GWT Test Cases. For Maven the convention is to have your tests named "GwtTest*" for GWT based unit tests and ending with either "Test" or "TestCase" for plain old Unit Tests. Luckely this is a simple change. I renamed the "BackOfficeTest.java" file to "GwtBackOffice.java" with the following command:&lt;pre&gt;$ git mv src/test/java/org/nuno/backoffice/client/BackOfficeTest.java src/test/java/org/nuno/backoffice/client/GwtTestBackOffice.java&lt;/pre&gt;Next I edited the file to change the name of the class. I will try to explain how to have 70% of your unit tests being plain old JUnit tests (without GWT) overhead in a future entry.&lt;br /&gt;&lt;br /&gt;Since I'm want to use Eclipse's Maven plug-in I simply deleted the eclipse projects with "git rm .classpath .project". Now comes the &lt;i&gt;hard&lt;/i&gt; part: the Project Object Model (POM).&lt;br /&gt;&lt;br /&gt;Making a POM for a GWT project was a collection of trials and errors with many searches on Google, forums and others. I finally got a simple POM that works for all that I needed so far, that is, to build the project, run simple unit tests and GWT based tests, run in development mode, make unit and coverage reports and that can be used directly from Eclipse.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://mojo.codehaus.org/gwt-maven-plugin/plugin-info.html"&gt;GWT for Maven plug-in&lt;/a&gt; has support to generate the ASYNC interfaces automatically. I decided to use this support I went ahead and removed the Async version of the interface as follows:&lt;pre&gt;$ git rm src/main/java/org/nuno/backoffice/client/GreetingServiceAsync.java&lt;br /&gt;&lt;/pre&gt;With all these steps and a lot of debugging, trial and error I ended up with this POM:&lt;pre style="background:black"&gt;&amp;lt;&lt;span style="color: #00ffff;"&gt;?&lt;/span&gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;xml&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;version&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"1.0"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;encoding&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;UTF&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;-8"&lt;/span&gt;?&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style="color: #87cefa;"&gt;project&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"http://maven.apache.org/POM/4.0.0"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;xsi&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;xsi&lt;/span&gt;:&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;schemaLocation&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;modelVersion&lt;/span&gt;&amp;gt;4.0.0&amp;lt;/&lt;span style="color: #87cefa;"&gt;modelVersion&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;org.nuno.backoffice&amp;lt;/&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;BackOffice&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;0.0.1-SNAPSHOT&amp;lt;/&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;packaging&lt;/span&gt;&amp;gt;war&amp;lt;/&lt;span style="color: #87cefa;"&gt;packaging&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;name&lt;/span&gt;&amp;gt;Back Office&amp;lt;/&lt;span style="color: #87cefa;"&gt;name&lt;/span&gt;&amp;gt;&lt;br /&gt;                &lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;properties&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;span style="color: #87cefa;"&gt;gwt.version&lt;/span&gt;&amp;gt;2.0.3&amp;lt;/&lt;span style="color: #87cefa;"&gt;gwt.version&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #87cefa;"&gt;properties&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;dependencies&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;span style="color: #87cefa;"&gt;dependency&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;com.google.gwt&amp;lt;/&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;-&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;servlet&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;${gwt.version}&amp;lt;/&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;scope&lt;/span&gt;&amp;gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;runtime&lt;/span&gt;&amp;lt;/&lt;span style="color: #87cefa;"&gt;scope&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;span style="color: #87cefa;"&gt;dependency&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;span style="color: #87cefa;"&gt;dependency&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;com.google.gwt&amp;lt;/&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;-user&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;${gwt.version}&amp;lt;/&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;scope&lt;/span&gt;&amp;gt;provided&amp;lt;/&lt;span style="color: #87cefa;"&gt;scope&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;span style="color: #87cefa;"&gt;dependency&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #ff4500;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Test dependencies &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;                &amp;lt;&lt;span style="color: #87cefa;"&gt;dependency&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;4.7&amp;lt;/&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;scope&lt;/span&gt;&amp;gt;test&amp;lt;/&lt;span style="color: #87cefa;"&gt;scope&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;span style="color: #87cefa;"&gt;dependency&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #87cefa;"&gt;dependencies&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;repositories&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;span style="color: #87cefa;"&gt;repository&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;id&lt;/span&gt;&amp;gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;-maven&amp;lt;/&lt;span style="color: #87cefa;"&gt;id&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;url&lt;/span&gt;&amp;gt;http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/&amp;lt;/&lt;span style="color: #87cefa;"&gt;url&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;span style="color: #87cefa;"&gt;repository&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #87cefa;"&gt;repositories&lt;/span&gt;&amp;gt;&lt;br /&gt;        &lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pluginRepositories&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pluginRepository&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;id&lt;/span&gt;&amp;gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;-maven&amp;lt;/&lt;span style="color: #87cefa;"&gt;id&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #87cefa;"&gt;url&lt;/span&gt;&amp;gt;http://gwt-maven.googlecode.com/svn/trunk/mavenrepo&amp;lt;/&lt;span style="color: #87cefa;"&gt;url&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pluginRepository&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pluginRepositories&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;build&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugins&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;org.apache.maven.plugins&amp;lt;/&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;maven-compiler-&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;configuration&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;source&lt;/span&gt;&amp;gt;1.6&amp;lt;/&lt;span style="color: #87cefa;"&gt;source&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;1.6&amp;lt;/&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;/&lt;span style="color: #87cefa;"&gt;configuration&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;org.codehaus.mojo&amp;lt;/&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;-maven-&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;1.2&amp;lt;/&lt;span style="color: #87cefa;"&gt;version&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;configuration&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;runTarget&lt;/span&gt;&amp;gt;org.nuno.backoffice.Backoffice/Backoffice.html&amp;lt;/&lt;span style="color: #87cefa;"&gt;runTarget&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;hostedWebapp&lt;/span&gt;&amp;gt;${project.build.directory}/gwt-run-war&amp;lt;/&lt;span style="color: #87cefa;"&gt;hostedWebapp&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;tomcat&lt;/span&gt;&amp;gt;${project.build.directory}/tomcat&amp;lt;/&lt;span style="color: #87cefa;"&gt;tomcat&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;/&lt;span style="color: #87cefa;"&gt;configuration&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;executions&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;execution&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                &amp;lt;&lt;span style="color: #87cefa;"&gt;goals&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;generateAsync&lt;/span&gt;&amp;lt;/&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;compile&amp;lt;/&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;resources&amp;lt;/&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;clean&amp;lt;/&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                &amp;lt;/&lt;span style="color: #87cefa;"&gt;goals&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;/&lt;span style="color: #87cefa;"&gt;execution&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &lt;span style="color: #ff4500;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;GWT&lt;/span&gt;&lt;span style="color: #ff4500;"&gt; Test Cases are run in the test phase instead o the &lt;/span&gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;integation&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;-test phase &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;execution&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                &amp;lt;&lt;span style="color: #87cefa;"&gt;id&lt;/span&gt;&amp;gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;-tests&amp;lt;/&lt;span style="color: #87cefa;"&gt;id&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                &amp;lt;&lt;span style="color: #87cefa;"&gt;phase&lt;/span&gt;&amp;gt;test&amp;lt;/&lt;span style="color: #87cefa;"&gt;phase&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                &amp;lt;&lt;span style="color: #87cefa;"&gt;goals&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;test&amp;lt;/&lt;span style="color: #87cefa;"&gt;goal&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                &amp;lt;/&lt;span style="color: #87cefa;"&gt;goals&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;/&lt;span style="color: #87cefa;"&gt;execution&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;/&lt;span style="color: #87cefa;"&gt;executions&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #ff4500;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Work around the fact that &lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ff4500;"&gt;:test creates a tomcat folder &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;maven-clean-&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;configuration&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;filesets&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                        &amp;lt;&lt;span style="color: #87cefa;"&gt;directory&lt;/span&gt;&amp;gt;tomcat&amp;lt;/&lt;span style="color: #87cefa;"&gt;directory&lt;/span&gt;&amp;gt;&lt;br /&gt;                                                &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt;&amp;gt;&lt;br /&gt;                                        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;filesets&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;/&lt;span style="color: #87cefa;"&gt;configuration&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugins&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #87cefa;"&gt;build&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;reporting&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugins&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;org.apache.maven.plugins&amp;lt;/&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;maven-surefire-report-&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;org.codehaus.mojo&amp;lt;/&lt;span style="color: #87cefa;"&gt;groupId&lt;/span&gt;&amp;gt;&lt;br /&gt;                                &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;emma&lt;/span&gt;-maven-&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;artifactId&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;plugins&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #87cefa;"&gt;reporting&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;span style="color: #87cefa;"&gt;project&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;With this POM we can simple do:&lt;ul&gt;  &lt;li&gt; "mvn package" to build the WAR file (running all unit tests); &lt;/li&gt;  &lt;li&gt; "mvn gwt:run" to run in development mode &lt;/li&gt;  &lt;li&gt; "mvn clean" to clean all output &lt;/li&gt;  &lt;li&gt; "mvn site" to generate the site for the project with all the reports.&lt;/li&gt;  &lt;li&gt; In principle any other Maven task or phase. &lt;/li&gt;&lt;/ul&gt;Using the M2 plugin for eclipse you can simple import the Maven project but you will have to choose "Maven"-&gt;"Update project Configuration" once it is imported so it caches the generated sources folder.&lt;br /&gt;&lt;br /&gt;The project will work well in eclipse but you won't be able to use GWT eclipse integration fully: you can edit all source files with all the assistance but you can't run the code using the GWT plugin for eclipse. What you can do is configure an external maven target of "gwt:run" and work as if nothing had happened.&lt;br /&gt;&lt;br /&gt;On future entries I have a lot more things to cover like how to run plain old Unit Tests for 70% of your tests (this POM is already prepared for it); Unit Testing with MVP and whatever comes to mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6908765049143209525?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6908765049143209525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6908765049143209525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6908765049143209525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6908765049143209525'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/04/gwt-part-ii-from-ant-to-maven.html' title='GWT Part II: From Ant to Maven'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-5021880230752817441</id><published>2010-04-13T19:29:00.002+01:00</published><updated>2011-10-05T12:59:02.926+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><title type='text'>GWT Start-up: improving the Ant Build file</title><content type='html'>GWT Start-up: improving the Ant Build file&lt;br /&gt;&lt;br /&gt;In the past weeks I've been investigation &lt;a href="http://code.google.com/webtoolkit/"&gt;Google's Web Toolkit&lt;/a&gt;. I started looking at it because I wanted a good "Web 2.0" application and JSF was cutting it. I tried using JSF and Porlets but Portlets 2.0 isn't ready for prime time yet: the JSF bridges I've tested still don't work, but that is a topic for another post.&lt;br /&gt;&lt;br /&gt;Today I want to make a fast track introduction to GWT and to summarise some of those issues and how I worked around them. For now I'll start with the basic project setup.&lt;br /&gt;&lt;br /&gt;GWT has first class support for Apache's &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; but I wanted to use Maven. Why Maven? It simply makes sense to me because of all the Project Management support it has. You can improve Ant with &lt;a href="http://ant.apache.org/ivy/"&gt;Ivy&lt;/a&gt; but for me it still feels like shell scripting in XML. If I'm going to pay the price for XML than I want something in return.&lt;br /&gt;&lt;br /&gt;There is an archetype for GWT and Maven but I simply don't like it so I decided to start with GWT's support for Ant and change the project to have Maven. But before going to Maven I also decided to improve the Ant build file the application creator generates.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating the Skeleton&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;GWT has a tool that automatically creates the skeleton for your application. I used that tool because I didn't want to wast time reinventing the wheel. It is rather simple just run the following command in the folder you want your project to live in:&lt;pre&gt;&lt;br /&gt;$ webAppCreator -junit ~/.m2/repository/junit/junit/4.7/junit-4.7.jar org.nuno.backoffice.BackOffice&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I'm using &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt;'s jar from by Maven repository. I could have omitted that step but I wanted GWT to generate a Test Case for me so I can use it as a starting point later on. You can check if your project works by simply running "ant devmode".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimising the build file&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The build file generated by GWT has, in my view, a copy/paste and I believe all copy/paste should be eliminated by refactoring. The part I'm talking about is the test part. The build file has support for running tests in development mode and in production mode. Here is what is generated by GWT:&lt;pre style="background:black" &gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dev&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;depends&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;javac&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.tests"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;description&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"Run development mode tests"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;mkdir&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;htmlunit&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dev&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;fork&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;printsummary&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;haltonfailure&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;jvmarg&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;line&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;Xmx&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;256m"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sysproperty&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;standardsMode&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; -&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;logLevel&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; WARN"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sysproperty&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"java.awt.headless"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"true"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;src&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;path&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;refid&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"project.class.path"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"/home/nsousa/.m2/repository/junit/junit/4.7/junit-4.7.jar"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;batchtest&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;todir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;htmlunit&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dev&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; &amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;include&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"**/*Test.java"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;batchtest&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;formatter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;type&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"plain"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;formatter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;type&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;xml&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test.prod"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;depends&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;javac&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.tests"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;description&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"Run production mode tests"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;mkdir&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;htmlunit&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.prod"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;fork&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;printsummary&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;haltonfailure&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;jvmarg&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;line&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;Xmx&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;256m"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sysproperty&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-prod -&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;standardsMode&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; -&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;logLevel&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; WARN -&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;standardsMode&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; -out &lt;/span&gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;www&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;-test"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sysproperty&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"java.awt.headless"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"true"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;src&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;path&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;refid&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"project.class.path"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"/home/nsousa/.m2/repository/junit/junit/4.7/junit-4.7.jar"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;batchtest&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;todir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;htmlunit&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.prod"&lt;/span&gt; &amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; &amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;include&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"**/*Test.java"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;batchtest&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;formatter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;type&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"plain"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;formatter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;type&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;xml&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;These tasks are basically copy/paste of each other and the only change is the output folder for the reports and the GWT parameters. I decided to refactor them to a macro definition to get things a lot simpler a less error prone.    &lt;pre style="background:black"&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;macrodef&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;testgwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;attribute&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;attribute&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"destination"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;sequential&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;mkdir&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;fork&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt; &lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;printsummary&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt; &lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;haltonfailure&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;jvmarg&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;line&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;Xmx&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;256m"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sysproperty&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"@{&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;}"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sysproperty&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"java.awt.headless"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"true"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;src&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;path&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;refid&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"project.class.path"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"/home/nsousa/.m2/repository/junit/junit/4.7/junit-4.7.jar"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;batchtest&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;todir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}"&lt;/span&gt; &amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; &amp;gt;&lt;br /&gt;            &amp;lt;&lt;span style="color: #87cefa;"&gt;include&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"**/*Test.java"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;batchtest&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;formatter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;type&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"plain"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;formatter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;type&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;xml&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="color: #87cefa;"&gt;sequential&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;macrodef&lt;/span&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dev&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;depends&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;javac&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.tests"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;description&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"Run development mode tests"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;testgwt&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;standardsMode&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; -&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;logLevel&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; WARN"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;destination&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;htmlunit&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dev&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test.prod"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;depends&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;javac&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.tests"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;description&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"Run production mode tests"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;testgwt&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #eedd82;"&gt;-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-prod -&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;standardsMode&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; -&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;logLevel&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; WARN -&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;standardsMode&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt; -out &lt;/span&gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;www&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;-test"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;destination&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;htmlunit&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.prod"&lt;/span&gt; /&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;Now that the build file has been refactored I decided to make an "ant clean" to find out that it doesn't actually clean all the generated output. Time to fix it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fixing the clean task&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When I asked ant to clean the project I found out that many artifacts were still laying around. How did I found out? Well, I use git and git pointed them out for me. This is not acceptable: running "ant clean" should clean all output. I immediately fixed the issue.&lt;pre style="background:black"&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"clean"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;description&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"Cleans this project"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"war/WEB-INF/classes"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;failonerror&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"false"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"war/&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;backoffice&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;failonerror&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"false"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;".gwt-tmp"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;failonerror&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"false"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"tomcat"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;failonerror&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"false"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;failonerror&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"false"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"www-test"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;failonerror&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"false"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;file&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"BackOffice.war"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #87cefa;"&gt;fileset&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;includes&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"**/*.class"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="color: #87cefa;"&gt;delete&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;I think that GWT should already add code coverage support to the default build file. I mean, why not put an option there since GWT now support &lt;a href="http://emma.sourceforge.net/"&gt;EMMA&lt;/a&gt;? Well I did just that.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Code Coverage with EMMA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I want to be able to run the tests with and without code coverage, just to be sure that the code coverage would be interfering with the tests somehow. So this is what I did. First I added a configuration area for emma on the top of the build file, right after the GWT configuration:&lt;pre style="background:black"&gt;  &lt;span style="color: #ff4500;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Configure path to &lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;GWT&lt;/span&gt;&lt;span style="color: #ff4500;"&gt; &lt;/span&gt;&lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;SDK&lt;/span&gt;&lt;span style="color: #ff4500;"&gt; &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;property&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sdk&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"/opt/NonCriticalStorage/Software/gwt-2.0.3"&lt;/span&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: #ff4500;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;Configure EMMA &lt;/span&gt;&lt;span style="color: #ff4500;"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;property&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"emma.dir"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"/home/nsousa/Software/emma/lib"&lt;/span&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"emma"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;description&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"turns on EMMA instrumentation/reporting"&lt;/span&gt; &amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;property&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"emma.enabled"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"true"&lt;/span&gt; /&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;path&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;id&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"emma.lib"&lt;/span&gt; &amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"${emma.dir}/emma.jar"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"${emma.dir}/emma_ant.jar"&lt;/span&gt; /&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #87cefa;"&gt;path&lt;/span&gt;&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;taskdef&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;resource&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"emma_ant.properties"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;classpathref&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"emma.lib"&lt;/span&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;path&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;id&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"project.class.path"&lt;/span&gt;&amp;gt;&lt;br /&gt; &lt;/pre&gt;The basic idea is that if I specify the "emma" task when calling ant than EMMA will be enabled and I'll have code coverage. If I don't specify the "emma" task then I won't have. In order words, running "ant clean emma test" will run tests with code coverage. Running "ant clean test" will run them without code coverage. I then changed the "javac" task to use EMMA if it is active as follows:&lt;pre style="background:black"&gt;  &amp;lt;&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;javac&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;depends&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"libs"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;description&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"Compile java source"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;mkdir&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"war/WEB-INF/classes"&lt;/span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;javac&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;srcdir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;src&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;includes&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"**"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;encoding&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;utf&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;-8"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;destdir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"war/WEB-INF/classes"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #eedd82;"&gt;source&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"1.5"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;target&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"1.5"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;nowarn&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"true"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #eedd82;"&gt;debug&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"true"&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;debuglevel&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"lines,vars,source"&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;refid&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"project.class.path"&lt;/span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;javac&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;copy&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;todir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"war/WEB-INF/classes"&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;src&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;excludes&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"**/*.java"&lt;/span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="color: #87cefa;"&gt;copy&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;emma&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;enabled&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"${emma.enabled}"&lt;/span&gt; &amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;instr&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;instrpath&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"war/WEB-INF/classes"&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;metadatafile&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/coverage/metadata.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;emma&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #eedd82;"&gt;merge&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"true"&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #eedd82;"&gt;mode&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"overwrite"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="color: #87cefa;"&gt;emma&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #87cefa;"&gt;target&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;Then I changed the macro definition for the tests to use EMMA if applicable and to generate EMMA's report as follows (I also added a report for junit):&lt;pre style="background:black;"&gt;&lt;br /&gt;  &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;macrodef&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;testgwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;attribute&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;attribute&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"destination"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;&lt;span style="color: #87cefa;"&gt;sequential&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;mkdir&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;fork&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt; &lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;printsummary&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt; &lt;span style="color: #ff4500; font-weight: bold; text-decoration: underline;"&gt;haltonfailure&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"yes"&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;jvmarg&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;line&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;Xmx&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;256m"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;jvmarg&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-Demma.coverage.out.file=reports/@{destination}/coverage.emma"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;jvmarg&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"-Demma.coverage.out.merge=true"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sysproperty&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;.&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"@{&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;gwt&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;-&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;args&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;}"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;sysproperty&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"java.awt.headless"&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;value&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"true"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;src&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;path&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;refid&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"project.class.path"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;pathelement&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;location&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"/home/nsousa/.m2/repository/junit/junit/4.7/junit-4.7.jar"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;path&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;refid&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"emma.lib"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;classpath&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;batchtest&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;todir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}"&lt;/span&gt; &amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt; &lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"test"&lt;/span&gt; &amp;gt;&lt;br /&gt;            &amp;lt;&lt;span style="color: #87cefa;"&gt;include&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"**/*Test.java"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;fileset&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;batchtest&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;formatter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;type&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"plain"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;formatter&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;type&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt;&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;xml&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;junit&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #87cefa;"&gt;junitreport&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;todir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}"&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;fileset&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}"&lt;/span&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;include&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"TEST-*.xml"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #87cefa;"&gt;fileset&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;report&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;todir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}"&lt;/span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;span style="color: #87cefa;"&gt;junitreport&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;span style="color: #87cefa;"&gt;emma&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;enabled&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"${emma.enabled}"&lt;/span&gt; &amp;gt;&lt;br /&gt;        &amp;lt;&lt;span style="color: #87cefa;"&gt;report&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;sourcepath&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"src"&lt;/span&gt; &amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;fileset&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports"&lt;/span&gt;&amp;gt;&lt;br /&gt;            &amp;lt;&lt;span style="color: #87cefa;"&gt;include&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"coverage/*.emma"&lt;/span&gt; /&amp;gt;&lt;br /&gt;            &amp;lt;&lt;span style="color: #87cefa;"&gt;include&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;name&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"@{destination}/*.emma"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;/&lt;span style="color: #87cefa;"&gt;fileset&lt;/span&gt;&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;txt&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;outfile&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}/coverage.txt"&lt;/span&gt; /&amp;gt;&lt;br /&gt;          &amp;lt;&lt;span style="color: #87cefa;"&gt;html&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;outfile&lt;/span&gt;=&lt;span style="color: #ffa07a;"&gt;"reports/@{destination}/coverage.html"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;span style="color: #87cefa;"&gt;report&lt;/span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;span style="color: #87cefa;"&gt;emma&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;span style="color: #87cefa;"&gt;sequential&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span style="color: #cdad00; font-weight: bold; text-decoration: underline;"&gt;macrodef&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;And that is it for getting the Ant build file to a decent state. On the next blog entry I'll talk about making a Maven build file for this project and also on rearranging the project's structure to follow Maven's conventions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-5021880230752817441?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/5021880230752817441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=5021880230752817441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5021880230752817441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5021880230752817441'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/04/gwt-start-up-improving-ant-build-file.html' title='GWT Start-up: improving the Ant Build file'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7109686945314777504</id><published>2010-01-22T15:00:00.002Z</published><updated>2011-10-05T12:59:11.687+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Simplified Option Icon 255 on Gentoo</title><content type='html'>I have an Option Icon 255 from work to use when I'm out of the office. It is a 3G USB pen. I've used many outside scripts and graphical user interfaces but I never liked them. They crashed a lot and never seemed natural. Also I wanted a script that actually worked all the time instead of failing sometimes because it took the device a couple more seconds to register in the network.&lt;br /&gt;&lt;br /&gt;My solution: a mix of udev and shell scripts.&lt;br /&gt;&lt;br /&gt;First I made udev rules for the device. I want it to always have the same name on the /dev file system and that as soon as I connect it to the laptop it should validate the PIN and register in the network.I created a "49-hso.rules" (hso is the name of the kernel driver for the device) in the "/etc/udev/rules.d" folder as follows:&lt;pre&gt;ACTION!="add", GOTO="hso_end"&lt;br /&gt;&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="Control",     SYMLINK+="wctrl0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="Application", SYMLINK+="wapp0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="Application", SYMLINK+="wappa0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="Application2",SYMLINK+="wappb0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="Diagnostic",  SYMLINK+="wdiag0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="Diagnostic",  SYMLINK+="wdiaga0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="Diagnostic2", SYMLINK+="wdiagb0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="Modem",       SYMLINK+="wmodem0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="GPS",         SYMLINK+="wgps0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="GPS_Control", SYMLINK+="wgpsc0"&lt;br /&gt;SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTR{hsotype}=="PCSC",        SYMLINK+="wpcsc0"&lt;br /&gt;&lt;br /&gt;KERNEL=="ttyHS[0-9]*", NAME="%k", GROUP="plugdev", MODE="0660"&lt;br /&gt;&lt;br /&gt;ATTRS{idVendor}=="0af0", ATTRS{idProduct}=="6971", RUN+="/etc/hso/setPin"&lt;br /&gt;&lt;br /&gt;LABEL="hso_end"&lt;/pre&gt;I copied these rules from &lt;a href="http://en.gentoo-wiki.com/wiki/Option_Icon_225"/&gt;here&lt;/a&gt;. They should work with other hso devices, but I never tested it.&lt;br /&gt;&lt;br /&gt;The magic is all in "/etc/hso" (I created this folder to hold all the scripts). First I created the "setPin" script as follows:&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;OUTPUTFILE=/tmp/output.hso-chat&lt;br /&gt;&lt;br /&gt;( /usr/sbin/chat -E -s -V -f /etc/hso/pin-chat &lt; /dev/wctrl0 &gt; /dev/wctrl0 ) 2&gt; $OUTPUTFILE&lt;/pre&gt;I leave the tmp file as I might want to debug it. The "chat-pin" chat script is the following (remember to put your PIN where "PIN-HERE" is written since I removed mine):&lt;pre&gt;ABORT ERROR&lt;br /&gt;TIMEOUT 10&lt;br /&gt;"" ATZ&lt;br /&gt;OK "AT+CPIN=\"PIN-HERE\"^m"&lt;br /&gt;OK "\d\d\d\d\d\d\dAT+COPS=?^m"&lt;br /&gt;OK "AT+CGDCONT=1,,\"internet\"^m"&lt;/pre&gt;Yes, the "^m" are on the spot. You may need to adapt the apn name (mine is internet). If you have a user and password will have to add it to the AT+CGDCONT command. Just check the &lt;a href="http://en.gentoo-wiki.com/wiki/Option_Icon_225"&gt;wiki&lt;/a&gt; for it. With these steps you should be able to plug the device and notice that it registers with the network. To connect to the network I created a "/etc/hso/connect" script as follows:&lt;pre&gt;#!/bin/bash                 &lt;br /&gt;&lt;br /&gt;PIP=""&lt;br /&gt;COUNTER=""&lt;br /&gt;OUTPUTFILE="/tmp/hso.chat"&lt;br /&gt;DEVICE="/dev/wctrl0"      &lt;br /&gt;NETDEV=hso0               &lt;br /&gt;&lt;br /&gt;while [ -z "$PIP" -a "$COUNTER" != "------" ]&lt;br /&gt;do                                           &lt;br /&gt;        echo "trying$COUNTER"                &lt;br /&gt;        sleep 2                              &lt;br /&gt;        rm -f $OUTPUTFILE&lt;br /&gt;        ( /usr/sbin/chat -E -s -V -f /etc/hso/con-chat &lt;$DEVICE &gt; $DEVICE ) 2&gt; $OUTPUTFILE&lt;br /&gt;        ISERROR=`grep '^ERROR' $OUTPUTFILE`&lt;br /&gt;        if [ -z "$ISERROR" ]&lt;br /&gt;        then&lt;br /&gt;                PIP="`grep '^_OWANDATA' $OUTPUTFILE | cut -d, -f2`"&lt;br /&gt;                NS1="`grep '^_OWANDATA' $OUTPUTFILE | cut -d, -f4`"&lt;br /&gt;                NS2="`grep '^_OWANDATA' $OUTPUTFILE | cut -d, -f5`"&lt;br /&gt;        fi&lt;br /&gt;&lt;br /&gt;        COUNTER="${COUNTER}-"&lt;br /&gt;&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;if [ -z "$PIP" ]&lt;br /&gt;then&lt;br /&gt;        echo "We did not get an IP address from the provider, bailing ..."&lt;br /&gt;        cat $OUTPUTFILE&lt;br /&gt;        rm -f $OUTPUTFILE&lt;br /&gt;        exit&lt;br /&gt;fi&lt;br /&gt;rm -f $OUTPUTFILE&lt;br /&gt;&lt;br /&gt;echo "Setting IP address to $PIP"&lt;br /&gt;ifconfig $NETDEV $PIP netmask 255.255.255.255 up&lt;br /&gt;&lt;br /&gt;echo "Adding route"&lt;br /&gt;route add default dev $NETDEV&lt;br /&gt;&lt;br /&gt;echo "Adding name servers"&lt;br /&gt;( echo nameserver $NS1 ; echo nameserver $NS2 ) | resolvconf -a $NETDEV&lt;br /&gt;&lt;br /&gt;echo "Done!"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The "/etc/hso/con-chat" script referenced is as follows:&lt;pre&gt;ABORT ERROR&lt;br /&gt;TIMEOUT 10&lt;br /&gt;"" ATZ&lt;br /&gt;OK "AT_OWANCALL=1,1,0^m"&lt;br /&gt;OK "\d\d\d\d\dAT_OWANDATA=1^m"&lt;br /&gt;OK ""&lt;/pre&gt;And with this it should work. Notice that I'm using openresolv to manage my name servers. If you aren't then you probably are better of changing the "connect" script to copy the previous resolv.conf and replace it with another. I just prefer to have openresolv since it takes care of things such as restarting the nscd (Naming Service Cache Daemon, if you are wondering). My end goal is to use dnsmasq and to route only the DNS requests to the company VPN. For that I'm better off using openresolv.&lt;br /&gt;&lt;br /&gt;Now that you are connected you need to be able to disconnect :-). The script is very simple:&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;DEVICE="/dev/wctrl0"&lt;br /&gt;NETDEV=hso0&lt;br /&gt;&lt;br /&gt;ifconfig $NETDEV down&lt;br /&gt;&lt;br /&gt;/usr/sbin/chat -V -f /etc/hso/dis-chat &lt;$DEVICE &gt;$DEVICE 2&gt; /dev/null&lt;br /&gt;&lt;br /&gt;resolvconf -d $NETDEV&lt;/pre&gt;And you also need a chat script in "/etc/hso/dis-chat" as follows:&lt;pre&gt;TIMEOUT 10&lt;br /&gt;ABORT ERROR&lt;br /&gt;"" ATZ&lt;br /&gt;OK "AT_OWANCALL=1,0,0^m"&lt;br /&gt;OK ""&lt;/pre&gt;And that should do it. At least it works for me :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7109686945314777504?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7109686945314777504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7109686945314777504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7109686945314777504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7109686945314777504'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/01/simplified-option-icon-255-on-gentoo.html' title='Simplified Option Icon 255 on Gentoo'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-1661400342344923015</id><published>2010-01-06T19:08:00.004Z</published><updated>2011-10-05T12:58:38.380+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Gentoo with LUKS and LVM</title><content type='html'>My company has security policy that forces us to encrypt the hard drive of the computer and any other media. Well, not the whole hard drive, but 99% of it: the 1% is what is required for the PC to boot and ask for a password to decrypt the rest of the drive. The good news is that I'm allowed to use Linux. The bad news is that they have red hat enterprise linux and I like Gentoo. For a long time I've been using kubuntu. It is not bad, but it is too easy to use that it borks some time and I like the control Gentoo gives. Since I only installed Gentoo 2 times, one in 2003 and another in 2007 I decided to write all the steps for a bare minimum Gentoo installation. I have tested these steps on a Virtual Machine using KVM. Next step is to make it on the real laptop. It should take something like 35 minutes to do this on a Core 2 Duo at 2.2ghz.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Notice:&lt;/span&gt; This works for me. Use it at your own risk and remember that these commands wipe your hard drive so, if you want something special read the commands and adapt.&lt;br /&gt;&lt;br /&gt;The list of steps is optimized. For more information you should read the gentoo handbook.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Partition the hard Drive&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I used a simple partition scheme: 200mb for the boot (the 1% that is not encyrpted) and the rest for the crypted part. The crypted part is 512mb for the swap and the rest for the root file system. Everything is using ext4.&lt;br /&gt;&lt;br /&gt;Using fdisk delete all the partitions on the harddrive and create two partitions: one with 200Mb (+200M in fdisk) and another with the rest.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Crypt and Open the Crypted Parition&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Execute the following command:&lt;br /&gt;&lt;pre&gt;cryptsetup -y --cipher serpent-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda2&lt;/pre&gt;I'm using serpent because it has no patent issues and it is one of the fastest according to a benchmark I saw on the web.&lt;br /&gt;&lt;br /&gt;You will have to answer YES (in upper case) and then enter and verify the pass-phrase. &lt;br /&gt;If for some reason you loose this pass-phrase then you loose your data. You have backups don't you? If not, good luck trying to crack it :-)&lt;br /&gt;&lt;br /&gt;After creating the crypted mapping you need to open it with the command:&lt;br /&gt;&lt;pre&gt;cryptsetup luksOpen /dev/sda2 sda2_crypt&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;LVM Setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is quite easy: just do the following (I'm calling internalhd to the volume, but you can choose another name).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   pvcreate /dev/mapper/sda2_crypt&lt;br /&gt;   vgcreate internalhd /dev/mapper/sda2_crypt&lt;br /&gt;   lvcreate -L512m -nswap internalhd&lt;br /&gt;   lvcreate -L7G -nroot internalhd&lt;/pre&gt;Next step is to create the swap and all the file systems. I chose ext4 and created all file systems and swap with labels. This allows me to use the label in the fstab later.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   mkswap -L SWAP /dev/mapper/internalhd-swap&lt;br /&gt;   swapon /dev/mapper/internalhd-swap&lt;br /&gt;   mkfs.ext4 -j /dev/mapper/internalhd-root -L ROOT&lt;br /&gt;   mount /dev/mapper/internalhd-root /mnt/gentoo&lt;br /&gt;   mkfs.ext4 -j /dev/sda1 -L BOOT&lt;br /&gt;   mount /dev/sda1 /mnt/gentoo/boot&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Gentoo Install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you need to setup a proxy now is the time ("export http_proxy=..."). Just remember that you need to configure it also in links.&lt;br /&gt;&lt;br /&gt;Use links and download the stage3 tarball and portage snapshot. You can do "links http://www.gentoo.org/main/en/mirrors.xml", choose a mirror and navigate.&lt;br /&gt;&lt;br /&gt;Next you extract all the things:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    cd /mnt/gentoo&lt;br /&gt;    tar xvjpf stage3-*.tar.bz2&lt;br /&gt;    tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr&lt;/pre&gt;Now its time to configure the portage. I opted to do it the easy way. Editing /mnt/gentoo/etc/make.conf and changing CLFAGS to "-O2 -march=native -pipe" and making CXXFLAGS="${CFLAGS}". I also aded MAKEOPTS="-j" and FEATURES="fixpackages sandbox". Later on I added the test features, but for now it is off to avoid a bug in the glib ebuild file. I need to check it and report it back to gentoo.&lt;br /&gt;&lt;br /&gt;Next you need to select a mirror for packages and for rsync. Jut do:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    mirrorselect -i -o &amp;gt;&amp;gt; /mnt/gentoo/etc/make.conf&lt;br /&gt;    mirrorselect -i -r -o &amp;gt;&amp;gt; /mnt/gentoo/etc/make.conf&lt;/pre&gt;Final preparations and entering the gentoo installation using chroot:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    cp -L /etc/resolv.conf /mnt/gentoo/etc/&lt;br /&gt;    mount -t proc none /mnt/gentoo/proc&lt;br /&gt;    mount -o bind /dev /mnt/gentoo/dev&lt;br /&gt;    chroot /mnt/gentoo /bin/bash&lt;br /&gt;    env-update&lt;br /&gt;    source /etc/profile&lt;br /&gt;    export PS1="(chroot) $PS1"&lt;br /&gt;    cp /usr/share/zoneinfo/GMT /etc/localtime&lt;/pre&gt;The last command will change the shell prompt so we remember were we are doing things. Next you can select your profile. I choose the desktop profile:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    eselect profile list&lt;br /&gt;    eselect profile set 2&lt;/pre&gt;You should also choose your locale by editing "/etc/locale.gen". I use 2 locales: en_GB and pt_PT. I do a little trick by doing the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    grep en_GB /usr/share/i18n/SUPPORTED &amp;gt;&amp;gt; /etc/locale.gen&lt;br /&gt;    grep pt_PT /usr/share/i18n/SUPPORTED &amp;gt;&amp;gt; /etc/locale.gen&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then you should run "locale-gen" to generate the i18n information for the chosen locales.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configuring the kernel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm going to use genkernel because it has support for lvm, luks and so forth. But it has a bug: although it builds lvm internally to use in its initrd image it does not do so for luks. The solution is to emerge cryptsetup before. Well, since I'm emerge the kernel I simply emerge all the packages that I'm going to need later on with the command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    emerge -av gentoo-sources genkernel syslog-ng logroate dhcpcd lvm2 cryptsetup grub&lt;/pre&gt;I then add the log daemon to the default run level with:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    rc-update add syslog-ng default&lt;/pre&gt;You need to tune the "/etc/genkernel.conf" file. Here are the options you should change (the LUKS option must be added since it doesn't exist):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    CLEAN="no"&lt;br /&gt;    MAKEOPTS="-j2"&lt;br /&gt;    LVM="yes"&lt;br /&gt;    LUKS="yes"&lt;br /&gt;    BUSYBOX="yes"&lt;br /&gt;    MENUCONFIG="yes"&lt;br /&gt;    DISKLABEL="yes"&lt;/pre&gt;I chose no cleaning because I don't want it to clean on each attempt. Then you can issue "genkernel all" and make sure you have the following kernel options (of course you should have the kernel options tuned for your computer):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Device Drivers  ---&amp;gt;&lt;br /&gt;      Multi-device support (RAID and LVM)  ---&amp;gt;&lt;br /&gt;       [*] Multiple devices driver support (RAID and LVM)&lt;br /&gt;       &amp;lt; &amp;gt;   RAID support&lt;br /&gt;       &amp;lt;*&amp;gt;   Device mapper support&lt;br /&gt;         &amp;lt;*&amp;gt; Crypt target support&lt;br /&gt;    File systems&lt;br /&gt;      &amp;lt;*&amp;gt; The extended 4 (ext3) file system&lt;br /&gt;&lt;br /&gt;    Cryptographic API&lt;br /&gt;      &amp;lt;*&amp;gt; SHA224 and SHA256 digest algorithm&lt;br /&gt;      &amp;lt;*&amp;gt; AES cipher algorithms (i586)&lt;br /&gt;      &amp;lt;*&amp;gt; Serpent cipher algorithm&lt;/pre&gt;The cryptographic APIs can't be modules. It seems genkernel only includes storage modules in the initrd... I simply tried it and it didn't work and since the disk is always encrypted why have it as modules?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configuring the System&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First you need to change "/etc/fstab". You labels as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    LABEL=BOOT   /boot  ext4  ...&lt;br /&gt;    LABEL=ROOT   /      ext4  ...&lt;br /&gt;    LABEL=SWAP   none   swap  ...&lt;/pre&gt;Set your hostname by editing "etc/hostname"&lt;br /&gt;&lt;br /&gt;Change the root password by running "passwd". You can add a user for yourself now or after you boot.&lt;br /&gt;&lt;br /&gt;Don't forget to set your keymap in "/etc/conf.d/keymaps" and to set your clock settings in "/etc/conf.d/clock".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Grub Configuration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Edit grubs configuration file "/boot/grub/grub.conf". Add something like the following (might need to be adapted if the kernel version is different):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    title Gentoo Linux 2.6.31-r6&lt;br /&gt;    root (hd0,0)&lt;br /&gt;    kernel /boot/kernel-genkernel-x86-2.6.31-gentoo-r6 root=/dev/ram0 crypt_root=/dev/sda2 real_root=/dev/mapper/internalhd-root dolvm quiet&lt;br /&gt;    initrd /boot/initramfs-genkernel-x86-2.6.31-gentoo-r6&lt;/pre&gt;To install grub I do the following (a short cut from the gentoo handbook):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    grep -v rootfs /proc/mounts &amp;gt; /etc/mtab&lt;br /&gt;    grub-install --no-floppy /dev/sda&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Reboot into it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that everything is ready you can reboot into the system. Do the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    exit&lt;br /&gt;    cd&lt;br /&gt;    umount /mnt/gentoo/boot&lt;br /&gt;    umount /mnt/gentoo/dev&lt;br /&gt;    umount /mnt/gentoo/proc&lt;br /&gt;    umount /mnt/gentoo&lt;br /&gt;    reboot&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Next steps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since the disk is encrypted and if you forget something in your kernel you won't be able to boot. What I did was to create a backup kernel like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    cp /boot/kernel-genkernel-x86-2.6.31-gentoo-r6 /boot/kernel-backup&lt;br /&gt;    cp /boot/initramfs-genkernel-x86-2.6.31-gentoo-r6 /boot/initramfs-backup&lt;/pre&gt;And added its entry to grub:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    title Gentoo Backup Kernel&lt;br /&gt;    root (hd0,0)&lt;br /&gt;    kernel /boot/kernel-backup root=/dev/ram0 crypt_root=/dev/sda2 real_root=/dev/mapper/internalhd-root quiet&lt;br /&gt;    initrd /boot/initramfs-backup&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Even more steps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I advise you to emerge some utilities for network and portage as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    emerge -av mirrorselect openresolv eix portage-utils gentoolkit&lt;/pre&gt;"eix" indexes portage and it is really fast. You should create the index and then do your first sync but using "eix" so it updates the index in the end.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    eix-update&lt;br /&gt;    eix-sync&lt;/pre&gt;Finally some tuning of "/etc/conf.drc" (to get a faster startup and, since this is a laptop, ensure it isn't waiting for eth0 to be available before starting other services):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    RC_PARALLEL_STARTUP="yes"&lt;br /&gt;    RC_NET_STRICT_CHECKING="lo"&lt;/pre&gt;Next you should check if your system is really secure:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    glsa-check -f all&lt;/pre&gt;And then you can have fun emerging packages, but since you synced recently and probably changed profile you should do something like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    emerge -uDNav world&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;Have fun!!!&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/34409529-1661400342344923015?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/1661400342344923015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=1661400342344923015' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1661400342344923015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1661400342344923015'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2010/01/gentoo-with-luks-and-lvm.html' title='Gentoo with LUKS and LVM'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-5680582123667197893</id><published>2009-12-15T22:03:00.003Z</published><updated>2009-12-15T22:14:42.834Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Getting NetBeans to do Anti-Aliasing</title><content type='html'>I changed desktop environment from KDE to none when Gentoo marked KDE 4 as stable. Don't get me wrong: it has nothing to do with KDE 4 itself. The problem is that my computer is rather old and it was already getting a little slow with KDE 3.5. KDE 4 is heavier and slower bringing me to the tipping point. No, GNOME is not the answer: I switched from GNOME to KDE when GNOME got too bloated and don't get me started with mono...&lt;br /&gt;&lt;br /&gt;Now I'm using &lt;a href="http://icculus.org/openbox/index.php/Main_Page"&gt;openbox&lt;/a&gt;, considering &lt;a href="http://wmii.suckless.org/"&gt;wmii&lt;/a&gt; or &lt;a href="http://www.enlightenment.org/"&gt;enlightenment&lt;/a&gt; but not a full desktop. I added &lt;a href="http://adesklets.sourceforge.net/"&gt;adesklets&lt;/a&gt; to the mix, &lt;a href="http://conky.sourceforge.net/"&gt;conky&lt;/a&gt;, &lt;a href="http://code.google.com/p/tint2/"&gt;tint2&lt;/a&gt; and &lt;a href="http://phrat.de/yeahtools.html"&gt;yeahconsole&lt;/a&gt; and I'm ready to work.&lt;br /&gt;&lt;br /&gt;A couple of days ago a colleague had issues with NetBeans on Gentoo, specifically the fonts had no anti-aliasing, hinting, whatever you want to call it. I tried it today because I was using NetBeans to do some PHP coding. Well, I had the same problem.&lt;br /&gt;&lt;br /&gt;After some investigation I finally found a way to get it back to work without running KDE or GNOME and I though of sharing it here hopping the next guy can find it easier.&lt;br /&gt;&lt;br /&gt;According to Sun's JDK documentation you can defined a "_JAVA_OPTIONS" environment variable with the options that the VM should use when starting. You can also force AWT to use a given fixed AA Font Settings and ignore the non existing desktop. In the end you have to make "_JAVA_OPTIONS" have the value "-Dawt.useSystemAAFontSettings=lcd" or any of the values defined in the &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/2d/flags.html#aaFonts"&gt;JDK docs&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-5680582123667197893?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/5680582123667197893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=5680582123667197893' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5680582123667197893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5680582123667197893'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2009/12/getting-netbeans-to-do-anti-aliasing.html' title='Getting NetBeans to do Anti-Aliasing'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-1177058409874354250</id><published>2009-11-17T22:27:00.004Z</published><updated>2011-10-05T12:59:22.612+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>CMake Cross-Compiling</title><content type='html'>I don't know if I already mentioned, but I'm writing and ODBC driver at work. A colleague of mine proposed that the driver is open sourced since it is not our main business. I hope it is, but I'm keeping my hopes high. In the mean time I can share what I have learnt.&lt;br /&gt;&lt;br /&gt;The driver is an ODBC-RESTful bridge, that is, ODBC requests are &lt;span style="font-style:italic;"&gt;transformed&lt;/span&gt; into HTTP Restful requests. Although the initial goal of the driver was to be Linux only we had to change it because of the wonderful reporting tool chosen. So I had to &lt;span style="font-style:italic;"&gt;port&lt;/span&gt; it to Windows. I wont go on the tiny details on how to write portable C code (basically using &lt;span style="font-style:italic;"&gt;#ifdefs&lt;/span&gt;) but on using CMake and cross-compiling. You see I went and tried to use Microsoft Visual Studio Express, the latest version, but the compiler was so slow, the IDE was, well, horrible and the Operating System is a stone in my shoe, even if executed in a virtual machine. So I decided to put MinGW to a good use and cross compile, that is, to compile on linux a windows executable. Well, in this case a DLL, since ODBC drivers are DLLs.&lt;br /&gt;&lt;br /&gt;I'm liking CMake more everyday and cross-compilation is one of the things I liked. So, this is how you can do it. The instructions here are really boring because I'm using kubuntu at work. I need to allocate some time to get gentoo into the company's laptop. Gentoo rules in cross-compilation, not to mention a lot more things - I still have a 9 year old lappy with gentoo that I use for my private work. The crazy thing is that I always upgraded it: never reinstalled it. But back to cross-compilation. &lt;br /&gt;In kubuntu (and I suppose all debian derivatives) if you want to build a windows executable you have to install mingw32. It is composed of 3 packages: mingw32, mingw32-binutils and mingw32-runtime. This will setup a /usr/i586-mingw32msvc/ folder with all the tools.&lt;br /&gt;&lt;br /&gt;The solution I found to get CMake to use these tools is to create a toolchain file. This CMake file will contain all the definitions for the new platform. Here is small sample of a &lt;span style="font-style:italic;"&gt;Toolchain-windows.cmake&lt;/span&gt; file.&lt;br /&gt;&lt;pre style="background:black"&gt;&lt;font face="monospace"&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;(CMAKE_SYSTEM_NAME Windows)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;(CMAKE_C_COMPILER&amp;nbsp;&amp;nbsp; i586-mingw32msvc-gcc)&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;(CMAKE_CXX_COMPILER i586-mingw32msvc-&lt;/b&gt;&lt;/font&gt;&lt;font color="#ff40ff"&gt;&lt;b&gt;g+&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;+)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;# Define paths to search for libraries&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc/)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;# Don't search in native paths, just the specified root paths&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;Now to get a windows build what I do is create a folder side by side with the projects folder. For instance, if the project is in the folder A with all the CMake and source files I create a A-Windows, go into it and run:&lt;br /&gt;&lt;pre style="background:black; color:white;"&gt;&lt;font face="monospace"&gt;cmake -DCMAKE_TOOLCHAIN_FILE=../Toolchain-windows.cmake ..&lt;br /&gt;make&lt;/font&gt;&lt;/pre&gt;And I get my windows version of the software. Of course you will have to &lt;span style="font-style:italic;"&gt;port&lt;/span&gt; your code to windows. Remeber the &lt;span style="font-style:italic;"&gt;#ifdef WIN32&lt;/span&gt; and, if you need to add more libraries to your executable do something like this on the &lt;span style="font-style:italic;"&gt;CMakeLists.txt&lt;/span&gt; file:&lt;br /&gt;&lt;pre style="background:black"&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;( &lt;/b&gt;&lt;/font&gt;&lt;font color="#ff40ff"&gt;&lt;b&gt;&amp;quot;&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ff00"&gt;&lt;b&gt;${CMAKE_SYSTEM_NAME}&lt;/b&gt;&lt;/font&gt;&lt;font color="#ff40ff"&gt;&lt;b&gt;&amp;quot;&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;MATCHES&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#ff40ff"&gt;&lt;b&gt;&amp;quot;Windows&amp;quot;&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff00"&gt;&lt;b&gt;set&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;(LIBS &lt;/b&gt;&lt;/font&gt;&lt;font color="#00ff00"&gt;&lt;b&gt;${LIBS}&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;wsock32)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;endif&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;( &lt;/b&gt;&lt;/font&gt;&lt;font color="#ff40ff"&gt;&lt;b&gt;&amp;quot;&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ff00"&gt;&lt;b&gt;${CMAKE_SYSTEM_NAME}&lt;/b&gt;&lt;/font&gt;&lt;font color="#ff40ff"&gt;&lt;b&gt;&amp;quot;&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;MATCHES&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#ff40ff"&gt;&lt;b&gt;&amp;quot;Windows&amp;quot;&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;)&lt;/b&gt;&lt;/font&gt;&lt;/pre&gt;And &lt;span style="font-weight:bold;"&gt;try&lt;/span&gt; to have fun. At least you can do most of your development on a decent platform with decent tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-1177058409874354250?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/1177058409874354250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=1177058409874354250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1177058409874354250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1177058409874354250'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2009/11/cmake-cross-compiling.html' title='CMake Cross-Compiling'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8477513007157418569</id><published>2009-11-03T22:02:00.002Z</published><updated>2009-11-03T22:15:35.129Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>HR F... Ups and Searching for a Job</title><content type='html'>It has been a long time since I ranted on this blog but the time has come to bring it back to life.&lt;br /&gt;&lt;br /&gt;It has been a few months since I started receiving my monthly salary receipt by email. It started as a measure to reduce paper waste in the company and it looked like a good idea. It was an HTML attachment to an email and the information was the same so all was good.&lt;br /&gt;&lt;br /&gt;Last month (October) they changed the format to PDF. I found it strange when the PDF was 4Mb long but I never gave it a second thought: I believed that the "intelligent" architects in my company devised an architecture were the PDFs were the scan of a printed document. Not that difficult to believe in where I work.&lt;br /&gt;&lt;br /&gt;A colleague of mine pointed out that he could see is receipt but some else's receipt. I looked again and what I found out was a great f... up bu the human resources. You see, they go to great lengths to ensure that you don't know other people salaries, but then they do things like this. The procedure that generates the PDF file to send by email doesn't delete the previously generated file and simply appends to it. In my 4Mb receipt there were receipts for another 187 colleagues of mine.&lt;br /&gt;&lt;br /&gt;It was a real eye opener. I must be really naive because I believe that a company should strive to keep its best resources and not f... them up but not changing their salary until they say: "I'm leaving". I found out that most of my coworkers are making more than me, even those that are younger and more inexperienced. But that is not the worst part. The worst part is knowing that total ignorant, incompetent and bad decision coworkers, those that cost millions of euros to the company, are making more than me. Those that make decisions because they don't know squat on the subject, even we people like me warning on the issues. And the proof that I must be really naive is that I go and continue to point to the problem and actually start background projects to fix the problem they created in the first place.&lt;br /&gt;&lt;br /&gt;And it doesn't end there: they even have incentives, prizes, whatever you want to call it. Their base salary is greater than mine, they make the screw ups, I try to save the day and the only payback I get is more insults: they get the incentive for producing nothing at the end of the day. And they still believe that to make NTP (Network Time Protocol) highly available you have to write a script, or that you don't need pagination in your web pages, you just load the database into memory, sort the data in memory and then render the 10 items of the page being viewed.&lt;br /&gt;&lt;br /&gt;I had enough. If I find a job close to home that pays me 800€ less than what I'm making now I'll take it. If I can work from home even better. So, I'm on the market search for a new job. Want to hire a Java, C, PHP, SQL, J2EE programmer/architect? Send me a message. If you post a nice offer changes are you will receive my CV.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8477513007157418569?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8477513007157418569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8477513007157418569' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8477513007157418569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8477513007157418569'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2009/11/hr-f-ups-and-searching-for-job.html' title='HR F... Ups and Searching for a Job'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-522549598592805220</id><published>2009-10-13T20:40:00.004+01:00</published><updated>2009-10-13T21:50:31.177+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='cmake'/><title type='text'>Back to C: CMake and CUnit</title><content type='html'>I'm back at programming in C. I proposed something 8 months ago at work that was totally ignore. Now my boss wants me to do it because the other alternatives have totally failed. The idea is to implement an ODBC Driver. If I have the time I'll put a tutorial here on how to do that on Linux. But back to the point of this entry.&lt;br /&gt;&lt;br /&gt;This small guide will help you create a simple project using &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt; to build it and &lt;a href="http://cunit.sourceforge.net/"&gt;cunit&lt;/a&gt; to test it. Yes, I believe in test driven development, no matter the language.&lt;br /&gt;&lt;br /&gt;Let's imagine a simple project that produces an executable that prints the result of 2 + 3 (I know, lame but sufficient for this example). To make it easier to test I split the application. The functions will go into a library and there will be a source file that starts the program. The library header file is called "lib.h" (extra points for originality). Here are its contents:&lt;pre width="80"&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;int add(int a, int b)&lt;/font&gt;&lt;/strong&gt;;&lt;/pre&gt; &lt;br /&gt;The implementation is on the lib.c file as follows:&lt;br /&gt;&lt;pre width="80"&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="add"&gt;&lt;/a&gt;int add(int a, int b)&lt;/font&gt;&lt;/strong&gt; {&lt;br /&gt;        &lt;font color="#4169E1"&gt;return&lt;/font&gt; a + b;&lt;br /&gt;}&lt;/pre&gt; &lt;br /&gt;As you can see it is a &lt;i&gt;very&lt;/i&gt; complicated function. The adder.c file contain the main function and starts the program as follows:&lt;br /&gt;&lt;pre width="80"&gt;&lt;font color="#A020F0"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#A020F0"&gt;#include &lt;/font&gt;&lt;font color="#666666"&gt;"lib.h"&lt;/font&gt;&lt;font color="#A020F0"&gt;&lt;/font&gt; &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="main"&gt;&lt;/a&gt;int main (int argc, char** argv)&lt;/font&gt;&lt;/strong&gt; {&lt;br /&gt;        printf(&lt;font color="#666666"&gt;"2+3=%d\n"&lt;/font&gt;, add(2, 3));&lt;br /&gt;        &lt;font color="#4169E1"&gt;return&lt;/font&gt; 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The unit test is a little more complicated as cunit requires some boiler plate code in order to run tests. Here is the source code of the test_lib.c file:&lt;br /&gt;&lt;pre width="80"&gt;&lt;font color="#A020F0"&gt;#include &lt;/font&gt;&lt;font color="#666666"&gt;"CUnit/Basic.h"&lt;/font&gt;&lt;font color="#A020F0"&gt;&lt;/font&gt; &lt;br /&gt;&lt;font color="#A020F0"&gt;#include &lt;/font&gt;&lt;font color="#666666"&gt;"lib.h"&lt;/font&gt;&lt;font color="#A020F0"&gt;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="simpleTest"&gt;&lt;/a&gt;void simpleTest(void)&lt;/font&gt;&lt;/strong&gt; {&lt;br /&gt;        CU_ASSERT(2 == add(1, 1));&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="main"&gt;&lt;/a&gt;int main (int argc, char** argv)&lt;/font&gt;&lt;/strong&gt; {&lt;br /&gt; &lt;br /&gt;        CU_pSuite pSuite = NULL;&lt;br /&gt; &lt;br /&gt;        &lt;font color="#B22222"&gt;/* initialize the CUnit test registry */&lt;/font&gt; &lt;br /&gt;   &lt;font color="#4169E1"&gt;if&lt;/font&gt; (CUE_SUCCESS != CU_initialize_registry())&lt;br /&gt;      &lt;font color="#4169E1"&gt;return&lt;/font&gt; CU_get_error();&lt;br /&gt; &lt;br /&gt;   &lt;font color="#B22222"&gt;/* add a suite to the registry */&lt;/font&gt; &lt;br /&gt;   pSuite = CU_add_suite(&lt;font color="#666666"&gt;"Suite_1"&lt;/font&gt;, NULL, NULL);&lt;br /&gt;   &lt;font color="#4169E1"&gt;if&lt;/font&gt; (NULL == pSuite) {&lt;br /&gt;      CU_cleanup_registry();&lt;br /&gt;      &lt;font color="#4169E1"&gt;return&lt;/font&gt; CU_get_error();&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   &lt;font color="#B22222"&gt;/* add the tests to the suite */&lt;/font&gt; &lt;br /&gt;   &lt;font color="#4169E1"&gt;if&lt;/font&gt; (NULL == CU_add_test(pSuite, &lt;font color="#666666"&gt;"Simple Addition Test"&lt;/font&gt;, simpleTest)) {&lt;br /&gt;      CU_cleanup_registry();&lt;br /&gt;      &lt;font color="#4169E1"&gt;return&lt;/font&gt; CU_get_error();&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   &lt;font color="#B22222"&gt;/* Run all tests using the CUnit Basic interface */&lt;/font&gt; &lt;br /&gt;   CU_basic_set_mode(CU_BRM_VERBOSE);&lt;br /&gt;   CU_basic_run_tests();&lt;br /&gt;   CU_cleanup_registry();&lt;br /&gt;   &lt;font color="#4169E1"&gt;return&lt;/font&gt; CU_get_error();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;To make all this build with CMake you have to create a CMakeLists.txt file with the following content:&lt;br /&gt;&lt;pre style="background:black"&gt;&lt;font face="monospace"&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;cmake_minimum_required&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;(VERSION 2.6)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;project&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;(Adder)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;set&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;(SOURCES lib.c)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;add_executable&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;(adder adder.c &lt;/b&gt;&lt;/font&gt;&lt;font color="#00ff00"&gt;&lt;b&gt;${SOURCES}&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;enable_testing&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;()&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;add_executable&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;(test_lib test_lib.c &lt;/b&gt;&lt;/font&gt;&lt;font color="#00ff00"&gt;&lt;b&gt;${SOURCES}&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;set_target_properties&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;(test_lib PROPERTIES LINK_FLAGS -Wl,-lcunit)&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&lt;b&gt;add_test&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;&amp;nbsp;(test_lib &lt;/b&gt;&lt;/font&gt;&lt;font color="#00ff00"&gt;&lt;b&gt;${EXECUTABLE_OUTPUT_PATH}&lt;/b&gt;&lt;/font&gt;&lt;font color="#00ffff"&gt;&lt;b&gt;/test_lib)&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And that is it. Now you can make a directory called "build", go into to it and type "cmake .." to generate all the necessary build files. To build the project you type "make", to run the tests you can type "make test" and to clean the output you can run "make clean". If you prefer to do it all in one pass just do "make clean all test".&lt;br /&gt;&lt;br /&gt;Just in case you are wondering: I used c2html to generate the html formated version of the C files and VIMs convert-to-html script for the CMake file.&lt;br /&gt;&lt;br /&gt;Happy coding!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-522549598592805220?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/522549598592805220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=522549598592805220' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/522549598592805220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/522549598592805220'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2009/10/back-to-c-cmake-and-cunit.html' title='Back to C: CMake and CUnit'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8542804682565988981</id><published>2009-09-29T21:28:00.002+01:00</published><updated>2009-09-29T21:34:17.251+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>LOL - "Server Too Busy"</title><content type='html'>This just happened to me today. What is more interesting is that this is an unhandled exception. So, the server being to busy is not something that they should predict and allow the application to handle, they just make you wait and then throw this at you. Don't you just love these products.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cPXUCYbNnhA/SsJuzL3mL0I/AAAAAAAAAJg/_bkkHUptNsE/s1600-h/ServerTooBusy.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 192px;" src="http://3.bp.blogspot.com/_cPXUCYbNnhA/SsJuzL3mL0I/AAAAAAAAAJg/_bkkHUptNsE/s400/ServerTooBusy.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5386989929926897474" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8542804682565988981?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8542804682565988981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8542804682565988981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8542804682565988981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8542804682565988981'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2009/09/lol-server-too-busy.html' title='LOL - &quot;Server Too Busy&quot;'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_cPXUCYbNnhA/SsJuzL3mL0I/AAAAAAAAAJg/_bkkHUptNsE/s72-c/ServerTooBusy.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4523174558724503176</id><published>2009-08-19T22:38:00.002+01:00</published><updated>2009-08-19T22:42:00.371+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>The Plan</title><content type='html'>It has been some time since I last posted here but I cam across this gem that I had to share. The tile is "&lt;span style="font-weight:bold;"&gt;The Plan&lt;/span&gt;":&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;In the beginning was The Plan.&lt;br /&gt;And then came The Assumptions.&lt;br /&gt;And The Assumptions were without form.&lt;br /&gt;And The Plan was without substance.&lt;br /&gt;And a terrible darkness fell upon the face of the Workers. And they&lt;br /&gt;spoke among themselves, saying "It is a crock of shit, and it stinks."&lt;br /&gt;And the Workers went unto their Supervisors and said loudly "It is a&lt;br /&gt;bucket of dung, and we cannot live with the smell."&lt;br /&gt;Whereupon the Supervisors went unto their Managers and didst say "It is&lt;br /&gt;a container of excrement, and it is very strong, such that none may&lt;br /&gt;abide by it." &lt;br /&gt;The Managers went quickly up into the temple and seeing there the&lt;br /&gt;Directors of the company, went unto them, saying in pious voices "It is&lt;br /&gt;a vessel of fertiliser, and none may abide its strength."&lt;br /&gt;After much feasting and lewd revellry, the Directors spoke among&lt;br /&gt;themselves, saying to one and other "It contains that which aids plant&lt;br /&gt;growth, and it is very strong."&lt;br /&gt;And together the Directors went up onto the mount and finding there the&lt;br /&gt;Vice President, said gravely "It promotes growth, and it is very&lt;br /&gt;powerful."&lt;br /&gt;Seizing upon this information the Vice President, went unto the&lt;br /&gt;President, saying, "This new Plan will actively promote the growth and&lt;br /&gt;vigour of the company with very powerful effects."&lt;br /&gt;The President looked upon The Plan and saw that it was good.&lt;br /&gt;And The Plan became Policy.&lt;br /&gt;And this is how Shit Happens.&lt;br /&gt;&lt;br /&gt;Company Confidential&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4523174558724503176?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4523174558724503176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4523174558724503176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4523174558724503176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4523174558724503176'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2009/08/plan.html' title='The Plan'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6678974520837363168</id><published>2009-03-08T16:59:00.001Z</published><updated>2011-10-05T12:59:38.448+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Shouldn't we be doing Customer Driven Development?</title><content type='html'>Ever felt like you really need to unwind and to put all your thoughts somewhere? Many of those times you feel you should share your opinion with others. I started this blog with many intentions but it seems that I have forgotten one of the best uses for a blog: to share ones opinion on any given subject.&lt;br /&gt;&lt;br /&gt;There has been a subject that has tormented me for a long time. I feel is more than time to put it out there. The Subject xDD, you know, TDD (Test Driven Development), DDD (Domain Driven Development), MDD (Model Drive Development), BDD (Behaviour Driven Development) and put your favourite x before "Driven Development". Shouldn't we all just be doing Customer Driven Development?&lt;br /&gt;&lt;br /&gt;I believe that TDD is definitely a good choice for any programmer. I honestly don't understand how some developers write code without tests these days. But I don't think that any project should "bow" to that concept. I believe the project should "bow" to the customer: to what the customer really needs. It shouldn't "bow" to &lt;a href="http://97-things.near-time.net/wiki/don-t-put-your-resume-ahead-of-the-requirements"&gt;our resumes &lt;/a&gt;. It shouldn't "bow" to the fact that we do not know the technology we are using. It shouldn't "bow" to anything except trying to implement the &lt;a href="http://97-things.near-time.net/wiki/Simplify%20essential%20complexity;%20diminish%20accidental%20complexity"&gt;simplest solution&lt;/a&gt; that satisfies our customer.&lt;br /&gt;&lt;br /&gt;Where I work it seems that the project is bowing to everybody needs except the needs of the costumer. The existing platform and its services are forgotten in favour of in house, re-invent the wheel, implementations. Technologies are chosen because they are good for the resumes. OEMs are chosen because of the "monetary compensations" that come with it. Attempts to make new concepts/platforms are exacerbated to a point where they put some blinds over their eyes so they don't have to see that they are doing nothing new.&lt;br /&gt;&lt;br /&gt;I personally understand the thrill of any programmer/architect in building/designing something new. The excitement of getting the base of the platform going. The sense of completion when simple principles come alive for a robust platform. But these days there is little to investigate in this area. Most of the problems that we are solving have already been solved a thousand times: we just need to apply the correct resolution to a given problem. Okay, maybe we need to fuse two known resolutions to get the solution for a problem, but nothing groundbreaking.&lt;br /&gt;&lt;br /&gt;Our customers want a simple system that does what they need. They can elaborate on a thousand functionalities that they think they want, but when you deliver two those key hundred, dead stable and simple functionalities, they will love you. In our day-and-age customers need to understand what is happening inside the system. They no longer accept the fact that the system "magically" works. They are tired of "magical" systems that sometimes fail. They want a robust system that doesn't fail. A Robust and simple system they understand. They don't want a complex system that they need to hire an external source just to understand where their inputs are going.&lt;br /&gt;&lt;br /&gt;I believe in being agile, but agile has become many different things these days. The original &lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt; reflected a wake-up call for all developers, architects and managers. When I first read it back in 2001 I was amazed at how it deeply integrated with my daily life even though I didn't made any effort in that sense. Today we see many organisations claiming to be agile when in fact what they have found is an excuse to make the development process in less structured.&lt;br /&gt;&lt;br /&gt;Structure is good. I'm not talking about bureaucratic nightmares that some companies create, like filling and signing three physical sheets of paper just to fix a spelling bug on the user interface. I'm talking about what is necessary for effective communication and flexibility in a software project. How can you call yourself "agile" if you can't accept a tiny change in your application at any given time? How can you call yourself "agile" if nobody knows the architecture of your application?&lt;br /&gt;&lt;br /&gt;Being agile is one thing. To deny your responsibilities as manager, architect or developer is to deny any responsibility for the failure of your project. If you are in a project that claims to be agile but completely lacks structure and you see that the last sprints seem a lot like a waterfall of bugs and issues to fix than welcome: you are in a company that claims to be agile to win customers but that should had stayed put and follow the waterfall project. At least with the old process we all, developers, architects, managers &lt;b&gt;and&lt;/b&gt; customers, knew what to expect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6678974520837363168?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6678974520837363168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6678974520837363168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6678974520837363168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6678974520837363168'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2009/03/shouldnt-we-be-doing-customer-driven.html' title='Shouldn&apos;t we be doing Customer Driven Development?'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-2083067101198872143</id><published>2009-01-08T21:59:00.002Z</published><updated>2009-01-08T22:07:03.354Z</updated><title type='text'>Helping out OpenStreeMap</title><content type='html'>It has been a while since I have last posted but I hope to do it more often. Don't ask me why. I guess that if you are in the bottom you loose all will to do anything. But a two weeks vacation and a few changes in both my personal and professional life and I'm starting to see the light at the end of tunnel.&lt;br /&gt;But that is enough drama, on to the goal of this entry.&lt;br /&gt;I made my very first contribution to the &lt;a href="http://www.openstreetmap.org/"&gt;OpenStreetMap&lt;/a&gt;. Think of it like a Wiki that is a map of the whole world. Since my country doesn't have a nice coverage I decided to hack my GPS to track my trips and share them. Then I edited my first roads (two fully and a part of one) and they are already appearing on the site. Next step is to add more roads.&lt;br /&gt;Want to help out? You don't even have to edit the roads. Just &lt;a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide"&gt;trace your trips and upload them&lt;/a&gt; they will help others since the more information the more accurate the map will be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-2083067101198872143?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.openstreetmap.org/?lat=41.03451&amp;lon=-8.55056&amp;zoom=16&amp;layers=0B00FTF' title='Helping out OpenStreeMap'/><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/2083067101198872143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=2083067101198872143' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2083067101198872143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2083067101198872143'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2009/01/helping-out-openstreemap.html' title='Helping out OpenStreeMap'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-1785464296542672113</id><published>2008-10-16T19:56:00.001+01:00</published><updated>2008-10-16T19:58:40.005+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>A Small Surgery</title><content type='html'>There are moments in your life when your health throws a curve ball at you. It happened to me several years ago and the end result is now &lt;span style="font-style: italic;"&gt;on display&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I'm at home, recovering from a surgery. I've been at home for almost 4 weeks and I still have at least 2 more to go before I'm considered able to go to back to work.&lt;br /&gt;&lt;br /&gt;Although the surgery was nothing too complicated this is my second day almost completely out of bed. I'm now able to sit for small burst of time. For the rest of the time I either stand up and walk or I simply go back to bed.&lt;br /&gt;&lt;br /&gt;I'm lucky. The day after my surgery, the doctor talked to me. I said it clearly: "Only 50 to 60% of these cases don't recover like we would like them to. When they don't recover in the 2 to 3 weeks like we like them to, then the scale is in the order of months. Minimum 2 to 3 months." That scared my, but I was confident because the doctor said that "90% of the success depends on the patient. If you stick to a few simples rules all should go well."  Even with such a bad numbers I decided I could do it, but then I met the nurse.&lt;br /&gt;&lt;br /&gt;I was released from the hospital the day after I was admitted, 20 hours after I had my surgery. Two days later the nurse came to my parents house to check on me and make the necessary treatments. What she told me left me baffled. She said that 90% of the cases where the doctors chose the approach that was applied on me didn't succeed. That "people simple don't recover as&lt;br /&gt;they should e 2 to 3 weeks and then is more like 4 to 6 months". After talking a bit more she finally said she had "never saw a case where it went well." This was mind blowing, but still it didn't made me give up just yet.&lt;br /&gt;&lt;br /&gt;I new the changes were slim to none, but I had one advantage: my motivation, I simply just wanted to go back to sports as soon as possible, and my diet.&lt;br /&gt;&lt;br /&gt;One advantage of having gone through a diet and being dead close to the ideal weight for my height is that I don't have as many fat matter as I used to have in the region of the surgery. In fact, I have almost no fat matter in that area, just muscles. This meant that the stitches applied had a better chance of keeping together then all the people that have a lot of fat in that area.&lt;br /&gt;&lt;br /&gt;The end result is that after 12 days they removed all the stitches, and 23 days after the surgery I was finally able to sitting down at my computer and type a few lines of source code. I still have a couple of weeks to go before I'm able to go to work. My doctor says, and with a good point, that it makes no sense for me to go to work if I can't sit for long periods in front of the computer.&lt;br /&gt;&lt;br /&gt;If there is a lesson to be learnt from all this, assuming that things won't go terribly wrong in the mean time, is that you should do what the doctor says and no matter the odds you should always focus on your goal and simply believe that you will achieve it no matter the odds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-1785464296542672113?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/1785464296542672113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=1785464296542672113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1785464296542672113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1785464296542672113'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/10/small-surgery.html' title='A Small Surgery'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6226128889494897030</id><published>2008-09-11T22:16:00.001+01:00</published><updated>2008-09-11T22:19:23.548+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Why Most Managers Suck</title><content type='html'>It is impressive how a book that was written way back in 1989 is capable of describing in great detail all the crap that is done today by many companies in terms of workplace. You would think that after 20 years of learning from your own and other people's mistakes that things would have improved. Well, they didn't.&lt;br /&gt;&lt;br /&gt; With so many studies about what not to do when you manage a team it was expected that people who got "promoted" to managers would tap into that knowledge. But they don't. Take the simple example of phones. A Software Developer's Phone should be off practically all day. They are a simple stupid interruptions that get people of the Zone/Flow.&lt;br /&gt;&lt;br /&gt; Don't know what the Zone/Flow is? Zone is what Rands calls that state were you're the most productive. It takes a lot of time for you to get into the Zone, but when you're there time flies by and you don't even notice it. Zone is what psychologists call to the Flow, but it is basically the same thing: you are so concentrated on a task that everything just flows and you get things done quicker and better. Put the phone in and you have your boss calling you over a banality. The problem is that a single banality has cost you another 30 minutes just to get back to the Zone, if you are lucky to make it back.&lt;br /&gt;&lt;br /&gt; But, back to our managers. Why won't they tap into the knowledge all over the surveys and books already written on the matter? Maybe they never had the opportunity to read and learn, but I believe something else is happening.&lt;br /&gt;&lt;br /&gt; I believe that most managers simply don't care. For them people are not important. But they are managers, they manage people. The main focus of their work is to try to make people work and succeed together. Why don't our managers focus on the many cases portrayed in Peopleware? Why don't they simply attack the simple things like making our working place a better one? Why do they still commit to the same blatant mistakes that were made over 20 years ago?&lt;br /&gt;&lt;br /&gt; For me the reason is simple: they are unable to learn, even for their own sake. I don't mean they are incapable, but they just don't want to try to do better. What newly appointed managers usually do is the same their previous manager did. They follow their example since its a "sure path to success".&lt;br /&gt;&lt;br /&gt; What really gets on my nerves is that, overnight, they simple forget all the complaints they made when they were slaves like the rest of us. This if they don't increase the measures and attitudes that they complained so loudly about when they were slaves. They do it because it is convenient for them. They appease to the upper management because it lends the idea that there isn't a single problem with the team.&lt;br /&gt;&lt;br /&gt; This will sound bad but I simply have to say what is on my minds some times. Most of the Managers I have met in my professional life are buffoons and turn-coats. They look like clowns in a circus doing whatever it takes to get the last laugh from the upper manager. And they turn coats because they no longer care about the people they used to call team-mates. Those are beneath them and no longer matter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6226128889494897030?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6226128889494897030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6226128889494897030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6226128889494897030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6226128889494897030'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/09/why-most-managers-suck.html' title='Why Most Managers Suck'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4825615627966382856</id><published>2008-08-22T15:26:00.002+01:00</published><updated>2008-08-22T15:32:24.846+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>A Diet</title><content type='html'>I always intended to write about this subject a while back but never got the change to actually sit and write about it. I think this is the time, so if you're looking for a technical or management related blog entry simply skip this one.&lt;br /&gt;&lt;br /&gt;  Eight months ago I started a diet. I was a "little" overweight and always postponing the task of getting back into shape. I was unable to postpone this any time longer because of my mother.&lt;br /&gt;&lt;br /&gt;  Some times in your life you need a little push in the right direction. This push can come from many sides. It can be an event that occurred to you. It can simply be a loved one or a friend that has a talk with you. In my case it was my mother actually scheduling an appointment with a nutritionist.&lt;br /&gt;&lt;br /&gt;  My excuse for not caring about my weight was always that I would first go to a doctor, a nutritionist, before embarking on a diet. Well, my mother took the next step and actually scheduled the appointment and the necessary blood analysis that I had  to carry out before the appointment.&lt;br /&gt;&lt;br /&gt;  I was scared. Not about the appointment but with the results of the analyses. There were some really bad values: that was the last push I needed to start thinking about my health a little more.&lt;br /&gt;&lt;br /&gt;  What is the end result? Well, I lost a third of my weight. I'm currently in my ideal body weight and feel a lot better. A side effect is that I'm also in a greater shape. I took an ancient old promise I made myself that if I would ever to loose any weight I would also get into shape. Nowadays I run, at least, 30km per week.&lt;br /&gt;&lt;br /&gt;  I was able not only to loose the extra "baggage" but I was also able to keep my ideal weight for 2 consecutive months. I actually had to cut down on the exercise because I was continuing to loose weight, but this way I get more time to blog.&lt;br /&gt;&lt;br /&gt;  If you read this far and you want to know the little details about the diet then I'm Sorry. I won't give them to you. My advice: see a doctor and respect what he/she tells you. Don't go for one of those "crazy" diets. What I can leave you with is a before and after picture of yours truly. The first picture is the picture I used to have in the right side of the blog. The second is the new "thin" me that is currently shown in the blog.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cPXUCYbNnhA/SK7NDmtOL-I/AAAAAAAAAGE/HVWQXo2WM_A/s1600-h/Chat.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_cPXUCYbNnhA/SK7NDmtOL-I/AAAAAAAAAGE/HVWQXo2WM_A/s400/Chat.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5237348878491987938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cPXUCYbNnhA/SK7ND8IBn2I/AAAAAAAAAGM/u2R-dyVZg2M/s1600-h/ChapIMG.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_cPXUCYbNnhA/SK7ND8IBn2I/AAAAAAAAAGM/u2R-dyVZg2M/s400/ChapIMG.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5237348884241555298" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4825615627966382856?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4825615627966382856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4825615627966382856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4825615627966382856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4825615627966382856'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/08/diet.html' title='A Diet'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_cPXUCYbNnhA/SK7NDmtOL-I/AAAAAAAAAGE/HVWQXo2WM_A/s72-c/Chat.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4949192078861418271</id><published>2008-08-02T15:05:00.002+01:00</published><updated>2008-08-02T15:25:57.108+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>"Nothing to do"</title><content type='html'>It has been a while since the last time I wrote in this blog. Facts are that I simply didn't have anything to blog about. Today, the first "weekend" I spend in my apartment away from home, I decided to break this silence and unleash all that is within, starting with the very thing that has stolen my "will to live" in the last weeks...&lt;br /&gt;&lt;br /&gt;I have nothing to do. When I say this I don't mean that I'm out of work. I'm employed, but without work. I've been in a "corner" for more than 2 months nothing to do. Apparently it is all my fault. In my new position as System Architect I should decide what to do; I should change the way the company works and push it forward; I should cover up for all those incompetent managers...&lt;br /&gt;&lt;br /&gt;The facts are simple to me: there is no process for the work I was doing; I have no power to define a process; when I help out a group they can simply ignore me, and ignore me they have; I can force the manager to work when they don't want to. So I simply stood to the objectives I had for the first half of the year. And I have more then fulfilled those objectives: I trashed them with a mark of 150% achievement. But it won't matter because what I did is sitting on a hard drive somewhere and won't have any impact on the daily business of the company. Maybe I'm just too much of a perfectionist, but I would like to see the company going forward instead of nowhere.&lt;br /&gt;&lt;br /&gt;When I was told that it was my problem that I was the one that was supposed to talk to everybody inside the company to get things changed I kind of freaked out. Am I, a hacker, really supposed to start hacking the brains of people? People who don't love their work, that just do it for the money? People that don't want to be bothered as long as they have a company car and are able to play golf on weekends?&lt;br /&gt;&lt;br /&gt;Maybe I should just point them to a &lt;a href="http://rdaarchitecture.blogspot.com/2008/07/what-is-architect.html"&gt;sufficiently good description of what a Software Architect is&lt;/a&gt;, but I guess they would do what they have done so far: ignore everything I say.&lt;br /&gt;&lt;br /&gt;What I did was advise myself with the local authorities on what could I do. I can fire myself and if they want to go against me they will have to prove it in court. But this is not my way. I have never done something like this and my eduction and way of being points to another alternative: try to sort things out.&lt;br /&gt;&lt;br /&gt;So I did what I though was best: try for the nth time to leave the team of "architects" I'm in and go back to R&amp;D.&lt;br /&gt;&lt;br /&gt;I did this last Tuesday. I still don't have an answer to my request... Facts are that if I don't get an answer before going to vacations... what the hell, so be it: until I come back from my vacations I'll fire myself with just cause and there won't be a way back!&lt;br /&gt;&lt;br /&gt;Facts are that I don't think the company is in a good shape. They are making a profit but its medium term vision is completely screwed up! They don't invest in real R&amp;D. They don't create anything new, they just try to keep up with the competition. If you want to make some money you need to beat the competition, not just keep up with it.&lt;br /&gt;&lt;br /&gt;The worst part is that in a R&amp;D company what matters is the human factor: the persons that actually do the R&amp;D. Being a Software Business what matters is people that are passionate about build good software. Well, they simply hire the cheapest labour that just wants to finish the task using the simplest and shortest hack they can find. You can't win clients with this approach, but I guess they still think that outsourcing everything to India will work.&lt;br /&gt;&lt;br /&gt;Note that I have nothing against India or the people that work there. I have worked with really smart people from India. What I mean is that it is a proven fact that Software Projects will fail when you have some "Architect" in Europe specifying a system and then 200 developers in India that stay in the company for 2 to 3 moths implementing it. Not only the high rotation of developers is condemning the project, but the fact that in Europe the company doesn't have a real Software Architect, just some really bad telecommunications engineer that has been promoted to "Architect" because he was incompetent, that is, he could write or document software let alone designing network equipments and systems.&lt;br /&gt;&lt;br /&gt;This is a true recipe for disaster. But it is interesting that since I asked to go back to pure R&amp;D at least it seems that the mental blocking that stopped me from doing anything in my free time is gone. Let's see what happens.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4949192078861418271?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4949192078861418271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4949192078861418271' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4949192078861418271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4949192078861418271'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/08/nothing-to-do.html' title='&quot;Nothing to do&quot;'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4693047180349609242</id><published>2008-06-22T14:39:00.003+01:00</published><updated>2008-07-12T15:39:36.602+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>"Moving Out"</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;It has been a while since I posted anything on the blog. I've been keeping the shared items going because they are part of my daily reads, but nothing regarding the blog itself.&lt;br/&gt;&lt;br/&gt;There are many reasons for this but on of them is that I have "moved out" of my parents house. I say "moved out" between quotes because I always go to my parents house on the weekends, but during the week I'm alone on a rented apartment.&lt;br/&gt;&lt;br/&gt;Why rent an apartment? Because I was tired of not having any time for myself. With the relocation of my workplace I ended up doing 1 hour drives each way to go to work. This meant 10 hours each week. This had a penalty in my life, not only on my health. My day was fully filled without any time to just breath. Now I live a 10 minute walk from my work. Sufficiently far to refuse to go their if they call me, but close enough to walk and leave the car parked all week long... except when I go windsurfing...&lt;br/&gt;&lt;br/&gt;The end result of all this is that I expect to post more frequently and on more technical subjects. Although I expect this I won't make any promises: I'm really enjoying windsurfing and I would trade 2 hours in front of a computer for 1 hour windsurfing...&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4693047180349609242?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4693047180349609242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4693047180349609242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4693047180349609242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4693047180349609242'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/06/out.html' title='&amp;quot;Moving Out&amp;quot;'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6111446995615132979</id><published>2008-04-22T22:28:00.003+01:00</published><updated>2008-04-22T22:35:59.352+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Business News...</title><content type='html'>Today I had one of those days. It started with a scratch on the car while getting it out of the garage. It immediately give me the message that something bad was going to happen. But even so I decided to go to work.&lt;br /&gt;&lt;br /&gt;70 km later the bad news started coming in: a global announcement was being made about a re-structuring inside the company. "Hmmm...", I though, "... someone is going to get laid off, but I'm not so lucky!".&lt;br /&gt;&lt;br /&gt;The time for the announcement came and it finally hit me: they are sending one of the products with the most potential to India. Lets get something clear first: I have nothing against India, Indians or anything of the like. What I'm ranting about is that for years they have ignored the product; for years they haven't understood the concept; etc... Now they saw the potential, but they still don't understand the concept: it is too complicated for their little heads. But just to make things more interesting they are sending it to a totally different team with the wrong background.&lt;br /&gt;&lt;br /&gt;Its a good time to start searching for a job...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6111446995615132979?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6111446995615132979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6111446995615132979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6111446995615132979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6111446995615132979'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/04/business-news.html' title='Business News...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6100368375399895474</id><published>2008-04-19T21:14:00.003+01:00</published><updated>2008-04-22T22:27:43.370+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>So much to do and so little time...</title><content type='html'>It is true: life can throw you a curve when you least expect it.&lt;br /&gt;&lt;br /&gt;I have some many reasons to blog about but I haven't found the time to get down and actually write anything. What has happened in my left? A lot... Lets see if I can make a short list of the most important things: I lost over 20Kg of weight (and got back up to shape by actually running over 6km every day); I've made a web site for my family's company (that is online and working without a hitch for a couple of weeks now); I've managed to get Gentoo running on an External USB hard drive so I can use the dead weight computer that the company I work for assigned to me while traveling to work on my things (yes, because that thing must have M$ Win...); I've been promoted; I've shown the guys in my company that simply saying it is impossible and giving up is not the answer; and a lot more...&lt;br /&gt;&lt;br /&gt;Should I talk about it all??? Well, the Linux part I'll leave for another entry because I want to put up the instructions on how you can get a computer running Gentoo, or any Linux flavor for that matter, out of an external USB hard drive. This way you can escape the company man in your off hours...&lt;br /&gt;&lt;br /&gt;As for the weight loss... I've always said that I would do a diet when I consulted a Nutritionist. Well, my mother went &lt;span style="font-style:italic;"&gt;behind my back&lt;/span&gt; and scheduled an appointment with one. Well, I was literally out of excuses and went to the doctor in good time: my cholesterol was in a bad level; I was overweighted; I didn't have any energy or endurance. I thought it would be difficult, but with some discipline when eating and a lot of exercise I managed to loose a lot of weight. The main problem is that I had and I'm still wasting money renovating my closet... As for the energy and stamina department? Well, 6.5km a day of running should say everything, but I can add that even after running those kms I'm back to normal e just 15min.&lt;br /&gt;&lt;br /&gt;On my family's company website: this is a project that I'm doing in part time or my free time, call it what you want. My uncle asked for my opinion on a budget he got from one of those web site building companies. The price tag was shocking, at least for me. It had many defects, it didn't fulfill their use cases and was really expensive. I actually considered opening my own company to make websites. In fact, I'm still considering it.&lt;br /&gt;&lt;br /&gt;Making the website was fun. It is using all open source technologies, some of which I've used more then 8 years ago. It was interesting to see how far they have become. It was also fun to see if I could make it so intuitive that I wouldn't get bothered with problems with the site. Well, I guess I succeeded because the site hasn't problems, they just want more functionalities :-)&lt;br /&gt;&lt;br /&gt;As for the company I work for: well, they are going down so fast that it scares me. They want to reduce OPEX (Operational Expenses, for those of you who never heard about it) but they don't even know how to compute it. They want to make tons of money but their first reaction to a client request is: "This is impossible! Let's no answer to the client and maybe it will go away." Come on people, lets get real: if you think it is impossible at least explain it to the customer. You may be surprised by the customer's knowledge and learn something while verifying that it is possible. Not to mention that you don't know squat on the subject you should first ask your colleagues within the company, just in case one of them knows a solution.&lt;br /&gt;&lt;br /&gt;Facts are that I ended up having to travel to the customer and presenting my solution. Its a simple solution that I think the customer bought. At least they are preparing a business case to get things started. It seems that everything now is business case oriented... I always though we should be user/customer oriented, but who am I to think these things?&lt;br /&gt;&lt;br /&gt;So, when I get some time I'll post a small guide on getting Gentoo running on an External USB drive and probably some other gems about: Web Services in Java, MySQL and Full Text Search, etc...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6100368375399895474?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6100368375399895474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6100368375399895474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6100368375399895474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6100368375399895474'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/04/so-much-to-do-and-so-little-time.html' title='So much to do and so little time...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-1927346527763922270</id><published>2008-01-04T15:06:00.000Z</published><updated>2008-01-04T15:47:01.427Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Replacing a Bad Inverter on a Toshiba Laptop...</title><content type='html'>The year has just begun and my laptop decided to bork. It already borked some time ago. The problem was the backlight: it started blinking and the laptop would go to sleep. I search the web and found &lt;a href="http://www.pluralsight.com/blogs/aaron/archive/2006/01/19/18114.aspx"&gt;this blog&lt;/a&gt;. I tried to figure out if this was the problem with my laptop, but I was almost sure it wasn't, because even if I connected an external monitor Linux kept receiving spurious lid close events. It turned out to be the board that had the lid closing button. The trick was to find the parts, but I was lucky enough. I called my old boss, who also bought the same laptop as I did and asked her what happened. Well, it turns out that the laptop was going for recycling. Not a moment too late! I asked for it, she gave it to me for free (thank you!!!) and I repaired my laptop using the board of her laptop - which seems to have a broken video card...&lt;br /&gt;&lt;br /&gt;Today the backlight finally hit the fan. I had been noticing some flickering of the backlight for some days but I completely ignored it and resumed working. It seemed to stabilize after some warming up. But today it went down and didn't came up, even after turning off the laptop and turning it on. I remembered the article and got to it. Since this might be useful for someone else I'm putting some instructions and a couple of pictures of the process. The pictures aren't fully illustrative, but it should be sufficient to get you there.&lt;br /&gt;&lt;br /&gt;First thing: opening the laptop. This might sound easy but it should be done carefully so as not to scratch the laptop. This is a Toshiba laptop so you should first remove the button cover. This can be done by starting by the right side of the cover: you can find a small gap that is perfect to put a screwdriver in.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cPXUCYbNnhA/R35PJQufGvI/AAAAAAAAADA/Yzqs4MzDP_g/s1600-h/p1040037.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_cPXUCYbNnhA/R35PJQufGvI/AAAAAAAAADA/Yzqs4MzDP_g/s320/p1040037.jpg" alt="" id="BLOGGER_PHOTO_ID_5151642044285786866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But you also need to open the screen. This is trickier. The screen has four screws: one in each corner. The top ones are hidden bellow the rubbers that protect the screen one it is closed. The lower ones are hidden below to little plastic covers that are &lt;span style="font-style: italic;"&gt;glued&lt;/span&gt; on top of them. Remove the lower covers with care because you want to glue them again in order to hide the screws. In the top just unglue the rubbers from the inside out just the sufficient to unscrew. I didn't remove the rubbers.&lt;br /&gt;&lt;br /&gt;Finally, and to complete the opening up of the screen you have to very gently start pulling the plastic cover. I'm not going to lie: this is something that is not for the faint of heart. I started in the lower part of the screen with my fingers pulling the plastic await from the screen, right above the TOSHIBA logo. Then I worked steadily with my hands as a small screwdriver all the way around the screen. The top of the screen is trickier, but once you free the lower and sides of the cover you can simple use the screwdriver to force free the top. DON'T FORCE the release of the spring that hold the cover shut when the laptop is closed: it is attached to the back plastic of the screen only. If you try to free it you might break something...&lt;br /&gt;&lt;br /&gt;You should end up with something like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cPXUCYbNnhA/R35RTwufGxI/AAAAAAAAADQ/7aPGUIt6Pog/s1600-h/p1040032.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_cPXUCYbNnhA/R35RTwufGxI/AAAAAAAAADQ/7aPGUIt6Pog/s320/p1040032.jpg" alt="" id="BLOGGER_PHOTO_ID_5151644423697668882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And these are the covers that were removed, set them aside:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cPXUCYbNnhA/R35Q3QufGwI/AAAAAAAAADI/6VyuOO0tw0E/s1600-h/p1040035.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_cPXUCYbNnhA/R35Q3QufGwI/AAAAAAAAADI/6VyuOO0tw0E/s320/p1040035.jpg" alt="" id="BLOGGER_PHOTO_ID_5151643934071397122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With these covers removed the back plastic cover of the screen should fall off without a lot of effort.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cPXUCYbNnhA/R35RzAufGyI/AAAAAAAAADY/L4z5WPh4eSY/s1600-h/p1040033.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_cPXUCYbNnhA/R35RzAufGyI/AAAAAAAAADY/L4z5WPh4eSY/s320/p1040033.jpg" alt="" id="BLOGGER_PHOTO_ID_5151644960568580898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now you need to find the Inverter. The inverter is on the lower part of the screen. You can't miss it: it is the only board with integrated circuits in the screen. To remove it you will have to unglue the metallic protection on the front and remove two screws. After this you can the backlight power cord on the right (two black and white wires that go into the screen that control the backlight) and the control line on the left (this is trickier because it has isolating tape around it). Do not tear any of the tape or protections, you will need them later. I only unglued what was essential. Then you have the inverter free from the laptop.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cPXUCYbNnhA/R35T1QufG1I/AAAAAAAAADs/bxfxSnEtlkI/s1600-h/p1040034.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_cPXUCYbNnhA/R35T1QufG1I/AAAAAAAAADs/bxfxSnEtlkI/s320/p1040034.jpg" alt="" id="BLOGGER_PHOTO_ID_5151647198246542162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now, &lt;span style="font-style:italic;"&gt;all&lt;/span&gt; you have to do is find a replacement for this part. Maybe eBay can help you, or even Toshiba. Since I have a scrap laptop I repeated the process and simple replaced the Inverter. Then is just a matter to mounting everything back up. It should be simple, don't force anything in: the plastics should go in nice and easy.&lt;br /&gt;&lt;br /&gt;After all this process my laptop was running with a working screen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cPXUCYbNnhA/R35UpwufG2I/AAAAAAAAAD0/7_n8-GLKoc4/s1600-h/p1040038.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_cPXUCYbNnhA/R35UpwufG2I/AAAAAAAAAD0/7_n8-GLKoc4/s320/p1040038.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5151648100189674338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of course I'm very lucky for having an old laptop to steal parts from, but if you can find the missing part and it is not too expensive it beats having to by a new laptop. Hope this helps you and, once again, I would like to thank my old boss for providing me with a scrap laptop to remove parts from.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-1927346527763922270?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/1927346527763922270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=1927346527763922270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1927346527763922270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1927346527763922270'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/01/replacing-bad-inverter-on-toshiba.html' title='Replacing a Bad Inverter on a Toshiba Laptop...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_cPXUCYbNnhA/R35PJQufGvI/AAAAAAAAADA/Yzqs4MzDP_g/s72-c/p1040037.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8602963938469624691</id><published>2008-01-03T12:39:00.000Z</published><updated>2008-04-22T22:27:52.228+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>New Year, New Adventures...</title><content type='html'>Welcome to 2008!!!&lt;br /&gt;&lt;br /&gt;I wish you all a good year filled with health and happiness for you and your family. And when I say "all" I actually mean "all", even those that consider themselves my enemies...&lt;br /&gt;&lt;br /&gt;When a new year comes along it is usually a time to think about what went well in the last year and what hasn't gone that well and to make some new year resolutions. If I believed in New Year resolutions mine would be to improve my health and fitness. Since I don't believe that making resolutions only once a year I won't make any...&lt;br /&gt;&lt;br /&gt;My vacations are practically over. I was finally &lt;span style="font-style:italic;"&gt;allowed&lt;/span&gt; to take a vacations. I said &lt;span style="font-style:italic;"&gt;allowed&lt;/span&gt; because I actually had to site laws to get them to approve my vacations, but it was worth it: I finally got some time to just recharge my batteries, you know, sleep 11 hours per day, read a book and basically do nothing...&lt;br /&gt;&lt;br /&gt;Work will start next week and I think it is time to scare the crap out of them. I believe I should be professional to the extreme, that is, to do only what I'm told. I've always worked for the same company and through all the years I've heard what I didn't deserve so many times just because I went the extra mile. I'm looking for alternatives and in the meantime I'll make some waves just giving my opinion, asking for it to be recorded on the minutes and then doing exactly what was asked of me, not more, not less. Let's see if the managers can handle this...&lt;br /&gt;&lt;br /&gt;It will all start with a trip to the capital for a meeting and the trip still hasn't been approved. Looks like someone made a long trip to my country to have a meeting with me and I won't be there because I won't travel without everything approved (I've been &lt;span style="font-style:italic;"&gt;burned&lt;/span&gt; previously and I won't be burned again).&lt;br /&gt;&lt;br /&gt;I'm now part of an international standards body that is doing something that isn't worth doing. The first thing I asked when I joined the group was: "What is the problem we are trying to solve?". I got a lot of side answers but no one actually gave me a straight answer. I believe the group is inventing what doesn't need to be invented, that they are doing it just to go to a few conferences, make some presentations, write some papers and books. This is not what I signed for and it will be fun to see the progress of it.&lt;br /&gt;&lt;br /&gt;So, this year all my technology related investigation will have to be performed at home. This means I won't use the company's resources and that I'll probably release it all under an Open Source License. Bad luck for the company I work for: if they don't want my best then it is OK for me, as long as I get payed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8602963938469624691?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8602963938469624691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8602963938469624691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8602963938469624691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8602963938469624691'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2008/01/new-year-new-adventures.html' title='New Year, New Adventures...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6617656775284013659</id><published>2007-12-04T22:04:00.000Z</published><updated>2008-04-22T22:28:06.125+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Project Leaders are needed because...</title><content type='html'>I finally found the reason why project leaders are needed. Bear with me for a second.&lt;br /&gt;&lt;br /&gt;Imagine you own a software development company. This software development company grows, and grows. You start to need some managers to keep track of all that is going on and to play with organizational boxes every now and then (a.k.a. "A new Organization Chart has been released" email).&lt;br /&gt;&lt;br /&gt;When the company starts you get a small set of rock-star developers. If you don't get those developers then you're just one step ahead of this line of thought. Those rock-star developers will then be called upon to interview future developers. The problem here is that developers are not the best persons to be making interviews, specially when the manager see no point in actually making a test to check the interviewees knowledge. This lead to the entrance of normal class developers in the company.&lt;br /&gt;&lt;br /&gt;Another round of interviews is needed and the rock-star developers are too busy cleaning up behind the normal developers. The normal developers get to make the interviews and the end-result is that low class developers enter the company. I'm talking about those guys that took a CS degree or Software Engineering degree but that actually hate programming or Software Development. There can be a shortcut here which is for the managers to hire low class developers directly because they simple ask "How many years of experience do you have in X?" and put the answer on the Excel Sheet. But it just accelerates the process that I'm explaining.&lt;br /&gt;&lt;br /&gt;With a few rock-star programmers, those that remained in the company because they were bought since all the others have already left; some medium class programmers and a mountain of low class programmers things get interesting. You get to see people making refactorings to say they are working. I'm not talking about refactoring some common functionality to be used during the implementation of a new Use Case. I'm talking about the "I don't like the name of this class so I changed it" refactoring. The one that says "The boss will see a lot of changed files and believe that I've been working a lot".&lt;br /&gt;&lt;br /&gt;But then you need Project Leaders. From this pool of developers you have to choose some to be leaders. Can you imagine the ones that are chosen? I say the low-class programmers. Let me explain: you need the rock-star programmers for System Engineers, even though they hate the concept of System Engineer that the company has and all the theoretical work they have to do; the medium-class programmers are need to actually write code that works at least 70% of the time. You're left with the low-class programmers that get what they really wanted: they get to be leaders. This is when things get sticky.&lt;br /&gt;&lt;br /&gt;You see, the rock-star programmers will flee to the competition. They don't like having to make a ton of vaporware so some numb manager presents it at a conference. They understand just a few weeks after changing responsibilities that their new goal in life is to make someone travel to exotic places and make a presentation, claiming they are the best when in fact they don't know dick about the subject.&lt;br /&gt;&lt;br /&gt;The low-class programmers, no turned into Project Leader, will then make a simple decision: hire cheap resources to save costs. You see, to them it makes perfect sense: If they are cheep, they don't stay around too long. If they don't stay around too long the Project Leader is needed to continuously refresh the team. Hence knowledge bout the project is withheld to ensure their job. If they are cheep they don't take the risk of, by a complete mistake, hire a medium or, god forbid, a rock-star programmer. You see, if they hire one of these then all their incompetence floats to the top of the water and they get canned.&lt;br /&gt;&lt;br /&gt;In conclusion: Project Leaders are need because the low-class programmers need a job. If you have low-class programmers, chances are they will become Project Leaders. Unless you fire them first.&lt;br /&gt;&lt;br /&gt;I honestly believe that it is better to have 5 good programmers then 25 medium programmers. Specially since having more then 6 persons changing the same source code will lead to a complete bloatware.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6617656775284013659?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6617656775284013659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6617656775284013659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6617656775284013659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6617656775284013659'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/12/project-leaders-are-needed-because.html' title='Project Leaders are needed because...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-632441519316788489</id><published>2007-12-04T21:53:00.000Z</published><updated>2007-12-04T22:04:21.202Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Christmas Dinners...</title><content type='html'>Christmas Dinners are supposed to be fun! You get around with your loved ones and your friends and you just forget about all the problem in your life and just play a catch up game on all the latest news and gossips. I love Christmas Dinners. I love hanging around my grandmother's house, with my cousins, playing games or just plain old eating as much candy as my stomach can take.&lt;br /&gt;&lt;br /&gt;What are not Christmas Dinners is institution or company forced encounters where you are required to loose around 8 hours of you life without pay just to go to and come back from the dinner. It simply doesn't make any sense. I believe that if a company or institution has a motivating environment, were everybody gets a long and likes/loves the work they have to do, then it is no problem in getting everybody to accept an invitation for dinner. Even if they won't pay you the extras hours, just the food.&lt;br /&gt;&lt;br /&gt;It simply makes no sense to force you to go to a dinner with people you don't like, when the company as treated you worse then furniture during the last year and when they won't even pay you the extra hours that you have to &lt;span style="font-style:italic;"&gt;invest&lt;/span&gt; in the dinner.&lt;br /&gt;&lt;br /&gt;Why am I ranting like this? Because it simple eats me up inside that my company did this last year and they are at it again. This year I simply won't go. They want a justification? I won't give one. I'm busy, the law requires them to make a formal request for extra-working time and they aren't going to make one. If they really want me to go they will have to pay for it. Period!&lt;br /&gt;&lt;br /&gt;Why should I continue to sacrifice my personal life for a company that has continuously failed to motivate me? That &lt;span style="font-style:italic;"&gt;forced&lt;/span&gt; me into an agreement and working condition that, if I had know before, I would never have signed it? They said that it was the agreement or nothing but then went behind my back and made different arrangements for others? I have nothing against the people that got a better deal, but I'm not a retard and see what is happening and now I know that the company is just trying to screw with me a little more.&lt;br /&gt;&lt;br /&gt;On top of all this I'm still &lt;span style="font-style:italic;"&gt;forced&lt;/span&gt; to work on a group that I don't like, doing things I don't like. And they call this a &lt;span style="font-style:italic;"&gt;promotion&lt;/span&gt;. I call this, lets put in making some &lt;span style="font-style:italic;"&gt;vaporware&lt;/span&gt; and on the call when the shit hits the fan until we no longer need him. Believe me, I won't be there till the end and I'm gonna start letting the shit hit the fan, and hit the fan really hard!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-632441519316788489?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/632441519316788489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=632441519316788489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/632441519316788489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/632441519316788489'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/12/christmas-dinners.html' title='Christmas Dinners...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-2449508767387163118</id><published>2007-11-19T21:50:00.000Z</published><updated>2007-11-19T21:57:08.983Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Finally on Vacations!!!</title><content type='html'>So, I'm finally on my vacations. I had to cite law articles to get some vacation time, but I'm finally at home, resting and recharging my batteries. I have some things to do, but things that are fun to do!!!&lt;br /&gt;&lt;br /&gt;And it was the right time to go on vacations: my mood wasn't all that good, in fact, nobody could hear another one of my comments about how things are all wrong; my car needs to go to the garage (they are able to squeeze it this week); I need to by some clothes; I need to check out some swimming pools and I need to find a new house.&lt;br /&gt;&lt;br /&gt;Many things to do while I'm on my vacations, but the one that I'm also doing is a Web Site for my family's company. It will be a simple Apache, PHP and MySQL site. What I really wanted was to make a full blow JEE5 Site, all Web 3.0 and so on. Facts are that they don't need all that bloat: they need a simple, clean and fast site. Taking into consideration the hosting costs and everything, PHP seems to be the way to go. I'll need to freshen-up my PHP skills, but that shouldn't be a problem...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-2449508767387163118?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/2449508767387163118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=2449508767387163118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2449508767387163118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2449508767387163118'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/11/finally-on-vacations.html' title='Finally on Vacations!!!'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4902752779133755796</id><published>2007-11-07T19:50:00.000Z</published><updated>2007-11-07T19:57:34.008Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Creative Commons!</title><content type='html'>Today I can't help to blog about something I stumbled upon in the Web.&lt;br /&gt;&lt;br /&gt;I don't know if you haver heard about the &lt;a href="http://creativecommons.org/"&gt;Creative Commons&lt;/a&gt; initiative. If you didn't brace yourself for a trip to the world of freedom of expression and though!!!&lt;br /&gt;&lt;br /&gt;Whenever you have an idea and implement it, the idea is automatically copyrighted. This is specifically true for Music, Pictures, Films, Books and son on. The problem nowadays is that this rights are being enforce to a level that is so extreme that our children are being forced in to pirates. They are being forced into believe that copyright should exist.&lt;br /&gt;&lt;br /&gt;My humble opinion is that copyright does and should exist. But &lt;span style="font-style:italic;"&gt;common sense&lt;/span&gt; should guide on what is breaking a copyright. If I'm copying a music without paying for it and redistributing it to the whole world, free of charge or not, I'm breaking a copyright. I don't think I'm breaking a copyright when I use a peace of a music, mix it with video and share it with my friends. This isn't breaking copyright, its expressing my  creativity.&lt;br /&gt;&lt;br /&gt;I won't write a lot more because &lt;a href="http://www.ted.com/talks/view/id/187"&gt;this video&lt;/a&gt; from TED says it all. The speaker? Larry Lessig. Watch it: its 20 minutes well spent!!! And if you agree with this vision share it with the world!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4902752779133755796?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4902752779133755796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4902752779133755796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4902752779133755796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4902752779133755796'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/11/creative-commons.html' title='Creative Commons!'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6518789802446581610</id><published>2007-11-05T22:02:00.000Z</published><updated>2007-11-05T22:30:28.266Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Just some thoughts...</title><content type='html'>I'm trying to promise myself not to make any more rants in this blog because this is becoming monotonous, but I just need to get this out of my chest.&lt;br /&gt;&lt;br /&gt;Things have been a little crazy at work. when I mean crazy, I don't mean that I have a lot of work. On the contrary: I have almost nothing to do. In fact, I have to &lt;span style="font-style: italic;"&gt;beg&lt;/span&gt; for work. I know this is crazy, but it is happening to me. I know I shouldn't complain and that many of you would like to have a job were they could surf the net the whole day without any care in the world. But I'm not like that. God gave me a gift and I should put it to a good use!&lt;br /&gt;&lt;br /&gt;What's the problem? Well, I have been &lt;span style="font-style: italic;"&gt;promoted&lt;/span&gt; to a new group. When I say &lt;span style="font-style: italic;"&gt;promoted&lt;/span&gt; I mean, I'm now part of another group and I'm leave my old group and its activities. When this was proposed to me by the head of the group, I said that I didn't like the idea of the group and that I thought it didn't make any sense. But he argued that the group would be as abstract as I predicts, but a lot more practical.&lt;br /&gt;&lt;br /&gt;Well, facts are that the group is pretty abstract. But that is not the worst. The worst is that they don't know dick of what they are saying and when I point out the errors, they don't count my opinion because &lt;span style="font-style: italic;"&gt;it is politically inconvenient&lt;/span&gt;. I'll explain.&lt;br /&gt;&lt;br /&gt;There was a group somewhere in Germany that made an analysis of different possible implementations of an engine. Now this group did its best, but I believe that not only the analysis had some shortcomings, they made some serious concept confusion that lead me to believe that they didn't fully understand the technologies they were analyzing. In my review I sent 9 comments. 2 were about other alternative implementations or the not up to date facts on current implementations. 1 was about the English text on the document, because in some parts it wasn't English! The other 6 comments were about misconceptions: badly understanding the concepts or how the company should position itself in the market place, taking into consideration what our CEO and bosses want.&lt;br /&gt;&lt;br /&gt;The feedback I got on those comments was by phone, not in writing. They basically said: "We agree totally with you, but we can't send this uphill due to political reason". You see, for them as &lt;span style="font-style:italic;"&gt;professionals&lt;/span&gt; it is more important to be on the good side of the group that made the study then to help the decision makers get a good study. There more concerned about their asses then about the good of the enterprise.&lt;br /&gt;&lt;br /&gt;For me it is simple: you have to be aware of your limitations and capacities. I know what I'm capable of. I know what I'm good at. I believe that I should always speak my mind, to the best of knowledge, even if what I say will cost me my job because some upper management &lt;span style="font-style:italic;"&gt;dude&lt;/span&gt; doesn't like to be told he is wrong. This is something that is entrenched in my personality: my conscience is huge and I have to live with it, so I respect it.&lt;br /&gt;&lt;br /&gt;I'm not going to hide any information or lie just to save my ass because I believe I have the capacity to excel in any enterprise doing what I do best: Software Development, from Analysis and Design, to Conception and Support. If I didn't had confidence in my abilities then it would make sense for me to lie to keep my job. With this I'm not saying that all those that are issuing &lt;span style="font-style:italic;"&gt;political&lt;/span&gt; opinions as incompetent: that is a matter of opinion.&lt;br /&gt;&lt;br /&gt;So, if you need a Java Software Developer and Architect with this profile, just leave a comment or drop me an email. Why? I'm analyzing my alternatives, maybe its time to quit my job and find some greener pastures.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6518789802446581610?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6518789802446581610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6518789802446581610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6518789802446581610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6518789802446581610'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/11/just-some-thoughts.html' title='Just some thoughts...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3661829241795546406</id><published>2007-10-26T23:00:00.001+01:00</published><updated>2009-08-02T21:22:43.572+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><title type='text'>Swing Tip: Heavy Paint Job...</title><content type='html'>Have you ever needed to make some heavy 2D rendering operation in Swing and you didn't want to block the Swing Thread? Well, I had to, several times and today I made a hack for a colleague that I would like to built upon here.&lt;br /&gt;&lt;br /&gt;My first attempt to ensure that the Swing Thread wasn't blocked was to conduct all rendering on a background thread. This obviously violated all Swing and Java2D principles. If you don't know, just Google for it, but the fact is that all rendering should be done by the Event Dispatch Thread. So, all Swing activities should also be done in that same thread. What happens if the scene you are rendering is rather complex and you don't want to hog the Even Dispatch Thread?&lt;br /&gt;&lt;br /&gt;A simple technique can be applied. The idea is to hold the context when the rendering is started. If the rendering has been going for quite some time, place an event in the Event Queue to resume it later. This allows the Event Dispatch Thread to process other events. When the rendering is resumed we can check if the context has changed. If it has we probably have to start the painting process all over. If it hasn't we can resume were we left of.&lt;br /&gt;&lt;br /&gt;Here is a sample code for this. The rendering is completely stupid, but the idea is to emphasize that you can put any rendering code in it.&lt;br /&gt;&lt;br /&gt;&lt;pre width="120"&gt;&lt;a name="line1"&gt;  1: &lt;/a&gt;&lt;font color="#228B22"&gt;import java.awt.BorderLayout;&lt;/font&gt;&lt;br /&gt;&lt;a name="line2"&gt;  2: &lt;/a&gt;&lt;font color="#228B22"&gt;import java.awt.Color;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line3"&gt;  3: &lt;/a&gt;&lt;font color="#228B22"&gt;import java.awt.Dimension;&lt;/font&gt;&lt;br /&gt;&lt;a name="line4"&gt;  4: &lt;/a&gt;&lt;font color="#228B22"&gt;import java.awt.Graphics;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line6"&gt;  6: &lt;/a&gt;&lt;font color="#228B22"&gt;import javax.swing.JComponent;&lt;/font&gt;&lt;br /&gt;&lt;a name="line7"&gt;  7: &lt;/a&gt;&lt;font color="#228B22"&gt;import javax.swing.JFrame;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line8"&gt;  8: &lt;/a&gt;&lt;font color="#228B22"&gt;import javax.swing.SwingUtilities;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line10"&gt; 10: &lt;/a&gt;&lt;font color="#B22222"&gt;/**&lt;/font&gt;&lt;br /&gt;&lt;a name="line11"&gt; 11: &lt;/a&gt;&lt;font color="#B22222"&gt; * Class that demonstrates out to avoid hogging the Event Dispatch Thread&lt;/font&gt;&lt;br /&gt;&lt;a name="line12"&gt; 12: &lt;/a&gt;&lt;font color="#B22222"&gt; * when a Heavy Paint Job needs to be performed.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line13"&gt; 13: &lt;/a&gt;&lt;font color="#B22222"&gt; *&lt;/font&gt;&lt;br /&gt;&lt;a name="line14"&gt; 14: &lt;/a&gt;&lt;font color="#B22222"&gt; * @author Nuno Sousa&lt;/font&gt;&lt;br /&gt;&lt;a name="line15"&gt; 15: &lt;/a&gt;&lt;font color="#B22222"&gt; * @version v0.1a(C) 2007 Nuno Sousa&lt;/font&gt;&lt;br /&gt;&lt;a name="line16"&gt; 16: &lt;/a&gt;&lt;font color="#B22222"&gt; */&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line17"&gt; 17: &lt;/a&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="HeavyPaintJob"&gt;&lt;/a&gt;public class HeavyPaintJob &lt;/font&gt;&lt;/strong&gt;{&lt;br /&gt;&lt;br /&gt;&lt;a name="line19"&gt; 19: &lt;/a&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;  public static void main(String[] args)&lt;/font&gt;&lt;/strong&gt; {&lt;br /&gt;&lt;a name="line20"&gt; 20: &lt;/a&gt;    final JFrame frame = new JFrame(&lt;font color="#666666"&gt;"Heavy Paint Job"&lt;/font&gt;);&lt;br /&gt;&lt;a name="line21"&gt; 21: &lt;/a&gt;    frame.setSize(800, 600);&lt;br /&gt;&lt;br /&gt;&lt;a name="line22"&gt; 22: &lt;/a&gt;    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;&lt;br /&gt;&lt;a name="line24"&gt; 24: &lt;/a&gt;    frame.setLayout(new BorderLayout());&lt;br /&gt;&lt;a name="line25"&gt; 25: &lt;/a&gt;    frame.add(new HeavyPaintComponent(), BorderLayout.CENTER);&lt;br /&gt;&lt;br /&gt;&lt;a name="line27"&gt; 27: &lt;/a&gt;    SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;&lt;a name="line28"&gt; 28: &lt;/a&gt;      @Override&lt;br /&gt;&lt;br /&gt;&lt;a name="line29"&gt; 29: &lt;/a&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;      public void run()&lt;/font&gt;&lt;/strong&gt; {&lt;br /&gt;&lt;a name="line30"&gt; 30: &lt;/a&gt;        frame.setVisible(true);&lt;br /&gt;&lt;a name="line31"&gt; 31: &lt;/a&gt;      }&lt;br /&gt;&lt;a name="line32"&gt; 32: &lt;/a&gt;    });&lt;br /&gt;&lt;br /&gt;&lt;a name="line33"&gt; 33: &lt;/a&gt;  }&lt;br /&gt;&lt;a name="line34"&gt; 34: &lt;/a&gt;}&lt;br /&gt;&lt;br /&gt;&lt;a name="line36"&gt; 36: &lt;/a&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="HeavyPaintComponent"&gt;&lt;/a&gt;class HeavyPaintComponent extends JComponent &lt;/font&gt;&lt;/strong&gt;{&lt;br /&gt;&lt;br /&gt;&lt;a name="line38"&gt; 38: &lt;/a&gt;  private Dimension fSize = null;&lt;br /&gt;&lt;a name="line39"&gt; 39: &lt;/a&gt;  private int fCurrentRenderingStep = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line41"&gt; 41: &lt;/a&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;  public HeavyPaintComponent()&lt;/font&gt;&lt;/strong&gt; {&lt;br /&gt;&lt;a name="line42"&gt; 42: &lt;/a&gt;    setOpaque(true);&lt;br /&gt;&lt;a name="line43"&gt; 43: &lt;/a&gt;    setDoubleBuffered(true);&lt;br /&gt;&lt;a name="line44"&gt; 44: &lt;/a&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line46"&gt; 46: &lt;/a&gt;  @Override&lt;br /&gt;&lt;a name="line47"&gt; 47: &lt;/a&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;  protected void paintComponent(Graphics g)&lt;/font&gt;&lt;/strong&gt; {&lt;br /&gt;&lt;br /&gt;&lt;a name="line49"&gt; 49: &lt;/a&gt;    &lt;font color="#B22222"&gt;// As context I'm using the components Size.&lt;/font&gt;&lt;br /&gt;&lt;a name="line50"&gt; 50: &lt;/a&gt;    &lt;font color="#4169E1"&gt;if&lt;/font&gt; ((fSize == null) || (fSize.width != getWidth()) || (fSize.height != getHeight())) {&lt;br /&gt;&lt;br /&gt;&lt;a name="line51"&gt; 51: &lt;/a&gt;      fSize = getSize();&lt;br /&gt;&lt;a name="line52"&gt; 52: &lt;/a&gt;      fCurrentRenderingStep = 0;&lt;br /&gt;&lt;br /&gt;&lt;a name="line54"&gt; 54: &lt;/a&gt;      &lt;font color="#B22222"&gt;// Rendering initialisation goes here (for instance background filling)&lt;/font&gt;&lt;br /&gt;&lt;a name="line55"&gt; 55: &lt;/a&gt;      super.paintComponent(g);&lt;br /&gt;&lt;br /&gt;&lt;a name="line56"&gt; 56: &lt;/a&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;a name="line58"&gt; 58: &lt;/a&gt;    &lt;font color="#B22222"&gt;// Boolean that controls if rendering has ended or not&lt;/font&gt;&lt;br /&gt;&lt;a name="line59"&gt; 59: &lt;/a&gt;    boolean renderingCompleted = false;&lt;br /&gt;&lt;br /&gt;&lt;a name="line61"&gt; 61: &lt;/a&gt;    &lt;font color="#B22222"&gt;// Don't hold the Event Dispatch Thread for more than 250ms&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="line62"&gt; 62: &lt;/a&gt;    long time = System.currentTimeMillis();&lt;br /&gt;&lt;a name="line63"&gt; 63: &lt;/a&gt;    &lt;font color="#4169E1"&gt;while&lt;/font&gt; ((System.currentTimeMillis() - time) &amp;lt;&amp;gt;= getWidth()) {&lt;br /&gt;&lt;a name="line64"&gt; 64: &lt;/a&gt;      renderingCompleted = true;&lt;br /&gt;&lt;a name="line65"&gt; 65: &lt;/a&gt;      &lt;font color="#4169E1"&gt;break&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;a name="line66"&gt; 66: &lt;/a&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;a name="line68"&gt; 68: &lt;/a&gt;    &lt;font color="#B22222"&gt;// Make sure that rendering is resumed at a later time&lt;/font&gt;&lt;br /&gt;&lt;a name="line69"&gt; 69: &lt;/a&gt;    &lt;font color="#4169E1"&gt;if&lt;/font&gt; (!renderingCompleted) {&lt;br /&gt;&lt;a name="line70"&gt; 70: &lt;/a&gt;      repaint();&lt;br /&gt;&lt;br /&gt;&lt;a name="line71"&gt; 71: &lt;/a&gt;    } &lt;font color="#4169E1"&gt;else&lt;/font&gt; {&lt;br /&gt;&lt;a name="line72"&gt; 72: &lt;/a&gt;      fSize = null;&lt;br /&gt;&lt;a name="line73"&gt; 73: &lt;/a&gt;    }&lt;br /&gt;&lt;a name="line74"&gt; 74: &lt;/a&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;a name="line75"&gt; 75: &lt;/a&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The next goal is to make this a component and put it somewhere people can get it and reuse. But at least you get the general idea today and not when I have the time to make a component out of this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3661829241795546406?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3661829241795546406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3661829241795546406' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3661829241795546406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3661829241795546406'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/10/swing-tip-heavy-paint-job.html' title='Swing Tip: Heavy Paint Job...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3011722901681973531</id><published>2007-10-19T23:53:00.000+01:00</published><updated>2007-10-20T00:35:50.588+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>When to quit your job...</title><content type='html'>If didn't notice I will make it clear: this entry is marked with a "rant" label. You have been warned!!!&lt;br /&gt;&lt;br /&gt;When should one quit his job?&lt;br /&gt;&lt;br /&gt;I ask this for one simple reason: I think I had enough with my current company. I never revealed the company I work for because freedom of expression isn't what it used to be. And no, I won't reveal it now. Suffice to say it is a great multi-national^H^H^H^H international company.&lt;br /&gt;&lt;br /&gt;As I always say I started as a &lt;span style="font-style: italic;"&gt;slave&lt;/span&gt;. Why this name? Well, when you have to do all the work and there is nobody bellow you in the hierarchy I think you are a &lt;span style="font-style: italic;"&gt;slave&lt;/span&gt;, rowing the boat with the rest of the salves in the galley. You have to: do all the work; put up with bosses that don't understand what they want from you, even less about what the client wants; fight the company bullshit and still try to be creative and innovate...&lt;br /&gt;&lt;br /&gt;Next in the evolution is to become an expert on some area. I'm a Software Engineer. When I left University I started working at this company for the telecommunications area. There were to of us Software Engineers entering a company filled with Telecommunications and Electronic Engineers. You can see the result. I had to be very quiet when I heard their "architecture" descriptions. Why? I was young, they were experienced, they had the obligation to knew better. Turns out that their experience was not in software. I ended up also learning a lot: learning that my coworkers didn't know what the hell I was supposed to do.&lt;br /&gt;&lt;br /&gt;End result? I ended up rewrite the application twice: The first was without their knowledge: I coded the client from scratch and they only noticed it after it was delivered to the client. The second was with their knowledge: a full blown architectural restart. You see, their "architecture" had performance problems...&lt;br /&gt;&lt;br /&gt;With time they started trusting my judgment. Why? Because there were too many times when I &lt;span style="font-style: italic;"&gt;advised&lt;/span&gt; them not to got a certain way and they ignored me. Later on the problems I had mention would hit them in their heads and they would remember my advice.&lt;br /&gt;&lt;br /&gt;It got to a point where I did all the coding for both Server and Client. We were 5: a boss, two telecommunication &lt;span style="font-style: italic;"&gt;experts&lt;/span&gt; and two Software Engineers. I coded the client and server of the main application, the other software engineer coded the client and server of the administration tool. The telecommunication &lt;span style="font-style: italic;"&gt;experts&lt;/span&gt; did... well, I guess I have to say they studied the standards sufficiently to be able to get a better job at another company. I say this because when the real telecom problems appears it had to be me to learn about things and fix it.&lt;br /&gt;&lt;br /&gt;The product was and still is a success. The company makes huge amounts of money, although I don't see almost a dime of it. With time we were victims of our success. Management saw an opportunity.  They added more features to the product, more requirements. When we said we needed to change the core of the product to react to the requirements they reacted by adding people to the team.&lt;br /&gt;&lt;br /&gt;Today we are thirteen. I think there are too many people. For me an ideal software development team is made of 6 persons, including the boss and tester. More then it should be two teams and agree upon an interface or divide the system vertically.&lt;br /&gt;&lt;br /&gt;With this many people playing with code I've written the end result is that I can't work for more than 30 minutes without someone wanting me to remember why on hell did I added 1 to an integer in a given source file. People: its a billion lines of source code, I can't remember every single one of them!!!&lt;br /&gt;&lt;br /&gt;The decision was for me to do less coding, concentrate on the core complicated parts and to become a Guru: someone that would design the whole system, make rookie programmers write distributed applications without even knowing how to program. Of course this didn't work...&lt;br /&gt;&lt;br /&gt;In the latest times I've been promoted. No, no pay increase, just more work... My new function? Be an &lt;span style="font-style: italic;"&gt;Architect&lt;/span&gt;. I still think architects are the ones that check if a house or bridge will stand up, but since software has a tendency to crash I guess it makes sense.&lt;br /&gt;&lt;br /&gt;My first reaction to this change was of caution: I don't want to become one of those guys that reads a couple of articles and issues an opinion without knowing dick about what his talking about. I'm a practical guy. I think that one should stand by is opinions and show the code and that it doesn't make sense talking about architectures without a real world problem to solve: a problem that people pay to solve.&lt;br /&gt;&lt;br /&gt;But things are changing. This last week has been particularly hilarious. We had a two days Agile Training session. I'm not against agile methods. In fact, back in 2000/2001 I had to hide the Unit Tests of my code. You see, managers considered them a waste of time: why write code for tests? Just write the code of the application and stop wasting time.&lt;br /&gt;&lt;br /&gt;The training was OK. I say OK because I already knew most of the things that were discussed. In fact, I had huge discussions trying to get team members and managers to use these methods. The end result? Managers didn't like them. They said the methods would work: cascade methods were the rule...&lt;br /&gt;&lt;br /&gt;Now management wants to enforce agile methods. This won't work because the managers and team leaders see their job at risk. They simply don't understand that a group off people working together will always outperform them when deciding what to do. Its simply more brain power.&lt;br /&gt;&lt;br /&gt;Contrast this with the theoretical work they got me doing in the new group. With all the fuss about&lt;br /&gt;Business Process Automation they got me studying BPEL, BPMN, OSS/J, eTOM and a ton of other sudo-standards. Clients don't if your system follows these standards: as long as it is easy to integrate and it works they are happy.&lt;br /&gt;&lt;br /&gt;The worst part is contrasting the Agile Methods with writing huge BPMN diagrams that can never be translated to BPEL (the execution language) because they aren't deterministic. People: BPMN is like UML; use it when it makes sense but then you need the code to make it run!!!&lt;br /&gt;&lt;br /&gt;I believe an Agile and practical approach should be taken. We have the client's end-to-end use cases. Lets make the simples BPMN that serves the use cases, translate it to BPEL and see if all these standards actually produce a working system. Lets not waste time designing a process that will end World Hunger, Save the Whales and Stop Global Warming!  The client doesn't want this! The client just wants their business process working!!!&lt;br /&gt;&lt;br /&gt;Today I sent an email to boss of the group I'm changing to. The motive? To talk about my presence on that group. It is a huge company and I can't identify with the activities of that group. In fact I think its going back. It took me a lot of energy to create an agile team with a great spirit and I don't want to go back to a old-minded, specification-producing-droll of a team.&lt;br /&gt;&lt;br /&gt;What about if this isn't clear and I can't change back??? Well, then maybe it is time to abandon ship. There are things more important in life than money. Love, Health and Happiness are some of them. Honestly I prefer to become a slave programmer again instead of what I'm doing currently.&lt;br /&gt;&lt;br /&gt;Do you think it is time to quit my job?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3011722901681973531?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3011722901681973531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3011722901681973531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3011722901681973531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3011722901681973531'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/10/when-to-quit-your-job.html' title='When to quit your job...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7438218758054534484</id><published>2007-09-30T22:30:00.000+01:00</published><updated>2007-09-30T22:36:34.700+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Updating my Six Year Old Laptop</title><content type='html'>Today I finally finished the update on my six year old laptop. I know it sounds crazy, but I bough a laptop back in end of 2001 and I still haven't replaced it. I put linux into it and never looked back Started with Mandrake at the time, I then made the switch to Gentoo. Since then I have always updated my system without any format like you have to do on other operating systems.&lt;br /&gt;&lt;br /&gt;I was unable to connect it to the internet for a while. This lead to a very outdated operating system. Luckily Gentoo is almost straight forward to update. The only problem is that my desktop environment is eating a little too much memory for my taste. I guess I'll need to tackle it later.&lt;br /&gt;&lt;br /&gt;On my project list is an idea to make a 3D chart on top of Java 2D. Why? Well, I already made such a chart for the company I work for, but at that time I used Java 3D. Now, there is nothing seriously wrong with Java 3D itself. Let me make it clear that it is very nice API. But to do a chart in Java 3D is an overkill. Also I believe I can make a simple implementation using Java 2D alone. I'll post the progress of that work here, as it evolves.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7438218758054534484?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7438218758054534484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7438218758054534484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7438218758054534484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7438218758054534484'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/09/updating-my-six-year-old-laptop.html' title='Updating my Six Year Old Laptop'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3044107039372256859</id><published>2007-09-27T22:00:00.000+01:00</published><updated>2007-09-27T22:12:56.806+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>WebBeans and others...</title><content type='html'>It has been some time since I blogged. I hope to do this more often. You see, I lost the internet connection in my Linux Laptop. Why? Well, my ISP decided to change its settings and didn't tell no one about it. It worked on Windows, but my laptop hasn't run Windows for over 4 years. I though it was a problem with the modem, or my configuration. I ended up buying a new modem/router. It still didn't work so I called technical support and then they told me the options that you have to use when you're not using their own modems. Why? Well, their modems have their hidden configuration options hardwired... but on to more interesting things.&lt;br /&gt;&lt;br /&gt;I came across a series of articles about Web Beans. I don't know if you know about JEE (yes, since version 5 it is JEE - Java Enterprise Edition, not J2EE) but I had a training on this subject and I liked the way they used annotations and other techniques to turn a bloated platform into a clean and simple programming model. But their efforts haven't stopped. They are also specifying the concept of Web Bean. It's target? JEE6. Does it make your life simpler? Hell yes.&lt;br /&gt;&lt;br /&gt;The injection model is simple and powerful. But instead of reading my opinion about it read the for part series on the subject by the Spec Lead: &lt;a href="http://in.relation.to/Bloggers/WebBeansSneakPeekPartIIntroducingWebBeans"&gt;part 1&lt;/a&gt;, &lt;a href="http://in.relation.to/Bloggers/WebBeansSneakPeekPartIIInjectionBindingAnnotationsAndComponentTypes"&gt;part 2&lt;/a&gt;, &lt;a href="http://in.relation.to/Bloggers/WebBeansSneakPeekPartIIIDeclaringComponentsUsingXML"&gt;part 3&lt;/a&gt; and &lt;a href="http://in.relation.to/Bloggers/WebBeansSneakPeekPartIVScopesContextsAndResolverMethods"&gt;part 4&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now that my laptop has a connection to the web it is just a matter of update it to the latests Gentoo patches and I'll be posting more regularly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3044107039372256859?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3044107039372256859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3044107039372256859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3044107039372256859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3044107039372256859'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/09/webbeans-and-others.html' title='WebBeans and others...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3039836254650551646</id><published>2007-08-14T15:20:00.000+01:00</published><updated>2007-08-14T15:28:32.373+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>I'm Still Alive!!!</title><content type='html'>No, I haven't disappeared from the face of the earth. At least no yet! What happened was a drastic change in my life that led me to stop blogging about anything. Today I decided to put this small entry just to say that I'm still alive. I'm finally  having some time off work to recharge batteries and get my life back together. I also hope this extra time allows me to post more things here.&lt;br /&gt;&lt;br /&gt;I have a couple of tutorials lined up. The first should be about WebServices in Java: how to call or build your one WebService following a predefined WSDL without using any libraries but the standard ones included in the Java Runtime Environment. So keep reading...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3039836254650551646?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3039836254650551646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3039836254650551646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3039836254650551646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3039836254650551646'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/08/im-still-alive.html' title='I&apos;m Still Alive!!!'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8236762127288410558</id><published>2007-05-16T20:47:00.000+01:00</published><updated>2007-05-16T20:57:21.545+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>News Update...</title><content type='html'>It has been a long time since I last blogged. The reasons are many, but lets just say that things have been a little chaotic. It seems that everything has landed on top of my head: work, thesis, health, you name it...&lt;br /&gt;&lt;br /&gt;Although it might seem that I'm just ranting for nothing, lets take a look at a few examples.&lt;br /&gt;&lt;br /&gt;First I had to make a presentation to the President of the Republic. Yes, I live in a republic and we have a president. I was chosen by my former chief and the current chief to make this presentation. A 5 minute presentation that should pass the concept of the product, including a live demo of the software. In other words: you have 5 minutes to either excel at it, or be marked for the rest of your life for the worst reasons. Why do I say this? Well, all the public TV channels were there, including some private. Newspaper reports, radio reports, you name it. I even ended up with my face and my back in the public television!!! My parents were so proud ;-)&lt;br /&gt;&lt;br /&gt;On that same week I had to travel to a city 300Km away (for those of you who think in miles I can tell you that it takes 3 hours by car to get there). The goal of the trip: try to save the same product I presented to the president. What do I mean with save? Well, there was a merge of the company with another company that had a similar tool. Similar... well, if you could say that it would be nice, but the fact is that the tool is ages behind us. It was a complete waste of time because upper management already decided for us. They just ignored more then 50 Mobile Phone Operators and more then 500 individual users, no big deal.&lt;br /&gt;&lt;br /&gt;Just to finish this small list of things that happened a last thing: I was &lt;span style="font-style: italic;"&gt;awarded&lt;/span&gt; a Laptop. No, it is not mine, it is of the company and everybody else is also getting one. It seems to be cheaper to give everybody laptops then to by an UPS. I also think they believe I should be working at home also, besides all the &lt;span style="font-style: italic;"&gt;free&lt;/span&gt; extra hours I give them every single day.&lt;br /&gt;&lt;br /&gt;As you can see things are moving along quite nicely... that's why I haven't been blogging much.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8236762127288410558?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8236762127288410558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8236762127288410558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8236762127288410558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8236762127288410558'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/05/news-update.html' title='News Update...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3933437189830433293</id><published>2007-05-01T19:33:00.000+01:00</published><updated>2007-05-16T20:44:31.375+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>The Building, Life and the Laptop...</title><content type='html'>It is funny how things turn out some times. No matter how many plans you make, destiny will always throw a curve ball at you. You may plan it all out: what to do, when to do it, even how to do it. But the fact is that when you try to actually do it, things will blow up in your face.&lt;br /&gt;&lt;br /&gt;The last entry I made in this blog was about the building I'm currently working on. Funny thing is that it has been over a month since I blogged and the building is still under constructions. But since someone very important, like the President, is coming for the official opening the work has suddenly switched into Warp 5 Speed. You have painters working side by side with welders; technicians configuring the elevator; technicians testing the air conditioning and more. The end result is that nobody can actually get any work done in the mist of all the noise and smell of paint.&lt;br /&gt;&lt;br /&gt;On top of that the building still has no full electrical power. We didn't work for a whole morning so the power company could make whatever it needed to connect the building to the power grid without restrictions. It turns out that the power company only checked if the installation had been properly performed. Luckily last Monday was a &lt;span style="font-style: italic;"&gt;working bridge&lt;/span&gt; for us so their plan was to use it to make the final connection. I will know if it all went well tomorrow, when I arrive their and push the power button on the PC. I won't have any communications or servers, but if the AC is working and pumping hot air I'll be a happy man. I say this because during the tests they were testing it for cold air, like if the building needed any cooling...&lt;br /&gt;&lt;br /&gt;My life has took a couple of turns the last month. I have been feeling a little stressed out and tired. It is probably due to the new working location and everything that is happening, but it has gotten me thinking if I made a good decision when I signed the agreement to move. And lately the company has made a push in the direction of the "Not a Good Decision". They paid what was written in the agreement, but they either forgot to mention or didn't matter to tell me that my salary would suffer a 10% cut in the month the agreement was paid. This is on my agenda for tomorrow, but I'm getting a little tired of all this. I should learn not to expect anything good or to believe in what I am told when discussion working conditions. We changed for good to terrible and they are still hitting us on top of that.&lt;br /&gt;&lt;br /&gt;Finally a note on my Laptop: I have a laptop that has more then 6 years of age. Even after I bought the laptop it wasn't the top notch of its time. I bought it because it seemed a good compromise and I'm glad I did it because it hasn't left me down ever since. It is true that I added more memory to it and that I changed the hard drive for a bigger and faster one, but even so it definitely was a good choice. I loaded it with Gentoo several years ago and I have been using Gentoo on it ever since. I though I would have changed to Ubuntu by now, but I'm afraid that Ubuntu won't be as fast as Gentoo so I'll stick to Gentoo. These days I have finally upgraded GCC to 4.1.1. This is something I had been delaying for over 6 moths because it requires a full rebuild of the system. Have a 6 years old laptop running non-stop for more then 3 days means that the laptop is definitely good. As a bonus the laptop will have XOrg 7.2 and maybe I'll try Beryl and see if it kicks-ass...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3933437189830433293?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3933437189830433293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3933437189830433293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3933437189830433293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3933437189830433293'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/05/building-life-and-laptop.html' title='The Building, Life and the Laptop...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-5098238171297477640</id><published>2007-03-20T19:44:00.000Z</published><updated>2007-03-20T19:56:25.992Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>The Building isn't Finished!!!</title><content type='html'>Since last Friday I have been working in the &lt;span style="font-style: italic;"&gt;new&lt;/span&gt; building to which my company relocated to. I have to say that I never thought that a working environment could get any worst then it already was. I have to say that the building isn't finished, to say the least, and that is what gives me a little hope that things will improve. But I'm starting to think that they never will...&lt;br /&gt;&lt;br /&gt;The building isn't finished because there are still construction workers on it. They are revising the roof of the building. I think they are actually replacing the whole roof. The windows have cracks and openings from which a constant and steady air flow emerges. Couple that with no air conditioning or heating and with a cold weather and you have to wear your jacket while working and still fail every three or four key presses.&lt;br /&gt;&lt;br /&gt;To put it simply and without attempting to make things look any worst then they really are let's look at the facts:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There are construction works still working on it, cutting steal and concrete, replace roof parts;&lt;/li&gt;&lt;li&gt;There is a crane moving right outside the building;&lt;/li&gt;&lt;li&gt;The building has not double glass windows with heat isolation;&lt;/li&gt;&lt;li&gt;The building hasn't been cleaned, in fact, although the cleaning personnel has been in the building and have cleaned some of its floors (some even twice), they have entered my floor.&lt;/li&gt;&lt;/ol&gt;All this makes up a cocktail that doesn't allow anyone to actually work effectively. I honestly think that they should have postponed the transfer until everything was fixed and ended. People can't work on freezing temperatures, with drafts, dust all over the place and workers pounding on the walls and ceiling...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-5098238171297477640?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/5098238171297477640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=5098238171297477640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5098238171297477640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5098238171297477640'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/03/building-isnt-finished.html' title='The Building isn&apos;t Finished!!!'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-2684913589173596382</id><published>2007-03-15T19:59:00.000Z</published><updated>2007-03-15T20:06:14.276Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>A Goodbye...</title><content type='html'>Today was my last day at my current working location. It is strange to leave a place where I have worked for 7 years and 15 days exactly. I'm not leaving the company, but the place, the friends from other departments that are staying.&lt;br /&gt;&lt;br /&gt;I will miss specially the ladies, since in our new location there won't be a single lady in the floor I'll be working: just men. I usually say that if you put too many men engineers in the same place without a single women things fall apart. I say this because the conversation level degrades...&lt;br /&gt;&lt;br /&gt;A women would make all the men automatically be more self-conscious and avoid having conversations in slang or anything worse. To all those that stay in the old location I wish the best of luck and happiness with their lives. For all those that like me will be pursuing a new adventure I wish also the best luck and happiness. For those that have left or will leave I want to say this: I understand and although I'll miss you, as friend I have to tell you to pursue your happiness.&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-2684913589173596382?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/2684913589173596382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=2684913589173596382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2684913589173596382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2684913589173596382'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/03/goodbye.html' title='A Goodbye...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-537398187874468351</id><published>2007-03-09T19:17:00.000Z</published><updated>2007-03-09T19:34:15.919Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Accepting an Offer...</title><content type='html'>This was a different week. The company I work for is moving locations and I considered their offer unacceptable.  Well, they made another offer and I decided to accept it. Although I feel like I sold myself, I can't stop and think that I'm still taking a huge risk. Part of what was proposed to me still hasn't been confirmed and three years from know I'll probably be loosing money if I continue in the company. I'm still thinking if I should sign the agreement without having this confirmation. It makes the risk even greater.&lt;br /&gt;&lt;br /&gt;But with that fact aside and if things go according to the plan I'll start working on the new location next Friday. I honestly believe that things won't go according to the plan because it involves changing 80 persons from 4 different locations to a new building that is from 4 to 250Km where those persons currently work. It involves changing people's machines, bindings, pencils, lab machines that are almost never turned off, the UPS, phones and so on. If things work smoothly it will be due to those that are involved in the change. I say this because the plans are still being written as I write this...&lt;br /&gt;&lt;br /&gt;But all changes have a bitter side. There are already people that announced that they are leaving. There many reasons to leave, but the main one is the fact that  the new location is too far away and they simply don't want to change because they would loose a lot of money every single month. There are those that will accept the proposal but will always be on the lookout for other opportunities. These are the ones that need the money and will be loosing money every single day, but they have loans to pay. This all leads to a break in the team spirit. A spirit that has been struggling to survive for a long time.&lt;br /&gt;&lt;br /&gt;On top of that I honestly believe that it will be harder to find new workers in the new location. The location where I'm working today is is close to 3 Universities that pump out workers every year that meet our exact requirements. The new location has only 1 University close to it and doesn't seem to pump out any real worker, you know, the kind that actually writes source code. But it seems there is another University that is not so close to the new location that also pumps out workers that meet our requirements. Since those guys don't have almost anything in the region and end up moving to the major cities, the company will offer them a different alternative. The price is the traveling time. Maybe they will end up thinking like I'm thinking: if the traveling time starts to be a burden I'll simply move closer to work...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-537398187874468351?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/537398187874468351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=537398187874468351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/537398187874468351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/537398187874468351'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/03/accepting-offer.html' title='Accepting an Offer...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-3831236108860204926</id><published>2007-03-03T12:23:00.000Z</published><updated>2007-03-03T12:37:27.736Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Making Life Changing Decisions...</title><content type='html'>I already ranted about this the last time I blogged and I don't want to rant any further, but it is affecting my life and I should blog about it. Facts are that I need to make a decision that will change the course of my life. I have to decide if I want to continue with my current employer or if a want to jump into the void and pursue another goal.&lt;br /&gt;&lt;br /&gt;There are many alternatives. I can simply look for another job, maybe even launch myself as a freelancer. I can even go for a PhD, but I don't want to get &lt;a href="http://www.phdcomics.com/"&gt;Piled Higher and Deeper&lt;/a&gt;. Just kidding. Although I love these comic strips, I haven't run against anything similar to it during my Masters.&lt;br /&gt;&lt;br /&gt;Why do I need to make a decision? Simple, I don't see my current employer step up to its responsibilities and pay for the relocation. Although it is in the Portuguese Law that the employer should pay for all the relocation costs I don't think they will. I'm saying this because they are using an option in the law to enter in agreement with the workers. But the agreement they are proposing pays only for part of the expenses and ensures that you stay in it for further 3 years without any king of salary increase - not even the normal inflation.&lt;br /&gt;&lt;br /&gt;I have though a lot on this problem and my current view is simple: if they don't step up and assume their responsibilities I'll simply quit. I may have to involve a lawyer. I say this because that is just how the company is: a large institution with absolutely no respect for its workers. Not even the group of 50 out of 600 that is responsible for 25% of their sales.&lt;br /&gt;&lt;br /&gt;What does this all mean? Well, if they don't step up I'll be looking for a job soon. I'll just take a few weeks to finish writing my Thesis and deliver it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-3831236108860204926?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/3831236108860204926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=3831236108860204926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3831236108860204926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/3831236108860204926'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/03/making-life-changing-decisions.html' title='Making Life Changing Decisions...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4490030498640311505</id><published>2007-02-22T19:41:00.000Z</published><updated>2007-02-22T19:57:04.320Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>A Little Ranting</title><content type='html'>When I started this blog I said to myself that it wouldn't be used to rant about anything, but a series of events as forced me to use it as a discharge mechanism. You see, the company I work for wants to relocate me. &lt;span style="font-weight: bold;"&gt;I am not against relocations as long as the company assumes the expenses of the relocation&lt;/span&gt;. With expenses I mean that, for instance, if rents in the new working area are larger then the old working area, the company should paid the difference to its workers. I also mean that, for instance, if the new working place is three times the distance of the current working place for the worker, the company should pay the additional traveling expenses.&lt;br /&gt;&lt;br /&gt;The company I work for is willing to pay for the expenses of the relocation, but only for three years. After the three years your on your own. Oh, by the way, this is paid up-front. If you decide to leave the company you have to return the remaining that you received to complete the three years. In other words: it is like signing a contract that says: "Hey, I'll work for more three years for you (beep.... parent control) without any raise. I love you guys a lot and you treat me so nicely that if I ever decide to leave I will pay you to leave. And don't worry, the feelings I have for you are so great that I'm even willing to take a pay cut for more than three years..."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;People: GET REAL!!!!&lt;/span&gt; Do you actually think I'm gonna sign something like that? I know a little about the law and honestly I prefer the part were you get to fire me and I'll find a job and hope that my efforts are appreciated, because here all hope is lost!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4490030498640311505?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4490030498640311505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4490030498640311505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4490030498640311505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4490030498640311505'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/02/little-ranting.html' title='A Little Ranting'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-5968453484601707425</id><published>2007-02-14T20:01:00.000Z</published><updated>2007-02-14T20:19:51.823Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>The Power of the Community</title><content type='html'>It isn't new, other have already said it, but today I found another demonstration of the Power of the Community. A Community of motivated people created many successful software projects, like the GNU/Linux project. When  the idea for a new project appears and a community builds up around it, the project at such a pace that commercial companies would say it is impossible. In fact, when the community that is developing an application that they will use it, magic happens.&lt;br /&gt;&lt;br /&gt;Today I was browsing through the web when I came across &lt;a href="http://www.youtube.com/view_play_list?p=D985A2229718FA8D"&gt;this set of videos&lt;/a&gt; on YouTube. It is about the &lt;a href="http://www.jokosher.org/"&gt;Jokosher&lt;/a&gt; project. What is the &lt;a href="http://www.jokosher.org/"&gt;Jokosher&lt;/a&gt; project? Well, I'll quote its home page:&lt;br /&gt;&lt;blockquote&gt;Jokosher is a simple yet powerful multi-track studio. With it you can create and record music, podcasts and more, all from an integrated simple environment.&lt;/blockquote&gt;It may not sound that great, but this application was built like every application should. And is moving at a quick pace because of the community that surrounds it. But back, to how the application was built. First they laid down their requirements. They also chose the tools they wanted to use, because they were the developers. Next step was to male lots of GUI Mock-Ups. Incredibly enough, someone decided to code one of the mock-ups, but nothing actually worked underneath it. Well, the Community stepped in and &lt;a href="http://www.jokosher.org/"&gt;Jokosher&lt;/a&gt; is being developed at an incredible pace. In fact, &lt;a href="http://www.lugradio.org/"&gt;L&lt;span style="text-decoration: underline;"&gt;ug&lt;/span&gt;Radio&lt;/a&gt; is being recorded with &lt;a href="http://www.jokosher.org/"&gt;Jokosher&lt;/a&gt;, since it was the driver for the project.&lt;br /&gt;&lt;br /&gt;This project is a living proof of what a community, and humanity in general can achieve if people set their minds to something. Believe me, this is not something you can force upon a group of people.  No, the software won't come out faster the more under-paid persons you throw at it. Actually, even with over-paid persons it simply won't work. You need motivated persons, a sense of community to drive a project. Building this community is hard, specially in commercial projects. In fact, I believe that for commercial projects things are even harder since a motivation is hard to build and easy to destroy, but that is a whole different story.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-5968453484601707425?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/5968453484601707425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=5968453484601707425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5968453484601707425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5968453484601707425'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/02/power-of-community.html' title='The Power of the Community'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8627028881920586459</id><published>2007-02-10T12:36:00.000Z</published><updated>2007-02-10T12:36:19.306Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Finally a API for Date and Time Handling in Java</title><content type='html'>Have you ever had to do real work with Dates and Times in Java? Well, I had to and still have to. For Data and Time handling the Java API includes the &lt;span style="font-style: italic;"&gt;Date&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Calendar&lt;/span&gt; classes, but these classes leave a lot to desire. For instance: there is no class that represents a Date without Time information, or a class that represents Time without Date. Even worst, there is no class to support Durations. Until know what I did was to create the classes that I missed. For instance: I created a &lt;span style="font-style: italic;"&gt;Duration&lt;/span&gt; class that represents Durations. It is weird to have to do these things, but it is a fact of life if you want to use Java Standard APIs.&lt;br /&gt;&lt;br /&gt;But there is hope for the rest of us that really want a new and better API. &lt;a href="http://www.jcp.org/en/jsr/detail?id=310"&gt;JSR-310 Date and Time API&lt;/a&gt; is planed for Java 7 and should address these issues. They will finally create a simpler API, with all the missing parts like Durations, Date without Time and Time without Date, and so on...&lt;br /&gt;&lt;br /&gt;The problem is we are still at least a year away from Java 7 and we need to develop applications now! What can we do? Well, when I found out about JSR-310, I also found out about &lt;a href="http://joda-time.sourceforge.net/"&gt;Joda Time&lt;/a&gt;. This is an API that fills the gaps in the Standard Java API with a license that we can use even in our commercial applications. In fact, JSR-310 will take ideas from the Joda Time API, fill some gaps and address other issues: nothing more. It won't be a copy of the Joda Time API, but it should be a simpler version.&lt;br /&gt;&lt;br /&gt;From what I saw in Joda Time API, I will definitely consider it whenever I do code that involves Dates and Times. The problem will be convincing management that we should adapt some of our existing code to use this API. But who knows: there might be some &lt;span style="font-style: italic;"&gt;severe&lt;/span&gt; error in our code that using Joda Time would solve. Well... I'm wishing out loud. The facts are that we currently don't have time to breath, just time to write the simplest code that guest the job done, no matter if the code is the ugliest hack every written!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8627028881920586459?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8627028881920586459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8627028881920586459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8627028881920586459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8627028881920586459'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/02/finally-api-for-date-and-time-handling.html' title='Finally a API for Date and Time Handling in Java'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6367628892173201920</id><published>2007-02-10T12:31:00.000Z</published><updated>2007-02-05T19:48:55.512Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>A Departure...</title><content type='html'>My grandfather has left this earth and went into the great adventure. He will always be in my heart and I'll never forget him. I know he is watching over us and he expects us to continue without his presence. I'll do my best to make him proud...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6367628892173201920?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6367628892173201920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6367628892173201920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6367628892173201920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6367628892173201920'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/02/departure.html' title='A Departure...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-2241929378207247718</id><published>2007-02-05T19:42:00.000Z</published><updated>2007-02-05T19:48:55.659Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>ARM, Symbian, Linux and the iPhone</title><content type='html'>I've been a little off-line lately due to some personal problems It involves the health and life of someone that is dear to me. This leaves me without any will our power to actually write anything. But at least I'll leave here a &lt;a href="http://www.roughlydrafted.com/RD/RDM.Tech.Q1.07/855E5843-AF47-47B7-B363-3C1FD2636F43.html"&gt;link to a series of articles&lt;/a&gt; on the story of the ARM processors, the Symbian and Linux use on Mobile Phones. And of course, the latest release from Apple the iPhone. &lt;a href="http://www.roughlydrafted.com/RD/RDM.Tech.Q1.07/855E5843-AF47-47B7-B363-3C1FD2636F43.html"&gt;Read on&lt;/a&gt; if you want to know a little about history, since my will to write is somewhere else...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-2241929378207247718?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/2241929378207247718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=2241929378207247718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2241929378207247718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2241929378207247718'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/02/arm-symbian-linux-and-iphone.html' title='ARM, Symbian, Linux and the iPhone'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4080070526118553171</id><published>2007-02-02T20:33:00.000Z</published><updated>2007-02-02T21:07:21.972Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Filling the Gaps in Swing...</title><content type='html'>I had this subject on my backlog for quite some time. You see, I started my days as a professional Java Developer doing Swing coding. At that time Swing was OK, a little slow, but OK. Today I believe Swing is as fast and any other GUI Toolkit for Java with the advantage of being extremely flexible. But I don't want to get into a GUI Toolkit debate here because I think there is nothing to debate: you weight the factors for the project, choose a toolkit and live with it.&lt;br /&gt;&lt;br /&gt;In the last couple of days I stumbled upon two very interesting Java Specification Requests (JSR) related to Swing The first and oldest one is the &lt;a href="http://jcp.org/en/jsr/detail?id=295"&gt;JSR 295 - Beans Binding&lt;/a&gt;. The second one is the &lt;a href="http://jcp.org/en/jsr/detail?id=296"&gt;JSR 296 - Swing Application Framework&lt;/a&gt;. I already heard about the first one a year ago and I actually thought it was dead, but there has been some progress. These JSRs fill some of the Gaps I always believed Swing had. I'll give you some details.&lt;br /&gt;&lt;br /&gt;The Beans Binding JSR finally turns Java Beans into something really useful. The idea is simple: you have two Java Beans and you want to bind their properties. You want that when property X of bean A is changed then the property X of bean B is also changed. Of course that you want this binding to work both ways. Simple in principle, but easy to do? Probably not, but look at the potential: you have a &lt;span style="font-style: italic;"&gt;JTextField&lt;/span&gt; and its "text" property; you have your own bean, Person, with a "name" property; you simply bind the two properties together and &lt;span style="font-style: italic;"&gt;voi lá&lt;/span&gt;: the name of the Person is displayed in the &lt;span style="font-style: italic;"&gt;JTextField&lt;/span&gt; and when you update the &lt;span style="font-style: italic;"&gt;JTextField&lt;/span&gt; the name of the Person is also updated.&lt;br /&gt;&lt;br /&gt;JRS 295 - Beans Binding goes far beyond this simple Use Case I described, it even has an expression language for complex operations and artificial properties to help use the Swing components more effectively. For instance: the JTable class has an artificial "elements" property that represents the rows in the table - this way you can bind a list of objects to a JTable. If your curious check &lt;a href="http://weblogs.java.net/blog/zixle/archive/2007/02/update_on_beans.html"&gt;this blog entry&lt;/a&gt; and dig in.&lt;br /&gt;&lt;br /&gt;Waht about JSR 296 - Swing Application Framework? How should I put it: if you didn't do something similar yourself when you developed your Swing interface that you're in real trouble!!! Let me explain: Action management is something that you must learn if you want to make a clean Swing Interface. Don't know what I'm talking about? Well, you're in real trouble. I'll help you: I'm talking about extending the &lt;span style="font-style: italic;"&gt;AbstractAction&lt;/span&gt; class. It may seem strange but the idea is simple: you create an action and use it for your menus, buttons and pop-up menus. This way you have only one point on your code where you define the icon for the action, the text, the tool tip, the accelerator key and so on. When you add the action to a menu Swing will automatically take advantage of all the properties. When you select the action, be it in an application menu bar, pop-up menu or tool bar, the same &lt;span style="font-style: italic;"&gt;actionPerformed&lt;/span&gt; method is used: the one of the action.&lt;br /&gt;&lt;br /&gt;But believe me that you loose some time creating the structure to get your Actions well together, specially if you want to have &lt;span style="font-style: italic;"&gt;ActionMaps&lt;/span&gt; and the standard Copy/Cut/Paste actions. And there comes JSR 296 to the request. With it you simply annotate the methods that are supposed to be actions and it takes care of the rest. Even the GUI builders like NetBeans Matisse will support this.&lt;br /&gt;&lt;br /&gt;But the JSR 296 goes beyond this and it event provides support for background Task execution with the same &lt;span style="font-style: italic;"&gt;@Action&lt;/span&gt; annotation. These background tasks can also provide a progress status and messages that can be displayed in a Status Bar. But another interesting thing is the support for Resource Management. The idea is that instead of setting all properties of a Swing component when it is created you simply set is Name property and then the resources define the rest. For instance, you set the name of a &lt;span style="font-style: italic;"&gt;JLabel&lt;/span&gt; and in the resources you can define the value for its Text, Background Color, Icon, Orientation properties, or any other property for that matter. This keeps code clean of any string or resource that doesn't belong there.&lt;br /&gt;&lt;br /&gt;For more details on JSR 296 - Swing Application Framework, check its &lt;a href="https://appframework.dev.java.net/"&gt;development site&lt;/a&gt;, specially the &lt;a href="https://appframework.dev.java.net/intro/index.html"&gt;introduction&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, if you're just on of those Eye Candy Lovers you can &lt;a href="http://weblogs.java.net/blog/campbell/archive/2007/02/orange_box_new.html"&gt;have a look on how the new Progress Dialog&lt;/a&gt; for the Java Plug-in will Look in the Java 6 Update 1 or Java 7. Now you have something decent to show your users when they are waiting for an Applet to load. In fact, you can even set the image you want to show.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4080070526118553171?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4080070526118553171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4080070526118553171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4080070526118553171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4080070526118553171'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/02/filling-gaps-in-swing.html' title='Filling the Gaps in Swing...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-2705995692651471332</id><published>2007-02-01T18:57:00.000Z</published><updated>2007-02-01T19:04:57.430Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='thesis'/><title type='text'>Three Pages, Three Weeks, Three Radars...</title><content type='html'>Today I made some progress on my Thesis: I was able to write three more pages in just one hour. At this rate It will take me another sixty hours to finish it. Hmm.... that still seems a huge number...&lt;br /&gt;&lt;br /&gt;On another note it seems that the number three has been pursuing me all day and will continue to. Let's have a look: I passed by three police Radars on my way to Work; the promise made by the high level management of providing us with full details on a sensitive subject within three weeks saw its deadline today (no, as usual they failed one more promise; why am I so stupid to think otherwise?); I found three major errors in the source code I was changing at work (don't worry, the errors are still there, since there is no time to correct them); I passed another three police radars on my way to the University; I have written three pages of my Thesis;... What will be next? Three Speeding Tickets when I get home?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-2705995692651471332?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/2705995692651471332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=2705995692651471332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2705995692651471332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2705995692651471332'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/02/three-pages-three-weeks-three-radars.html' title='Three Pages, Three Weeks, Three Radars...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4802539228755469602</id><published>2007-01-31T19:21:00.000Z</published><updated>2007-01-31T19:26:55.217Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Linux Kernel Internals...</title><content type='html'>Have you ever wanted to know the Linux Kernel Internals? Well, today, while browsing the web, I came across &lt;a href="http://kerneltrap.org/node/7637"&gt;this article&lt;/a&gt;. It is an interview with Jens Axboe, the hacker that launched the development of the 2.5 branch of the Linux Kernel with his rewrite of the block layer.&lt;br /&gt;&lt;br /&gt;If you ever wanted to understand a little more about how Linux works, just read the interview. It is well worth the time it takes to read it. In fact, I'm know installing the kernel 2.6.19 on my Laptop and I'm following some of his advices, specially the notes about I/O Schedulers. What do you want? My Laptop is a 6 years old machine: if I can squeeze a little more performance out of it, I will!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4802539228755469602?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4802539228755469602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4802539228755469602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4802539228755469602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4802539228755469602'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/linux-kernel-internals.html' title='Linux Kernel Internals...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-5567762896355298931</id><published>2007-01-30T19:03:00.000Z</published><updated>2007-01-30T19:09:41.325Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>The Community</title><content type='html'>Today I was browsing through my usual RSS feeds and I ran into &lt;a href="http://www.jonobacon.org/?p=878"&gt;this one&lt;/a&gt;. It is a presentation about "How To Herd Cats and Influence People". Jono is right on the money: the community is the key to keep a project alive. In fact he is even righter when he mentions that the process should be defined, not a peace of bureaucracy that no one wants to follow, but a simply defined.&lt;br /&gt;&lt;br /&gt;I'm saying this because I'm trying to contribute to Rhythmbox and I'm having difficulties on how should I make things. You see, when I involve myself in a project I like to respect the already made decisions. For instance: I don't want to start immediately by questioning the chosen architecture. The problem is that if I don't understand the architecture it will be difficult to contribute.&lt;br /&gt;&lt;br /&gt;What's there left to do? Well, I'll choose one implementation, the one that is quicker and that doesn't seem to break the application's architecture and move ahead; submit the patch and wait for feedback. I hope that the feedback contains some sort of guidance if they don't like the solution I'll propose.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-5567762896355298931?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/5567762896355298931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=5567762896355298931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5567762896355298931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5567762896355298931'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/community.html' title='The Community'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-5839602083747664731</id><published>2007-01-29T20:18:00.000Z</published><updated>2007-01-29T20:24:33.907Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='thesis'/><title type='text'>Thesis Progress... or lack of...</title><content type='html'>As you already know I'm writing my Thesis. Facts are that I haven't made any progress in it and I believe I should really channel all my energies to it. It is almost the end of January and I want to end it as soon as possible.&lt;br /&gt;&lt;br /&gt;The problem is that it has been some weeks since I have written anything on the Thesis. It is not that the subject isn't interesting, but since I shot for the impossible for the given time frame I'm writing about what I wanted to achieve. Facts are that I didn't achieve my end goal and that makes me frustrated to a point that I can't write about it. I guess the rage needs to build up before I write a single line in the Thesis...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-5839602083747664731?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/5839602083747664731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=5839602083747664731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5839602083747664731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5839602083747664731'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/thesis-progress-or-lack-of.html' title='Thesis Progress... or lack of...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7912035443387592652</id><published>2007-01-27T11:29:00.000Z</published><updated>2007-01-27T11:41:54.864Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><title type='text'>It is not the Language: It's the Library!!!</title><content type='html'>In my last post I said that it was time to brush up my C programming skills. Well, it turns out that my C programming skills are way OK. The problem is that I don't know GNome's APIs.&lt;br /&gt;&lt;br /&gt;It's like when you have one of those enlightening moments when someone explains you how to do something without having to do a Marathon before. I'm always saying: "Developer, know thy tools!". It seems this sentence is now haunting me because I don't know GNome's APIs and I'm paying the price: I end up look, searching or even reinventing something that has already been done all over again.&lt;br /&gt;&lt;br /&gt;I know most of Java SE APIs by hart, their patterns and how they should be used. I know them so well that I can even abuse of them to my benefit. In fact, it is not the first time I go to Java's source code to see how something is done so I know if I can use it in a given way. In fact, the last time I did this was just a couple of days ago when I wanted to see if the Preferences API in Java 6 used the Context Class Loader of a Thread when instantiating the Preferences Factory. This is how I feel in Java: like a fish in the water because I have been using it since its first version.&lt;br /&gt;&lt;br /&gt;With C and C++ it is different. I'm using C++ in my Thesis to program a robot and I need to learn its API and the API of the framework I'm using. For the remote control and UI I'm using Java because I feel more comfortable with it.&lt;br /&gt;&lt;br /&gt;But GNome has a whole set of APIs that I want to get to know. The main problem is that, like most open source projects, the documentation is not what it could be. Maybe I can contribute on this end, that is, as I'm learning the API I can document it, or at least write some articles about it. What I would really love is to have something like the Java's reference API for all GNome's library. I'm using DevHelp and I can see the &lt;span style="font-style: italic;"&gt;classes&lt;/span&gt; that exist and their &lt;span style="font-style: italic;"&gt;API&lt;/span&gt;, but most functions aren't documented and what I'm missing is an introductory path to an API. For instance, if you want to use GDK PixBuf library to load a JPEG how would you do it? I know how to do it, but after scavenging the API for fifteen minutes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7912035443387592652?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7912035443387592652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7912035443387592652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7912035443387592652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7912035443387592652'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/it-is-not-language-its-library.html' title='It is not the Language: It&apos;s the Library!!!'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7967613408808105245</id><published>2007-01-25T18:35:00.000Z</published><updated>2007-01-25T18:45:29.700Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><title type='text'>I need to brush up my C Programming Skills...</title><content type='html'>It looks like I have been &lt;span style="font-style: italic;"&gt;Eating my own Dog Food&lt;/span&gt; for too long. I'm saying this because I usually make new code using code that I have already written down. This makes things easy: the principles behind the code are almost the same (if we don't factor in the natural evolution that comes with Age and Experience); the architecture is know; the flow is know and so on.&lt;br /&gt;&lt;br /&gt;I'm trying to add a new feature to GNome's Rhythmbox application and I'm finding out that I'm a bit lost in their source code. It is a mix o C, with object oriented support built from scratch, and Python. Problems? Well, I don't understand their architecture and I have never written anything serious in Python. End result? I'm lost :-|&lt;br /&gt;&lt;br /&gt;For me this means that I need to brush up on my C skills and also to learn Python. Maybe this was just the excuse I needed: a worthy challenge that would force me to dig into someone else's code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7967613408808105245?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7967613408808105245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7967613408808105245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7967613408808105245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7967613408808105245'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/i-need-to-brush-up-my-c-programming.html' title='I need to brush up my C Programming Skills...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-1264361128720522661</id><published>2007-01-23T17:22:00.000Z</published><updated>2007-01-23T17:30:31.791Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Beating an RDBMS...</title><content type='html'>My latest assignment at work is to try to make a dedicated storage system that we can use to be the performance of a RDBMS when making statistics. I know it seems strange, but the first tests show that a dedicated storage system can be something like 5 times faster then a RDBMS, even without optimizing the storage.&lt;br /&gt;&lt;br /&gt;It goes inline with a recent article from the MIT guys that indicates that for specific applications a dedicated storage system can be &lt;a href="http://developers.slashdot.org/article.pl?sid=07/01/09/2337257"&gt;up to 10 or more times faster&lt;/a&gt; then a conventional RDBMS, even if it is a really expensive one. Well, I've known this all along: the RDBMS needs to be sufficiently generic and if you know the nature of the data and the operations that are going to be performed you can always make something faster.&lt;br /&gt;&lt;br /&gt;The problem with attempting to make something faster is that you will have to solve some of the problems that an RDBMS already did. No, I'm not talking about Transaction Management, but concerning how data is store. You need to structure your storage in a way that enables you to update, read and delete effectively. And believe me: although this might seem simple, it is not!&lt;br /&gt;&lt;br /&gt;Now my days are spend around managing files in blocks, splitting block in slots, making linked list in files, metadata, storage format, etc., etc. And I still have to think about defragmentation techniques...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-1264361128720522661?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/1264361128720522661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=1264361128720522661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1264361128720522661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/1264361128720522661'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/beating-rdbms.html' title='Beating an RDBMS...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7529175367304094046</id><published>2007-01-20T12:11:00.000Z</published><updated>2007-01-20T12:23:44.054Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><title type='text'>Learning New Languages</title><content type='html'>I think it is about time to start learning a new programming language. I think it has come a time where you should really use the best tool for the job and not just reinvent the wheel just because your language doesn't do a certain thing.&lt;br /&gt;&lt;br /&gt;There are many languages out there that I wanted to try, like Ruby and Python. But what I'm also pondering to try C#. I have always delayed this because C# first seemed like a clone of Java, it didn't ran on Linux and it wasn't truly multi-platform. Today I believe I should know its special constructs if I ever need to use it, because everything else looks very similar to Java and C++. Is like 15% is new, everything else comes from other languages. As with any new language the main step in the learning path is learning is API. Like Java, C# has many modules that address many things. Knowing at least some of them would be good. This is even more true for someone who has been working in the same place for 7 years and sees a dark future ahead.&lt;br /&gt;&lt;br /&gt;Today I installed &lt;a href="http://www.monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; on my laptop to give it a go. It is still unstable and has already crashed twice, but it should be sufficient to make a few experiments with the language. Ruby and Python are also on my sight, specially the JRuby and JPython &lt;span style="font-style: italic;"&gt;flavors&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7529175367304094046?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7529175367304094046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7529175367304094046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7529175367304094046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7529175367304094046'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/learning-new-languages.html' title='Learning New Languages'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8753650459655268623</id><published>2007-01-19T20:04:00.000Z</published><updated>2007-01-19T20:22:27.689Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><title type='text'>Blender...</title><content type='html'>Do you know a tool called &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt;? If you don't maybe it is about time that you do. If you are interested in Graphics, 3D, High Quality Rendering, Physics Engines, Game Engines, Ray Tracing and others of the same kind, then you are a Graphics Geek. Well, at least I think that is what geeks that are interested in Graphics should be called.&lt;br /&gt;&lt;br /&gt;Am I a Graphics Geek? Well, probably not fully, but I've always found interesting the world of Graphics. It all started at the University when I had to develop a Z-Buffer Implementation, coupled a a 3D Modeling tool. You see, I went the extra mile. For a simple project where you shouldn't spend more then 40 hours I ended up spending something like 60 hours and ended up with a tool that even made objects by Revolution, that is, you draw a polygon and a line and the engine would warp the polygon around the line making quads as it went by.&lt;br /&gt;&lt;br /&gt;What really amazed me at the time is that this is an area were you could always attempt old techniques and new techniques to squeeze a little more performance from the machine. At the time I did this I had a 486 PC at 66Mhz. At that time we had Pentium's 3 at 130Mhz at the University and even those weren't top of the line. The end result? Well, I had to make substantial optimizations to the engine to ensure that it had an "acceptable" performance in my PC. Actually it is a funny story.&lt;br /&gt;&lt;br /&gt;When it first ran and produced a good result it took something like 5 to 10 minutes to render a scene. I added back-face culling and it dropped to 2 to 5 minutes. I then added an computational cache for the dots and it dropped to something like 20 to 40 seconds. It was acceptable, but it had a strange output. I was rendering a sphere and it seemed like a density map, like the engine was supposed to produce more colors but it didn't. It was the night before the presentation and I gave up at about 1a.m..&lt;br /&gt;&lt;br /&gt;The next day I was attempting to see it running in the University's machines, just before the presentation, and I was already preparing myself to explain the teacher that I couldn't solve that bug. What happened? Well, it toked only 3 to 10 seconds to render a scene and the scenes were absolutely beautiful. Then I remembered that at home it was running with only 8 bit color depth (256 colors). At the University it was running at 16 bits. The teacher was amazed with the speed of the engine and I had to explain the techniques that I used that he didn't teach, some of which I invented - like the calculation cache. I got an A for that work ;-)&lt;br /&gt;&lt;br /&gt;So, if you like this area, like I do, have a look at blender and you'll be amazed. But be warned: its engine is far more complex then the one I developed so don't expect fast rendering times. In fact, if you abuse and start adding things like fur to surfaces you're in for a good minutes of rendering time, before seeing the end result...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8753650459655268623?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8753650459655268623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8753650459655268623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8753650459655268623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8753650459655268623'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/blender.html' title='Blender...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6332941512804989692</id><published>2007-01-18T18:41:00.000Z</published><updated>2007-01-18T19:18:50.472Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><title type='text'>Maven and TestNG</title><content type='html'>Yesterday, while browsing through the World Wide Web, I read a couple of articles. The &lt;a href="http://www.devx.com/Java/Article/28801/"&gt;first one&lt;/a&gt; talked about &lt;a href="http://maven.apache.org/"&gt;Maven.&lt;/a&gt; The second one talked about &lt;a href="http://www.devx.com/enterprise/Article/33507"&gt;The Top 12 Productivity Killers in Development Methodologies&lt;/a&gt;. I was captivated by Maven and intrigued by the second that I decided to blog about Maven and &lt;a href="http://testng.org/"&gt;TestNG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What is Maven? Well, I can quote what is written on &lt;a href="http://maven.apache.org/"&gt;its web site&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;         Maven is a software project management and comprehension tool. Based on the concept of a project object model         (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.&lt;/blockquote&gt;What does this mean? Well, it means that you declare your projects dependencies and Maven will take care of all the work, even if it involves downloading the dependencies from the Web.&lt;br /&gt;&lt;br /&gt;Although this might seem a simple functionality, if you ever worked with huge projects, specially if they are component oriented projects, you can see the benefit. Imagine that you have a tool that automatically handles your dependencies, builds them, ensures that no dependency is built twice and has all the phases that you need, that is, compilation, testing, packaging, reporting and, for those that go the extra mile, source code generation, etc., etc.&lt;br /&gt;&lt;br /&gt;Imagine &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; on steroids: you have a real tool that manages projects described as an XML file, unlike Ant where the goal is to have a build file that is an XML file. The potentialities are even greater then with Ant. I'm saying this and I had to develop a component building system on top of Ant that handled dependencies, ensure that components were built only once, ran unit tests, build test and coverage reports, etc., etc. This was hard, it even has some python scripts in it. With Maven this would be a lot easier.&lt;br /&gt;&lt;br /&gt;But lets put Maven at the side for a moment and talk about the other article: the one about The 12 Productivity Killers in a Development Environment. Many of these killers hit the Development Environment in my company so there was nothing new for me on those issues, but there was one strategy that I wasn't aware of. Fact 6 on &lt;a href="http://www.devx.com/enterprise/Article/33507/0/page/2"&gt;Page 2 of the article&lt;/a&gt; mentioned the idea of having several testing layers.&lt;br /&gt;&lt;br /&gt;The idea is to have several defense strategies that warn you the soonest possible of any issue in your project. This can be way before anyone actually testing it for real. Here the TestNG software comes in. The TestNG is like an extended version of JUnit. Amongst many other features it allows you to define a category for your test. This way your unit tests may categories such as: consistency tests (that verify that the component works well on its on), integration tests (that checks that multiple components work well together), system tests (that verify that the system is working well with all components together), functional tests and so on. Or you can separate the tests in fast and slow tests, running the fast ones first to ensure that the production stops on a killer issue. You can even have a category called "Regression Tests" that are ran always as last to ensure that no bug is resurrected.&lt;br /&gt;&lt;br /&gt;The problem with any new Methodology is the usual Aversion to Change you find when you propose it. It seems that everybody has been doing it the old way for too long and they don't want to learn a new way. Facts are that as a team grows its methodologies and the way work is carried out needs to be adjusted and sometimes new methodologies are in order.&lt;br /&gt;&lt;br /&gt;For instance, where I work we used to be 3 programmers in the team. With a low number of programmers source code access isn't a problem. In fact, if the programmers have some sense you won't get into problems. Now we are almost 10 programmers. What happens? Well, if you are in a project that has multiple versions on the field that need to be supported and you need to make patches for, with also multiple new versions and customer dedicated projects with different features in development... Well, if you don't have a tight control over what gets into a release you are in serious trouble. What could happen? Well, you might need to release a patch on a certain branch, but someone has already checked in some changes in that branch that shouldn't go in the patch. At the same time the changes in the branch should continuously be merged to another branch where development of the future versions is taking place. This is hard to do, specially if you don't control the access to the source code!&lt;br /&gt;&lt;br /&gt;I believe a better way is to have several branches for development of new features or bug corrections and a main branch to be used to build deliveries. The idea is that every time you make a delivery you create a branch that will be used to build patches of that version. Over that branch, other branches will be created for the developers to use when correcting bugs or adding features. Depending on the project's plan, when the time comes to make a new delivery, it is a matter of merging all the branches of the features and/or bug corrections to include into the branch that is being used for the new delivery, be it the branch to produce a patch or a new version of the product. This not only tightens the control of the source code but it also allows you to know what exactly changed between one version and another. This information is extremely important for the testing teem: it allows them to know what features or components changed and need to be tested in more detail.&lt;br /&gt;&lt;br /&gt;This, I believe, should lead to more quality control in a Software Development Project. But to make it clearer I would probably do better in writing an article about it...&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6332941512804989692?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6332941512804989692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6332941512804989692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6332941512804989692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6332941512804989692'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/maven-and-testng.html' title='Maven and TestNG'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-4669830204645001656</id><published>2007-01-17T18:47:00.000Z</published><updated>2007-01-17T19:05:48.594Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Programmers Block...</title><content type='html'>I have always been a programmer. I started programming in BASIC with the &lt;a href="http://en.wikipedia.org/wiki/ZX_Spectrum"&gt;ZX Spectrum&lt;/a&gt;. Incredibly as it might sound I even wrote a game for that computer. Over the years things evolved and know I would like to say that I use the language that serves best the needs at hand, but facts are that I do most things in Java. That is the language that I use at work. At home, for my pet projects, I choose language and it goes from C to Java. Lately I've been looking a Python and Ruby, but I haven't really tried them out.&lt;br /&gt;&lt;br /&gt;At work I have evolved to what I call a "Word Programmer". What is a "Word Programmer"? Well, it is someone that makes highly detailed specifications that others follow when programming. I call it "Word Programmer" because "Word" is the name of the Text Editor that the company I work for forces me to use. The idea is to develop software from very high-level languages: English and &lt;a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language"&gt;UML&lt;/a&gt; (Unified Modeling Language). It is an interesting work since you get to develop something that the University doesn't teach: &lt;a href="http://en.wikipedia.org/wiki/Soft_skills"&gt;Soft Skills&lt;/a&gt;. I say this because the &lt;span style="font-style: italic;"&gt;compilers&lt;/span&gt; that actually turn the &lt;span style="font-style: italic;"&gt;source code&lt;/span&gt; I write into an executable program are the programmers of the team. Each one with their own personality and experience.&lt;br /&gt;&lt;br /&gt;One of the things I learned after all these years as a programmer is that sometimes you reach what I like to tall "Programmers Block". Like it happens with writers that are with &lt;a href="http://en.wikipedia.org/wiki/Writer%27s_block"&gt;Writer's Block,&lt;/a&gt; sometimes I simply can write a single line of code. No matter how long I stare at the editor no single line comes out. It seems that my "Over Engineering" neuron is firing all the time and everything seems to complicated. End result: no source code comes out. But then something clicks, the neuron stops firing and source code starts to poor out as usual. I just have to wait for a while.&lt;br /&gt;&lt;br /&gt;Has this haver happened to you? Because I believe this is another proof that developing software is just another form of art. If only my bosses figured this out and stopped thinking that the programmer is like a factory worker that consistently delivers 15k lines of source code per day...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-4669830204645001656?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/4669830204645001656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=4669830204645001656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4669830204645001656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/4669830204645001656'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/programmers-block.html' title='Programmers Block...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8549461900157956366</id><published>2007-01-16T18:54:00.000Z</published><updated>2007-01-16T18:59:50.581Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>My Shared Links..</title><content type='html'>I don't know about you, but I read a lot of RSS Feeds on a daily basis. I use &lt;a href="http://reader.google.com"&gt;Google Reader&lt;/a&gt; for this but recently I found out that it allows me to create a list of shared items. I found the idea interesting so I'll start trying to use it. The idea is simple: if I find a post, news, article or whatever on the web that I find interesting or funny enough I'll add it to my shared items. These will be available &lt;a href="http://www.google.com/reader/shared/03069193563343422406"&gt;in this page&lt;/a&gt; (you can also find a permanent link on the right side of the blog, under My Links and it is called "&lt;a href="http://www.google.com/reader/shared/03069193563343422406"&gt;Interesting Links&lt;/a&gt;").&lt;br /&gt;&lt;br /&gt;This way you can keep track of what I find interesting, but be warned that you will get a "Filtered" version of what I find in the RSS Feeds I read that is interesting. You may not like it, but you won't know until you give it a try!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8549461900157956366?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8549461900157956366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8549461900157956366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8549461900157956366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8549461900157956366'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/my-shared-links.html' title='My Shared Links..'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-5703334552683279986</id><published>2007-01-16T17:25:00.000Z</published><updated>2007-01-16T17:48:23.536Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='thesis'/><title type='text'>Writing a Thesis... a Revelation!</title><content type='html'>Writing a Thesis is turning out to be a worthy challenge. It is like writing a book! You have to make it fluent and coherent from start to finish, it has to be well written and an enjoyable reading. On top of all this you have to be talking about things that are complex, new and hard to understand. Its like mixing water with oil: the two don't get along and even if try really hard to mix them they won't stay together for too long.&lt;br /&gt;&lt;br /&gt;I haven't written a single sentence in my Thesis for a long time. You see, the &lt;span style="font-style: italic;"&gt;only&lt;/span&gt; things I have to do to finish it are: write the Thesis, deliver it and defend it. It seems simple but I'm finding it hard to focus on the task at hand: writing it!&lt;br /&gt;&lt;br /&gt;I always wanted to write some articles or even a book, but if I can't write the Thesis it is going to be hard. I also believe that writing articles or books can be a lot easier then writing the Thesis because I'm writing a text that should teach or help someone grasp a concept. In the Thesis I'm explaining new concepts to those that already understand the old ones.&lt;br /&gt;&lt;br /&gt;Strange, now that I have written this it seems that I can write the Thesis like if it was a book that is introducing a new idea to someone who doesn't know anything about it. Strange: it seems that by writing about the problem a solution has presented itself. Its like when: your way to deep in code that you can't see the bug; you ask someone for their help and when you just started explaining what the code does you find the bug.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-5703334552683279986?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/5703334552683279986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=5703334552683279986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5703334552683279986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5703334552683279986'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/writing-thesis-revelation.html' title='Writing a Thesis... a Revelation!'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6105946103962467017</id><published>2007-01-15T19:59:00.000Z</published><updated>2007-01-15T20:21:53.992Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>To Hack or not to Hack?</title><content type='html'>I 've been looking at existing bugs in GNome's Bugzilla. I was amazed to see that there are several bugs related to showing &lt;a href="http://bugzilla.gnome.org/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;amp;short_desc=album+cover&amp;product=rhythmbox&amp;amp;long_desc_type=substring&amp;long_desc=&amp;amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;amp;keywords_type=allwords&amp;keywords=&amp;amp;bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;emailassigned_to1=1&amp;amp;emailtype1=substring&amp;email1=&amp;amp;emailassigned_to2=1&amp;emailreporter2=1&amp;amp;emailqa_contact2=1&amp;emailcc2=1&amp;amp;emailtype2=substring&amp;email2=&amp;amp;bugidtype=include&amp;bug_id=&amp;amp;chfieldfrom=&amp;chfieldto=Now&amp;amp;chfieldvalue=&amp;cmdtype=doit&amp;amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;amp;type0-0-0=noop&amp;amp;value0-0-0="&gt;Album Covers in Rhythmbox&lt;/a&gt;. I'm starting to think: "Is it worth to make a patch to show the art embedded in MP3 Files?". A fact is that GStreamer supports it, but the latest version of Rhythmbox from SVN doesn't. It is also a fact that there are already bugs that are addressing the issue and even using a Metadata extension in Rhythmbox to show the Album Cover in the notification message. My efforts might be a little late, that is, if they show it in the tray icon then it is a lot easier to add support for embedded images.&lt;br /&gt;&lt;br /&gt;My Conclusion: I went over my head in trying to make a patch for something that it seems others are working on, or at least on parts of. There is already a Bug that handles &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=345592"&gt;showing the Cover Art &lt;/a&gt;in the notification area. The changes proposed in this bug have been committed so I'll check what they have been doing. If I can find a way to plug in the cover art without having to change many things it would be great. Facts are that I will have to upgrade the GStreamer version on my stable machine to an unstable one to develop this patch...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6105946103962467017?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6105946103962467017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6105946103962467017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6105946103962467017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6105946103962467017'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/to-hack-or-not-to-hack.html' title='To Hack or not to Hack?'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7465225082904730241</id><published>2007-01-13T12:44:00.000Z</published><updated>2007-01-13T12:50:18.562Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Hacking Problems...</title><content type='html'>Today I started hacking Rhythmbox. Things aren't going so well. I expected to be able to quickly hack the new functionality into it but I ran into problems. You see, although Gentoo (my Linux distribution of choice) has GStreamer 0.10.8 marked as stable, which is the GStreamer version that includes the new GST_TAG_IMAGE that I need to show the pictures embedded within the MP3 files, it has the base plug-ins of GStreamer that still don't provide this tag when the ID3 tag on the MP3 file has an image.&lt;br /&gt;&lt;br /&gt;I still have to think weather I attempt an upgrade, with all the risks it involves, or weather I simply give up on trying to make a patch for this. It seems to be rather simple after having GStreamer obtaining the image data: I'll use the GDK-Pixbuf library to turn it into something that can be used by the Album Cover plug-in of Rhythmbox to convince it to show the embedded picture. Guess it will take more hacking to get it done, but I don't want to give up just yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7465225082904730241?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7465225082904730241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7465225082904730241' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7465225082904730241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7465225082904730241'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/hacking-problems.html' title='Hacking Problems...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-830982526760235188</id><published>2007-01-12T19:36:00.000Z</published><updated>2007-01-12T19:54:16.354Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Hacking GNOME</title><content type='html'>Have you have contributed to an Open Source project? Well, I have and it was so long ago that I can't remember. Although I have been using GNU/Linux on my laptop since the day I bought it, I have never really used it to contribute anything. The last time I contributed was when I was in the University. I don't think it makes sense to use something that is really free and only give back to the community more "Requests for Improvements".&lt;br /&gt;&lt;br /&gt;I use the &lt;a href="http://www.gnome.org"&gt;GNOME Desktop&lt;/a&gt;. Why? Well, I like the way it looks, the way it feels and its User Interface philosophy. But I don't want to get drawn into one of those Desktop Environment discussions about the advantages or disadvantages of each Desktop Environment. That's not the goal.&lt;br /&gt;&lt;br /&gt;What's the goal? Well, there is one functionality that I've really been missing in &lt;a href="http://www.gnome.org/projects/rhythmbox/"&gt;Rhythmbox&lt;/a&gt;. What is Rhythmbox? Well, a media player and organizer for the GNOME Desktop, that takes its inspiration from several tools. The functionality that I miss the most is the ability to use the Cover Art embedded in the MP3 files.&lt;br /&gt;&lt;br /&gt;You see, MP3 files can be tagged using ID3. And in the latest versions of ID3 there is support to include the album art, among other images. Where is this used? Well, some MP3 players show it in their color screens and it makes them more appealing to the eyes.&lt;br /&gt;&lt;br /&gt;Rhythmbox currently fetches the cover art from the web. I want to change it to use the art found in the file. If the file hasn't any image then the World Wide Web is consulted.&lt;br /&gt;&lt;br /&gt;It turns out that there is already a &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=345975"&gt;feature request&lt;/a&gt; on &lt;a href="http://bugzilla.gnome.org/"&gt;GNOME's Bugzilla&lt;/a&gt; for this issue. I saw that it was stopped for a long time, looked at what it implied (yes, I actually checked the source code) and I decided to give it a try. Let's see what happens since it has been some time since I try to do anything in C. I've been working with Java like since I left from the University and I've also used some C++ for my Thesis. But this one will be in C, and Python??? I just checked out the SVN version, since the GNOME project just moved from CVS to Subversion recently, and the plug-in is written in Python... Things keep getting more interesting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-830982526760235188?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/830982526760235188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=830982526760235188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/830982526760235188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/830982526760235188'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/hacking-gnome.html' title='Hacking GNOME'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-2840078201057468245</id><published>2007-01-11T17:38:00.000Z</published><updated>2007-01-11T18:03:02.205Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Time for Some Swimming</title><content type='html'>As I already mentioned, I'm a little overweighted. As part of the New Year's Resolution to live my life to its fullest I have decided to start Swimming. By this I mean to start doing some one hour sessions in a swimming pool. Although during the first sessions... well, probably the first month, I won't be able to swim for an entire our it should be a good way to: burn some calories; discharge some stress and get into shape.&lt;br /&gt;&lt;br /&gt;Why Swimming? Well, I used to be in the pre-competition in in this area. What does this mean? I used to do something like 200 swimming pools in one hour in all sorts of styles and I would do it three times a week. Since I left it I have never been in shape like back then. At that time I could do whatever for no matter how long and I would feel tired - unless I really pushed to the limit for too long. Now I loose part of my breath one I walk up 5 flights of stairs. I think it is a sign that I need to get into shape.&lt;br /&gt;&lt;br /&gt;Now I only have to choose a pool and a schedule in which I still have some time to sleep...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-2840078201057468245?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/2840078201057468245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=2840078201057468245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2840078201057468245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/2840078201057468245'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/time-for-some-swimming.html' title='Time for Some Swimming'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-8011538750425536130</id><published>2007-01-10T20:32:00.000Z</published><updated>2007-01-10T20:35:43.523Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Wearing Glasses</title><content type='html'>Today is my first day as someone who has to use glasses to work. In fact, this is my first &lt;span style="font-style: italic;"&gt;Computer Session&lt;/span&gt; in which I'm using glasses. How do they feel? Strange and distracting. I hope this feeling of something in the corner of my eyes goes ahead really fast.&lt;br /&gt;&lt;br /&gt;On top of that my sister just scared me with some interesting questions. For instance: do you feel dizzy or with a need to throw up? That scares me. I though the goal of the glasses was to make one see better and thus feel better, not to make one dizzy!&lt;br /&gt;&lt;br /&gt;It will be an interesting times, specially the &lt;span style="font-style: italic;"&gt;getting used to put the glasses before starting to work&lt;/span&gt;. &lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-8011538750425536130?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/8011538750425536130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=8011538750425536130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8011538750425536130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/8011538750425536130'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/wearing-glassesa.html' title='Wearing Glasses'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-7446919204326660001</id><published>2007-01-09T17:33:00.000Z</published><updated>2007-01-09T17:52:02.587Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Having Full-Text Search Working Properly on JavaHelp</title><content type='html'>Today I'm posting about technology.&lt;br /&gt;&lt;br /&gt;This is a problem that I had to solve at work today. We are using JavaHelp for our On-Line help. Like many other have found issues with the Full Text Search so have we. What's the issue? Well, the selection on the help page is of by a few characters and continuously increases until the end of the page. Near the end of the page the selection of the searched word is completely off (see &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375606"&gt;the issue on the Bug Database&lt;/a&gt;, a.k.a. Bug Parade).&lt;br /&gt;&lt;br /&gt;This issue doesn't happen with JavaHelp 2.0.4 (fetch it from &lt;a href="https://javahelp.dev.java.net/"&gt;this page&lt;/a&gt; - here is &lt;a href="http://download.java.net/javadesktop/javahelp/javahelp2_0_04.zip"&gt;the direct link&lt;/a&gt;). But for those of you that can't use it just yet, because of the wonderful tool you are using, there is a simple workaround:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Unpack the HelpSet in trouble to a new folder. For instance, if the HelpSet is named help.jar extract it to the folder &lt;span style="font-style: italic;"&gt;help&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;In that folder there will be a XXX_JavaHelpSearch folder that contains the full text search index. Delete that folder. In our example it will be called help_JavaHelpSearch, very intuitive...&lt;/li&gt;&lt;li&gt;Standing in the extract folder (&lt;span style="font-style: italic;"&gt;help&lt;/span&gt; in our example), run the &lt;span style="font-style: italic;"&gt;jhindexer&lt;/span&gt; of the new JavaHelp on all html documents. For instance, if all documents are in the folder docs you just run "jhindexer docs/*.html".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The &lt;span style="font-style: italic;"&gt;jhindexer&lt;/span&gt; tool creates a JavaHelpSearch folder. Rename it to whatever you found in step 2. For instance, rename it to help_JavaHelpSearch.&lt;/li&gt;&lt;li&gt;Add all the files to a new JAR file without any additional directories. You can do this by standing in the extract folder (&lt;span style="font-style: italic;"&gt;help&lt;/span&gt; in the example provided) and issuing "jar cfv ../newjar.jar *". After this you have a new HelpSet in the &lt;span style="font-style: italic;"&gt;newjar.jar&lt;/span&gt; file in which the Full Text Search selects the text properly.&lt;/li&gt;&lt;/ol&gt;And that is it for the first programming related entry of this blog. Any issue, send a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-7446919204326660001?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/7446919204326660001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=7446919204326660001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7446919204326660001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/7446919204326660001'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/having-full-text-search-working.html' title='Having Full-Text Search Working Properly on JavaHelp'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-6153571042341647030</id><published>2007-01-07T14:29:00.000Z</published><updated>2007-01-07T14:57:47.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Cleaning out the Closet...</title><content type='html'>This weekend has been out of the ordinary. It must have something to do with the fact that I want to do what my heart tells me to do.&lt;br /&gt;&lt;br /&gt;I started with a trip to the ophthalmologist (I think that's the work in English for the vision doctor). I had been postponing this trip for a long time and I had been getting some headaches and other symptoms that there was something wrong with my eyesight. Well, it turns out that my left eye is twisted a little relatively to its original position. Reason: too many hours in front of a computer screen. Result: I will start using glasses when working. At least the problem can still be corrected.&lt;br /&gt;&lt;br /&gt;My Saturday continue with a global closet cleaning. I'm not talking about cleaning the house, I'm total about a global closet cleaning: when of those cleanings in which you take out everything form your closet, choose the close that still fits you or that you still consider wearing and put out everything that you won't wear. It's amazing what you accumulate in several years: a lot of clothes and some of which I haven't dressed once!&lt;br /&gt;&lt;br /&gt;Sunday started with church school. I'm Christian and I teach small children at the church. I don't know how to pronounce it in English, when I found out I'll tell it. But things aren't going so great because people are fleeing from the church. Why? Unfortunately one of the may reasons is the Preacher, but that is a story I don't want to get into for now.&lt;br /&gt;&lt;br /&gt;But Sunday isn't going all that will also for other reasons. It is fact that I'm a little overweighted. I need to loose some weight. I really do. It would be great not only for my health but also for my ego. This has turned into a battle in which there is my weight and everyone in my family in one side and me on the other side, trying to keep my temper. I need to learn how to control my temper even if everybody has decided to make their top priority to bug me for whatever reason.&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;br /&gt;&lt;br /&gt;I don't know what is wrong with me but recently I burst whenever I'm pushed and for whatever reason. And didn't use to be like this and I need to find that piece of mind once again. Things are getting so critical that I'm even considering the chance of leaving my family and finding myself a new house away from all the pressure that my family is placing on me. Most times I just want to take my car and run away from all the problems, pressures, critiques and comments.&lt;br /&gt;&lt;br /&gt;The point is that even if I run away from all this they won't get solved. I need to attack the problems head on and solve them. I have to do this in order to end my Thesis, to get into shape and to live a better life. If in this process there are others that, even if they believe they are helping, are simply just making matters worst, I simply have to put some distance between me and them. I'm not talking about physical distance, but about ignoring their remarks no matter how offending they are and avoid depending on them to make activities that I enjoy.&lt;br /&gt;&lt;br /&gt;I believe they we all need some hours every day or every week to do what you like the most, or simply to feel good about doing something. During those hours we shouldn't have to put up with bosses, problems at work, problems at the university, problems at home or remarks from .... well, I won't go there.&lt;br /&gt;&lt;br /&gt;The hard part about all this is that as I'm writing this I keep getting this feeling in the back of my head that I'm being selfish. As I grow older I'm starting to believe that although we are in this world to help others and to try to make a different we also have to be a little selfish if we want to accomplish some of our dreams. Unfortunately it seems that I have always put the wellbeing of others above my wellbeing, my life and my health. I won't do this anymore.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-6153571042341647030?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/6153571042341647030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=6153571042341647030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6153571042341647030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/6153571042341647030'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/cleaning-out-closet.html' title='Cleaning out the Closet...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-5283863614365693556</id><published>2007-01-04T19:19:00.000Z</published><updated>2007-01-04T19:21:42.000Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Making Life Changing Decisions</title><content type='html'>You probably noticed that this blog has been &lt;span style="font-style: italic;"&gt;dead&lt;/span&gt; for quite some time. Too many things are happening at the same time that I'm have a hard time keeping track of them all. I don't want to make a full summary of all the items on my &lt;span style="font-style: italic;"&gt;think list&lt;/span&gt;, but I'll give you a glimpse.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Health&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First things first: I need to get into shape. I have been postponing this item for way too long. I should I put this... Well, in my youth I was a true sports freak. I was involved in many sports some of which at the exact same time. I did swimming, water polo, tennis, biking and handball. Not to mention all the other smaller things. I even reached the pre-competition series in swimming, that is, the next step would be to train every single day and join competitions. In handball I was federated, that is, I actually participated in the Regional Championship. But I had to give all that up to study.&lt;br /&gt;&lt;br /&gt;Please don't get me wrong! I don't regret making the decision of giving all that up. I'm happy with what I do. I have the possibility to do what I like every single day, although that is changing a little. But that is another topic.&lt;br /&gt;&lt;br /&gt;So, what should I do? Well, I will start doing some sport and dancing. You're probably wondering "Why Dancing"? Well, it is like a sport and I get to learn something that I have always wanted to learn. At the same time I get to meet new people. For sports I'll go back to swimming. I think it is one of the most complete sports. I don't know if I'll go for a Gym like everyone goes, but I'll probably start swimming right away. For the dance part, I'll go with my sister as partner.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Thesis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm making a Master Thesis. Well, I guess I am. I say this because it has been too long since I actually written a sentence in the Thesis. I need to end the Thesis. It will probably be a rage weekend but I'll get it out of my system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have a saying in Portugal when we want to emphasise when thing are getting really bad. It goes like this: "Vai de mal a Pior". In English it is something like "It goes from bad to worst". And believe me, that is how things are at work.&lt;br /&gt;&lt;br /&gt;There many things that contribute for this. The first thing is that the division is moving to something like 100Km away from its current location. When your workplace moves this distance you start to make some operations in your head: how more will you spend to get to work it terms of time and money; if you are willing to move to somewhere nearer; if things will get any better there and so on.&lt;br /&gt;&lt;br /&gt;With the change the company has decided to hire people that are willing to move to the new location or that already live in its surroundings. They have been doing this for over a year now. But this was a strategy that I didn't saw at first. Their goal is not to reduce the burden on the already overloaded workers that we are. Their goal is to get people in that will absorb the knowledge and tasks of those that don't see them moving to the new location. Recently this has gotten so visible that all the old people are seeing it.&lt;br /&gt;&lt;br /&gt;Don't get me wrong, this is a viable strategy on their part. It is a strategy that I don't agree with, but it is a viable strategy. But they have a flaw in its implementation. The oldest people are the most experienced ones and the ones that know the core parts of the system. To replace them you need at least people with almost the same level of experience in the technologies involved. Their flaw is that they are hiring the cheapest resources, people without any experience or basic training or knowledge needed to perform the task.&lt;br /&gt;&lt;br /&gt;What I see happening is that the projects won't meet the delivery dates. Why do I say this? Well, simple: the delivery dates are after the move. If the older workers leave the new ones will have to take care of business. The new ones will eventually get things done, but the time they will take to get things done will be greater and there goes the delivery date.&lt;br /&gt;&lt;br /&gt;You are probably thinking: "hey, get a grip, everybody is replaceable". Well, I agree with that sentence. It is true that everybody is replaceable. But it is also true that everybody is different and that there are people who are more creative and more experienced than others. What will happen is that something that those creative and experienced people would do in 2 months and that the client would live ends up being developed in 6 or more months and the client will hate it. It is a simple fact that the longer you work on a project and if you are a open minded person, you will get a deeper understanding of the users and their expectations. This is particularly true if you have real contact with the users and you see them using the product and explaining what they want. This is a type of knowledge that can be taught: it must be learnt by trial and error.&lt;br /&gt;&lt;br /&gt;On top off all this the group spirit that made me get out of the bed everyday is almost gone. We work to accomplish the dead-lines that are just around the corner, in a group were almost everybody is working without any motivation and some have their own personal agenda.&lt;br /&gt;&lt;br /&gt;I still don't know how I will proceed on this issue. Part of me wants to get out before I loose my mind. Part of me wants to say and grab the compensation for being dismissed. Part of me just wants to forget all about these issues, be professional, get the work done and don't let this get into my system. There is also a part of me that would love to get to work and say: "Bye, bye, I'm out of here", in a more lyrical way and in the faces of the bosses.&lt;br /&gt;&lt;br /&gt;For now it seems that I will simply train myself to get this out of my system. I'll try to live more my life so that work is just something I do to get paid and something that I'll always do to the best of my abilities.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Know What?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, with all these items on the back of my head I have to make some resolutions. I have to give priorities to things and try to enjoy life. I have wasted a lot of time thinking about this issues and just cruising through life like it was passing by me. So, I guess this is my New Year's Resolution: to live my life to its fullest.&lt;br /&gt;&lt;br /&gt;What's your resolution? &lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-5283863614365693556?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/5283863614365693556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=5283863614365693556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5283863614365693556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/5283863614365693556'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2007/01/making-life-changing-decisions.html' title='Making Life Changing Decisions'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-116197316678313493</id><published>2006-10-27T19:18:00.000+01:00</published><updated>2007-01-04T19:24:29.493Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Linux is Continuously Evolving!</title><content type='html'>&lt;p&gt;Today I decided to write about Linux and its evolution. You see, I &lt;i&gt;am&lt;/i&gt; a Linux user. Unfortunately at work there are some restrictions that translate into a single sentence: you can't use Linux. I don't know why, but that is life. At home and in my Thesis I only use Linux. Why? Well, because it is free, it is stable, it is fast and it is easy to use once you have it configured. In fact, lately it is even getting easier to configure it, but thats not the goal of this post.&lt;/p&gt;&lt;p&gt;I have laptop that is almost making 6?? Well, either 5 or 6 years old, I can't remember exactly when I bought it. Facts are that I installed Linux in it the very day I bought it. At the time I left the windows that came with it in a different partition, but something like 3 years ago I realised I didn't have any free disk space. You see, it came with a 20Gig hard drive. Windows had 5 and with all the digital photos, videos and projects was screaming for more disk space. So, 3 years ago I simply deleted the Windows partition.&lt;/p&gt;&lt;p&gt;Facts are that since I installed Linux on it I never needed to reinstall it. I'm using Gentoo and I installed version 1.4 and have been upgrading ever since without problems. It even survived an hard disk upgrade because 20Gig isn't sufficient for everything I want to keep on it. So I bought a 7200rpm 80Gig hard drive, copied everything over using tar, swapped disks and it was up and running.&lt;/p&gt;&lt;p&gt;Things I like: well, I'm surprised with Linux from time to time. My laptop is getting faster and I'm not counting the speed upgrade of the hard drive because that one was hardware related - by the way, I definitely recommend it since little things like start-up time were cut by half. Today I even have the beginnings of shadows and transparency effects in my desktop and the best thing is that when these effects go stable my 6 year old lappy will handle it with its GeForce2 Go.&lt;/p&gt;&lt;p&gt;Why the entry? Well, I usually don't work with the touchpad. Like many people I have an external USB mouse. But I knew that the touchpad had support from some advanced things like scrolling (if I drag at its right limit or bottom limit). Windows had this. When I installed Linux the driver was the Synaptics driver, but my touchpad was an Alps one. Today I decided to take it for a new spin and see if anyone had ever tried to make it work. Fact is: its working!!! Horizontal Scroll, Vertical Scroll, you name it. Thank you guys and keep up the good work. I'm already giving something back by submitting bugs, trying to reproduce bugs and help others configuring this, but when I finish the Thesis I'll start giving back code!!!&lt;/p&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-116197316678313493?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/116197316678313493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=116197316678313493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/116197316678313493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/116197316678313493'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2006/10/linux-is-continuously-evolving.html' title='Linux is Continuously Evolving!'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-116171271616661096</id><published>2006-10-24T18:49:00.000+01:00</published><updated>2007-01-04T19:25:36.236Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>What I wanted to do...</title><content type='html'>&lt;p&gt;Today I found blog that follows the lines of what I wanted to do. It contains many little hacks or tricks to make something that is way cool for the end user simple for the programmer. You can find it &lt;a href="http://jroller.com/page/santhosh"&gt;here&lt;/a&gt;. It also has a &lt;a href="https://myswing.dev.java.net/MyBlog/MySwingTree.html"&gt;nice tree index&lt;/a&gt; if you're looking for something specific.&lt;/p&gt;&lt;p&gt;This blog contains some of the things I would like to be doing, if I had the time. Well, in fact I have the time because the time I should be investing in my Thesis I don't. Why? Well, I would say lack of motivation or of writing something that should have been written a long time ago. Maybe I should just &lt;i&gt;swallow this frog&lt;/i&gt; and write it out of hanger... Yes, lets just do it!&lt;/p&gt;&lt;p&gt;In can you are wondering "&lt;i&gt;Swallow this frog&lt;/i&gt;" is an expression that Portuguese people use. When is it used? Well, when you're doing something you don't like but that you must. And since frogs are ugly and in Portugal they aren't part of a standard diet we call it &lt;i&gt;swallow a frog&lt;/i&gt;.&lt;/p&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-116171271616661096?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/116171271616661096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=116171271616661096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/116171271616661096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/116171271616661096'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2006/10/what-i-wanted-to-do.html' title='What I wanted to do...'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-116067682752433582</id><published>2006-10-12T19:13:00.000+01:00</published><updated>2007-01-04T19:25:15.141Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='thesis'/><title type='text'>My First Article is Getting Publish</title><content type='html'>&lt;p&gt;If I haven't told you before, I'm telling you now: I'm making a Master Thesis. This is a Master Thesis at the old Portuguese levels, that is, for the rest of the world it is like I'm making a second Master Thesis.&lt;/p&gt;&lt;p&gt;Well, names ans systems aside, I'm making a Master Thesis. As part of that Thesis I wrote a while back an article for a conference. Well, the article was accepted and I ended up presenting it in the conference.&lt;/p&gt;&lt;p&gt;I though the story ended there, but no. Today I received an email inviting me to have my article published in a technical magazine. Of course I said yes: it's something to put on my CV and a good compensation for the nights I lost writing it.&lt;/p&gt;&lt;p&gt;The crazy part is that GMail marked the message that contained the invitation as SPAM! I was lucky that my Thesis Adviser also received it and asked me if I was going to send it. I was completely in the dark. I'm not saying that GMail's SPAM marking is bad. In fact, this is the first time it failed and I would probably catch it in my usual SPAM scanning. I usually scan the titles of the messages and until now all off them had something about Viagra in it...&lt;/p&gt;&lt;p&gt;Well, I sent the article and I can't wait to by the magazine. I wonder if they will send me a sample?&lt;/p&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-116067682752433582?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/116067682752433582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=116067682752433582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/116067682752433582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/116067682752433582'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2006/10/my-first-article-is-getting-publish.html' title='My First Article is Getting Publish'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-116050205091530439</id><published>2006-10-10T18:24:00.000+01:00</published><updated>2007-01-04T19:24:56.069Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>About Life and its Purpose</title><content type='html'>&lt;p&gt;Today I had an enlightening experience that I think will change my life.&lt;/p&gt;&lt;p&gt;I usually start my day reading too many blogs from the web. These blogs range from technical articles and news, to jokes, movies, you name it: it's my "Inbox of the Web" - like someone from the Google Reader team said.&lt;/p&gt;&lt;p&gt;Everything was running as usual when I step upon a very long blog entry that I actually read. Why? Well, although the blog should be about Java, among other things, the entry was dedicated to a quadriplegic that had passed away. What captivated me in the log was the description of all the things that person had done after the skying accident that forced him to move in a wheel chair. He leaved is life to the fullest.&lt;/p&gt;&lt;p&gt;You might think: what the hell does it have to do we me? Well, that person actually programmed. How? Well, he used a stick in his mouth and typed one key after the other, very patiently. Although this shows the type of person he was, it wasn't this fact that caught my attention. What caught my attention is that he didn't let is condition stop him in any way from doing what he wanted.&lt;/p&gt;&lt;p&gt;Today I have many things that I would like to do. These things include making computer software, but I also want to do some crazy things. For instance: I think it was a couple of years ago that I bought a BTT (one of those all terrain bikes). A few weeks later I actually picked it up and went to a mountain and made an all terrain quest. I wasn't alone, but still we managed to get lost. It was prone to happen since we didn't had any map. This coupled with a bull (yes, a bull, like the mate of the cow) in the middle of the road and finishing following a paved road after descending for 4 kilometers of what used to be a road made the day unforgettable: it was an adventure.&lt;/p&gt;&lt;p&gt;I also want to go back and start swimming again, but I keep giving myself the excuse that I don't have time: I have to finish my Thesis. Facts are that even telling myself that I haven't been able to finish the Thesis either way.&lt;/p&gt;&lt;p&gt;And all this leads to what? Well, its time I take the example of someone and start taking control of my life. I can't let things affect me. If I'm unable to write the Thesis maybe its because I'm not swimming like my body is asking me to. In fact, even my mind sometimes asks me to.&lt;/p&gt;&lt;p&gt;With all that outside of my system I think its time to make some changes. Probably even making a change in my look. My parents have been crying for this one for quite some time, since I'm one of those that wants to feel comfortable in their close, no matter if they are old or if I used the same pair of pants the whole week.&lt;/p&gt;&lt;p&gt;Lets see what happens, if this is just a discharge of what I read today or if I actually change anything in my life. Either way, I'll starting writing about my life more often. It is a little strange to write about my life on the web, but it helps. And if this entry helps someone change their life also then better yet.&lt;/p&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-116050205091530439?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/116050205091530439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=116050205091530439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/116050205091530439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/116050205091530439'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2006/10/about-life-and-its-purpose.html' title='About Life and its Purpose'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34409529.post-115825244468079895</id><published>2006-09-14T17:47:00.000+01:00</published><updated>2007-01-04T19:26:20.072Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>The Beginning</title><content type='html'>&lt;p&gt;Today I decided to start a new blog. Why do I say a new blog? Because I used to have one bug I gave up on it. I was writing it anonymously and nobody knew who I was. I don't want to be famous, but at least I want a blog I can tell my friends: hey, that is mine!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;What will this blog be about?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Too many things. I intend to talk about almost everything, but the main theme is programming, computers and my work as a programmer.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;What can you expect from this blog?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;You can expect to see some programming articles, notes or hacks. You'll also find some thoughts on work ethics and the state of the world today.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;How often will it be updated?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;As often as I can, that is, when I have something that is worth writing I will write.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;So, tune in...&lt;/p&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34409529-115825244468079895?l=nuno-sousa-corner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nuno-sousa-corner.blogspot.com/feeds/115825244468079895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34409529&amp;postID=115825244468079895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/115825244468079895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34409529/posts/default/115825244468079895'/><link rel='alternate' type='text/html' href='http://nuno-sousa-corner.blogspot.com/2006/09/beginning.html' title='The Beginning'/><author><name>Nuno Sousa</name><uri>http://www.blogger.com/profile/12985958024778979830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='26' src='http://bp3.blogger.com/_cPXUCYbNnhA/SJRvPeGUsKI/AAAAAAAAAF8/zksdC1i3Rl4/S220/ChapIMG.png'/></author><thr:total>0</thr:total></entry></feed>
