<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;AkQDRXwyeSp7ImA9WxJVE0k.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578</id><updated>2009-06-30T10:52:54.291+03:00</updated><title>Paranoid Engineering</title><subtitle type="html">A humble blog about life and software development</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default?start-index=51&amp;max-results=50&amp;redirect=false&amp;v=2" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>50</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/ParanoidEngineering" type="application/atom+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">ParanoidEngineering</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CE8FRHk-fip7ImA9WxJWE00.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7449946928536751751</id><published>2009-06-17T22:14:00.001+03:00</published><updated>2009-06-18T08:26:55.756+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-18T08:26:55.756+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><category scheme="http://www.blogger.com/atom/ns#" term="multiunpacker" /><category scheme="http://www.blogger.com/atom/ns#" term="hawkscope" /><title>A tool for unpacking multiple archives and other ramblings</title><content type="html">I've always wondered why torrents are packed into multiple archives, sometimes even archives inside other archives. Anyway, I've got fed up with all the unpacking routines, especially after downloading several seasons of something that has each episode in an individual folder containing 20 rar or zip files. So, after one evening of coding this nightmare is now over.&lt;br /&gt;&lt;br /&gt;Here is the screenshot of the stupidly named tool (click to visit project page): &lt;br /&gt;&lt;a href="http://multiunpacker.googlecode.com"&gt;&lt;img src="http://lh5.ggpht.com/_nP8Aa6cTHpo/SjhtmDh0ZNI/AAAAAAAABnQ/YhPuOQIm8ag/mu1.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It was also a good reason to try out new version of &lt;a href="http://www.netbeans.org"&gt;NetBeans&lt;/a&gt;. I still &lt;a href="http://paranoid-engineering.blogspot.com/2009/02/screw-all-gui-builders.html"&gt;hate GUI builders&lt;/a&gt;, however for small "write and forget" kind of projects like &lt;a href="http://multiunpacker.googlecode.com"&gt;Multi Unpacker&lt;/a&gt; it's a fairly good choice. However NetBeans is still slow and unresponsive in comparison with &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So far Multi Unpacker is for Windows only, however it's a spare evening away from becoming cross-platform (and you are welcome to join the project). Too bad my MacBook broke down completely, so Macs will most probably not get any special treatment... This is also bad news for &lt;a href="http://hawkscope.googlecode.com"&gt;Hawkscope&lt;/a&gt;, unless someone is willing to donate me an old Mac? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7449946928536751751?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=HXj7OrVz47k:KK8eW_xWTOs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=HXj7OrVz47k:KK8eW_xWTOs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=HXj7OrVz47k:KK8eW_xWTOs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=HXj7OrVz47k:KK8eW_xWTOs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=HXj7OrVz47k:KK8eW_xWTOs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=HXj7OrVz47k:KK8eW_xWTOs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=HXj7OrVz47k:KK8eW_xWTOs:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/HXj7OrVz47k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7449946928536751751/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/06/tool-for-unpacking-multiple-archives.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7449946928536751751?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7449946928536751751?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/06/tool-for-unpacking-multiple-archives.html" title="A tool for unpacking multiple archives and other ramblings" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CkIBQ388fCp7ImA9WxJXGUo.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-2261219203303616143</id><published>2009-06-14T12:02:00.002+03:00</published><updated>2009-06-14T12:09:12.174+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-14T12:09:12.174+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="games" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><title>Things you can do in weekend</title><content type="html">You can take a trip to nature, you can visit your friends. You can also cowboy-code &lt;a href="http://www.varaneckas.com/projects/games/jeweled"&gt;a small game&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-2261219203303616143?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=lEayrIiEaFo:-NyiGTexTkw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=lEayrIiEaFo:-NyiGTexTkw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=lEayrIiEaFo:-NyiGTexTkw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=lEayrIiEaFo:-NyiGTexTkw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=lEayrIiEaFo:-NyiGTexTkw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=lEayrIiEaFo:-NyiGTexTkw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=lEayrIiEaFo:-NyiGTexTkw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/lEayrIiEaFo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/2261219203303616143/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/06/things-you-can-do-in-weekend.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2261219203303616143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2261219203303616143?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/06/things-you-can-do-in-weekend.html" title="Things you can do in weekend" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CEEGQno5eyp7ImA9WxJXFEk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7020190752896202431</id><published>2009-06-07T20:50:00.000+03:00</published><updated>2009-06-08T09:30:23.423+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-08T09:30:23.423+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="cheatsheet" /><title>Cheatsheet: Unicode characters for buttons and GUI elements</title><content type="html">Before drawing your own graphics for various GUI buttons, you could try finding a Unicode character that represents the thing you want to do. For instance, up/down arrows can be made with 25B2 (&amp;#x25B2;) and 25BC (&amp;#x25BC;).&lt;br /&gt;&lt;br /&gt;Here are some pictures with Unicode characters that you can use to build GUIs. First a quick guide to using these: &lt;br /&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SiypdWWK1uI/AAAAAAAABmI/5tbPUsNpQbA/s800/tutorial.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5344833179461801698" /&gt;&lt;br /&gt;&lt;br /&gt;Now, the cheatsheets:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SiyppQEwfuI/AAAAAAAABmQ/DmltPIUN45E/s800/dialogboxes.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5344833383936589538" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SiypyGUuCZI/AAAAAAAABmY/vd6GytOglaI/s800/dingbats.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5344833535938005394" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/Siyp6L9CcmI/AAAAAAAABmg/sTiE4yxf3No/s800/math.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5344833674888245858" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SiyqAe-EGwI/AAAAAAAABmo/I9aTeAZ9nAs/s800/puct-curr.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5344833783072037634" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SiyqfBWFHSI/AAAAAAAABmw/OejCzyrgyoM/s800/symarr.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5344834307695648034" /&gt;&lt;br /&gt;&lt;br /&gt;These were captured from a tool named &lt;a href="http://korais.sourceforge.net/"&gt;Korais&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can download these images in a single PDF file: &lt;a href="http://www.varaneckas.com/sites/default/files/unicode.gui.cheatsheet.pdf"&gt;unicode.gui.cheatsheet.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7020190752896202431?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=VHYQU-C98DU:NxrqXkN4EAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=VHYQU-C98DU:NxrqXkN4EAw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=VHYQU-C98DU:NxrqXkN4EAw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=VHYQU-C98DU:NxrqXkN4EAw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=VHYQU-C98DU:NxrqXkN4EAw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=VHYQU-C98DU:NxrqXkN4EAw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=VHYQU-C98DU:NxrqXkN4EAw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/VHYQU-C98DU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7020190752896202431/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/06/cheatsheet-unicode-characters-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7020190752896202431?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7020190752896202431?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/06/cheatsheet-unicode-characters-for.html" title="Cheatsheet: Unicode characters for buttons and GUI elements" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SiypdWWK1uI/AAAAAAAABmI/5tbPUsNpQbA/s72-c/tutorial.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkIERHgyfCp7ImA9WxJTGEg.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6128788630209482828</id><published>2009-04-27T21:21:00.006+03:00</published><updated>2009-04-27T21:55:05.694+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-27T21:55:05.694+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>Symbolic links in Windows</title><content type="html">Surprisingly, all the good Windows features are hidden, undocumented and hard to find. It took me nearly a decade to accidentally find out that Windows has symbolic links. They are called &lt;a href="http://en.wikipedia.org/wiki/NTFS_junction_point"&gt;NTFS Junction Points&lt;/a&gt;. However their support is limited to directory links, and the usage is a bit weird.&lt;br /&gt;&lt;br /&gt;Oh, and you have to install Windows Resource Kit to get the functionality. You can download it from any of these locations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9D467A69-57FF-4AE7-96EE-B18C4790CFFD&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=9D467A69-57FF-4AE7-96EE-B18C4790CFFD&amp;amp;displaylang=en&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.petri.co.il/download_windows_xp_reskit_tools.htm"&gt;http://www.petri.co.il/download_windows_xp_reskit_tools.htm&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The command you want is &lt;b&gt;linkd&lt;/b&gt;. Let's take it for a spin.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_nP8Aa6cTHpo/SfX4G7QSFlI/AAAAAAAABkM/Si5TvNdat_A/2.PNG"/&gt;&lt;br /&gt;&lt;br /&gt;The sandbox contains a directory named &lt;code&gt;original&lt;/code&gt; with &lt;code&gt;text.txt&lt;/code&gt; inside.&lt;br /&gt;&lt;br /&gt;To create a symbolic link named &lt;code&gt;symlinked&lt;/code&gt; that points to &lt;code&gt;original&lt;/code&gt;, the command is &lt;code&gt;linkd symlinked original&lt;/code&gt;. In POSIX it would be &lt;code&gt;ln -s original symlinked&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/SfX4G6tjGyI/AAAAAAAABkc/DBvwIb6J9mY/4.PNG"/&gt;&lt;br /&gt;&lt;br /&gt;When calling &lt;code&gt;dir&lt;/code&gt;, &lt;code&gt;symlinked&lt;/code&gt; shows as "junction". The other behavior is like a plain folder. In explorer you cannot tell the difference between the two.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_nP8Aa6cTHpo/SfX8ThZzq1I/AAAAAAAABk0/MUBD5aZn1eg/7.PNG"/&gt;&lt;br /&gt;&lt;br /&gt;To delete the symlink use &lt;code&gt;rmdir&lt;/code&gt;, because &lt;code&gt;del&lt;/code&gt; will attempt to remove the files from original directory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6128788630209482828?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Ti3_utBwIB0:V7PjkoF7lbw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Ti3_utBwIB0:V7PjkoF7lbw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=Ti3_utBwIB0:V7PjkoF7lbw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Ti3_utBwIB0:V7PjkoF7lbw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=Ti3_utBwIB0:V7PjkoF7lbw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Ti3_utBwIB0:V7PjkoF7lbw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Ti3_utBwIB0:V7PjkoF7lbw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/Ti3_utBwIB0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6128788630209482828/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/04/symbolic-links-in-windows.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6128788630209482828?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6128788630209482828?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/04/symbolic-links-in-windows.html" title="Symbolic links in Windows" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></entry><entry gd:etag="W/&quot;Dk4MSHkyfCp7ImA9WxJTEkk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7059060899627159531</id><published>2009-04-20T19:07:00.004+03:00</published><updated>2009-04-20T19:29:49.794+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-20T19:29:49.794+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle buys Sun</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SeyfLoyXELI/AAAAAAAABjM/HlzgImNEvaE/s1600-h/eclipse.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 331px;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SeyfLoyXELI/AAAAAAAABjM/HlzgImNEvaE/s400/eclipse.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5326807481548476594" /&gt;&lt;/a&gt;&lt;br /&gt;For a moment I thought this was a late April 1 joke, but obviously it's not. &lt;a href="http://www.guardian.co.uk/business/2009/apr/20/oracle-buys-sun-microsystems"&gt;Oracle is buying Sun&lt;/a&gt;. It should have been &lt;a href="http://www.nytimes.com/2009/04/03/technology/business-computing/03blue.html"&gt;IBM&lt;/a&gt;... The worst case of this impact is that Java is doomed to become an enterprise drone database integration language and MySQL is... Well... Simply F*cked.&lt;br /&gt;&lt;br /&gt;Hopefully Oracle will keep their hands away from core Java (SE) and the JVM, otherwise it will be time to change camps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7059060899627159531?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Eyf0H7_e4dc:UxbpOgBsEtA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Eyf0H7_e4dc:UxbpOgBsEtA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=Eyf0H7_e4dc:UxbpOgBsEtA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Eyf0H7_e4dc:UxbpOgBsEtA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=Eyf0H7_e4dc:UxbpOgBsEtA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Eyf0H7_e4dc:UxbpOgBsEtA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Eyf0H7_e4dc:UxbpOgBsEtA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/Eyf0H7_e4dc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7059060899627159531/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/04/oracle-buys-sun.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7059060899627159531?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7059060899627159531?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/04/oracle-buys-sun.html" title="Oracle buys Sun" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SeyfLoyXELI/AAAAAAAABjM/HlzgImNEvaE/s72-c/eclipse.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;CEMDQHszeCp7ImA9WxVUGU0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-1943069500513041670</id><published>2009-03-21T22:26:00.012+02:00</published><updated>2009-03-24T15:47:51.580+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T15:47:51.580+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="gmail4j" /><title>Gmail4J - Gmail API for Java</title><content type="html">&lt;a href="http://gmail4j.googlecode.com"&gt;&lt;img src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/ScVN8As7PjI/AAAAAAAABg8/BmM6a3LZQno/s400/gmail128.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315740628556660274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Seems that Google has &lt;a href="http://code.google.com/apis/gdata/faq.html#GmailAtomFeed"&gt;no Gmail API available&lt;/a&gt;, so I made a small Java library called &lt;a href="http://gmail4j.googlecode.com"&gt;Gmail4J&lt;/a&gt;. The library is designed to be extensible, allowing various implementations. Currently the only available implementation allows getting new unread messages from their &lt;a href="https://mail.google.com/mail/feed/atom/"&gt;RSS feed&lt;/a&gt;. That's not much, but it's a start. &lt;br /&gt;&lt;br /&gt;Here is the example code (updated to conform with Gmail4J 0.2):&lt;br /&gt;&lt;pre name="code" class="java"&gt;GmailClient client = new RssGmailClient();&lt;br /&gt;GmailConnection connection = new HttpGmailConnection("user", "pass".toCharArray());&lt;br /&gt;client.setConnection(connection);&lt;br /&gt;final List&amp;lt;GmailMessage&amp;gt; messages = client.getUnreadMessages();&lt;br /&gt;for (GmailMessage message : messages) {&lt;br /&gt;    System.out.println(message);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Next implementation will probably be based on &lt;a href="http://java.sun.com/products/javamail/"&gt;JavaMail&lt;/a&gt; IMAP functionality. It should be able to do more than getting unread messages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-1943069500513041670?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Uq1pVX67Djg:fRhU5_CMqso:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Uq1pVX67Djg:fRhU5_CMqso:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=Uq1pVX67Djg:fRhU5_CMqso:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Uq1pVX67Djg:fRhU5_CMqso:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=Uq1pVX67Djg:fRhU5_CMqso:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Uq1pVX67Djg:fRhU5_CMqso:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Uq1pVX67Djg:fRhU5_CMqso:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/Uq1pVX67Djg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/1943069500513041670/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/03/gmail4j-gmail-api-for-java.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1943069500513041670?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1943069500513041670?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/03/gmail4j-gmail-api-for-java.html" title="Gmail4J - Gmail API for Java" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nP8Aa6cTHpo/ScVN8As7PjI/AAAAAAAABg8/BmM6a3LZQno/s72-c/gmail128.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">13</thr:total></entry><entry gd:etag="W/&quot;CUYCQHY8cCp7ImA9WxVUEUk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-4888051849477932650</id><published>2009-03-15T20:44:00.004+02:00</published><updated>2009-03-15T20:52:41.878+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-15T20:52:41.878+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><title>JAD Java Decompiler download mirror</title><content type="html">As &lt;a href="http://www.kpdus.com"&gt;http://www.kpdus.com&lt;/a&gt; is no longer accessible, JAD Java Decompiler download is extremely hard to find. I've put up a mirror where you can get jad executable for Windows, Linux and Mac OS X: &lt;a href="http://www.varaneckas.com/jad"&gt;http://www.varaneckas.com/jad&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps those who are having a hard time finding a working JAD download.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-4888051849477932650?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=u2bz0dYMSpk:jGxi01C_9pE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=u2bz0dYMSpk:jGxi01C_9pE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=u2bz0dYMSpk:jGxi01C_9pE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=u2bz0dYMSpk:jGxi01C_9pE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=u2bz0dYMSpk:jGxi01C_9pE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=u2bz0dYMSpk:jGxi01C_9pE:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=u2bz0dYMSpk:jGxi01C_9pE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/u2bz0dYMSpk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/4888051849477932650/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/03/jad-java-decompiler-is-down.html#comment-form" title="19 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4888051849477932650?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4888051849477932650?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/03/jad-java-decompiler-is-down.html" title="JAD Java Decompiler download mirror" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">19</thr:total></entry><entry gd:etag="W/&quot;DUMFR38_cSp7ImA9WxVVEk8.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-773262922771753917</id><published>2009-03-05T06:06:00.009+02:00</published><updated>2009-03-05T06:30:16.149+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-05T06:30:16.149+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="life" /><title>My little anniversary</title><content type="html">It has been one year since I've quit smoking. Even though it's not my first attempt it's hopefully the last one. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/Sa9SAlROgnI/AAAAAAAABfg/hi9pYhS2RAg/s1600-h/cigarette_butt.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 285px; height: 380px;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/Sa9SAlROgnI/AAAAAAAABfg/hi9pYhS2RAg/s400/cigarette_butt.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5309552655650947698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I used to smoke up to 20-30 cigarettes a day, I used to have a constant cough all the time at all seasons, telling myself "that's just a little cold". Now  it's all gone. I feel great, I can run much longer distances than I could before, and of course, I save a nice piece of money on what I've used to spend. Meanwhile cigarette prices have increased, and they are about to increase again.&lt;br /&gt;&lt;br /&gt;This quitting was probably one of the most significant things I did for my own good. How did I do that? Very simple:&lt;ul&gt;&lt;li&gt;Cold turkey - quit right now, throw away all smoking attributes with no remorse.&lt;/li&gt;&lt;li&gt;Avoid the "I feel so sorry for my poor self" sessions.&lt;/li&gt;&lt;/ul&gt;The motivating factor was &lt;a href="http://www.amazon.com/Easy-Way-Stop-Smoking-Non-Smokers/dp/1402718616/?tag=paranoengine-20"&gt;this little book&lt;/a&gt;. It uplifted me and gave the needed strength to do it. &lt;br /&gt;&lt;br /&gt;Like in object oriented programming, it's better to have less dependencies on anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-773262922771753917?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=kyVeWQ3ycGw:3xeOYBkQo70:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=kyVeWQ3ycGw:3xeOYBkQo70:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=kyVeWQ3ycGw:3xeOYBkQo70:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=kyVeWQ3ycGw:3xeOYBkQo70:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=kyVeWQ3ycGw:3xeOYBkQo70:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=kyVeWQ3ycGw:3xeOYBkQo70:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=kyVeWQ3ycGw:3xeOYBkQo70:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/kyVeWQ3ycGw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/773262922771753917/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/03/my-little-anniversary.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/773262922771753917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/773262922771753917?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/03/my-little-anniversary.html" title="My little anniversary" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_nP8Aa6cTHpo/Sa9SAlROgnI/AAAAAAAABfg/hi9pYhS2RAg/s72-c/cigarette_butt.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;D08MQn05cCp7ImA9WxVWGUQ.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-5058624312377682797</id><published>2009-02-28T15:38:00.002+02:00</published><updated>2009-03-02T14:11:23.328+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-02T14:11:23.328+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="hawkscope" /><title>Hawkscope: Twitter plugin</title><content type="html">The new release of &lt;a href="http://hawkscope.googlecode.com"&gt;Hawkscope&lt;/a&gt; has a &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt; plugin. Here's how you can install and use it:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First, go to Hawkscope Settings&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/Sak5Ka7HqhI/AAAAAAAABcc/LUeItesCA8k/Picture%202.png" /&gt;&lt;br /&gt;&lt;br /&gt;Then go to Plugins tab and click Get Plugins&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/Sak5KS7DdRI/AAAAAAAABck/qG4BNkjwlxg/Picture%203.png" /&gt;&lt;br /&gt;&lt;br /&gt;Hawkscope Plugins page will open in your Browser, click on twitter-1.0.jar to download it&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_nP8Aa6cTHpo/Sak5KYuWYtI/AAAAAAAABcs/oovCslGkWr0/s720/Picture%204.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/Sak5KhYGYVI/AAAAAAAABc0/6S2WEtWdh1k/Picture%205.png" /&gt; &lt;br /&gt;&lt;br /&gt;Go to your download folder to find the plugin&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/Sak5Ksw4y7I/AAAAAAAABc8/aCvjJQvYSAA/Picture%206.png" /&gt;&lt;br /&gt;&lt;br /&gt;Then go back to Hawkscope Settings Plugins tab and click Open in Plugin Location &lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/Sak5KS7DdRI/AAAAAAAABck/qG4BNkjwlxg/Picture%203.png" /&gt;&lt;br /&gt;&lt;br /&gt;A new Finder (or another file navigator) window will open. You will have to drag and drop twitter-1.0.jar from your downloads to Hawkscope plugins folder &lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/Sak5Y6avviI/AAAAAAAABdM/dRFecBpQipI/s640/Picture%208.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/Sak5Yy_N4DI/AAAAAAAABdU/cJAyl86wv30/s640/Picture%209.png" /&gt;&lt;br /&gt;&lt;br /&gt;Then, in Hawkscope Settings Plugins tab click Reload Plugins. You should see Twitter plugin in Available Plugins list &lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/Sak5ZJBeQfI/AAAAAAAABdc/3MjxwSV7htc/Picture%2010.png" /&gt;&lt;br /&gt;&lt;br /&gt;Close Hawkscope Settings window (click OK). Then if you open Hawkscope menu you will see a sad Twitter item. It's sad because there is no configuration. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_nP8Aa6cTHpo/Sak5ZOoDkCI/AAAAAAAABdk/mt0wZ8yK-Yc/Picture%2011.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configuring&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Go to Settings again. Your settings now has a Twitter tab&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/Sak5l-vTMrI/AAAAAAAABdw/-oOatGtDyqM/Picture%2012.png" /&gt;&lt;br /&gt;&lt;br /&gt;Enter your Twitter username and password. You can choose what elements to display. I chose not to see my own tweets. Click OK to apply your settings.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/Sak5mBAIuBI/AAAAAAAABd4/xTNGqb0xy18/Picture%2013.png" /&gt;&lt;br /&gt;&lt;br /&gt;Your Twitter Hawkscope menu item is now enabled&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_nP8Aa6cTHpo/Sak5mW8s71I/AAAAAAAABeA/Nnt-zH5dXOk/Picture%2014.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Click Tweet! to add a new Twitter status message&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/Sak5mbJdj-I/AAAAAAAABeI/3prTjZC8W_Q/Picture%2015.png" /&gt;&lt;br /&gt;&lt;br /&gt;And you can also see more tweets or visit them in browser by clicking&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/Sak5mr4wtQI/AAAAAAAABeQ/tu-a7sMXkX8/s720/Picture%2016.png" /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy! And by the way, this plugin works on all operating systems that Hawkscope supports - Windows, Linux (Gnome) and Mac.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-5058624312377682797?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=-tPcxPS1aUc:4JPUMHpvoxQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=-tPcxPS1aUc:4JPUMHpvoxQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=-tPcxPS1aUc:4JPUMHpvoxQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=-tPcxPS1aUc:4JPUMHpvoxQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=-tPcxPS1aUc:4JPUMHpvoxQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=-tPcxPS1aUc:4JPUMHpvoxQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=-tPcxPS1aUc:4JPUMHpvoxQ:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/-tPcxPS1aUc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/5058624312377682797/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/02/hawkscope-twitter-plugin.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5058624312377682797?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5058624312377682797?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/02/hawkscope-twitter-plugin.html" title="Hawkscope: Twitter plugin" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUMBQnk7eip7ImA9WxVXFU8.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6589874961632081900</id><published>2009-02-13T13:05:00.008+02:00</published><updated>2009-02-13T14:17:33.702+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-13T14:17:33.702+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><title>Screw all GUI builders</title><content type="html">Are you making your &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI&lt;/a&gt; with a builder? Do you like the generated code you get? I hate it. Even though I like the idea of building GUI with visual means (&lt;a href="http://en.wikipedia.org/wiki/WYSIWYG"&gt;WYSIWYG&lt;/a&gt;), I can't stand the mess that code generators produce. In addition to that, there are more serious downsides:&lt;ul&gt;&lt;li&gt;You don't know how exactly the generated code works. You don't need to. You start not to care and GUI application development becomes a process of drawing and adding simple event handlers here and there.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Most GUI builders force you to use single class for single window, so generated classes tend to have thousands of lines of code.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Most GUI builders don't want you to modify the generated code. And if you do, they either break or rewrite your code.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GUI builders force you to use an IDE, mostly one you started coding with. So if you start with NetBeans, you most likely be forced to stay with it for the whole project.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The generated code is far from being optimal. It's not resize-friendly, not dynamic enough, it has many hard-coded values, refactoring is most likely impossible, because builder would not allow that.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So, why are you using GUI builders? Is it because you're doing GUI apps during your day job, you need fast results and you don't want to learn more than you have to? Or you just have no choice? That's reasonable, but when you have a choice, consider learning how &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/swing/"&gt;Swing&lt;/a&gt; or &lt;a href="http://www.eclipse.org/swt"&gt;SWT&lt;/a&gt; works, spend some time reading the API docs and examining the code - it's amazing how fast and dynamic your GUI building process can get when you finally get a clear understanding HOW to use all the widgets and layouts. Let me show you. Here's a window from &lt;a href="http://hawkscope.googlecode.com"&gt;Hawkscope&lt;/a&gt; app that I'm making in my spare time. It was generated with &lt;a href="http://www.cloudgarden.com/jigloo/"&gt;Jigloo&lt;/a&gt; GUI builder in Eclipse. First let's see how it looks:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/SZVfSTp7IUI/AAAAAAAABNE/aQGpXb_9a54/about.png"/&gt;&lt;br /&gt;&lt;br /&gt;The code (all comments removed):&lt;br /&gt;&lt;pre name="code" class="java"&gt;package com.varaneckas.hawkscope.gui;&lt;br /&gt;&lt;br /&gt;import org.eclipse.swt.SWT;&lt;br /&gt;import org.eclipse.swt.events.MouseAdapter;&lt;br /&gt;import org.eclipse.swt.events.MouseEvent;&lt;br /&gt;import org.eclipse.swt.events.PaintEvent;&lt;br /&gt;import org.eclipse.swt.events.PaintListener;&lt;br /&gt;import org.eclipse.swt.events.SelectionAdapter;&lt;br /&gt;import org.eclipse.swt.events.SelectionEvent;&lt;br /&gt;import org.eclipse.swt.graphics.Color;&lt;br /&gt;import org.eclipse.swt.graphics.Cursor;&lt;br /&gt;import org.eclipse.swt.layout.FormAttachment;&lt;br /&gt;import org.eclipse.swt.layout.FormData;&lt;br /&gt;import org.eclipse.swt.layout.FormLayout;&lt;br /&gt;import org.eclipse.swt.program.Program;&lt;br /&gt;import org.eclipse.swt.widgets.Button;&lt;br /&gt;import org.eclipse.swt.widgets.Canvas;&lt;br /&gt;import org.eclipse.swt.widgets.Display;&lt;br /&gt;import org.eclipse.swt.widgets.Label;&lt;br /&gt;import org.eclipse.swt.widgets.Shell;&lt;br /&gt;import org.eclipse.swt.widgets.Text;&lt;br /&gt;&lt;br /&gt;import com.cloudgarden.resource.SWTResourceManager;&lt;br /&gt;import com.varaneckas.hawkscope.Version;&lt;br /&gt;import com.varaneckas.hawkscope.cfg.ConfigurationFactory;&lt;br /&gt;import com.varaneckas.hawkscope.util.IOUtils;&lt;br /&gt;import com.varaneckas.hawkscope.util.IconFactory;&lt;br /&gt;import com.varaneckas.hawkscope.util.OSUtils;&lt;br /&gt;&lt;br /&gt;public class AboutWindow extends org.eclipse.swt.widgets.Dialog {&lt;br /&gt;    &lt;br /&gt;    private Shell dialogShell;&lt;br /&gt;    private Canvas logoCanvas;&lt;br /&gt;    private Label appNameLabel;&lt;br /&gt;    private Label appSloganLabel;&lt;br /&gt;    private Label appVersion;&lt;br /&gt;    private Label appHomepageValue;&lt;br /&gt;    private Button copyReportButton;&lt;br /&gt;    private Button closeButton;&lt;br /&gt;    private Label environmentLabel;&lt;br /&gt;    private Text environmentTextArea;&lt;br /&gt;    private Label appHomepageLabel;&lt;br /&gt;    private Label appReleasedValue;&lt;br /&gt;    private Label appReleasedLabel;&lt;br /&gt;    private Label appVersionValue;&lt;br /&gt;&lt;br /&gt;    public AboutWindow(final Shell parent, final int style) {&lt;br /&gt;        super(parent, style);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public synchronized void open() {&lt;br /&gt;        if (dialogShell != null &amp;&amp; !dialogShell.isDisposed()) {&lt;br /&gt;            dialogShell.setVisible(true);&lt;br /&gt;            dialogShell.forceFocus();&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;        final Shell parent = getParent();&lt;br /&gt;        dialogShell = new Shell(parent, SWT.DIALOG_TRIM &lt;br /&gt;                | SWT.APPLICATION_MODAL);&lt;br /&gt;        {&lt;br /&gt;            SWTResourceManager.registerResourceUser(dialogShell);&lt;br /&gt;        }&lt;br /&gt;        dialogShell.setImage(IconFactory.getInstance()&lt;br /&gt;                .getUncachedIcon("hawkscope16.png"));&lt;br /&gt;        dialogShell.setText("About");&lt;br /&gt;        &lt;br /&gt;        dialogShell.setLayout(new FormLayout());&lt;br /&gt;        dialogShell.layout();&lt;br /&gt;        dialogShell.pack();            &lt;br /&gt;        dialogShell.setSize(516, 322);&lt;br /&gt;        {&lt;br /&gt;            copyReportButton = new Button(dialogShell, SWT.PUSH | SWT.CENTER);&lt;br /&gt;            FormData copyReportButtonLData = new FormData();&lt;br /&gt;            copyReportButtonLData.width = 125;&lt;br /&gt;            copyReportButtonLData.height = 29;&lt;br /&gt;            copyReportButtonLData.left =  new FormAttachment(0, 1000, 314);&lt;br /&gt;            copyReportButtonLData.top =  new FormAttachment(0, 1000, 252);&lt;br /&gt;            copyReportButton.setLayoutData(copyReportButtonLData);&lt;br /&gt;            copyReportButton.addSelectionListener(new SelectionAdapter() {&lt;br /&gt;               @Override&lt;br /&gt;               public void widgetSelected(SelectionEvent event) {&lt;br /&gt;                   IOUtils.copyToClipboard(Version.getEnvironmentReport());&lt;br /&gt;               } &lt;br /&gt;            });&lt;br /&gt;            copyReportButton.setText("Co&amp;py to Clipboard");&lt;br /&gt;            OSUtils.adjustButton(copyReportButton);&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            closeButton = new Button(dialogShell, SWT.PUSH | SWT.CENTER);&lt;br /&gt;            FormData closeButtonLData = new FormData();&lt;br /&gt;            closeButtonLData.width = 47;&lt;br /&gt;            closeButtonLData.height = 29;&lt;br /&gt;            closeButtonLData.left =  new FormAttachment(0, 1000, 451);&lt;br /&gt;            closeButtonLData.top =  new FormAttachment(0, 1000, 252);&lt;br /&gt;            closeButton.setLayoutData(closeButtonLData);&lt;br /&gt;            closeButton.addSelectionListener(new SelectionAdapter() {&lt;br /&gt;               @Override&lt;br /&gt;                public void widgetSelected(SelectionEvent event) {&lt;br /&gt;                   dialogShell.dispose();&lt;br /&gt;                } &lt;br /&gt;            });&lt;br /&gt;            closeButton.setText("&amp;Close");&lt;br /&gt;            OSUtils.adjustButton(closeButton);&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            environmentLabel = new Label(dialogShell, SWT.NONE);&lt;br /&gt;            FormData environmentLabelLData = new FormData();&lt;br /&gt;            environmentLabelLData.width = 486;&lt;br /&gt;            environmentLabelLData.height = 17;&lt;br /&gt;            environmentLabelLData.left =  new FormAttachment(0, 1000, 12);&lt;br /&gt;            environmentLabelLData.top =  new FormAttachment(0, 1000, 127);&lt;br /&gt;            environmentLabel.setLayoutData(environmentLabelLData);&lt;br /&gt;            environmentLabel.setText("Environment");&lt;br /&gt;            environmentLabel.setFont(SWTResourceManager.getFont("Sans", 10, 1));&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            environmentTextArea = new Text(dialogShell, SWT.MULTI | SWT.WRAP &lt;br /&gt;                    | SWT.V_SCROLL | SWT.BORDER);&lt;br /&gt;            FormData environmentTextAreaLData = new FormData();&lt;br /&gt;            environmentTextAreaLData.width = 468;&lt;br /&gt;            environmentTextAreaLData.height = 90;&lt;br /&gt;            environmentTextAreaLData.left =  new FormAttachment(0, 1000, 12);&lt;br /&gt;            environmentTextAreaLData.top =  new FormAttachment(0, 1000, 150);&lt;br /&gt;            environmentTextArea.setLayoutData(environmentTextAreaLData);&lt;br /&gt;            environmentTextArea.setText(Version.getSystemProperties());&lt;br /&gt;            environmentTextArea.setEditable(false);&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            appHomepageValue = new Label(dialogShell, SWT.NONE);&lt;br /&gt;            appHomepageValue.addMouseListener(new MouseAdapter() {&lt;br /&gt;                @Override&lt;br /&gt;                public void mouseUp(MouseEvent event) {&lt;br /&gt;                    Program.launch(Version.HOMEPAGE);&lt;br /&gt;                } &lt;br /&gt;            });&lt;br /&gt;            appHomepageValue.setCursor(new Cursor(dialogShell.getDisplay(), &lt;br /&gt;                    SWT.CURSOR_HAND));&lt;br /&gt;            appHomepageValue.setForeground(&lt;br /&gt;                    new Color(dialogShell.getDisplay(), 0, 0, 255));&lt;br /&gt;            FormData appHomepageValueLData = new FormData();&lt;br /&gt;            appHomepageValueLData.width = 242;&lt;br /&gt;            appHomepageValueLData.height = 17;&lt;br /&gt;            appHomepageValueLData.left =  new FormAttachment(0, 1000, 256);&lt;br /&gt;            appHomepageValueLData.top =  new FormAttachment(0, 1000, 104);&lt;br /&gt;            appHomepageValue.setLayoutData(appHomepageValueLData);&lt;br /&gt;            appHomepageValue.setToolTipText("Click to open in browser");&lt;br /&gt;            appHomepageValue.setText(Version.HOMEPAGE);&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            appHomepageLabel = new Label(dialogShell, SWT.NONE);&lt;br /&gt;            FormData appHomepageLabelLData = new FormData();&lt;br /&gt;            appHomepageLabelLData.width = 94;&lt;br /&gt;            appHomepageLabelLData.height = 17;&lt;br /&gt;            appHomepageLabelLData.left =  new FormAttachment(0, 1000, 156);&lt;br /&gt;            appHomepageLabelLData.top =  new FormAttachment(0, 1000, 104);&lt;br /&gt;            appHomepageLabel.setLayoutData(appHomepageLabelLData);&lt;br /&gt;            appHomepageLabel.setText("Homepage:");&lt;br /&gt;            appHomepageLabel.setFont(SWTResourceManager.getFont("Sans", 10, 1));&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            appReleasedValue = new Label(dialogShell, SWT.NONE);&lt;br /&gt;            FormData appReleasedValueLData = new FormData();&lt;br /&gt;            appReleasedValueLData.width = 242;&lt;br /&gt;            appReleasedValueLData.height = 17;&lt;br /&gt;            appReleasedValueLData.left =  new FormAttachment(0, 1000, 256);&lt;br /&gt;            appReleasedValueLData.top =  new FormAttachment(0, 1000, 81);&lt;br /&gt;            appReleasedValue.setLayoutData(appReleasedValueLData);&lt;br /&gt;            appReleasedValue.setText(Version.VERSION_DATE);&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            appReleasedLabel = new Label(dialogShell, SWT.NONE);&lt;br /&gt;            FormData appReleasedLabelLData = new FormData();&lt;br /&gt;            appReleasedLabelLData.width = 77;&lt;br /&gt;            appReleasedLabelLData.height = 17;&lt;br /&gt;            appReleasedLabelLData.left =  new FormAttachment(0, 1000, 156);&lt;br /&gt;            appReleasedLabelLData.top =  new FormAttachment(0, 1000, 81);&lt;br /&gt;            appReleasedLabel.setLayoutData(appReleasedLabelLData);&lt;br /&gt;            appReleasedLabel.setText("Released:");&lt;br /&gt;            appReleasedLabel.setFont(SWTResourceManager.getFont("Sans", 10, 1));&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            appVersionValue = new Label(dialogShell, SWT.NONE);&lt;br /&gt;            FormData appVersionValueLData = new FormData();&lt;br /&gt;            appVersionValueLData.width = 242;&lt;br /&gt;            appVersionValueLData.height = 17;&lt;br /&gt;            appVersionValueLData.left =  new FormAttachment(0, 1000, 256);&lt;br /&gt;            appVersionValueLData.top =  new FormAttachment(0, 1000, 58);&lt;br /&gt;            appVersionValue.setLayoutData(appVersionValueLData);&lt;br /&gt;            if (Version.isUpdateAvailable() == null) {&lt;br /&gt;             appVersionValue.setText(Version.VERSION_NUMBER);&lt;br /&gt;             if (ConfigurationFactory.getConfigurationFactory()&lt;br /&gt;               .getConfiguration().checkForUpdates()) {&lt;br /&gt;              appVersionValue.setToolTipText("Could not get version information.");&lt;br /&gt;             }&lt;br /&gt;            } else {&lt;br /&gt;             if (Version.isUpdateAvailable()) {&lt;br /&gt;                    appVersionValue.setForeground(new Color(dialogShell&lt;br /&gt;                            .getDisplay(), 255, 0, 0));&lt;br /&gt;                    appVersionValue.setText(Version.VERSION_NUMBER &lt;br /&gt;                            + " (Update Available!)");&lt;br /&gt;                    appVersionValue.setToolTipText("Click to go to update " +&lt;br /&gt;                      "download page");&lt;br /&gt;                    appVersionValue.setCursor(new Cursor(dialogShell&lt;br /&gt;                            .getDisplay(), SWT.CURSOR_HAND));&lt;br /&gt;                    appVersionValue.addMouseListener(new MouseAdapter() {&lt;br /&gt;                       @Override&lt;br /&gt;                        public void mouseUp(MouseEvent event) {&lt;br /&gt;                           Program.launch(Version.DOWNLOAD_URL);&lt;br /&gt;                           dialogShell.dispose();&lt;br /&gt;                        } &lt;br /&gt;                    });&lt;br /&gt;                } else {&lt;br /&gt;                    appVersionValue.setText(Version.VERSION_NUMBER);&lt;br /&gt;                    appVersionValue.setToolTipText("Latest available version!");&lt;br /&gt;                    appVersionValue.setForeground(new Color(dialogShell&lt;br /&gt;                            .getDisplay(), 0, 128, 0));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            appVersion = new Label(dialogShell, SWT.NONE);&lt;br /&gt;            FormData appVersionLData = new FormData();&lt;br /&gt;            appVersionLData.width = 77;&lt;br /&gt;            appVersionLData.height = 17;&lt;br /&gt;            appVersionLData.left =  new FormAttachment(0, 1000, 156);&lt;br /&gt;            appVersionLData.top =  new FormAttachment(0, 1000, 58);&lt;br /&gt;            appVersion.setLayoutData(appVersionLData);&lt;br /&gt;            appVersion.setText("Version:");&lt;br /&gt;            appVersion.setFont(SWTResourceManager.getFont("Sans", 10, 1));&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            appSloganLabel = new Label(dialogShell, SWT.WRAP);&lt;br /&gt;            FormData appSloganLabelLData = new FormData();&lt;br /&gt;            appSloganLabelLData.width = 342;&lt;br /&gt;            appSloganLabelLData.height = 17;&lt;br /&gt;            appSloganLabelLData.left =  new FormAttachment(0, 1000, 156);&lt;br /&gt;            appSloganLabelLData.top =  new FormAttachment(0, 1000, 35);&lt;br /&gt;            appSloganLabel.setLayoutData(appSloganLabelLData);&lt;br /&gt;            appSloganLabel.setText(Version.APP_SLOGAN);&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            appNameLabel = new Label(dialogShell, SWT.NONE);&lt;br /&gt;            FormData appNameLabelLData = new FormData();&lt;br /&gt;            appNameLabelLData.width = 342;&lt;br /&gt;            appNameLabelLData.height = 17;&lt;br /&gt;            appNameLabelLData.left =  new FormAttachment(0, 1000, 156);&lt;br /&gt;            appNameLabelLData.top =  new FormAttachment(0, 1000, 12);&lt;br /&gt;            appNameLabel.setLayoutData(appNameLabelLData);&lt;br /&gt;            appNameLabel.setText("Hawkscope");&lt;br /&gt;            appNameLabel.setFont(SWTResourceManager.getFont("Sans", 10, 1));&lt;br /&gt;        }&lt;br /&gt;        {&lt;br /&gt;            final FormData logoCanvasLData = new FormData();&lt;br /&gt;            logoCanvasLData.width = 114;&lt;br /&gt;            logoCanvasLData.height = 109;&lt;br /&gt;            logoCanvasLData.left =  new FormAttachment(0, 1000, 12);&lt;br /&gt;            logoCanvasLData.top =  new FormAttachment(0, 1000, 12);&lt;br /&gt;            logoCanvas = new Canvas(dialogShell, SWT.RESIZE);&lt;br /&gt;            logoCanvas.addPaintListener(new PaintListener() {&lt;br /&gt;                public void paintControl(PaintEvent e) {&lt;br /&gt;                    e.gc.drawImage(IconFactory.getInstance()&lt;br /&gt;                            .getUncachedIcon("hawkscope128.png"), 0, 0, 128, &lt;br /&gt;                            128, 0, 0, 114, 109);&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;            logoCanvas.addMouseListener(new MouseAdapter() {&lt;br /&gt;                @Override&lt;br /&gt;                public void mouseUp(MouseEvent event) {&lt;br /&gt;                    Program.launch(Version.HOMEPAGE);&lt;br /&gt;                } &lt;br /&gt;            });&lt;br /&gt;            logoCanvas.setCursor(new Cursor(dialogShell.getDisplay(), &lt;br /&gt;                    SWT.CURSOR_HAND));&lt;br /&gt;            logoCanvas.setToolTipText("Click to visit Homepage");&lt;br /&gt;            logoCanvas.setLayoutData(logoCanvasLData);&lt;br /&gt;        }&lt;br /&gt;        dialogShell.setLocation(getParent().toDisplay(100, 100));&lt;br /&gt;        dialogShell.open();&lt;br /&gt;        Display display = dialogShell.getDisplay();&lt;br /&gt;        while (!dialogShell.isDisposed()) {&lt;br /&gt;            if (!display.readAndDispatch())&lt;br /&gt;                display.sleep();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, a hand-rewritten version with no GUI builder:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_nP8Aa6cTHpo/SZVgdacWLhI/AAAAAAAABNM/2i4IPdcVaL4/about2.png"/&gt;&lt;br /&gt;&lt;br /&gt;The code:&lt;br /&gt;&lt;pre name="code" class="java"&gt;package com.varaneckas.hawkscope.gui;&lt;br /&gt;&lt;br /&gt;import org.eclipse.swt.SWT;&lt;br /&gt;import org.eclipse.swt.events.MouseAdapter;&lt;br /&gt;import org.eclipse.swt.events.MouseEvent;&lt;br /&gt;import org.eclipse.swt.events.PaintEvent;&lt;br /&gt;import org.eclipse.swt.events.PaintListener;&lt;br /&gt;import org.eclipse.swt.events.SelectionAdapter;&lt;br /&gt;import org.eclipse.swt.events.SelectionEvent;&lt;br /&gt;import org.eclipse.swt.graphics.Color;&lt;br /&gt;import org.eclipse.swt.graphics.Cursor;&lt;br /&gt;import org.eclipse.swt.graphics.Font;&lt;br /&gt;import org.eclipse.swt.graphics.FontData;&lt;br /&gt;import org.eclipse.swt.layout.FormAttachment;&lt;br /&gt;import org.eclipse.swt.layout.FormData;&lt;br /&gt;import org.eclipse.swt.layout.FormLayout;&lt;br /&gt;import org.eclipse.swt.program.Program;&lt;br /&gt;import org.eclipse.swt.widgets.Button;&lt;br /&gt;import org.eclipse.swt.widgets.Canvas;&lt;br /&gt;import org.eclipse.swt.widgets.Control;&lt;br /&gt;import org.eclipse.swt.widgets.Label;&lt;br /&gt;import org.eclipse.swt.widgets.Shell;&lt;br /&gt;import org.eclipse.swt.widgets.Text;&lt;br /&gt;&lt;br /&gt;import com.varaneckas.hawkscope.Version;&lt;br /&gt;import com.varaneckas.hawkscope.cfg.ConfigurationFactory;&lt;br /&gt;import com.varaneckas.hawkscope.tray.TrayManager;&lt;br /&gt;import com.varaneckas.hawkscope.util.IOUtils;&lt;br /&gt;import com.varaneckas.hawkscope.util.IconFactory;&lt;br /&gt;&lt;br /&gt;public class AboutShell {&lt;br /&gt;    &lt;br /&gt;    private Shell shell;&lt;br /&gt;    private FormData layout;&lt;br /&gt;    private Font bold;&lt;br /&gt;    private Color red;&lt;br /&gt;    private Color green;&lt;br /&gt;    private Color blue;&lt;br /&gt;    private Cursor hand;&lt;br /&gt;    private Canvas logo;&lt;br /&gt;    private Label labelAppName;&lt;br /&gt;    private Label labelAppSlogan;&lt;br /&gt;    private Label labelVersion;&lt;br /&gt;    private Label labelReleased;&lt;br /&gt;    private Label labelHomePage;&lt;br /&gt;    private Label labelAppVersion;&lt;br /&gt;    private Label labelAppReleased;&lt;br /&gt;    private Label labelAppHomePage;&lt;br /&gt;    private Label labelEnvironment;&lt;br /&gt;    private Text textEnvironment;&lt;br /&gt;    private Button buttonCopyToClipboard;&lt;br /&gt;    private Button buttonClose;&lt;br /&gt;    &lt;br /&gt;    public void open() {&lt;br /&gt;        if (shell != null &amp;&amp; !shell.isDisposed()) {&lt;br /&gt;            shell.setVisible(true);&lt;br /&gt;            shell.forceFocus();&lt;br /&gt;            return;&lt;br /&gt;        }       &lt;br /&gt;        createShell();&lt;br /&gt;        createResources();&lt;br /&gt;        createLogo();&lt;br /&gt;        createLabelAppName();&lt;br /&gt;        createLabelAppSlogan();&lt;br /&gt;        createLabelVersion();&lt;br /&gt;        createLabelReleased();&lt;br /&gt;        createLabelHomePage();&lt;br /&gt;        createLabelAppVersion();&lt;br /&gt;        createLabelAppReleased();&lt;br /&gt;        createLabelAppHomePage();&lt;br /&gt;        createLabelEnvironment();&lt;br /&gt;        createButtonClose();&lt;br /&gt;        createButtonCopyToClipboard();&lt;br /&gt;        createTextEnvironment();&lt;br /&gt;        shell.pack();&lt;br /&gt;        shell.open();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createResources() {&lt;br /&gt;        final FontData data = new FontData();&lt;br /&gt;        data.setHeight(10);&lt;br /&gt;        data.setStyle(SWT.BOLD);&lt;br /&gt;        bold = new Font(shell.getDisplay(), data);&lt;br /&gt;        red = new Color(shell.getDisplay(), 255, 0, 0);&lt;br /&gt;        green = new Color(shell.getDisplay(), 0, 128, 0);&lt;br /&gt;        blue = new Color(shell.getDisplay(), 0, 0, 255);&lt;br /&gt;        hand = new Cursor(shell.getDisplay(), SWT.CURSOR_HAND);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createShell() {&lt;br /&gt;        shell = new Shell(TrayManager.getInstance().getShell(), SWT.SHELL_TRIM);&lt;br /&gt;        final FormLayout layout = new FormLayout();&lt;br /&gt;        layout.spacing = 6;&lt;br /&gt;        layout.marginHeight = 12;&lt;br /&gt;        layout.marginWidth = 12;&lt;br /&gt;        shell.setLocation(shell.getParent().toDisplay(100, 100));&lt;br /&gt;        shell.setImage(IconFactory.getInstance()&lt;br /&gt;                .getUncachedIcon("hawkscope16.png"));&lt;br /&gt;        shell.setText("About");&lt;br /&gt;        shell.setLayout(layout);&lt;br /&gt;        shell.layout();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private FormData relativeTo(final Control top, final Control left) {&lt;br /&gt;        layout = new FormData();&lt;br /&gt;        layout.top = new FormAttachment(top);&lt;br /&gt;        layout.left = new FormAttachment(left);&lt;br /&gt;        return layout;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private FormData relativeToBottomRight(final Control right) {&lt;br /&gt;        layout = new FormData();&lt;br /&gt;        layout.bottom = new FormAttachment(100, 0);&lt;br /&gt;        if (right == null) {&lt;br /&gt;            layout.right = new FormAttachment(100, 0);&lt;br /&gt;        } else {&lt;br /&gt;            layout.right = new FormAttachment(right);&lt;br /&gt;        }&lt;br /&gt;        return layout;&lt;br /&gt;    }    &lt;br /&gt;    &lt;br /&gt;    private void createLogo() {&lt;br /&gt;        logo = new Canvas(shell, SWT.NONE);&lt;br /&gt;        logo.addPaintListener(new PaintListener() {&lt;br /&gt;            public void paintControl(PaintEvent e) {&lt;br /&gt;                e.gc.drawImage(IconFactory.getInstance()&lt;br /&gt;                        .getUncachedIcon("hawkscope128.png"), 0, 0);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;        logo.addMouseListener(new MouseAdapter() {&lt;br /&gt;            @Override&lt;br /&gt;            public void mouseUp(MouseEvent event) {&lt;br /&gt;                Program.launch(Version.HOMEPAGE);&lt;br /&gt;            } &lt;br /&gt;        });&lt;br /&gt;        logo.setCursor(hand);&lt;br /&gt;        logo.setToolTipText("Click to visit Homepage");&lt;br /&gt;        layout = relativeTo(null, null);&lt;br /&gt;        layout.width = 128;&lt;br /&gt;        layout.height = 128;&lt;br /&gt;        logo.setLayoutData(layout);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createLabelAppName() {&lt;br /&gt;        labelAppName = new Label(shell, SWT.NONE);&lt;br /&gt;        labelAppName.setText(Version.APP_NAME);&lt;br /&gt;        labelAppName.setLayoutData(relativeTo(null, logo));&lt;br /&gt;        labelAppName.setFont(bold);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createLabelAppSlogan() {&lt;br /&gt;        labelAppSlogan = new Label(shell, SWT.NONE);&lt;br /&gt;        labelAppSlogan.setLayoutData(relativeTo(labelAppName, logo));&lt;br /&gt;        labelAppSlogan.setText(Version.APP_SLOGAN);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createLabelVersion() {&lt;br /&gt;        labelVersion = new Label(shell, SWT.NONE);&lt;br /&gt;        labelVersion.setText("Version:");&lt;br /&gt;        labelVersion.setFont(bold);&lt;br /&gt;        labelVersion.setLayoutData(relativeTo(labelAppSlogan, logo));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createLabelAppVersion() {&lt;br /&gt;        labelAppVersion = new Label(shell, SWT.NONE);&lt;br /&gt;        labelAppVersion.setText(Version.VERSION_NUMBER);&lt;br /&gt;        labelAppVersion.setLayoutData(relativeTo(labelAppSlogan, labelHomePage));&lt;br /&gt;        updateLabelAppVersion();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void updateLabelAppVersion() {&lt;br /&gt;        if (Version.isUpdateAvailable() == null) {&lt;br /&gt;            if (ConfigurationFactory.getConfigurationFactory()&lt;br /&gt;                    .getConfiguration().checkForUpdates()) {&lt;br /&gt;                labelAppVersion.setToolTipText("Could not get version information.");&lt;br /&gt;            }&lt;br /&gt;        } else {&lt;br /&gt;            if (Version.isUpdateAvailable()) {&lt;br /&gt;                labelAppVersion.setForeground(red);&lt;br /&gt;                labelAppVersion.setText(Version.VERSION_NUMBER &lt;br /&gt;                        + " (Update Available!)");&lt;br /&gt;                labelAppVersion.setToolTipText("Click to go to update " +&lt;br /&gt;                        "download page");&lt;br /&gt;                labelAppVersion.setCursor(hand);&lt;br /&gt;                labelAppVersion.addMouseListener(new MouseAdapter() {&lt;br /&gt;                   @Override&lt;br /&gt;                    public void mouseUp(final MouseEvent event) {&lt;br /&gt;                       Program.launch(Version.DOWNLOAD_URL);&lt;br /&gt;                       shell.dispose();&lt;br /&gt;                    } &lt;br /&gt;                });&lt;br /&gt;            } else {&lt;br /&gt;                labelAppVersion.setText(Version.VERSION_NUMBER);&lt;br /&gt;                labelAppVersion.setToolTipText("Latest available version!");&lt;br /&gt;                labelAppVersion.setForeground(green);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createLabelReleased() {&lt;br /&gt;        labelReleased = new Label(shell, SWT.NONE); &lt;br /&gt;        labelReleased.setText("Released:");&lt;br /&gt;        labelReleased.setFont(bold);&lt;br /&gt;        labelReleased.setLayoutData(relativeTo(labelVersion, logo));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createLabelAppReleased() {&lt;br /&gt;        labelAppReleased = new Label(shell, SWT.NONE);&lt;br /&gt;        labelAppReleased.setText(Version.VERSION_DATE);&lt;br /&gt;        labelAppReleased.setLayoutData(relativeTo(labelVersion, labelHomePage));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createLabelHomePage() {&lt;br /&gt;        labelHomePage = new Label(shell, SWT.NONE); &lt;br /&gt;        labelHomePage.setText("Homepage:");&lt;br /&gt;        labelHomePage.setFont(bold);&lt;br /&gt;        labelHomePage.setLayoutData(relativeTo(labelReleased, logo));&lt;br /&gt;    }    &lt;br /&gt;    &lt;br /&gt;    private void createLabelAppHomePage() {&lt;br /&gt;        labelAppHomePage = new Label(shell, SWT.NONE);&lt;br /&gt;        labelAppHomePage.setText(Version.HOMEPAGE);&lt;br /&gt;        labelAppHomePage.setLayoutData(relativeTo(labelReleased, labelHomePage));&lt;br /&gt;        labelAppHomePage.setCursor(hand);&lt;br /&gt;        labelAppHomePage.setForeground(blue);&lt;br /&gt;        labelAppHomePage.setToolTipText("Click to open in browser");&lt;br /&gt;        labelAppHomePage.addMouseListener(new MouseAdapter() {&lt;br /&gt;            @Override&lt;br /&gt;            public void mouseUp(final MouseEvent event) {&lt;br /&gt;                Program.launch(Version.HOMEPAGE);&lt;br /&gt;            } &lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createLabelEnvironment() {&lt;br /&gt;        labelEnvironment = new Label(shell, SWT.NONE);&lt;br /&gt;        labelEnvironment.setText("Environment");&lt;br /&gt;        labelEnvironment.setFont(bold);&lt;br /&gt;        labelEnvironment.setLayoutData(relativeTo(logo, null));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void createButtonClose() {&lt;br /&gt;        buttonClose = new Button(shell, SWT.PUSH);&lt;br /&gt;        buttonClose.setText("&amp;Close");&lt;br /&gt;        buttonClose.setLayoutData(relativeToBottomRight(null));&lt;br /&gt;        buttonClose.addSelectionListener(new SelectionAdapter() {&lt;br /&gt;            @Override&lt;br /&gt;            public void widgetSelected(final SelectionEvent event) {&lt;br /&gt;                shell.dispose();&lt;br /&gt;            } &lt;br /&gt;         });&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createButtonCopyToClipboard() {&lt;br /&gt;        buttonCopyToClipboard = new Button(shell, SWT.PUSH);&lt;br /&gt;        buttonCopyToClipboard.setText("C&amp;opy to Clipboard");&lt;br /&gt;        buttonCopyToClipboard.setLayoutData(relativeToBottomRight(buttonClose));&lt;br /&gt;        buttonCopyToClipboard.addSelectionListener(new SelectionAdapter() {&lt;br /&gt;            @Override&lt;br /&gt;            public void widgetSelected(final SelectionEvent event) {&lt;br /&gt;                IOUtils.copyToClipboard(Version.getEnvironmentReport());&lt;br /&gt;            } &lt;br /&gt;         });&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void createTextEnvironment() {&lt;br /&gt;        textEnvironment = new Text(shell, SWT.MULTI | SWT.WRAP &lt;br /&gt;                | SWT.V_SCROLL | SWT.BORDER);&lt;br /&gt;        textEnvironment.setText(Version.getEnvironmentReport());&lt;br /&gt;        textEnvironment.setEditable(false);&lt;br /&gt;        layout = relativeTo(labelEnvironment, null);&lt;br /&gt;        layout.right = new FormAttachment(100, 0);&lt;br /&gt;        layout.bottom = new FormAttachment(buttonClose);&lt;br /&gt;        layout.width = 500;&lt;br /&gt;        layout.height = 150;&lt;br /&gt;        textEnvironment.setLayoutData(layout);&lt;br /&gt;    }    &lt;br /&gt;    &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you compare the two versions, handcoded one is superior in most aspects. The code is smaller, more readable and text editor friendly. The window can be resized, it is better looking - in generated code the logo image was scaled due to dragging inacuracy. And, believe it or not, I've spent less time creating the handcoded GUI version than "drawing" the automated one and then hacking it's generated code. Of course, if you know your tools well, you can be much more productive with a GUI builder, but I'll rather learn the low-level GUI API than some commercial third party product that treats you like parents treat their kids with LEGO. &lt;br /&gt;&lt;br /&gt;No more GUI builders for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6589874961632081900?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=JJWq3rXE"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=OQMxqber"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=OQMxqber" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=7UFRotJA"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=7UFRotJA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=cxeot4U8"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/fNkGErFED74" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6589874961632081900/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/02/screw-all-gui-builders.html#comment-form" title="14 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6589874961632081900?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6589874961632081900?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/02/screw-all-gui-builders.html" title="Screw all GUI builders" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">14</thr:total></entry><entry gd:etag="W/&quot;DUAGRXY8fCp7ImA9WxVQEUs.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-1958182843587425596</id><published>2009-01-28T20:11:00.005+02:00</published><updated>2009-01-28T20:35:24.874+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-28T20:35:24.874+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><category scheme="http://www.blogger.com/atom/ns#" term="hawkscope" /><title>Hawkscope on Mac. Finally.</title><content type="html">Last week I have quit sleeping and did hell of a coding on &lt;a href="http://hawkscope.googlecode.com"&gt;Hawkscope&lt;/a&gt;. And there's a new version, with many significant &lt;a href="http://code.google.com/p/hawkscope/wiki/Changelog"&gt;changes and improvements&lt;/a&gt;. To name a few: &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Works on Mac OS X! (Java 5, Tiger / Leopard)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Installer packages for Windows, Mac and Debian (Ubuntu).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Settings can finally be changed via Settings Window, like in most normal applications...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Speed! Especially noticeable when you have many network drives.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Check for updates. A new way to annoy the users!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Blacklist. Remove all the shit you don't want to see.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/SYCilltvEbI/AAAAAAAABB0/KAf9OzKmf20/hs-0.4.0-mac-cr.png"/&gt;&lt;br /&gt;&lt;br /&gt;Download links:&lt;br /&gt;&lt;a href="http://hawkscope.googlecode.com/files/hawkscope_0.4.0-1_i386.deb"&gt;hawkscope_0.4.0-1_i386.deb&lt;/a&gt;: Debian Package for i386 GTK Linux (Ubuntu)&lt;br /&gt;&lt;a href="http://hawkscope.googlecode.com/files/hawkscope_0.4.0-1_amd64.deb"&gt;hawkscope_0.4.0-1_amd64.deb&lt;/a&gt;: Debian Package for amd64 GTK Linux (Ubuntu)&lt;br /&gt;&lt;a href="http://hawkscope.googlecode.com/files/Hawkscope-0.4.0.dmg"&gt;Hawkscope-0.4.0.dmg&lt;/a&gt;: Mac OS X i386 Package (Tiger/Leopard)&lt;br /&gt;&lt;a href="http://hawkscope.googlecode.com/files/hawkscope-0.4.0-installer.exe"&gt;hawkscope-0.4.0-installer.exe&lt;/a&gt;: Windows i386 Installer (XP/Vista)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-1958182843587425596?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=QCYAP5xz"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=rMVaBFkm"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=rMVaBFkm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Q0vhJac8"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=Q0vhJac8" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=RbcWOuI6"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/atiTOALZQ_c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/1958182843587425596/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/hawkscope-on-mac-finally.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1958182843587425596?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1958182843587425596?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/hawkscope-on-mac-finally.html" title="Hawkscope on Mac. Finally." /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;DEQDQ3YycSp7ImA9WxVRFk0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-8259214883577114224</id><published>2009-01-22T08:10:00.008+02:00</published><updated>2009-01-22T08:39:32.899+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-22T08:39:32.899+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><category scheme="http://www.blogger.com/atom/ns#" term="hawkscope" /><title>Hawkscope: Getting Better</title><content type="html">&lt;a href="http://hawkscope.googlecode.com/"&gt;&lt;img src="http://lh3.ggpht.com/_nP8Aa6cTHpo/SXgOYu9E6wI/AAAAAAAABAs/7jcJ-oQDerc/hawkscope128.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, I've managed to finish the &lt;a href="http://www.eclipse.org/swt"&gt;SWT&lt;/a&gt; implementation of &lt;a href="http://hawkscope.googlecode.com/"&gt;Hawkscope&lt;/a&gt; GUI. Along with some other minor fixes and improvements it ended up as a new Hawkscope version: 0.3.0.&lt;br /&gt;&lt;br /&gt;A list of key points for this release:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tray icon should work with Mac OS X (at least with 64-bit Leopard /w Java 6)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hawkscope menu is more responsive and usable&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Keyboard navigation through the menu is finally available&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Each OS/Architecture has it's own &lt;a href="http://code.google.com/p/hawkscope/downloads/list"&gt;build&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Added &lt;code&gt;-delay &amp;lt;milliseconds&amp;gt;&lt;/code&gt; startup parameter as a workaround for Java bug &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6438179"&gt;#6438179&lt;/a&gt; that prevented Hawkscope from auto-starting in operating systems like Ubuntu. Read more in the &lt;a href="http://code.google.com/p/hawkscope/wiki/UsingHawkscope"&gt;User Guide&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;By the way, if you're on 64-bit Vista or 64-bit Leopard with Java 6 and you've got &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; in your hands, you could be helpful by &lt;a href="http://code.google.com/p/hawkscope/wiki/BuildingHawkscope"&gt;providing the build&lt;/a&gt; for your OS. Thank You!&lt;br /&gt;&lt;br /&gt;If Java is your cocaine, you are welcome to join the development - just &lt;a href="mailto:tomas.varaneckas@gmail.com"&gt;contact me&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Download links for the new Hawkscope 0.3.0:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hawkscope.googlecode.com/files/hawkscope-0.3.0-linux-gtk-32.jar"&gt;hawkscope-0.3.0-linux-gtk-32.jar&lt;/a&gt; - Linux GTK 32-bit Executable JAR   &lt;br /&gt;&lt;a href="http://hawkscope.googlecode.com/files/hawkscope-0.3.0-linux-gtk-64.jar"&gt;    hawkscope-0.3.0-linux-gtk-64.jar&lt;/a&gt; - Linux GTK 64-bit Executable JAR&lt;br /&gt;&lt;a href="http://hawkscope.googlecode.com/files/hawkscope-0.3.0-win-32.exe"&gt;hawkscope-0.3.0-win-32.exe&lt;/a&gt; - Windows XP/Vista 32-bit Executable&lt;br /&gt;&lt;a href="http://hawkscope.googlecode.com/files/hawkscope-0.3.0-win-32.jar"&gt;hawkscope-0.3.0-win-32.jar&lt;/a&gt; - Windows XP/Vista 32-bit Executable JAR&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-8259214883577114224?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=D64Fw8uQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=DuXBmGTF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=DuXBmGTF" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=oG3Fe183"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=oG3Fe183" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=03ZF5WyR"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/y8rvIOp3JXU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/8259214883577114224/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/hawkscope-getting-better.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8259214883577114224?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8259214883577114224?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/hawkscope-getting-better.html" title="Hawkscope: Getting Better" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEYDQHo4fip7ImA9WxVRFEk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-461490020168567375</id><published>2009-01-20T12:08:00.002+02:00</published><updated>2009-01-20T12:09:31.436+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-20T12:09:31.436+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><title>Dive into Java</title><content type="html">Java Jump-start for experienced software developers. Another presentation I gave at work.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_933836"&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=dive-into-java-simplified-1232446026998878-3&amp;stripped_title=dive-into-java-presentation" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=dive-into-java-simplified-1232446026998878-3&amp;stripped_title=dive-into-java-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-461490020168567375?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=NVqhcyFt"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=QOJeIIeX"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=QOJeIIeX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=sV54Ey8J"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=sV54Ey8J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=SxaukfA6"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/7qbu36CRzdI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/461490020168567375/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/dive-into-java.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/461490020168567375?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/461490020168567375?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/dive-into-java.html" title="Dive into Java" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;DEYNRHs5eip7ImA9WxVRFEk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7931420001795344257</id><published>2009-01-20T10:45:00.007+02:00</published><updated>2009-01-20T12:09:55.522+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-20T12:09:55.522+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><title>Brainshifting programmers from procedural to object oriented</title><content type="html">Slides from a talk I gave at work. The talk is about a transition from procedural to object oriented programming.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_933801"&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=object-oriented-programming-1232445326501531-1&amp;stripped_title=object-oriented-programming-presentation-933801" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=object-oriented-programming-1232445326501531-1&amp;stripped_title=object-oriented-programming-presentation-933801" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7931420001795344257?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=TbBSbSz1"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=tRKdn3z2"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=tRKdn3z2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=pSPWPWk6"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=pSPWPWk6" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=x4WCS0vT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/RizbNdqnxvI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7931420001795344257/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/brainshifting-programmers-from.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7931420001795344257?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7931420001795344257?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/brainshifting-programmers-from.html" title="Brainshifting programmers from procedural to object oriented" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;C0IARH85eCp7ImA9WxVREEw.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-217110495930278793</id><published>2009-01-15T11:07:00.005+02:00</published><updated>2009-01-15T11:25:45.120+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-15T11:25:45.120+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="sarcasm" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>High scalabilaty at it's best</title><content type="html">That's a great example of how to do extremely scalable websites. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://highscalabilaty.com" title="High Scalability. Building bigger, faster, more reliable websites."&gt;http://highscalabilaty.com&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SW79UNmWRNI/AAAAAAAAA9E/-YFWidfpxC4/s1600-h/super-scalable.png"&gt;&lt;img src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SW79UNmWRNI/AAAAAAAAA9E/-YFWidfpxC4/s800/super-scalable.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5291445135896626386" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I guess someone forgot to scale the database... hehe...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-217110495930278793?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Z1PS3gYO"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=NNQ5iJFw"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=NNQ5iJFw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=gYJKTFx3"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=gYJKTFx3" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=lLRfTIDE"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/sH6V1J3lGP0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/217110495930278793/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/high-scalabilaty-at-its-best.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/217110495930278793?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/217110495930278793?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/high-scalabilaty-at-its-best.html" title="High scalabilaty at it's best" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SW79UNmWRNI/AAAAAAAAA9E/-YFWidfpxC4/s72-c/super-scalable.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUENSX4_eip7ImA9WxVSEkk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-3641044292524439414</id><published>2009-01-06T06:58:00.001+02:00</published><updated>2009-01-06T14:08:18.042+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-06T14:08:18.042+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Using Unicode in Java .property files</title><content type="html">Using multi-byte characters in Java .property files? Forget the Sun's &lt;a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/native2ascii.html"&gt;native2ascii&lt;/a&gt; application. Rather than doing the irritating conversions, create UTF-8 encoded .property files, edit them directly and use &lt;span style="font-style:italic;"&gt;Utf8ResourceBundle&lt;/span&gt; to access them. The code:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;package com.varaneckas.utils;&lt;br /&gt;&lt;br /&gt;import java.io.UnsupportedEncodingException;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.PropertyResourceBundle;&lt;br /&gt;import java.util.ResourceBundle;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * UTF-8 friendly ResourceBundle support&lt;br /&gt; * &lt;br /&gt; * Utility that allows having multi-byte characters inside java .property files.&lt;br /&gt; * It removes the need for Sun's native2ascii application, you can simply have&lt;br /&gt; * UTF-8 encoded editable .property files.&lt;br /&gt; * &lt;br /&gt; * Use: &lt;br /&gt; * ResourceBundle bundle = Utf8ResourceBundle.getBundle("bundle_name");&lt;br /&gt; * &lt;br /&gt; * @author Tomas Varaneckas &amp;lt;tomas.varaneckas@gmail.com&amp;gt;&lt;br /&gt; */&lt;br /&gt;public abstract class Utf8ResourceBundle {&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Gets the unicode friendly resource bundle&lt;br /&gt;     * &lt;br /&gt;     * @param baseName&lt;br /&gt;     * @see ResourceBundle#getBundle(String)&lt;br /&gt;     * @return Unicode friendly resource bundle&lt;br /&gt;     */&lt;br /&gt;    public static final ResourceBundle getBundle(final String baseName) {&lt;br /&gt;        return createUtf8PropertyResourceBundle(&lt;br /&gt;                ResourceBundle.getBundle(baseName));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Creates unicode friendly {@link PropertyResourceBundle} if possible.&lt;br /&gt;     * &lt;br /&gt;     * @param bundle &lt;br /&gt;     * @return Unicode friendly property resource bundle&lt;br /&gt;     */&lt;br /&gt;    private static ResourceBundle createUtf8PropertyResourceBundle(&lt;br /&gt;            final ResourceBundle bundle) {&lt;br /&gt;        if (!(bundle instanceof PropertyResourceBundle)) {&lt;br /&gt;            return bundle;&lt;br /&gt;        }&lt;br /&gt;        return new Utf8PropertyResourceBundle((PropertyResourceBundle) bundle);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Resource Bundle that does the hard work&lt;br /&gt;     */&lt;br /&gt;    private static class Utf8PropertyResourceBundle extends ResourceBundle {&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * Bundle with unicode data&lt;br /&gt;         */&lt;br /&gt;        private final PropertyResourceBundle bundle;&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * Initializing constructor&lt;br /&gt;         * &lt;br /&gt;         * @param bundle&lt;br /&gt;         */&lt;br /&gt;        private Utf8PropertyResourceBundle(final PropertyResourceBundle bundle) {&lt;br /&gt;            this.bundle = bundle;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        @SuppressWarnings("unchecked")&lt;br /&gt;        public Enumeration getKeys() {&lt;br /&gt;            return bundle.getKeys();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        protected Object handleGetObject(final String key) {&lt;br /&gt;            final String value = bundle.getString(key);&lt;br /&gt;            if (value == null)&lt;br /&gt;                return null;&lt;br /&gt;            try {&lt;br /&gt;                return new String(value.getBytes("ISO-8859-1"), "UTF-8");&lt;br /&gt;            } catch (final UnsupportedEncodingException e) {&lt;br /&gt;                throw new RuntimeException("Encoding not supported", e);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-3641044292524439414?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=9vyrgSsx"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=6VA11GOl"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=6VA11GOl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=3bEJIL1N"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=3bEJIL1N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=VwINtpJ1"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/6zwgFDeoJj4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/3641044292524439414/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/using-unicode-in-java-property-files.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3641044292524439414?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3641044292524439414?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/01/using-unicode-in-java-property-files.html" title="Using Unicode in Java .property files" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUYHRn45cSp7ImA9WxVTEE8.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-4125003364866751704</id><published>2008-12-23T05:48:00.005+02:00</published><updated>2008-12-23T11:05:37.029+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-23T11:05:37.029+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title>Fight for Java</title><content type="html">&lt;div id="doc-contents"&gt; &lt;div&gt;Java - the #1 programming language according the famous &lt;a title="TIOBE index" href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html" id="bl9d"&gt;TIOBE index&lt;/a&gt;. It has it's lovers and haters, damn, this community even has their own &lt;a href="http://www.bileblog.org/" id="n8zc" title="Hani Suleiman"&gt;Paris Hilton&lt;/a&gt;! However, why is Java #1? What is the key of success and is it a blessing or a curse? I'll try to explain my point of view.   &lt;div&gt; &lt;div id="cafp" style="padding: 1em 0px; text-align: left;"&gt; &lt;img src="https://docs.google.com/File?id=dgmqxjtx_24d43k4jhn_b" style="width: 640px; height: 480px;" /&gt; &lt;/div&gt; &lt;/div&gt; &lt;h3&gt;The Academic People&lt;/h3&gt;Java has been widely promoted in academic sector, as it's clean syntax works great for &lt;a title="demonstrating" href="http://maven.smith.edu/%7Ethiebaut/java/sort/demo.html" id="fzpn"&gt;demonstrating&lt;/a&gt; concepts of programming, from simple algorithms to more sophisticated design patterns, and all that can be easily visualized online with help of a few simple Java applets. The versatility of this language paved a way for Java to be the language of academic example code. That also meant that fresh students were ready to code in Java.&lt;br /&gt;&lt;h3&gt;The Community&lt;br /&gt;&lt;/h3&gt; There is a large community behind Java. And I'm not talking about Habib who knows how to do &lt;span style="font-family:Courier New;"&gt;System.out.println("Dear Sirs,\n Hello World!");&lt;/span&gt; in main method. &lt;a title="Java Community Process" href="http://www.jcp.org/" id="soa2"&gt;Java Community Process&lt;/a&gt; is one of the greatest things any programming language could get. Lots of &lt;a title="strong open source projects" href="http://www.eclipse.org/" id="b4uk"&gt;strong open source projects&lt;/a&gt;, some of them supported by major players like IBM, Google, Nokia.&lt;br /&gt;&lt;h3&gt;Java Crowd&lt;/h3&gt; There's a massive amount of programmers who (claim to) know Java, or a subset of Java (like &lt;a title="J2ME" href="http://en.wikipedia.org/wiki/Java_ME" id="yrh9"&gt;J2ME&lt;/a&gt;). Tens, hundreds of thousands. Maybe millions? You can count &lt;a title="India" href="http://www.google.com/search?q=india+java+programmer" id="x8.4"&gt;India&lt;/a&gt; alone.&lt;br /&gt;&lt;h3&gt;Online Resources&lt;br /&gt;&lt;/h3&gt;Want to learn Java? Well you can! Many books offer that in 21 days, in 7 days, fuck, even &lt;a title="in 24 hours" href="http://www.amazon.com/Sams-Teach-Yourself-Java-Hours/dp/0672324601?tag=paranoengine-20" id="e_xh"&gt;in 24 hours&lt;/a&gt;. Solution to virtually any popular problem can be Googled up in a few minutes. There are thousands of active blogs and sites with big communities and loads of traffic.&lt;br /&gt;&lt;h3&gt;Quantity over Quality&lt;/h3&gt;Even though there are millions of online resources for Java developers, 95% of them is bullshit. Other 4.99% are vendor content and the last 0.01% is what you will most likely not find easily. You can subscribe to any popular Java related news feed and try looking at it. What do you see? Spam... Spam... Crap... Spam... Bullshit... Spam... Old news... Spam... Crap...&lt;/div&gt;&lt;div id="vtyl" style="padding: 1em 0pt; text-align: left;"&gt;&lt;div id="qmo5" style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 658px; height: 416px;" src="https://docs.google.com/File?id=dgmqxjtx_31sd7rtzcx_b" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And most of other "respected" sites like &lt;a title="theserverside.com" href="http://www.theserverside.com/" id="nd9o"&gt;theserverside.com&lt;/a&gt;, &lt;a title="IBM developer works" href="http://www.ibm.com/developerworks/" id="au1j"&gt;IBM developer works&lt;/a&gt;, even &lt;a title="java.sun.com" href="http://java.sun.com/" id="yyba"&gt;java.sun.com&lt;/a&gt; - they're all full of shit. They're trying to trick you into using their enterprisey frameworks that offer you incredible results in ridicoulously short amount of time. Yeah, right.&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;h3&gt;The Enterprises&lt;/h3&gt;A combination of traits like static typing, clean and straightforward syntax, strict error handling and garbage collection along with serious attitude and effort that Sun has put into Java to make it a stable, mature, well-designed cross platform (PC to refrigerator) programming language has quickly brought attention to enterprise corporations. Java was quickly adopted as a server-side language of choice in huge and demanding sectors like wholesale banking and telecommunications to name a few. Why wouldn't they choose Java when there's such a crowd available for hire?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Carreer Programmers&lt;/h3&gt;&lt;/div&gt;When enterprises target a language, it can only mean one thing - there's lots money involved. And if there's money involved, various types of people will reach for it. Job security, yearly raises, big prospects, etc. Smells like a good career opportunity. Based on people that I have encountered or interviewed over last couple of years I dare to claim that &lt;i&gt;at least 80% of Java crowd are career programmers&lt;/i&gt; who feel no joy in developing software and frankly don't give a fuck about it. Also, 5 years of Java programming experience does not mean that person knows how to develop software properly, how to take full advantage of OOP, what is software lifecycles, how to automate stuff, etc. It's possible that he was simply "growing experience" with routine tasks. If you do same boring things for 5 years in a row it does not make you good.&lt;br /&gt;&lt;h3&gt;Bad Company&lt;br /&gt;&lt;/h3&gt;Big bad enterprises have adopted and integrated Java with their software. Many programmers learned Java using the resources provided in third party enterprise tutorials. Yes, I am talking about Oracle. &lt;a title="Oracle Technology Network" href="http://www.oracle.com/technology/tech/java/index.html" id="x4tj"&gt;Oracle Technology Network&lt;/a&gt; can quickly turn you into a brainwashed &lt;a title="JDeveloper" href="http://www.oracle.com/technology/products/jdev/index.html" id="roi6"&gt;JDeveloper&lt;/a&gt; using zombie who does web with &lt;a title="Oracle ADF" href="http://www.oracle.com/technology/products/adf/index.html" id="iin0"&gt;Oracle ADF&lt;/a&gt;. You shoul avoid this sort of digital perversion at any cost. Problem is that many certified J2EE architects with many years of experience are the graduates of Oracle Java school and you cannot convince them that the Matrix they live in is just a big pile of shit that they can't see because they're looking at it from too close. If you see a certified Java someone who is also certified Oracle someone, go away real quick to avoid potential brain damage.&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Open Source&lt;/h3&gt;Java has one of the widest open source selection you can wish for. Thanks to Sun's properly thought out packaging system Java has a vast amount of reusable open source libraries anyone can get, so software development is now just like building lego blocks and knowledge of how to write programs actually means knowledge of open source components and how to use their API. If you're writing your own code, you're probably duplicating something that is already there. Of course, we should not forget all the big things like giant frameworks, application servers and developer tools. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="padding: 1em 0px; text-align: left;" id="d_vh"&gt;&lt;img src="https://docs.google.com/File?id=dgmqxjtx_29cfx4x5hp_b" style="width: 603px; height: 445px;" /&gt;&lt;/div&gt;&lt;h3&gt;Open Legacy&lt;br /&gt;&lt;/h3&gt;Legacy is a word that is usually associated with old corporate software that all developers hate and tend to avoid. However, open source software also has their own legacy. These are things that a bunch of people cowboy coded several years ago and threw away and now their terrible code is reused in thousands of other projects. Although there is active development, it's usually about minor fixes, not serious API changes. Current committers are rarely related to original authors. &lt;a title="Apache Software Foundation" href="http://www.apache.org/" id="b:zt"&gt;Apache Software Foundation&lt;/a&gt; is probably the main source of Java's Open Legacy.&lt;br /&gt;&lt;h3&gt;Java Certification&lt;/h3&gt;&lt;div id="ymn2" style="padding: 1em 0pt; text-align: left;"&gt;&lt;img style="width: 600px; height: 192px;" src="https://docs.google.com/File?id=dgmqxjtx_30cpj3hnhk_b" /&gt;&lt;/div&gt;That is another tricky topic. Sun is promoting their &lt;a title="Java certification" href="http://www.sun.com/training/certification/java/index.xml" id="jixd"&gt;Java certification&lt;/a&gt; offering many levels of complexity. You may even think that this can actually help. In reality certification shows how bad your brain damage is. Like if you know the tricky details of EJB and JSF, you may qualify for Sun Certified Web Component Developer. In other words, certification will raise your chances of getting blind-hired by the next drone enslaving corporation. And for Sun it's the money from the masses. It's also a good source of money for various book publishers, Java experts and companies who can do Java certification training.&lt;br /&gt;&lt;h3&gt;Java Books&lt;/h3&gt;Good books are rare. Especially good programming books. Especially good Java programming books. There are several types of crap books you can encounter:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A book on a popular topic writen primarily to earn money.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A book by unknown author who wants to earn a buck and promote himself by rewriting some servlet manuals along with crappy source code examples. &lt;span class="binding"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;A book by one or more authors who want to push their another open source business 2.0 product.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A "smart" book that gives you 50 pages worth of bullshit in 500 illustrated repetative pages (&lt;a title="Head First" href="http://headfirstlabs.com/" id="a4e0"&gt;Head First&lt;/a&gt; series)&lt;/li&gt;&lt;li&gt;A brainwasher book that shows how cool are dynamic languages, how will they run on JVM and replace Java, so you should convince people to learn Ruby, Groovy, Erlang or something like that.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;You should never trust authors and publishers. Read different things and make your own conclusions instead. There is no single book that will guide you though the mess that Java is.&lt;br /&gt;&lt;h3&gt;Follow the Sun&lt;/h3&gt;If you go to the official source of Java - java.sun.com website, you will be offered to take a look at Sun's selection of enterprise crapware. Probably the only good thing you can find there is the core Java API. Other than that you will be offered to use &lt;a title="NetBeans" href="http://www.netbeans.org/" id="s9.f"&gt;NetBeans&lt;/a&gt; instead of &lt;a title="Eclipse" href="http://www.eclipse.org/" id="x44c"&gt;Eclipse&lt;/a&gt; or &lt;a title="IDEA" href="http://www.jetbrains.com/idea/" id="tnu-"&gt;IDEA&lt;/a&gt; which are the choice of most good Java developers. You will encounter crapware like &lt;a title="JavaFX" href="http://javafx.com/" id="udaa"&gt;JavaFX&lt;/a&gt; and if you press any link that has EE letters in it, you will be quickly showered with shitloads of Sun's bloatware that most carreer J2EE architects love to use. Why? Because it's offered by Sun. It's hard to believe in Java when the cradle itself is so rotten.&lt;br /&gt;&lt;h3&gt;Conferences&lt;/h3&gt;Want to get spammed straight to your face by the authors of a new "revolutionary" crap product? Then Java conferences is a place to be. Of course, there are interesting and worthy talks too, but if you're a young and trusty you can easily get brainwashed by soft voiced smart bearded baldy who will convince you that his &lt;a title="MOM" href="http://en.wikipedia.org/wiki/Message_Oriented_Middleware" id="lq2l"&gt;MOM&lt;/a&gt; will make your wet dreams come true. Open source projects that are around for not long enough or those that are backed up by some corporations are usually vendor traps, so you should avoid them. Also, you'll hear lot's of buzzwords like SOA, ESB, etc. You may even want to start using them in your day job. Do you really want to? Point is that it's almost always about big money for big corporations and not about beautiful software development. You don't need another overengineered JMS driven autoclustered enterprise service bus at a price of a new Lexus to do software integration.&lt;br /&gt;&lt;h3&gt;Fight for Java&lt;/h3&gt;It's the developers that make Java what it is today. Don't let the corporate bastards convince you to use their crap. You don't need military boots to swim in a pool and you don't need enterprise tools to build your software. Fight for pure Java, fight for clean and useful open source, fight for a honest community and make Java a better language. Fight to get rid of corporate J2EE/Oracle architects and their enterprise bloatware, fight for good lightweight tooling and for the right to be productive. Fight for freedom and for the right to choose. Fight for light, fast and simple Java.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-4125003364866751704?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=29ZrQhoT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=7jkNo5dU"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=7jkNo5dU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=0p66D3Rd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=0p66D3Rd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=igCmzvDq"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/prj5i9q2G2w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/4125003364866751704/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/12/fight-for-java.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4125003364866751704?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4125003364866751704?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/12/fight-for-java.html" title="Fight for Java" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEcCR3o7eyp7ImA9WxRbF0Q.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-8626341054817070804</id><published>2008-12-08T18:38:00.011+02:00</published><updated>2008-12-09T06:14:26.403+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T06:14:26.403+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><title>How to restore grub after Windows installation</title><content type="html">There's nothing magical about it, you can easily Google it up, but I always forget the "find /boot/grub..." part and there are many other ways people explain this procedure, so I'm adding a screenshot as I'm doing it yet another time.&lt;br /&gt;&lt;br /&gt;This is a best and easiest way to fix MBR after Windows f*ck it up.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/ST1Tv1uhb2I/AAAAAAAAA7I/lbmJkSzDBOw/s1600/grub2.png" /&gt;&lt;br /&gt;&lt;br /&gt;In short:&lt;br /&gt;1. boot from Ubuntu live CD (or any other live cd)&lt;br /&gt;2. start a terminal&lt;br /&gt;3. &lt;pre style="code"&gt;sudo grub&lt;br /&gt;find /boot/grub/stage1&lt;br /&gt;root (hdX,Y)&lt;br /&gt;setup (hdX)&lt;br /&gt;quit&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you've got several drives you should check if your Windows partition is bootable and the other ones are not, otherwise if you install grub into linux partition, Windows will "fix" itself by changing bootable flag. To view and change bootable flags in Ubuntu Live go to System &gt; Administration &gt; Partition Editor (or run sudo gparted in terminal). The rest is illustrated below. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/ST1XY4QxJqI/AAAAAAAAA7Q/l9agxKqpUTc/s1600-h/parted.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 329px;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/ST1XY4QxJqI/AAAAAAAAA7Q/l9agxKqpUTc/s400/parted.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5277470423279281826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/ST1XfCscajI/AAAAAAAAA7Y/zdNKikP4POA/s1600-h/bootable.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 314px; height: 290px;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/ST1XfCscajI/AAAAAAAAA7Y/zdNKikP4POA/s400/bootable.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5277470529158933042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If grub loads but boot fails, it means grub detected your partitions incorrectly. Hit 'e' on linux entry, change the "root (hd1,0)" to "root (hd0,0)" or vice versa and press 'b' to attempt a modified boot. Repeat the "sudo grub" procedure when booted, but choose "setup (hdX)" target the oposite of your "root", i.e., if you did "root (hd1,0)", do "setup (hd0)" instead of "setup (hd1)". You should also edit /boot/grub/menu.lst afterwards and change all (hd0 to (hd1 and (hd1 to (hd0 to fix the boot menu. &lt;br /&gt;&lt;br /&gt;Does all software have to suck?..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-8626341054817070804?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=RwDy7nqN"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Cd1P1vzh"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=Cd1P1vzh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=iOm11dXf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=iOm11dXf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=poLGQAhy"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/VAAoMWVbYoU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/8626341054817070804/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/12/how-to-restore-grub-after-windows.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8626341054817070804?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8626341054817070804?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/12/how-to-restore-grub-after-windows.html" title="How to restore grub after Windows installation" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_nP8Aa6cTHpo/ST1Tv1uhb2I/AAAAAAAAA7I/lbmJkSzDBOw/s72-c/grub2.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;D04ESHo4eyp7ImA9WxRbEUQ.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-5040655441728552009</id><published>2008-12-01T17:08:00.008+02:00</published><updated>2008-12-02T07:31:49.433+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-02T07:31:49.433+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title>How to be a good specialist and still have a life</title><content type="html">There is a saying "life, sleep, career - choose two". But is it possible to choose three without sacrificing anything significant?  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/STQBY4iuZYI/AAAAAAAAA6o/9XPfeJhxU64/s1600-h/Trainspotting-Poster-C10290987.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 266px; height: 400px;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/STQBY4iuZYI/AAAAAAAAA6o/9XPfeJhxU64/s400/Trainspotting-Poster-C10290987.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5274842590564214146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Types of people &lt;/span&gt;&lt;br /&gt;As far as you can see the world mostly consists of two stereotypes of people - ones who are successful at their career but have very little time for family and themselves and those who have lots of prime time with their beloved ones, yet, they are very average at what they do for living. Both approaches have their advantages and a "price to pay". Let's break everything down to pieces:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;A hard worker&lt;/span&gt;&lt;br /&gt;Stereotypical work mule who performs as 5 people and is loved by most employees.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Pros:&lt;/span&gt;&lt;br /&gt;• Skilled specialist&lt;br /&gt;• Loves what she does&lt;br /&gt;• No problems at finding a great job&lt;br /&gt;• Wealthy living&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Cons:&lt;br /&gt;&lt;/span&gt;• Often too tired&lt;br /&gt;• Often with bad habits (coffee, cigarettes)&lt;br /&gt;• Health problems (because of the above)&lt;br /&gt;• Always in a hurry&lt;br /&gt;• Problems with personal life&lt;br /&gt;• Works at spare time&lt;br /&gt;• Problems with sleep (due to lifestyle)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;A soft worker&lt;/span&gt;&lt;br /&gt;Stereotypical average lazy guy without career ambitions who is reading news papers at work while thinking of his wife and kids. The bigger the corporation, the more soft workers it has.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Pros:&lt;/span&gt;&lt;br /&gt;• Laid back and relaxed most of the time&lt;br /&gt;• Not too tired&lt;br /&gt;• No coffee overdoses&lt;br /&gt;• Sleeps like a rock&lt;br /&gt;• Has a life and enjoys it&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Cons:&lt;/span&gt;&lt;br /&gt;• Often short on money&lt;br /&gt;• Shabby resume&lt;br /&gt;• The only career path - to stay long enough in one place to become a loyal "company veteran".&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Which way of life is better? &lt;/span&gt;&lt;br /&gt;I think the right answer is that being both hard or soft worker is wrong. Why? Look at the cons. There's no life without money, and money is worthless without a life. Wouldn't it be lovely if you could refactor your life to avoid having the cons of either of those? I made my attempt and found a formula that works for me. It could be useful for more software developers or even people with other professions.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Think out of the box&lt;/span&gt;&lt;br /&gt;What is the definition of "work"? Is it a place you go 5 times a week and do things you are told for 4 hours, have a lunch and then do more things you are told for 4 more hours? If you have this attitude, you're most probably a soft worker. Loose it. If your definition of "work" is a place where you go to learn something, to do great things and achieve great results, to improve yourself and to help others, you're most probably a hard worker. Congrats. Now read further to find how to reclaim your personal life and have more free time.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Work is a Symbiosis&lt;br /&gt;&lt;/span&gt;Remember biology. Work is a &lt;a href="http://en.wikipedia.org/wiki/Symbiosis"&gt;symbiosis&lt;/a&gt; of employer and employee. And for that symbiosis to work both sides must give each other equal amount of value. If you work hard, don't let yourself to be underpaid for various reasons your employee could come up with. Those reasons can vary from &lt;span class="Apple-style-span" style="font-style: italic;"&gt;"you haven't worked here long enough to earn that much"&lt;/span&gt; to &lt;span class="Apple-style-span" style="font-style: italic;"&gt;"no programmer earns that much here"&lt;/span&gt;. Respect yourself and don't work for food.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Work 4 days a week&lt;/span&gt;&lt;br /&gt;3 day long weekend every week? Most employees are OK with this option, though I haven't found many people using this. Stop crying that you have no time to spend your money and go ask for shorter work week. And believe me, It's worth to earn less money for that. You can choose what to do. You can sleep longer. You can do your routines and spend the rest of your long weekend without stress. Read a book, or even write a one. Learn Kung-Fu or fly RC planes with your kid. Forget the feeling of being tired. More time with less money has more value than more money with less time.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Debug your commute&lt;/span&gt;&lt;br /&gt;When I first came to the company I currently work at, there were two &lt;span class="Apple-style-span" style="font-style: italic;"&gt;official&lt;/span&gt; choices of work hours: 8-17 and 9-18 including 1-hour of lunch. It was a nightmare to have 45-60 minute long drive in one direction. The traffic is unbelievable here in Vilnius. Now where was that emphasized word mentioned before? &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Official&lt;/span&gt;. What is &lt;span class="Apple-style-span" style="font-style: italic;"&gt;official&lt;/span&gt;? When a tree has symbiosis with a shroom, do they have official ours for their activities? I guess not. It's a matter of one single conversation with authority to get your work hours flexible or to begin when you want it to. Early bird? Choose 7-16 and have more time with family. If you're nocturnal, work 10-19 to avoid traffic and get more sleep. Or for best results, choose to come anywhere between 7 and 10 AM and leave office respectively. Can you work remotely? Great, do it. And if noone told you can work remotely or even told that you &lt;span class="Apple-style-span" style="font-style: italic;"&gt;officially&lt;/span&gt; cannot, go and have a talk. You may be surprised. As of myself, I like to get up early and save my daylight, so I work 7-16. And my drive time is now 15 minutes in both directions. Did you know that one extra free hour a day saves two weeks of time in one year?&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Debug your time&lt;/span&gt;&lt;br /&gt;Again, it's all about the official stuff. If your company has the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;"official"&lt;/span&gt; coffee breaks at 9 and 15 hours sharp, make sure you get your coffee before that to save extra 20 minutes of productivity.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Contribute back to The Company&lt;/span&gt;&lt;br /&gt;Be good at what you do and don't do it just for money. See more than you should. If something's wrong - say it aloud, don't just curse and look for a new job. Even large enterprises can be shaken from the bottom, and your contributions will give you experience and increase your karma. I mean it. Do it to get closer to beauty and perfection. Plant a seed and see how it grows. If you are a software developer in a company that uses home grown Windows-only issue tracker that sucks ass does not mean you can't tell your boss that you know what would make a great replacement for the suck-ass issue tracker that everyone hates. Don't wait for a miracle to happen, make miracles yourself.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;A symbiotic worker&lt;/span&gt;&lt;br /&gt;That's what I call the type of worker that is between hard and soft. In short, it's like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Pros:&lt;br /&gt;&lt;/span&gt;• Skilled specialist&lt;br /&gt;• Loves what she does&lt;br /&gt;• No problems at finding a great job&lt;br /&gt;• Probably a wealthy living&lt;br /&gt;• Not too tired&lt;br /&gt;• Has a life and enjoys it&lt;br /&gt;• Employers who practice slavery tends to avoid such people (harder to get a bad job)&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Cons:&lt;/span&gt;&lt;br /&gt;• Still not a &lt;a href="http://paranoid-engineering.blogspot.com/2008/06/enterprise-journeymen-and-free-souls.html"&gt;free soul&lt;/a&gt;. Make a startup of your own to become one, if you can.&lt;br /&gt;&lt;br /&gt;You only live once, so don't waste yourself. Don't be a slave. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-5040655441728552009?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=6Q0rrA6c"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=D0FxLKEZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=D0FxLKEZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=iTWhVNoH"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=iTWhVNoH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=uO2w8Q5e"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/lJORG0VOGO4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/5040655441728552009/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/12/how-to-be-good-specialist-and-still.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5040655441728552009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5040655441728552009?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/12/how-to-be-good-specialist-and-still.html" title="How to be a good specialist and still have a life" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_nP8Aa6cTHpo/STQBY4iuZYI/AAAAAAAAA6o/9XPfeJhxU64/s72-c/Trainspotting-Poster-C10290987.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUENRn4-eCp7ImA9WxRaGEU.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-195853549543014396</id><published>2008-11-25T21:37:00.013+02:00</published><updated>2008-12-21T20:21:37.050+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-21T20:21:37.050+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="games" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Python MUD Game Example</title><content type="html">I've found a small &lt;a href="http://en.wikipedia.org/wiki/MUD"&gt;MUD&lt;/a&gt;-like single player game that I did with &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; several years ago. Thought it would be nice to share the source. So here it is.&lt;br /&gt;&lt;br /&gt;First of all, a live demo (type help. gone if my internet connection or home server is down.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;server down&lt;/b&gt; &lt;br /&gt;&lt;!-- &lt;br /&gt;&lt;iframe src="http://spajus.homeunix.org/mud/" width="660px" height="460px" style="border: 0"&gt;&lt;br /&gt;&lt;/iframe&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;And a "screenshot" (sorry for my bad sense of humor):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;gt; help&lt;br /&gt;welcome to mud. available commands are:&lt;br /&gt; go, move, help, exit, look, say, take, drop, inventory, use&lt;br /&gt;&amp;gt;&lt;br /&gt;Unknown Command&lt;br /&gt;&amp;gt; look&lt;br /&gt;spajus sees deep green woods. There also seems to be: flower, bird&lt;br /&gt;&amp;gt; touch bird&lt;br /&gt;looks like a rainbow&lt;br /&gt;&amp;gt; use bird&lt;br /&gt;you do not have bird&lt;br /&gt;&amp;gt; take bird&lt;br /&gt;spajus puts bird in his inventory&lt;br /&gt;&amp;gt; use bird&lt;br /&gt;cuckarekoo! motherfucka!?!&lt;br /&gt;&amp;gt; drop bird&lt;br /&gt;bird was dropped..&lt;br /&gt;&amp;gt; kill bird&lt;br /&gt;Unknown Command&lt;br /&gt;&amp;gt; look north&lt;br /&gt;spajus sees shallow river. There also seems to be: object&lt;br /&gt;&amp;gt; go north&lt;br /&gt;spajus moves to shallow river&lt;br /&gt;&amp;gt; look object&lt;br /&gt;spajus sees a stinky one&lt;br /&gt;&amp;gt; touch object&lt;br /&gt;ewww...&lt;br /&gt;&amp;gt; take object&lt;br /&gt;spajus puts shit in his inventory&lt;br /&gt;&amp;gt; use shit&lt;br /&gt;you are sick, you know that?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, the &lt;code&gt;engine.py&lt;/code&gt;&lt;br /&gt;&lt;pre name="code" class="python"&gt;&lt;br /&gt;class MudObject:&lt;br /&gt; def __init__(self, name, sight, collide = 'nothing happens', usability = 'unusable'):&lt;br /&gt;   self.name = name&lt;br /&gt;   self.sight = sight&lt;br /&gt;   self.collide = collide&lt;br /&gt;   self.usability = usability&lt;br /&gt; def view(self):&lt;br /&gt;   return self.sight&lt;br /&gt; def touch(self):&lt;br /&gt;   return self.collide&lt;br /&gt; def use(self):&lt;br /&gt;   return self.usability&lt;br /&gt;class MudPlayer:&lt;br /&gt; def __init__(self, name):&lt;br /&gt;   self.inventory = {}&lt;br /&gt;   self.name = name&lt;br /&gt;   self.health = 100&lt;br /&gt; def move(self, area):&lt;br /&gt;   return self.name + ' moves to ' + area.sight&lt;br /&gt; def take(self, obj):&lt;br /&gt;   self.inventory[obj.name] = obj&lt;br /&gt;   return self.name + ' puts ' + obj.name + ' in his inventory'&lt;br /&gt; def drop(self, name):&lt;br /&gt;   if self.inventory.has_key(name):&lt;br /&gt;     return self.inventory.pop(name)&lt;br /&gt; def say(self, what):&lt;br /&gt;   return self.name + ' says: ' + what&lt;br /&gt; def use(self, what):&lt;br /&gt;   if self.inventory.has_key(what):&lt;br /&gt;     return self.inventory[what].use()&lt;br /&gt;   else:&lt;br /&gt;     return 'you do not have ' + what&lt;br /&gt;&lt;br /&gt;class MudArea:&lt;br /&gt; def __init__(self, sight):&lt;br /&gt;   self.objects = {}&lt;br /&gt;   self.panorama = {}&lt;br /&gt;   self.sight = sight&lt;br /&gt;   self.inverted_directions = {'north':'south', 'south':'north', 'east':'west', 'west':'east'}&lt;br /&gt; def addArea(self, direction, area):&lt;br /&gt;   area.panorama[self.inverted_directions[direction]] = self&lt;br /&gt;   self.panorama[direction] = area&lt;br /&gt;  &lt;br /&gt; def relocate(self, args):   &lt;br /&gt;   try:&lt;br /&gt;     return self.panorama[args]&lt;br /&gt;   except KeyError:&lt;br /&gt;     return None&lt;br /&gt; def addObject(self, name, obj):&lt;br /&gt;   if obj != None:&lt;br /&gt;     self.objects[name] = obj&lt;br /&gt;     return name + ' was dropped..'&lt;br /&gt; def getObject(self, name):&lt;br /&gt;   if self.objects.has_key(name):&lt;br /&gt;     return self.objects.pop(name)&lt;br /&gt;   else:&lt;br /&gt;     return 'there is no ' + name + ' arround!'&lt;br /&gt; def touchObject(self, name):&lt;br /&gt;   if self.objects.has_key(name):&lt;br /&gt;     return self.objects[name].touch()&lt;br /&gt;   else:&lt;br /&gt;     return 'there is no ' + name + ' arround!'&lt;br /&gt; def view(self, args = 'arround'):&lt;br /&gt;   if (args != '' and args != 'arround'):&lt;br /&gt;     try:&lt;br /&gt;       return self.panorama[args].view()&lt;br /&gt;     except KeyError:&lt;br /&gt;       try:&lt;br /&gt;         return self.objects[args].view()&lt;br /&gt;       except KeyError:&lt;br /&gt;         return 'nothing.'&lt;br /&gt;   else:&lt;br /&gt;     objects = ', '.join([k for k, v in self.objects.items()])&lt;br /&gt;     if (objects != ''):       &lt;br /&gt;       obsight = '. There also seems to be: ' + objects&lt;br /&gt;     else:&lt;br /&gt;       obsight = ''&lt;br /&gt;     return self.sight + obsight&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;class MudCommand:&lt;br /&gt; """ welcome to mud. available commands are:&lt;br /&gt; go, move, help, exit, look, touch, say, take, drop, inventory, use """&lt;br /&gt; def __init__(self, char, area):&lt;br /&gt;   self.char = char&lt;br /&gt;   self.area = area&lt;br /&gt;&lt;br /&gt; def go(self, args):&lt;br /&gt;   """ alias of move """&lt;br /&gt;   return self.move(args)&lt;br /&gt;&lt;br /&gt; def use(self, args):&lt;br /&gt;   """ uses item from inventory """&lt;br /&gt;   return self.char.use(args)&lt;br /&gt;&lt;br /&gt; def inventory(self, args):&lt;br /&gt;   """ displays inventory """&lt;br /&gt;   return self.char.name + ' has: ' + ', '.join(self.char.inventory)&lt;br /&gt;&lt;br /&gt; def help(self, args):&lt;br /&gt;   """ gives you help on a topic"""     &lt;br /&gt;   if args == '':&lt;br /&gt;     return self.__doc__&lt;br /&gt;   else:&lt;br /&gt;     try:&lt;br /&gt;       return getattr(self, args).__doc__&lt;br /&gt;     except AttributeError:&lt;br /&gt;       return 'help topic not found'&lt;br /&gt;&lt;br /&gt; def exit(self, args):&lt;br /&gt;   """ exits game """ &lt;br /&gt;   print 'bye bye!'&lt;br /&gt;   sys.exit()&lt;br /&gt;  &lt;br /&gt; def look(self, args):&lt;br /&gt;   """ lets you look arround """&lt;br /&gt;   return self.char.name + ' sees ' + self.area.view(args)&lt;br /&gt;&lt;br /&gt; def take(self, args):&lt;br /&gt;   """ takes item from the ground """&lt;br /&gt;   try:&lt;br /&gt;     return self.char.take(self.area.getObject(args))&lt;br /&gt;   except AttributeError:&lt;br /&gt;     return 'you cannot take ' + args&lt;br /&gt;  &lt;br /&gt; def touch(self, args):&lt;br /&gt;   """ touches item from the ground """&lt;br /&gt;   return self.area.touchObject(args)&lt;br /&gt;&lt;br /&gt; def drop(self, args):&lt;br /&gt;   """ drops item from inventory to current area """&lt;br /&gt;   return self.area.addObject(args, self.char.drop(args))&lt;br /&gt;&lt;br /&gt; def move(self, args):&lt;br /&gt;   """ moves arround """ &lt;br /&gt;   area = self.area.relocate(args)&lt;br /&gt;   if area != None:&lt;br /&gt;     self.area = area&lt;br /&gt;     return self.char.move(self.area)&lt;br /&gt;   else:&lt;br /&gt;     return 'There seems to be nothing that way.'&lt;br /&gt;  &lt;br /&gt; def say(self, args):&lt;br /&gt;   """ makes character talk """&lt;br /&gt;   return self.char.say(args)     &lt;br /&gt;class MudGame:&lt;br /&gt; def __init__(self, char, area):&lt;br /&gt;   self.cmd = MudCommand(char, area)&lt;br /&gt;&lt;br /&gt; def run(self):&lt;br /&gt;   while True:&lt;br /&gt;     command = raw_input('&amp;gt; ');&lt;br /&gt;     self.parse(command)&lt;br /&gt;  &lt;br /&gt; def parse(self, command):&lt;br /&gt;   comm = command.lower().split(' ')&lt;br /&gt;   try:&lt;br /&gt;     cmd = comm[0]&lt;br /&gt;   except IndexError:&lt;br /&gt;     cmd = 'help'&lt;br /&gt;   try:&lt;br /&gt;     args = comm[1:]&lt;br /&gt;   except IndexError:&lt;br /&gt;     args = []&lt;br /&gt;   try:&lt;br /&gt;     result = getattr(self.cmd, cmd)(' '.join(args).strip())&lt;br /&gt;   except AttributeError:&lt;br /&gt;     result = 'Unknown Command'&lt;br /&gt;   print result&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And the main game script - &lt;code&gt;mud.py&lt;/code&gt;:&lt;br /&gt;&lt;pre name="code" class="python"&gt;&lt;br /&gt;from engine import *&lt;br /&gt;&lt;br /&gt;#objects (name, description, on touch, on use)&lt;br /&gt;rose = MudObject('rose', 'a red blossom with spikes', 'bites fingers!', 'wanna eat it or what?')&lt;br /&gt;shit = MudObject('shit', 'a stinky one', 'ewww...', 'you are sick, you know that?')&lt;br /&gt;gaidys = MudObject('bird', 'oh, a cock!', 'looks like a rainbow', 'cuckarekoo! motherfucka!?!')&lt;br /&gt;&lt;br /&gt;#areas&lt;br /&gt;woods = MudArea('deep green woods')&lt;br /&gt;river = MudArea('shallow river')&lt;br /&gt;hills = MudArea('orc hills')&lt;br /&gt;house = MudArea('house of all gay')&lt;br /&gt;meadow = MudArea('a green smelly meadow')&lt;br /&gt;&lt;br /&gt;#attaching interactive stuff to areas&lt;br /&gt;river.addObject('object', shit)&lt;br /&gt;woods.addObject('flower', rose)&lt;br /&gt;woods.addObject('bird', gaidys)&lt;br /&gt;meadow.addObject('animal', gaidys)&lt;br /&gt;&lt;br /&gt;#link all areas with bidirectional references&lt;br /&gt;river.addArea('south', hills)&lt;br /&gt;woods.addArea('north', river)&lt;br /&gt;woods.addArea('west', house)&lt;br /&gt;hills.addArea('east', meadow)&lt;br /&gt;meadow.addArea('north', woods)&lt;br /&gt;&lt;br /&gt;#create a player&lt;br /&gt;char = MudPlayer('spajus')&lt;br /&gt;&lt;br /&gt;#create a game with player and starting area&lt;br /&gt;game = MudGame(char, woods)&lt;br /&gt;&lt;br /&gt;#lets go!&lt;br /&gt;game.run()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;OK, and of course, unit tests:&lt;br /&gt;&lt;pre name="code" class="python"&gt;&lt;br /&gt;import unittest&lt;br /&gt;from engine import *&lt;br /&gt;&lt;br /&gt;class TestMudObject(unittest.TestCase):&lt;br /&gt; def setUp(self):&lt;br /&gt;   self.o = MudObject('object1', 'sight1', 'collision1', 'usage1')&lt;br /&gt;   self.o2 = MudObject('object2', 'sight2')&lt;br /&gt;  &lt;br /&gt; def test_view(self):&lt;br /&gt;   self.assertEqual(self.o.view(), 'sight1')&lt;br /&gt;   self.assertEqual(self.o2.view(), 'sight2')&lt;br /&gt;   self.assertNotEqual(self.o.view(), 'c')&lt;br /&gt;   self.assertNotEqual(self.o.view(), self.o2.view())&lt;br /&gt;  &lt;br /&gt; def test_touch(self):&lt;br /&gt;   self.assertEqual(self.o.touch(), 'collision1')&lt;br /&gt;   self.assertEqual(self.o2.touch(), 'nothing happens')&lt;br /&gt;   self.assertNotEqual(self.o.touch(), 'sight1')&lt;br /&gt;   self.assertNotEqual(self.o.touch(), self.o2.touch())&lt;br /&gt;  &lt;br /&gt; def test_use(self):&lt;br /&gt;   self.assertEqual(self.o.use(), 'usage1')&lt;br /&gt;   self.assertEqual(self.o2.use(), 'unusable')&lt;br /&gt;   self.assertNotEqual(self.o.use(), 'unsuable')&lt;br /&gt;   self.assertNotEqual(self.o.use(), self.o2.use())&lt;br /&gt;  &lt;br /&gt;class TestMudPlayer(unittest.TestCase):&lt;br /&gt; def setUp(self):&lt;br /&gt;   self.p1 = MudPlayer('player1')&lt;br /&gt;   self.p2 = MudPlayer('player2')&lt;br /&gt;   self.area1 = MudArea('area1')&lt;br /&gt;   self.area2 = MudArea('area2')&lt;br /&gt;   self.o = MudObject('object1', 'sight1', 'collision1', 'usage1')&lt;br /&gt;   self.o2 = MudObject('object2', 'sight2')&lt;br /&gt;  &lt;br /&gt; def test_move(self):&lt;br /&gt;   f1 = self.p1.move&lt;br /&gt;   f2 = self.p2.move&lt;br /&gt;   a1 = self.area1&lt;br /&gt;   a2 = self.area2&lt;br /&gt;   self.assertEqual(f1(a1), 'player1 moves to area1')&lt;br /&gt;   self.assertEqual(f2(a1), 'player2 moves to area1')&lt;br /&gt;   self.assertEqual(f1(a2), 'player1 moves to area2')&lt;br /&gt;   self.assertEqual(f2(a2), 'player2 moves to area2')&lt;br /&gt;   self.assertNotEqual(f1(a1), 'player1 moves to area2')&lt;br /&gt;&lt;br /&gt; def test_take_drop(self):&lt;br /&gt;   take = self.p1.take&lt;br /&gt;   use = self.p1.use&lt;br /&gt;   drop = self.p1.drop&lt;br /&gt;   inven = self.p1.inventory&lt;br /&gt;  &lt;br /&gt;   o1 = self.o&lt;br /&gt;   o2 = self.o2&lt;br /&gt;  &lt;br /&gt;   self.assertEqual(inven, {})&lt;br /&gt;   self.assertEqual(take(o1), 'player1 puts object1 in his inventory')&lt;br /&gt;   self.assertEqual(inven, {'object1':o1})&lt;br /&gt;   self.assertEqual(take(o2), 'player1 puts object2 in his inventory')&lt;br /&gt;   self.assertEqual(inven, {'object1':o1, 'object2':o2})&lt;br /&gt;  &lt;br /&gt;   self.assertEqual(drop('object1'), o1)&lt;br /&gt;   #neesamo objekto dropint neina&lt;br /&gt;   self.assertRaises(TypeError, drop('object1'))&lt;br /&gt;   self.assertEqual(inven, {'object2':o2})&lt;br /&gt;   self.assertEqual(drop('object2'), o2)&lt;br /&gt;   self.assertEqual(inven, {})&lt;br /&gt;  &lt;br /&gt; def test_use(self):&lt;br /&gt;   p1 = self.p1&lt;br /&gt;   o1 = self.o&lt;br /&gt;   self.assertNotEqual(p1.use('object1'), 'usage1')&lt;br /&gt;   self.assertEqual(p1.use('object1'), 'you do not have object1')&lt;br /&gt;   p1.take(o1)&lt;br /&gt;   self.assertEqual(p1.use('object1'), 'usage1')&lt;br /&gt;  &lt;br /&gt;class TestMudArea(unittest.TestCase):&lt;br /&gt; def setUp(self):&lt;br /&gt;   self.a1 = MudArea('area1')&lt;br /&gt;   self.a2 = MudArea('area2')&lt;br /&gt;   self.o1 = MudObject('obj1', 'sight1', 'collide1', 'use1')&lt;br /&gt;   self.o2 = MudObject('obj2', 'sight2')&lt;br /&gt;  &lt;br /&gt; def test_addArea(self):&lt;br /&gt;   #assignmentas turi buti veidrodinis&lt;br /&gt;   self.a1.addArea('north', self.a2)&lt;br /&gt;   self.assertEqual(self.a1.panorama, {'north':self.a2})&lt;br /&gt;   self.assertEqual(self.a2.panorama, {'south':self.a1})&lt;br /&gt;  &lt;br /&gt; def test_relocate(self):&lt;br /&gt;   self.a1.addArea('north', self.a2)&lt;br /&gt;   self.assertEqual(self.a1.relocate('north'), self.a2)&lt;br /&gt;   self.assertEqual(self.a2.relocate('north'), None)&lt;br /&gt;   self.assertEqual(self.a2.relocate('south'), self.a1)&lt;br /&gt;&lt;br /&gt; def test_addObject(self):&lt;br /&gt;   self.assertEqual(self.a1.objects, {})&lt;br /&gt;   #dropped returninama todel, kad paprastai objectas zaidimo metu addinamas tada, kai playeris dropina ji.&lt;br /&gt;   #kreivai biski, bet ka padarysi :)&lt;br /&gt;   self.assertEqual(self.a1.addObject('something', self.o1), 'something was dropped..')&lt;br /&gt;   self.assertEqual(self.a1.objects, {'something':self.o1})&lt;br /&gt;   self.a1.addObject('other', self.o2)&lt;br /&gt;   self.assertEqual(self.a1.objects, {'something':self.o1, 'other':self.o2})&lt;br /&gt;   self.assertEqual(self.a1.addObject('something_clone', self.o1), 'something_clone was dropped..')&lt;br /&gt;   self.assertEqual(self.a1.objects, {'something':self.o1, 'other':self.o2, 'something_clone':self.o1})&lt;br /&gt;  &lt;br /&gt; def test_getObject(self):&lt;br /&gt;   self.assertEqual(self.a1.objects, {})&lt;br /&gt;   self.a1.addObject('something', self.o1)&lt;br /&gt;   self.a1.addObject('other', self.o2)&lt;br /&gt;   self.assertEqual(self.a1.getObject('something'), self.o1)&lt;br /&gt;   self.assertEqual(self.a1.objects, {'other':self.o2})&lt;br /&gt;   self.assertEqual(self.a1.getObject('something'), 'there is no something arround!')&lt;br /&gt;  &lt;br /&gt; def test_touchObject(self):&lt;br /&gt;   self.assertEqual(self.a1.objects, {})&lt;br /&gt;   self.a1.addObject('something', self.o1)&lt;br /&gt;   self.a1.addObject('other', self.o2)&lt;br /&gt;   self.assertEqual(self.a1.touchObject('something'), self.o1.touch())&lt;br /&gt;   self.assertNotEqual(self.a1.touchObject('obj2'), self.o2.touch())&lt;br /&gt;   self.assertEqual(self.a1.touchObject('ass'), 'there is no ass arround!')&lt;br /&gt;  &lt;br /&gt; def test_view(self):&lt;br /&gt;   view = self.a1.view&lt;br /&gt;   self.assertEqual(view(), 'area1')&lt;br /&gt;   #unindentified object/panorama&lt;br /&gt;   self.assertEqual(view('my brain'), 'nothing.')&lt;br /&gt;  &lt;br /&gt;   self.a1.addObject('my brain', self.o1)&lt;br /&gt;   self.assertEqual(view('my brain'), self.o1.view())&lt;br /&gt;   #padarom dar idomiau. kadangi pridejom my brain, reikia parodyti ir tai..&lt;br /&gt;   self.assertNotEqual(view(), 'area1')&lt;br /&gt;   self.assertEqual(view(), 'area1. There also seems to be: my brain')&lt;br /&gt;   self.a1.addObject('duck', self.o2)&lt;br /&gt;   self.assertEqual(view(), 'area1. There also seems to be: my brain, duck') #', '.join(self.a1.objects)&lt;br /&gt;  &lt;br /&gt;   self.assertEqual(view('north'), 'nothing.')&lt;br /&gt;   self.a1.addArea('north', self.a2)&lt;br /&gt;   self.assertEqual(view('north'), 'area2')&lt;br /&gt;   #kadangi priskyrem area2, turejo atsispindeti ir is ten paziurejus i priesinga north krypti (south), turi matytis area1 viewas&lt;br /&gt;   self.assertEqual(self.a2.view('south'), view())&lt;br /&gt;   #akurat.. matosi :)&lt;br /&gt;&lt;br /&gt;class MudCommandTest(unittest.TestCase):&lt;br /&gt; def setUp(self):&lt;br /&gt;   self.p1 = MudPlayer('player1')&lt;br /&gt;   self.a1 = MudArea('area1')&lt;br /&gt;   self.a2 = MudArea('area2')&lt;br /&gt;   self.o1 = MudObject('obj1', 'sight1', 'collide1', 'use1')&lt;br /&gt;   self.o2 = MudObject('obj2', 'sight2', 'collide2', 'use2')&lt;br /&gt;   self.a2.addObject('bread', self.o1)&lt;br /&gt;   self.a2.addObject('pig', self.o2)&lt;br /&gt;   self.a1.addArea('east', self.a2)   &lt;br /&gt;   self.c = MudCommand(self.p1, self.a1)&lt;br /&gt;&lt;br /&gt; def test_go_move(self):&lt;br /&gt;   #MudArea.go === MudArea.move&lt;br /&gt;   #test wrong way&lt;br /&gt;   self.assertEqual(self.c.go('somewhere'), 'There seems to be nothing that way.')&lt;br /&gt;   #test walk arround&lt;br /&gt;   self.assertEqual(self.c.go('east'), 'player1 moves to area2')&lt;br /&gt;   self.assertEqual(self.c.go('west'), 'player1 moves to area1')&lt;br /&gt;  &lt;br /&gt; def test_use(self):&lt;br /&gt;   self.assertEqual(self.c.use('bla'), 'you do not have bla')&lt;br /&gt;   #lets go east and take something to test using&lt;br /&gt;   self.c.go('east')&lt;br /&gt;   self.c.take('bread')&lt;br /&gt;   #as bread was only the looks, we know it's actually obj1, so lets use it&lt;br /&gt;   self.assertEqual(self.c.use('obj1'), self.o1.use())&lt;br /&gt;  &lt;br /&gt; def test_inventory(self):&lt;br /&gt;   self.c.go('east')&lt;br /&gt;   self.c.take('bread')&lt;br /&gt;   self.assertEqual(self.c.inventory(None), 'player1 has: obj1')&lt;br /&gt;  &lt;br /&gt; def test_help(self):&lt;br /&gt;   self.assertEqual(self.c.help(''), self.c.__doc__)&lt;br /&gt;   self.assertEqual(self.c.help('move'), self.c.move.__doc__)&lt;br /&gt;   self.assertEqual(self.c.help('blabla'), 'help topic not found')&lt;br /&gt;&lt;br /&gt; def test_look(self):&lt;br /&gt;   self.assertEqual(self.c.look(''), 'player1 sees ' + self.a1.view())&lt;br /&gt;   self.assertEqual(self.c.look('at my balls'), 'player1 sees nothing.')&lt;br /&gt;   self.assertEqual(self.c.look('east'), 'player1 sees ' + self.a2.view())&lt;br /&gt;  &lt;br /&gt; def test_take(self):&lt;br /&gt;   self.c.go('east')&lt;br /&gt;   self.assertEqual(self.c.take('bread'), 'player1 puts obj1 in his inventory')&lt;br /&gt;   self.assertEqual(self.p1.inventory, {'obj1':self.o1})&lt;br /&gt;   #already taken!&lt;br /&gt;   self.assertEqual(self.c.take('bread'), 'you cannot take bread')&lt;br /&gt;  &lt;br /&gt; def test_touch(self): #perv test.. :)&lt;br /&gt;   self.assertEqual(self.c.touch('self'), 'there is no self arround!')&lt;br /&gt;   self.assertNotEqual(self.c.touch('bread'), self.o1.touch())&lt;br /&gt;   self.c.go('east')&lt;br /&gt;   #kad paliesti reik pirma nueiti&lt;br /&gt;   self.assertEqual(self.c.touch('bread'), self.o1.touch())&lt;br /&gt;  &lt;br /&gt; def test_drop(self):&lt;br /&gt;   self.assertEqual(self.c.drop('smelly thing'), None)&lt;br /&gt;   self.c.go('east')&lt;br /&gt;   self.c.take('bread')&lt;br /&gt;   self.c.go('west')&lt;br /&gt;   self.assertEqual(self.c.drop('obj1'), 'obj1 was dropped..')&lt;br /&gt;   self.assertEqual(self.a1.objects, {'obj1':self.o1})&lt;br /&gt;  &lt;br /&gt; def test_say(self):&lt;br /&gt;   self.assertEqual(self.c.say('i love this game'), 'player1 says: i love this game')&lt;br /&gt;   self.assertNotEqual(self.c.say('python sucks'), 'player1 says: that\'s true!')&lt;br /&gt;  &lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;   unittest.main()   &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To run the game:&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;python mud.py&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To run the tests:&lt;br /&gt;&lt;pre&gt;python testengine.py&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Damn, I really miss such coding activities :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-195853549543014396?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=lDW6AwHy"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=ltOnZRVH"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=ltOnZRVH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=WYLPoKss"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=WYLPoKss" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=wgCejylP"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/k77Jo7tbvK4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/195853549543014396/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/python-mud-game-example.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/195853549543014396?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/195853549543014396?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/python-mud-game-example.html" title="Python MUD Game Example" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;DEAMQnc8eyp7ImA9WxRUFUw.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-5458011432195060039</id><published>2008-11-24T05:38:00.001+02:00</published><updated>2008-11-24T10:53:03.973+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-24T10:53:03.973+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="geekery" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><title>Most WTF hacker scene ever</title><content type="html">IT people know how stupid are all the details in those "Hacker" movies. This weekend I've seen &lt;a href="http://www.imdb.com/title/tt0298814/"&gt;The Core&lt;/a&gt;, which is not really a Hacker movie, but it sure had the most WTF hacker scene I've ever encountered. Get ready to learn how to get free long distance phone calls for life:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/A2ghcYF_R-0&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/A2ghcYF_R-0&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-5458011432195060039?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=oZFDPErU"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Nmv5BUxq"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=Nmv5BUxq" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=IhX53cwT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=IhX53cwT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=wZ5AAbhW"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/8POrIu3whb0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/5458011432195060039/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/most-wtf-hacker-scene-ever.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5458011432195060039?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5458011432195060039?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/most-wtf-hacker-scene-ever.html" title="Most WTF hacker scene ever" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0YNQ3o5fCp7ImA9WxRUEU0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7898691303550909038</id><published>2008-11-19T17:35:00.001+02:00</published><updated>2008-11-19T17:39:52.424+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-19T17:39:52.424+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="photography" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="hate" /><title>So long Suckr. I mean Flickr.</title><content type="html">&lt;img style="cursor:pointer; cursor:hand;width: 229px; height: 90px;" src="http://farm1.static.flickr.com/95/220662782_546666965b.jpg?v=0" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;A year or two ago I was stupid enough to go through unbelievable pain of Yahoo registration just to open a free &lt;a title="Flickr account" href="http://flickr.com/photos/somefolk" id="y4.9"&gt;Flickr account&lt;/a&gt; for keeping some of my photos. I thought &lt;a title="Flickr" href="http://www.flickr.com/" id="faw."&gt;Flickr&lt;/a&gt; was more usable than the shabby looking &lt;a title="Picasa" href="http://picasaweb.google.com/" id="gxhc"&gt;Picasa&lt;/a&gt;. Obviously I haven't bothered myself to read all the &lt;a title="details" href="http://www.flickr.com/help/limits/" id="mqep"&gt;details&lt;/a&gt;, so a while ago I found this amusing e-mail in my Yahoo inbox  (along with loads of uncaught spam, of course):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Hi somefolk,&lt;br /&gt;&lt;br /&gt;You have 192 photos stored on Flickr. Once you hit 200,&lt;br /&gt;you'll need to upgrade to a Flickr Pro account or you'll&lt;br /&gt;only be able to see your most recent 200 photos. Nothing&lt;br /&gt;will be deleted, and if you upgrade, you'll have unlimited&lt;br /&gt;space for all your things.&lt;br /&gt;&lt;br /&gt;Perhaps you'd like to purchase a Flickr pro account? Its&lt;br /&gt;unlimited and you get video and stats too!&lt;br /&gt;&lt;br /&gt;You'll even get 3 months free for purchasing before 30&lt;br /&gt;September 2008!&lt;br /&gt;&lt;br /&gt;You can learn more here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://flickr.com/yay/pronow/3mo/" target="_blank"&gt;http://flickr.com/yay/pronow/3mo/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Flickreenos&lt;br /&gt;&lt;br /&gt;*********************************************************************&lt;br /&gt;Please do not reply to this message. This is a service&lt;br /&gt;email related to your use of Flickr. To learn more about&lt;br /&gt;Flickr's use of personal information please read our&lt;br /&gt;Privacy Policy. Flickr is located at Flickr c/o Yahoo!, 701&lt;br /&gt;First Avenue, Sunnyvale, CA 94089.&lt;br /&gt;&lt;br /&gt;Go to Privacy Policy:&lt;br /&gt;&lt;a href="http://flickr.com/privacy_policy.gne" target="_blank"&gt;http://flickr.com/privacy_policy.gne&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Mothr Fuckrs&lt;/span&gt;! I was well aware of their 100MB/month limit for free accounts, but 200 photo ceiling was a surprise. Now, with a little help of &lt;a title="Migratr" href="http://www.callingshotgun.net/about/migratr/" id="rea7"&gt;Migratr&lt;/a&gt; I'm a satisfied &lt;a title="Picasa user" href="http://picasaweb.google.com/tomas.varaneckas/" id="qj6s"&gt;Picasa user&lt;/a&gt;. Hail free software.&lt;br /&gt;&lt;br /&gt;And please stop naming things with &lt;b style="color: rgb(255, 0, 0);"&gt;r&lt;/b&gt; in the rear.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7898691303550909038?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=nJx5cBDO"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=hi4irZDO"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=hi4irZDO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=QZEaUY7K"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=QZEaUY7K" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=pk6SNVal"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/1_fu3CPY-Rc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7898691303550909038/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/so-long-suckr-i-mean-flickr.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7898691303550909038?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7898691303550909038?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/so-long-suckr-i-mean-flickr.html" title="So long Suckr. I mean Flickr." /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total></entry><entry gd:etag="W/&quot;DkMNSH8zfSp7ImA9WxRVGU8.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-1212946423359079127</id><published>2008-11-17T14:16:00.002+02:00</published><updated>2008-11-17T14:21:39.185+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-17T14:21:39.185+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Disabling Emoticons in Atlassian Confluence 2.9+</title><content type="html">The quick and dirty way:&lt;br /&gt;&lt;br /&gt;1. unpack confluence/WEB-INF/lib/confluence-X.X.jar&lt;br /&gt;2. open plugins/wiki-renderer-components.xml for editing&lt;br /&gt;3. comment out or delete renderer component block where key is "emoticon" &lt;br /&gt;4. pack the file back into jar&lt;br /&gt;5. restart confluence&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-1212946423359079127?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=sXGuMKIF"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=IfSJ0uGe"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=IfSJ0uGe" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=G2rWKES9"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=G2rWKES9" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Dw22VyO7"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/X2HdJYWCvvw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/1212946423359079127/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/disabling-emoticons-in-atlassian.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1212946423359079127?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1212946423359079127?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/disabling-emoticons-in-atlassian.html" title="Disabling Emoticons in Atlassian Confluence 2.9+" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CE4NRnY5eSp7ImA9WxRVFUg.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-3471912917408331770</id><published>2008-11-11T08:04:00.004+02:00</published><updated>2008-11-13T07:09:57.821+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-13T07:09:57.821+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>InputStreamChain</title><content type="html">If you have several Java &lt;a href="http://java.sun.com/javase/6/docs/api/java/io/InputStream.html"&gt;InputStream&lt;/a&gt;s that you want to queue up into a single InputStream object, you can use this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;package com.varaneckas;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.util.LinkedList;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * {@link InputStream} implementation that allows chaining of various &lt;br /&gt; * streams for seamless sequential reading&lt;br /&gt; * &lt;br /&gt; * @author Tomas Varaneckas &amp;lt;tomas.varaneckas@gmail.com&amp;gt;&lt;br /&gt; */&lt;br /&gt;public class InputStreamChain extends InputStream {&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Input stream chain&lt;br /&gt;     */&lt;br /&gt;    private final LinkedList&amp;lt;InputStream&amp;gt; streams = new LinkedList&amp;lt;InputStream&amp;gt;();&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Currently active stream&lt;br /&gt;     */&lt;br /&gt;    private InputStream current;&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Default constructor&lt;br /&gt;     */&lt;br /&gt;    public InputStreamChain() {&lt;br /&gt;        //nothing to do&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Constructor with an initial stream&lt;br /&gt;     * &lt;br /&gt;     * @param first Initial InputStream&lt;br /&gt;     */&lt;br /&gt;    public InputStreamChain(final InputStream first) {&lt;br /&gt;        addInputStream(first);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Constructor with an array of initial streams&lt;br /&gt;     * &lt;br /&gt;     * @param streams Array of initial InputStreams&lt;br /&gt;     */&lt;br /&gt;    public InputStreamChain(final InputStream[] streams) {&lt;br /&gt;        for (InputStream stream : streams) {&lt;br /&gt;            addInputStream(stream);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Vararg constructor&lt;br /&gt;     * &lt;br /&gt;     * @param streams initial input streams&lt;br /&gt;     */&lt;br /&gt;    public InputStreamChain(final InputStream ... streams) {&lt;br /&gt;        for (InputStream stream : streams) {&lt;br /&gt;            addInputStream(stream);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Adds input stream to the end of chain&lt;br /&gt;     * &lt;br /&gt;     * @param stream InputStream to add to chain&lt;br /&gt;     * @return instance of self (for fluent calls)&lt;br /&gt;     */&lt;br /&gt;    public InputStreamChain addInputStream(final InputStream stream) {&lt;br /&gt;        streams.addLast(stream);&lt;br /&gt;        if (current == null) {&lt;br /&gt;            current = streams.removeFirst();&lt;br /&gt;        }&lt;br /&gt;        return this;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public int read() throws IOException {&lt;br /&gt;        int bit = current.read();&lt;br /&gt;        if (bit == -1 &amp;&amp; streams.size() &gt; 0) {&lt;br /&gt;            try {&lt;br /&gt;                current.close();&lt;br /&gt;            } catch (final IOException e) {&lt;br /&gt;                //replace this with a call to logging facility&lt;br /&gt;                e.printStackTrace();&lt;br /&gt;            }&lt;br /&gt;            current = streams.removeFirst();&lt;br /&gt;            bit = read();&lt;br /&gt;        }&lt;br /&gt;        return bit;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    public int available() throws IOException {&lt;br /&gt;        int available = current.available();&lt;br /&gt;        for (InputStream stream : streams) {&lt;br /&gt;            available += stream.available();&lt;br /&gt;        }&lt;br /&gt;        return available;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    public void close() throws IOException {&lt;br /&gt;        current.close();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    public boolean markSupported() {&lt;br /&gt;        return current.markSupported();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    public synchronized void mark(int i) {&lt;br /&gt;        current.mark(i);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    public synchronized void reset() throws IOException {&lt;br /&gt;        current.reset();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public long skip(long l) throws IOException {&lt;br /&gt;        return current.skip(l);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Example code:&lt;br /&gt;&lt;pre name="code" class="java"&gt;InputStream chuck = new ByteArrayInputStream("Chuck ".getBytes());&lt;br /&gt;InputStream norris = new ByteArrayInputStream("Norris".getBytes());&lt;br /&gt;InputStream chuckNorris = new InputStreamChain()&lt;br /&gt;        .addInputStream(chuck)&lt;br /&gt;        .addInputStream(norris);&lt;br /&gt;//will print "Chuck Norris"&lt;br /&gt;System.out.println(new BufferedReader(&lt;br /&gt;        new InputStreamReader(chuckNorris)).readLine());&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-3471912917408331770?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=SCGSr5Br"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=H3aB6egv"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=H3aB6egv" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=thCa1HGT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=thCa1HGT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=uC5Wj9SW"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/RwB1QxfY-I4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/3471912917408331770/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/inputstreamchain.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3471912917408331770?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3471912917408331770?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/inputstreamchain.html" title="InputStreamChain" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;DkQFQn07fCp7ImA9WxRWGUg.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6463652460172790469</id><published>2008-11-06T08:27:00.008+02:00</published><updated>2008-11-06T08:51:53.304+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T08:51:53.304+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Software design tips from the creator of C++ programming language</title><content type="html">[1] Know what you are trying to achieve&lt;br /&gt;[2] Keep in mind that software development is a human activity&lt;br /&gt;[3] Proof by analogy is fraud&lt;br /&gt;[4] Have specific and tangible aims&lt;br /&gt;[5] Don’t try technological fixes for sociological problems&lt;br /&gt;[6] Consider the longer term in design and in the treatment of people&lt;br /&gt;[7] There is no lower limit to the size of programs for which it is sensible to design before starting to code&lt;br /&gt;[8] Design processes to encourage feedback&lt;br /&gt;[9] Don’t confuse activity for progress&lt;br /&gt;[10] Don’t generalize beyond what is needed, what you have direct experience with, and what can be tested&lt;br /&gt;[11] Represent concepts as classes&lt;br /&gt;[12] There are properties of a system that should not be represented as a class&lt;br /&gt;[13] Represent hierarchical relationships between concepts as class hierarchies&lt;br /&gt;[14] Actively search for commonality in the concepts of the application and implementation and represent the resulting more general concepts as base classes&lt;br /&gt;[15] Classifications in other domains are not necessarily useful classifications in an inheritance model for an application&lt;br /&gt;[16] Design class hierarchies based on behaviour and invariants&lt;br /&gt;[17] Consider use cases&lt;br /&gt;[18] Consider using CRC cards&lt;br /&gt;[19] Use existing systems as models, as inspiration, and as starting points&lt;br /&gt;[20] Beware of viewgraph engineering&lt;br /&gt;[21] Throw a prototype away before it becomes a burden&lt;br /&gt;[22] Design for change, focusing on flexibility, extensibility, portability, and reuse&lt;br /&gt;[23] Focus on component design&lt;br /&gt;[24] Let each interface represent a concept at a single level of abstraction&lt;br /&gt;[25] Design for stability in the face of change&lt;br /&gt;[26] Make designs stable by making heavily used interfaces minimal, general, and abstract&lt;br /&gt;[27] Keep it small. Don’t add features "just in case"&lt;br /&gt;[28] Always consider alternative representations for a class. If no alternative representation is plausible, the class is probably not representing a clean concept&lt;br /&gt;[29] Repeatedly review and refine both the design and the implementation&lt;br /&gt;[30] Use the best tools available for testing and for analysing the problem, the design, and the implementation&lt;br /&gt;[31] Experiment, analyse, and test as early as possible and as often as possible&lt;br /&gt;[32] Don’t forget about efficiency&lt;br /&gt;[33] Keep the level of formality appropriate to the scale of the project&lt;br /&gt;[34] Make sure that someone is in charge of the overall design&lt;br /&gt;[35] Document, market, and support reusable components&lt;br /&gt;[36] Document aims and principles as well as details&lt;br /&gt;[37] Provide tutorials for new developers as part of the documentation&lt;br /&gt;[38] Reward and encourage reuse of designs, libraries, and classes&lt;br /&gt;&lt;br /&gt;I found these great tips in a classic programming book: &lt;a href="http://www.amazon.com/Programming-Language-3rd-Bjarne-Stroustrup/dp/0201889544?tag=paranoengine-20"&gt;The C++ Programming Language Third Edition&lt;/a&gt; by &lt;a href="http://en.wikipedia.org/wiki/Bjarne_Stroustrup"&gt;Bjarne Stroustrup&lt;/a&gt;, the creator of &lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;. If you want to learn C++ or deepen your knowledge, this is The Book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6463652460172790469?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=QdotUUho"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=RjF7hVbT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=RjF7hVbT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=qQoMoFEn"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=qQoMoFEn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=pfYkjgNJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/0ueWOHw_QmI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6463652460172790469/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/software-design-tips-from-creator-of-c.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6463652460172790469?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6463652460172790469?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/11/software-design-tips-from-creator-of-c.html" title="Software design tips from the creator of C++ programming language" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0ECR3k-eip7ImA9WxRWEks.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-5757610084993314759</id><published>2008-10-28T19:49:00.001+02:00</published><updated>2008-10-29T09:34:26.752+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-29T09:34:26.752+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="games" /><category scheme="http://www.blogger.com/atom/ns#" term="geekery" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><title>Stuck on games</title><content type="html">I'm not much of a gamer, but this autumn is something terrible - there are at least three new time wasters for PC that I must get my hands on. &lt;br /&gt;&lt;br /&gt;Bully: Scholarship Edition&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/j4JOWzYc8Nw&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/j4JOWzYc8Nw&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Fallout 3&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/3S7aNgHjN80&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/3S7aNgHjN80&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;and finally, Grand Theft Auto IV&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/c8Y0MT0PX_k&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/c8Y0MT0PX_k&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Time to disconnect...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-5757610084993314759?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=2kpICeNX"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=DamprBTS"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=DamprBTS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=6XI9aSEa"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=6XI9aSEa" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=euwffFEu"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/ekSrLdNQtkw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/5757610084993314759/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/10/stuck-on-games.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5757610084993314759?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5757610084993314759?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/10/stuck-on-games.html" title="Stuck on games" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A04BQn05eip7ImA9WxRQE0k.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-3444337046325583248</id><published>2008-10-07T05:51:00.011+03:00</published><updated>2008-10-07T06:25:53.322+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-07T06:25:53.322+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><category scheme="http://www.blogger.com/atom/ns#" term="hawkscope" /><title>Hawkscope 0.2.0</title><content type="html">This little peace of software has lately become my passion that reminds me of those days when I was programming 16 hours a day 7 days a week. Anyway, here are the highlights for the new &lt;a href="http://hawkscope.googlecode.com/files/hawkscope-0.2.0.jar"&gt;Hawkscope 0.2.0&lt;/a&gt;:&lt;br /&gt;&lt;li&gt;Size dropped down from 740Kb to 122Kb.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fixed bugs that prevented writing the &lt;a href="http://code.google.com/p/hawkscope/wiki/UsingHawkscope#Configuration"&gt;configuration&lt;/a&gt; file in Windows and reading it in all OS.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Added &lt;em&gt;Quick Access List&lt;/em&gt; menu that allows custom folders to be listed on top of all partitions. User home is there by default. This list can contain dynamic variables like Java properties (&lt;code&gt;${user.home}/Desktop&lt;/code&gt;) or environmental variables (&lt;code&gt;${$JAVA_HOME}&lt;/code&gt;). Read the &lt;a href="http://code.google.com/p/hawkscope/wiki/UsingHawkscope#Configuration"&gt;User Guide&lt;/a&gt; to find out how to configure your own Quick Access List. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Floppy drives are ignored by default to avoid annoying device buzz whenever mouse travels over floppy disk entry. This can be turned back on by changing &lt;code&gt;display.floppy&lt;/code&gt; property to "1". By the way, same thing can be done with hidden files. They are hidden by default, but there is &lt;code&gt;display.hidden&lt;/code&gt; property in &lt;code&gt;[user_home]/.hawkscope.properties&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Improvements in About and Error dialogs. You can now copy nicely formatted bug reports to Clipboard for easy submission. If you use Hawkscope and find anything suspicious, please, copy the report and add &lt;a href="http://code.google.com/p/hawkscope/issues/entry"&gt;new issue&lt;/a&gt;, it takes just 10-20 seconds.&lt;/li&gt;&lt;br /&gt;You can find more changes in Hawkscope &lt;a href="http://code.google.com/p/hawkscope/wiki/Changelog"&gt;Changelog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's how the new version looks on Windows Vista:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://hawkscope.googlecode.com"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px;" src="http://lh3.ggpht.com/tomas.varaneckas/SOpVcc9DZDI/AAAAAAAAAPk/g_vpEubT5FA/s800/hawkscope.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned for future improvements that include a full blown plugin system, GUI driven configuration and more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-3444337046325583248?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=RVVcC8N0"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=CRJeoTUp"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=CRJeoTUp" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=U0AtjUJM"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=U0AtjUJM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=uY650Tgs"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/mpTw3ZAUl54" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/3444337046325583248/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/10/hawkscope-020.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3444337046325583248?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3444337046325583248?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/10/hawkscope-020.html" title="Hawkscope 0.2.0" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/tomas.varaneckas/SOpVcc9DZDI/AAAAAAAAAPk/g_vpEubT5FA/s72-c/hawkscope.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0cERHs9cCp7ImA9WxRRFko.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-2774081816401223306</id><published>2008-09-29T11:55:00.004+03:00</published><updated>2008-09-29T12:03:25.568+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-29T12:03:25.568+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nonsense" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="sarcasm" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>Windows Server 2008?.. Anyone?.. Please?..</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SOCYZ2Hg_TI/AAAAAAAAAPE/ATaqp_1O-TM/s1600-h/windows.server.2008.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SOCYZ2Hg_TI/AAAAAAAAAPE/ATaqp_1O-TM/s800/windows.server.2008.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5251364735305186610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5 ads mentioning Windows Server 2008 &lt;strong&gt;7 times&lt;/strong&gt; in one screen. Wow. Go Microsoft!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-2774081816401223306?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=UIzrElpJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=qIESo70V"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=qIESo70V" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=dHaHwPwf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=dHaHwPwf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=H0rQFFD1"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/h8_8gJBa7i8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/2774081816401223306/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/windows-2008-server-anyone-please.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2774081816401223306?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2774081816401223306?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/windows-2008-server-anyone-please.html" title="Windows Server 2008?.. Anyone?.. Please?.." /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SOCYZ2Hg_TI/AAAAAAAAAPE/ATaqp_1O-TM/s72-c/windows.server.2008.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A04NRXc5fyp7ImA9WxRRFk0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-1590224068330516526</id><published>2008-09-28T16:32:00.010+03:00</published><updated>2008-09-28T16:53:14.927+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-28T16:53:14.927+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><category scheme="http://www.blogger.com/atom/ns#" term="hawkscope" /><title>Hawkscope: System Tray File Browser</title><content type="html">I'm happy to announce the first usable release of my new weekend project. It's &lt;a href="http://hawkscope.googlecode.com"&gt;Hawkscope&lt;/a&gt; - a simple productivity tool that allows you to find and open any file or folder in seconds by single-clicking a tray icon and navigating through dynamically generated menus that reflect the contents of your available file systems.  &lt;br /&gt;&lt;br /&gt;Hawkscope is &lt;a href="http://code.google.com/p/hawkscope/source/browse/"&gt;open source&lt;/a&gt;, it's built with Java 1.6, therefore it doesn't run on Mac OS X (for now...), even with &lt;a href="http://paranoid-engineering.blogspot.com/2008/09/java-6-on-32-bit-intel-mac.html"&gt;SoyLatte &lt;/a&gt; JDK. I tested it on Windows (XP and Vista) and Linux (Ubuntu + Gnome). Should work perfectly where Java 6 &lt;a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/"&gt;System Tray&lt;/a&gt; and &lt;a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/desktop_api/"&gt;Desktop API&lt;/a&gt; are supported.&lt;br /&gt;&lt;br /&gt;Here's how it looks on Windows Vista (running inside &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SN-IwUI0ODI/AAAAAAAAAO0/utXne_iBpkw/s1600-h/hawkscope1.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SN-IwUI0ODI/AAAAAAAAAO0/utXne_iBpkw/s800/hawkscope1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5251066054158071858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And on my Ubuntu:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/tomas.varaneckas/SN-KNLLUSyI/AAAAAAAAAO8/Lz7h6vMjQV4/s800/hawkscope2.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://lh4.ggpht.com/tomas.varaneckas/SN-KNLLUSyI/AAAAAAAAAO8/Lz7h6vMjQV4/s800/hawkscope2.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can always download latest release &lt;a href="http://code.google.com/p/hawkscope/downloads/list"&gt;here&lt;/a&gt;. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-1590224068330516526?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=IYcgQEAi"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=IlymnhJl"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=IlymnhJl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=qMsF465T"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=qMsF465T" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=YdEvVaeu"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/SxFExotozGg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/1590224068330516526/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/hawkscope-system-tray-file-browser.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1590224068330516526?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1590224068330516526?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/hawkscope-system-tray-file-browser.html" title="Hawkscope: System Tray File Browser" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SN-IwUI0ODI/AAAAAAAAAO0/utXne_iBpkw/s72-c/hawkscope1.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0MMSXk4eCp7ImA9WxRRFE0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-8645349264199056162</id><published>2008-09-26T07:56:00.003+03:00</published><updated>2008-09-26T08:04:48.730+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-26T08:04:48.730+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><title>Java 6 on 32-bit Intel Mac</title><content type="html">Dying to have Java 6 on an older, non Core 2 Duo Intel Mac? You should get &lt;a href="http://landonf.bikemonkey.org/static/soylatte/"&gt;SoyLatte&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;SoyLatte is a functional, X11-based port of the &lt;a href="http://www.eyesbeyond.com/freebsddom/java/jdk16.html"&gt;FreeBSD Java 1.6 patchset&lt;/a&gt; to Mac OS X Intel machines. SoyLatte is initially focused on supporting Java 6 development; however, the long-term view far more captivating: open development of Java 7 for Mac OS X, with a release available in concert with the official Sun release, supported on all recent versions of Mac OS X.&lt;br /&gt;&lt;br /&gt;It lacks some features like system tray support, but overall these folks are doing a way better job than the official &lt;a href="http://developer.apple.com/java/"&gt;Apple Java&lt;/a&gt; team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-8645349264199056162?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=nx3rEA30"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=gFyNUmYI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=gFyNUmYI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=zMIBL47d"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=zMIBL47d" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=McFBC7eZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/NzCbOhYnBqs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/8645349264199056162/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/java-6-on-32-bit-intel-mac.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8645349264199056162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8645349264199056162?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/java-6-on-32-bit-intel-mac.html" title="Java 6 on 32-bit Intel Mac" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0IDQXY_eSp7ImA9WxRREko.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6841493620033073280</id><published>2008-09-24T17:30:00.011+03:00</published><updated>2008-09-24T21:06:10.841+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-24T21:06:10.841+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="sarcasm" /><category scheme="http://www.blogger.com/atom/ns#" term="hate" /><category scheme="http://www.blogger.com/atom/ns#" term="being social" /><title>Crap Overflow</title><content type="html">What happens when two amazing Windows developers like &lt;a href="http://www.joelonsoftware.com"&gt;Joel Spolsky&lt;/a&gt;, the great creator of &lt;a href="http://www.fogcreek.com/FogBugz/"&gt;FagBugz&lt;/a&gt; - a &lt;a href="http://www.joelonsoftware.com/items/2006/09/01.html"&gt;Wassabi&lt;/a&gt; driven &lt;a href="http://www.zedshaw.com/rants/fortune_favors_big_turds.html"&gt;bug tracker for MBAs&lt;/a&gt; and &lt;a href="http://www.codinghorror.com"&gt;Jeff Atwood&lt;/a&gt;, a... Umm... Nerd who has a popular blog that is full of crap but did nothing else in his life join forces? Yes, you get &lt;a href="http://www.stackoverflow.com" title="Crap Overflow"&gt;Crap Overflow&lt;/a&gt;. A social networking wiki blog forum failure full of &lt;strike&gt;dorks&lt;/strike&gt; career programmers who walk around and mumble "Yupp.. I know this one.. Yupp.. Bla blah blah.. Yupp.. Oh yeaaaahh... Another &lt;a href="http://stackoverflow.com/badges"&gt;badge&lt;/a&gt; is mine!.. I'll go fill my TPS report now... Yeaaahhhh..."&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stackoverflow.com/about"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SNpTkw5WefI/AAAAAAAAANc/mUkI5qOzDzU/s400/CrapOverflow.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5249600206719580658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let me guess. The site is built with &lt;a href="http://builtwith.com/?www.stackoverflow.com"&gt;ASP.NET&lt;/a&gt; and hosted on &lt;a href="http://www.crystaltech.com/dedicated-windows.aspx"&gt;Windows server&lt;/a&gt;. I bet most visitors use Windows Vista + Internet Explorer to browse that piece of shit. By the way, Joel, why didn't you use your awesome &lt;a href="http://www.joelonsoftware.com/items/2006/09/01b.html"&gt;Wassabi&lt;/a&gt;? It has to be like so better than ASP.NET, like seriously.&lt;br /&gt;&lt;br /&gt;There's more. The &lt;a href="http://stackoverflow.com/users/21318/jason-n-gaylord"&gt;average user&lt;/a&gt;... And an &lt;a href="http://stackoverflow.uservoice.com/pages/general/suggestions/28099"&gt;average suggestion&lt;/a&gt; by the community for the makers... &lt;br /&gt;&lt;br /&gt;What can I say. Great site folks! Please make this great service cost at least $19/month when your public beta is over. Please, really.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6841493620033073280?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=HDDTRW3a"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=EF8lfAgW"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=EF8lfAgW" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=1i7yKF8h"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=1i7yKF8h" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=7JuG96WZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/rxlf2USIJJY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6841493620033073280/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/crap-overflow.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6841493620033073280?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6841493620033073280?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/crap-overflow.html" title="Crap Overflow" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SNpTkw5WefI/AAAAAAAAANc/mUkI5qOzDzU/s72-c/CrapOverflow.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;AkMCRXk9fCp7ImA9WxRSF0s.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-4298792356598814120</id><published>2008-09-18T22:47:00.008+03:00</published><updated>2008-09-18T23:07:44.764+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-18T23:07:44.764+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Eclipse Template: Singleton Pattern</title><content type="html">Are you writing your Java classes as &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;Singletons&lt;/a&gt; quite often? Use this Eclipse template and make any class a singleton in two seconds:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Go to Window -&gt; Preferences -&gt; Java -&gt; Editor -&gt; Templates. Create New:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SNKxZyuoYdI/AAAAAAAAANE/5KXdeT4O8I8/s1600-h/singleton.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SNKxZyuoYdI/AAAAAAAAANE/5KXdeT4O8I8/s800/singleton.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5247451572512252370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:grey;"&gt;Code for copy paste:&lt;br /&gt;&lt;code&gt;private static final ${enclosing_type} instance = new ${enclosing_type}();&lt;br /&gt;private ${enclosing_type}() {}&lt;br /&gt;public static ${enclosing_type} getInstance() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return instance;&lt;br /&gt;}&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Type "single" or "singleton", hit Content Assist shortcut key (ctrl+space by default), then enter:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SNKyWcXvMtI/AAAAAAAAANM/BPW7HWhN5V4/s1600-h/singleton2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SNKyWcXvMtI/AAAAAAAAANM/BPW7HWhN5V4/s800/singleton2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5247452614482670290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And there you go - a singleton in two seconds (actual time may vary on your typing and CPU speed).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SNKzGBQhddI/AAAAAAAAANU/OgxyxwHRtBI/s1600-h/singleton3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SNKzGBQhddI/AAAAAAAAANU/OgxyxwHRtBI/s800/singleton3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5247453431838373330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You may want to use a different Singleton implementation. Check out &lt;a href="http://electrotek.wordpress.com/2008/08/06/singleton-in-java-the-proper-way/"&gt;Java Singleton: The Proper Way&lt;/a&gt; for a good example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-4298792356598814120?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=SLjMU3Vy"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=ETirFvCh"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=ETirFvCh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=6MfW3D4R"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=6MfW3D4R" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=QQTz4Lim"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/mAec8ROIL18" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/4298792356598814120/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/eclipse-template-singleton-pattern.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4298792356598814120?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4298792356598814120?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/eclipse-template-singleton-pattern.html" title="Eclipse Template: Singleton Pattern" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SNKxZyuoYdI/AAAAAAAAANE/5KXdeT4O8I8/s72-c/singleton.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry gd:etag="W/&quot;CEIARno_eip7ImA9WxRTFE8.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7997965204467079232</id><published>2008-09-01T07:18:00.002+03:00</published><updated>2008-09-03T09:15:47.442+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-03T09:15:47.442+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Add loggers to your Java code in seconds using Eclipse Templates</title><content type="html">Custom Eclipse Templates can greatly increase your productivity by automating daily development. For instance, instead of creating Apache Commons Logging loggers by hand, you can do this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Go to Window -&gt; Preferences -&gt; Java -&gt; Editor -&gt; Templates. Create New:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SL4rRh0y_qI/AAAAAAAAAM8/_ZWHV43dR8Y/s1600-h/log.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SL4rRh0y_qI/AAAAAAAAAM8/_ZWHV43dR8Y/s800/log.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5241674596443422370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Type "log", hit Content Assist shortcut key (ctrl+space by default), then enter:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SLuOnYhd6qI/AAAAAAAAAMY/5yup14pn5Bc/s1600-h/1.1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SLuOnYhd6qI/AAAAAAAAAMY/5yup14pn5Bc/s800/1.1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5240939398624570018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hit Ctrl+Shift+O to import Log and LogFactory:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SLuPBYDdcCI/AAAAAAAAAMg/l4AFB1z8xzw/s1600-h/2.1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SLuPBYDdcCI/AAAAAAAAAMg/l4AFB1z8xzw/s800/2.1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5240939845175308322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saves hell of a time in the long run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7997965204467079232?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=SlUF3WBk"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Tm9NvAPd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=Tm9NvAPd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=RD0x2Ip7"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=RD0x2Ip7" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=gYx0PzWj"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/90E9UTXeytY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7997965204467079232/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/add-loggers-in-your-java-code-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7997965204467079232?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7997965204467079232?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/09/add-loggers-in-your-java-code-in.html" title="Add loggers to your Java code in seconds using Eclipse Templates" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SL4rRh0y_qI/AAAAAAAAAM8/_ZWHV43dR8Y/s72-c/log.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;Dk4EQHs5eip7ImA9WxdUFE4.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6268073048212080098</id><published>2008-07-30T18:45:00.007+03:00</published><updated>2008-07-30T19:21:41.522+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-30T19:21:41.522+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="geekery" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="toys" /><title>Geek Sports: Power Ball</title><content type="html">A while ago I've bought myself a new toy which is actually a quite competitive workout tool. Behold, the Power Ball Gyroscope:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.nsdball.com/"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SJCM2hq1OHI/AAAAAAAAALQ/W-tfmJe9YqA/s400/PB188C.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5228834035755989106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The idea behind this ball is that when you twist it in your hand, the inner ball is spinning and accumulating force that you generated. The stronger you twist, the heavier the ball gets. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm spinning my power ball whenever I get a spare minute or two, it's great during long walks and when you want to kill some time. The ball actually has &lt;a href="http://www.powerballs.com/rehab.php?m=Benefits"&gt;benefits for your health&lt;/a&gt;, especially if you're a geek like me who spends most of his day banging a keyboard. A short list of things that Power Ball prevents:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Carpal Tunnel Syndrome (CTS)&lt;br /&gt;&lt;li&gt;Arthritis&lt;br /&gt;&lt;li&gt;Repetitive Strain Injury (RSI)&lt;br /&gt;&lt;li&gt;Wrist Injury / Break&lt;br /&gt;&lt;li&gt;Tendonitis&lt;br /&gt;&lt;li&gt;Tennis Elbow / Golf Elbow&lt;/ul&gt;&lt;br /&gt;See how it works:&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ZctcZ-DsNBs&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ZctcZ-DsNBs&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;There are various versions, simple (the one I've got), with speedometers, with neon lights, etc. Make a choice and have both fun and good health!&lt;br /&gt;&lt;a href="http://www.amazon.com/Dynaflex-Sports-Exerciser-Official-Training/dp/B000F006TA/?tag=paranoengine-20"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SJCQlji6iiI/AAAAAAAAALY/MwT8zIjD8FY/s400/21pIvX%2B0xiL._SL500_AA160_.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5228838142248389154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/DynaFlat-Dynaflex-Powerball-With-Speedometer/dp/B00065V0CG/?tag=paranoengine-20"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SJCTSn692BI/AAAAAAAAALg/N-D5Vubh4wg/s400/31SkdqwOF1L._SL500_AA250_.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5228841115540379666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/12050-Dynaflex-Powerball-Gyroscope/dp/B000ALKS74/?tag=paranoengine-20"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SJCUMl-bfJI/AAAAAAAAALo/mVLUeIanJ9E/s400/21SQTZX1QRL._SL500_AA220_.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5228842111450446994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But heed my warning. It's damn addictive...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6268073048212080098?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=lr3LfKpx"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=pstyFDDE"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=pstyFDDE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=0cAF9ItW"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=0cAF9ItW" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=jilHkjAV"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/nwW8dBTDc4U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6268073048212080098/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/geek-sports-power-ball.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6268073048212080098?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6268073048212080098?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/geek-sports-power-ball.html" title="Geek Sports: Power Ball" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SJCM2hq1OHI/AAAAAAAAALQ/W-tfmJe9YqA/s72-c/PB188C.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;D0MERnk_eip7ImA9WxVVGEg.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7086936917364999737</id><published>2008-07-25T09:47:00.011+03:00</published><updated>2009-03-12T12:56:47.742+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T12:56:47.742+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Slap your Java code hard with Maven and PMD</title><content type="html">How good you think your code is? How can you be sure it's optimal, bug and bullet proof? Unit Tests? In case the coverage is good, they will tell if your code works, but will it tell if and where your code sucks in general? Let's get down to business.&lt;br /&gt;&lt;br /&gt;As &lt;a target="_blank" href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; is used de facto for Java builds, I assume you're using it. You may have heard of &lt;a target="_blank" href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;, but have you tried it? If you have, did you know that it has a nice &lt;a target="_blank" href="http://maven.apache.org/plugins/maven-pmd-plugin/"&gt;Maven Plugin&lt;/a&gt;? A quick way to integrate it:&lt;br /&gt;&lt;br /&gt;Add the following to your pom.xml. Sadly, default check rulesets are too friendly, so you may want to try my configuration (even the "too hardcore" block):&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;project&gt;&lt;br /&gt; &lt;!-- ... --&gt;&lt;br /&gt; &lt;reporting&gt;&lt;br /&gt;   &lt;plugins&gt;&lt;br /&gt;     &lt;plugin&gt;&lt;br /&gt;       &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;&lt;br /&gt;       &lt;artifactId&gt;maven-jxr-plugin&lt;/artifactId&gt;&lt;br /&gt;     &lt;/plugin&gt;&lt;br /&gt;     &lt;plugin&gt;&lt;br /&gt;       &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;&lt;br /&gt;       &lt;artifactId&gt;maven-pmd-plugin&lt;/artifactId&gt;&lt;br /&gt;       &lt;configuration&gt;&lt;br /&gt;         &lt;rulesets&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/basic.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/braces.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/clone.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/codesize.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/coupling.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/favorites.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/finalizers.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/imports.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/junit.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/migrating_to_15.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/optimizations.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/typeresolution.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/unusedcode.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;ruleset&gt;rulesets/strings.xml&lt;/ruleset&gt;&lt;br /&gt;           &lt;!-- too hardcore             &lt;br /&gt;             &lt;ruleset&gt;rulesets/controversial.xml&lt;/ruleset&gt;           &lt;br /&gt;             &lt;ruleset&gt;rulesets/design.xml&lt;/ruleset&gt;         &lt;br /&gt;             &lt;ruleset&gt;rulesets/logging-java.xml&lt;/ruleset&gt;          &lt;br /&gt;             &lt;ruleset&gt;rulesets/strictexception.xml&lt;/ruleset&gt;          &lt;br /&gt;             &lt;ruleset&gt;rulesets/naming.xml&lt;/ruleset&gt;       &lt;br /&gt;         --&gt;          &lt;br /&gt;         &lt;/rulesets&gt;&lt;br /&gt;         &lt;linkXRef&gt;true&lt;/linkXRef&gt;&lt;br /&gt;         &lt;includeTests&gt;true&lt;/includeTests&gt;&lt;br /&gt;         &lt;sourceEncoding&gt;utf-8&lt;/sourceEncoding&gt;&lt;br /&gt;         &lt;minimumPriority&gt;5&lt;/minimumPriority&gt;&lt;br /&gt;         &lt;minimumTokens&gt;20&lt;/minimumTokens&gt;&lt;br /&gt;         &lt;targetJdk&gt;1.5&lt;/targetJdk&gt;&lt;br /&gt;       &lt;/configuration&gt;&lt;br /&gt;     &lt;/plugin&gt;&lt;br /&gt;   &lt;/plugins&gt;&lt;br /&gt; &lt;/reporting&gt;&lt;br /&gt; &lt;!-- ... --&gt;&lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To generate a report, simply run:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mvn pmd:pmd&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;You may want to build Java cross reference for links to source code to work:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mvn jxr:jxr&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Finally, open the report and see how naughty the code is:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;target/site/pmd.html&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Watch out for &lt;a target="_blank" href="http://www.onjava.com/pub/a/onjava/2004/06/16/ccunittest.html"&gt;Cyclomatic Complexity&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7086936917364999737?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=wkCWYeDL"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=UciWfMtx"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=UciWfMtx" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=sYx18efZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=sYx18efZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=1t2abpWV"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/tuc4lSMif54" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7086936917364999737/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/slap-your-java-code-hard-with-maven-and.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7086936917364999737?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7086936917364999737?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/slap-your-java-code-hard-with-maven-and.html" title="Slap your Java code hard with Maven and PMD" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;D0IMQHw5fyp7ImA9WxdVGU0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-2058117882199075630</id><published>2008-07-24T13:32:00.005+03:00</published><updated>2008-07-24T16:19:41.227+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-24T16:19:41.227+03:00</app:edited><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="hate" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>I Hate Oracle Stuff</title><content type="html">Want a mug with this on it?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SIha6hvcT9I/AAAAAAAAALA/k8xLZkjj3Ko/s1600-h/998301.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SIha6hvcT9I/AAAAAAAAALA/k8xLZkjj3Ko/s400/998301.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5226527329099730898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Or a T-Shirt?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SIhaUxhsqXI/AAAAAAAAAK4/2p-BATIhoms/s1600-h/jitcrunch.aspx.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SIhaUxhsqXI/AAAAAAAAAK4/2p-BATIhoms/s400/jitcrunch.aspx.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5226526680502020466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Get yours &lt;a href="http://www.cafepress.com/oraclehaters"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-2058117882199075630?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=ZnA2DggT"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=5Kz7FQGP"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=5Kz7FQGP" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=luL4dAjB"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=luL4dAjB" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=3KnjYov5"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/MukAIwQBnLo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/2058117882199075630/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/oracle-t-shirts.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2058117882199075630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2058117882199075630?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/oracle-t-shirts.html" title="I Hate Oracle Stuff" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SIha6hvcT9I/AAAAAAAAALA/k8xLZkjj3Ko/s72-c/998301.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CkQNQH0-fSp7ImA9WxdVFE0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-4903400661744916683</id><published>2008-07-18T17:28:00.012+03:00</published><updated>2008-07-18T19:59:51.355+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-18T19:59:51.355+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="geekery" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><title>Best of Jargon File</title><content type="html">My favorite definitions from &lt;a href="http://www.catb.org/jargon/"&gt;Jargon File&lt;/a&gt; (AKA, &lt;span style="font-weight: bold;"&gt;The New Hacker's Dictionary&lt;/span&gt;)&lt;b id="l._6"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;brute force and ignorance&lt;/b&gt;: &lt;span id="l._60" class="grammar"&gt;n.&lt;/span&gt;&lt;dd id="l._61"&gt;&lt;p id="l._62"&gt; A popular design technique at many software houses —    &lt;a id="l._63" href="http://www.catb.org/%7Eesr/jargon/html/B/brute-force.html"&gt;&lt;i id="l._64" class="glossterm"&gt;brute force&lt;/i&gt;&lt;/a&gt; coding unrelieved by any knowledge of    how problems have been previously solved in elegant ways.  Dogmatic    adherence to design methodologies tends to encourage this sort of thing.    Characteristic of early &lt;a id="l._65" href="http://www.catb.org/%7Eesr/jargon/html/L/larval-stage.html"&gt;&lt;i id="l._66" class="glossterm"&gt;larval stage&lt;/i&gt;&lt;/a&gt; programming;    unfortunately, many never outgrow it.  Often abbreviated BFI: “&lt;span id="l._67" class="quote"&gt;Gak,    they used a &lt;a id="l._68" href="http://www.catb.org/%7Eesr/jargon/html/B/bubble-sort.html"&gt;&lt;i id="l._69" class="glossterm"&gt;bubble sort&lt;/i&gt;&lt;/a&gt;!  That's strictly from    BFI.&lt;/span&gt;” Compare &lt;a id="l._610" href="http://www.catb.org/%7Eesr/jargon/html/B/bogosity.html"&gt;&lt;i id="l._611" class="glossterm"&gt;bogosity&lt;/i&gt;&lt;/a&gt;.  A very similar usage    is said to be mainstream in Great Britain.&lt;/p&gt;&lt;/dd&gt;&lt;dt id="zj550"&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dt id="BOFH"&gt;&lt;b id="zj553"&gt;BOFH&lt;/b&gt;: &lt;span id="zj554" class="pronunciation"&gt;//&lt;/span&gt;, &lt;span id="zj555" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="zj556"&gt;&lt;p id="zj557"&gt; [common] Acronym, Bastard Operator From Hell.  A system    administrator with absolutely no tolerance for    &lt;a id="zj559" href="http://www.catb.org/%7Eesr/jargon/html/L/luser.html"&gt;&lt;i id="zj5510" class="glossterm"&gt;luser&lt;/i&gt;&lt;/a&gt;s.  “&lt;span id="zj5511" class="quote"&gt;You say you need more filespace?    &lt;massive-global-delete&gt; Seems to me you have plenty left...&lt;/massive-global-delete&gt;&lt;/span&gt;”    Many BOFHs (and others who would be BOFHs if they could get away with it)    hang out in the newsgroup &lt;tt id="zj5512" class="systemitem"&gt;alt.sysadmin.recovery&lt;/tt&gt;, although there has    also been created a top-level newsgroup hierarchy (&lt;tt id="zj5513" class="systemitem"&gt;bofh.*&lt;/tt&gt;) of their own.&lt;/p&gt;&lt;p id="zj5514"&gt;Several people have written stories about BOFHs. The set usually    considered canonical is by Simon Travaglia and may be found at the &lt;a id="zj5515" href="http://bofh.ntk.net/Bastard.html" target="_top"&gt;Bastard Home Page&lt;/a&gt;. BOFHs    and BOFH wannabes hang out on &lt;a id="zj5516" href="http://www.catb.org/%7Eesr/jargon/html/S/scary-devil-monastery.html"&gt;&lt;i id="zj5517" class="glossterm"&gt;scary devil monastery&lt;/i&gt;&lt;/a&gt;    and wield &lt;a id="zj5518" href="http://www.catb.org/%7Eesr/jargon/html/L/LART.html"&gt;&lt;i id="zj5519" class="glossterm"&gt;LART&lt;/i&gt;&lt;/a&gt;s.&lt;/p&gt;&lt;/dd&gt;  &lt;dt id="buried-treasure"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="l._613"&gt;&lt;b id="l._615"&gt;buried treasure&lt;/b&gt;: &lt;span id="l._616" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._617"&gt;&lt;p id="l._618"&gt; A surprising piece of code found in some program.  While usually not    wrong, it tends to vary from &lt;a id="l._620" href="http://www.catb.org/%7Eesr/jargon/html/C/crufty.html"&gt;&lt;i id="l._621" class="glossterm"&gt;crufty&lt;/i&gt;&lt;/a&gt; to    &lt;a id="l._622" href="http://www.catb.org/%7Eesr/jargon/html/B/bletcherous.html"&gt;&lt;i id="l._623" class="glossterm"&gt;bletcherous&lt;/i&gt;&lt;/a&gt;, and has lain undiscovered only because    it was functionally correct, however horrible it is.  Used sarcastically,    because what is found is anything &lt;span id="l._624" class="emphasis"&gt;&lt;i id="l._625"&gt;but&lt;/i&gt;&lt;/span&gt; treasure.    Buried treasure almost always needs to be dug up and removed.  “&lt;span id="l._626" class="quote"&gt;I    just found that the scheduler sorts its queue using     &lt;a id="l._627" href="http://www.catb.org/%7Eesr/jargon/html/B/bubble-sort.html"&gt;&lt;i id="l._628" class="glossterm"&gt;bubble sort&lt;/i&gt;&lt;/a&gt;!  Buried treasure!&lt;/span&gt;”&lt;/p&gt;&lt;/dd&gt; &lt;dt id="l._631"&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dt id="code-police"&gt;&lt;b id="l._633"&gt;code police&lt;/b&gt;: &lt;span id="l._634" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._635"&gt;&lt;p id="l._636"&gt; [by analogy with George Orwell's ‘thought police’] A    mythical team of Gestapo-like storm troopers that might burst into one's    office and arrest one for violating programming style rules.  May be used    either seriously, to underline a claim that a particular style violation is    dangerous, or ironically, to suggest that the practice under discussion is    condemned mainly by anal-retentive &lt;a id="l._638" href="http://www.catb.org/%7Eesr/jargon/html/W/weenie.html"&gt;&lt;i id="l._639" class="glossterm"&gt;weenie&lt;/i&gt;&lt;/a&gt;s.    “&lt;span id="l._640" class="quote"&gt;Dike out that goto or the code police will get you!&lt;/span&gt;” The    ironic usage is perhaps more common.&lt;/p&gt;&lt;/dd&gt; &lt;dt id="l._643"&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dt id="cow-orker"&gt;&lt;b id="l._645"&gt;cow orker&lt;/b&gt;: &lt;span id="l._646" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._647"&gt;&lt;p id="l._648"&gt; [Usenet] n. fortuitous typo for co-worker, widely used in Usenet,    with perhaps a hint that orking cows is illegal.  This term was popularized    by Scott Adams (the creator of &lt;a id="l._650" href="http://www.catb.org/%7Eesr/jargon/html/D/Dilbert.html"&gt;&lt;i id="l._651" class="glossterm"&gt;Dilbert&lt;/i&gt;&lt;/a&gt;) but already    appears in the January 1996 version of the     &lt;a id="l._652" href="http://www.catb.org/%7Eesr/jargon/html/S/scary-devil-monastery.html"&gt;&lt;i id="l._653" class="glossterm"&gt;scary devil monastery&lt;/i&gt;&lt;/a&gt; FAQ, and has been traced back to a 1989    &lt;a id="l._654" href="http://www.catb.org/%7Eesr/jargon/html/S/sig-block.html"&gt;&lt;i id="l._655" class="glossterm"&gt;sig block&lt;/i&gt;&lt;/a&gt;. Compare &lt;a id="l._656" href="http://www.catb.org/%7Eesr/jargon/html/H/hing.html"&gt;&lt;i id="l._657" class="glossterm"&gt;hing&lt;/i&gt;&lt;/a&gt;,    &lt;a id="l._658" href="http://www.catb.org/%7Eesr/jargon/html/G/grilf.html"&gt;&lt;i id="l._659" class="glossterm"&gt;grilf&lt;/i&gt;&lt;/a&gt;, &lt;a id="l._660" href="http://www.catb.org/%7Eesr/jargon/html/F/filk.html"&gt;&lt;i id="l._661" class="glossterm"&gt;filk&lt;/i&gt;&lt;/a&gt;,    &lt;a id="l._662" href="http://www.catb.org/%7Eesr/jargon/html/N/newsfroup.html"&gt;&lt;i id="l._663" class="glossterm"&gt;newsfroup&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/dd&gt; &lt;dt id="l._666"&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dt id="eyeball-search"&gt;&lt;b id="l._668"&gt;eyeball search&lt;/b&gt;: &lt;span id="l._669" class="grammar"&gt;n.,v.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._670"&gt;&lt;p id="l._671"&gt; To look for something in a mass of code or data with one's own    native optical sensors, as opposed to using some sort of pattern matching    software like &lt;a id="l._673" href="http://www.catb.org/%7Eesr/jargon/html/G/grep.html"&gt;&lt;i id="l._674" class="glossterm"&gt;grep&lt;/i&gt;&lt;/a&gt; or any other automated search    tool.  Also called a &lt;a id="l._675" href="http://www.catb.org/%7Eesr/jargon/html/V/vgrep.html"&gt;&lt;i id="l._676" class="glossterm"&gt;vgrep&lt;/i&gt;&lt;/a&gt;; compare    &lt;a id="l._677" href="http://www.catb.org/%7Eesr/jargon/html/V/vdiff.html"&gt;&lt;i id="l._678" class="glossterm"&gt;vdiff&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/dd&gt; &lt;dt id="l._681"&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dt id="gang-bang"&gt;&lt;b id="l._683"&gt;gang bang&lt;/b&gt;: &lt;span id="l._684" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._685"&gt;&lt;p id="l._686"&gt; The use of large numbers of loosely coupled programmers in an    attempt to wedge a great many features into a product in a short time.    Though there have been memorable gang bangs (e.g., that over-the-weekend    assembler port mentioned in Steven Levy's &lt;i id="l._688" class="citetitle"&gt;Hackers&lt;/i&gt;),    and large numbers of loosely-coupled programmers operating in    &lt;a id="l._689" href="http://www.catb.org/%7Eesr/jargon/html/B/bazaar.html"&gt;&lt;i id="l._690" class="glossterm"&gt;bazaar&lt;/i&gt;&lt;/a&gt; mode can do very useful work when they're not    on a deadline, most are perpetrated by large companies trying to meet    unrealistic deadlines; the inevitable result is enormous buggy masses of    code entirely lacking in &lt;a id="l._691" href="http://www.catb.org/%7Eesr/jargon/html/O/orthogonal.html"&gt;&lt;i id="l._692" class="glossterm"&gt;orthogonal&lt;/i&gt;&lt;/a&gt;ity.  When    market-driven managers make a list of all the features the competition has    and assign one programmer to implement each, the probability of maintaining    a coherent (or even functional) design goes to    &lt;a id="l._693" href="http://www.catb.org/%7Eesr/jargon/html/E/epsilon.html"&gt;&lt;i id="l._694" class="glossterm"&gt;epsilon&lt;/i&gt;&lt;/a&gt;.  See also    &lt;a id="l._695" href="http://www.catb.org/%7Eesr/jargon/html/F/firefighting.html"&gt;&lt;i id="l._696" class="glossterm"&gt;firefighting&lt;/i&gt;&lt;/a&gt;,     &lt;a id="l._697" href="http://www.catb.org/%7Eesr/jargon/html/M/Mongolian-Hordes-technique.html"&gt;&lt;i id="l._698" class="glossterm"&gt;Mongolian Hordes technique&lt;/i&gt;&lt;/a&gt;, &lt;a id="l._699" href="http://www.catb.org/%7Eesr/jargon/html/C/Conways-Law.html"&gt;&lt;i id="l._6100" class="glossterm"&gt;Conway's Law&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/dd&gt; &lt;dt id="l._6103"&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dt id="Guido"&gt;&lt;b id="l._6105"&gt;Guido&lt;/b&gt;: &lt;span id="l._6106" class="pronunciation"&gt;/gwee´do/&lt;/span&gt;, &lt;span id="l._6107" class="pronunciation"&gt;/khwee´do/&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._6108"&gt;&lt;p id="l._6109"&gt; Without qualification, Guido van Rossum (author of    &lt;a id="l._6111" href="http://www.catb.org/%7Eesr/jargon/html/P/Python.html"&gt;&lt;i id="l._6112" class="glossterm"&gt;Python&lt;/i&gt;&lt;/a&gt;).  Note that Guido answers to English    &lt;span id="l._6113" class="pronunciation"&gt;/gwee´do/&lt;/span&gt; but in Dutch it's    &lt;span id="l._6114" class="pronunciation"&gt;/khwee´do/&lt;/span&gt;.  Mythically,    Guido's most important attribute besides Python itself is Guido's time    machine, a device he is reputed to possess because of the unnerving    frequency with which user requests for new features have been met with the    response “&lt;span id="l._6115" class="quote"&gt;I just implemented that last night...&lt;/span&gt;”.  See    &lt;a id="l._6116" href="http://www.catb.org/%7Eesr/jargon/html/B/BDFL.html"&gt;&lt;i id="l._6117" class="glossterm"&gt;BDFL&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/dd&gt;        &lt;br /&gt;        &lt;dt id="guiltware"&gt;&lt;b id="l._6120"&gt;guiltware&lt;/b&gt;: &lt;span id="l._6121" class="pronunciation"&gt;/gilt´weir/&lt;/span&gt;, &lt;span id="l._6122" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._6123"&gt;&lt;p id="l._6129"&gt; 1. A piece of &lt;a id="l._6126" href="http://www.catb.org/%7Eesr/jargon/html/F/freeware.html"&gt;&lt;i id="l._6127" class="glossterm"&gt;freeware&lt;/i&gt;&lt;/a&gt; decorated with a    message telling one how long and hard the author worked on it and    intimating that one is a no-good freeloader if one does not immediately    send the poor suffering martyr gobs of money.&lt;/p&gt;&lt;/dd&gt;&lt;dd id="l._6123"&gt;&lt;p id="l._6129"&gt;2. A piece of &lt;a id="l._6130" href="http://www.catb.org/%7Eesr/jargon/html/S/shareware.html"&gt;&lt;i id="l._6131" class="glossterm"&gt;shareware&lt;/i&gt;&lt;/a&gt; that works.&lt;br /&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dd id="l._6128"&gt;&lt;br /&gt;&lt;/dd&gt; &lt;dt id="jsvm"&gt;&lt;b id="jsvm1"&gt;hired gun&lt;/b&gt;: &lt;span id="jsvm2" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="jsvm3"&gt;&lt;p id="jsvm4"&gt; A contract programmer, as opposed to a full-time staff member.  All    the connotations of this term suggested by innumerable spaghetti Westerns    are intentional.&lt;/p&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt id="hyperspace"&gt;&lt;b id="s4tv1"&gt;hyperspace&lt;/b&gt;: &lt;span id="s4tv2" class="pronunciation"&gt;/hi:´per·spays/&lt;/span&gt;, &lt;span id="s4tv3" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt;&lt;dd id="s4tv4"&gt;&lt;p id="s4tv5"&gt; A memory location that is &lt;span id="s4tv7" class="emphasis"&gt;&lt;i id="s4tv8"&gt;far&lt;/i&gt;&lt;/span&gt; away from where    the program counter should be pointing, especially a place that is    inaccessible because it is not even mapped in by the virtual-memory system.    “&lt;span id="s4tv9" class="quote"&gt;Another core dump — looks like the program jumped off to    hyperspace somehow.&lt;/span&gt;” (Compare     &lt;a id="s4tv10" href="http://www.catb.org/%7Eesr/jargon/html/J/jump-off-into-never-never-land.html"&gt;&lt;i id="s4tv11" class="glossterm"&gt;jump off into never-never land&lt;/i&gt;&lt;/a&gt;.)  This usage is from the SF notion of a spaceship jumping    &lt;span id="s4tv12" class="firstterm"&gt;into hyperspace&lt;/span&gt;, that is, taking a    shortcut through higher-dimensional space — in other words, bypassing    this universe.  The variant &lt;span id="s4tv13" class="firstterm"&gt;east    hyperspace&lt;/span&gt; is recorded among CMU and Bliss hackers.&lt;/p&gt;&lt;/dd&gt;                         &lt;dt id="l._6140"&gt;&lt;br /&gt;&lt;/dt&gt;&lt;dt id="I-didn-t-change-anything-"&gt;&lt;b id="l._6142"&gt;I didn't change anything!&lt;/b&gt;: &lt;span id="l._6143" class="grammar"&gt;interj.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._6144"&gt;&lt;p id="l._6145"&gt; An aggrieved cry often heard as bugs manifest during a regression    test.  The &lt;a id="l._6147" href="http://www.catb.org/%7Eesr/jargon/html/C/canonical.html"&gt;&lt;i id="l._6148" class="glossterm"&gt;canonical&lt;/i&gt;&lt;/a&gt; reply to this assertion is    “&lt;span id="l._6149" class="quote"&gt;Then it works just the same as it did before, doesn't it?&lt;/span&gt;”    See also &lt;a id="l._6150" href="http://www.catb.org/%7Eesr/jargon/html/O/one-line-fix.html"&gt;&lt;i id="l._6151" class="glossterm"&gt;one-line fix&lt;/i&gt;&lt;/a&gt;.  This is also heard from    applications programmers trying to blame an obvious applications problem on    an unrelated systems software change, for example a divide-by-0 fault after    terminals were added to a network.  Usually, their statement is found to be    false.  Upon close questioning, they will admit some major restructuring of    the program that shouldn't have broken anything, in their opinion, but    which actually &lt;a id="l._6152" href="http://www.catb.org/%7Eesr/jargon/html/H/hosed.html"&gt;&lt;i id="l._6153" class="glossterm"&gt;hosed&lt;/i&gt;&lt;/a&gt; the code completely.&lt;/p&gt;&lt;/dd&gt;&lt;dd id="l._6155"&gt;&lt;p id="l._6156"&gt; A contract programmer, as opposed to a full-time staff member.  All    the connotations of this term suggested by innumerable spaghetti Westerns    are intentional.&lt;/p&gt;&lt;/dd&gt;&lt;br /&gt;&lt;b id="yp:q0"&gt;KIBO&lt;/b&gt;: &lt;span class="pronunciation" id="yp:q1"&gt;/ki:´boh/&lt;/span&gt;&lt; &lt;dd id="yp:q2"&gt; &lt;p id="yp:q3"&gt; 1. [acronym] Knowledge In, Bullshit Out. A summary of what happens whenever valid data is passed through an organization (or person) that deliberately or accidentally disregards or ignores its significance. Consider, for example, what an advertising campaign can do with a product's actual specifications. Compare &lt;a href="http://www.catb.org/%7Eesr/jargon/html/G/GIGO.html" id="yp:q5"&gt;&lt;i class="glossterm" id="yp:q6"&gt;GIGO&lt;/i&gt;&lt;/a&gt;; see also &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/SNAFU-principle.html" id="yp:q7"&gt;&lt;i class="glossterm" id="yp:q8"&gt;SNAFU principle&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="l._6158"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="Macintrash"&gt;&lt;b id="l._6160"&gt;Macintrash&lt;/b&gt;: &lt;span class="pronunciation" id="l._6161"&gt;/mak´in·trash`/&lt;/span&gt;, &lt;span class="grammar" id="l._6162"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._6163"&gt; &lt;p id="l._6164"&gt;   The Apple Macintosh, as described by a hacker who doesn't appreciate being kept away from the &lt;span class="emphasis" id="l._6166"&gt;&lt;i id="l._6167"&gt;real computer&lt;/i&gt;&lt;/span&gt; by the interface. The term &lt;a href="http://www.catb.org/%7Eesr/jargon/html/M/maggotbox.html" id="l._6168"&gt;&lt;i class="glossterm" id="l._6169"&gt;maggotbox&lt;/i&gt;&lt;/a&gt; has been reported in regular use in the Research Triangle area of North Carolina. Compare &lt;a href="http://www.catb.org/%7Eesr/jargon/html/M/Macintoy.html" id="l._6170"&gt;&lt;i class="glossterm" id="l._6171"&gt;Macintoy&lt;/i&gt;&lt;/a&gt;. See also &lt;a href="http://www.catb.org/%7Eesr/jargon/html/B/beige-toaster.html" id="l._6172"&gt;&lt;i class="glossterm" id="l._6173"&gt;beige toaster&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/W/WIMP-environment.html" id="l._6174"&gt;&lt;i class="glossterm" id="l._6175"&gt;WIMP environment&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/P/point-and-drool-interface.html" id="l._6176"&gt;&lt;i class="glossterm" id="l._6177"&gt;point-and-drool interface&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/D/drool-proof-paper.html" id="l._6178"&gt;&lt;i class="glossterm" id="l._6179"&gt;drool-proof paper&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/U/user-friendly.html" id="l._6180"&gt;&lt;i class="glossterm" id="l._6181"&gt;user-friendly&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="k0.h"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="meatspace"&gt;&lt;b id="k0.h1"&gt;meatspace&lt;/b&gt;: &lt;span class="pronunciation" id="k0.h2"&gt;/meet´spays/&lt;/span&gt;, &lt;span class="grammar" id="k0.h3"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="k0.h4"&gt; &lt;p id="k0.h5"&gt;   The physical world, where the meat lives — as opposed to &lt;a href="http://www.catb.org/%7Eesr/jargon/html/C/cyberspace.html" id="k0.h7"&gt;&lt;i class="glossterm" id="k0.h8"&gt;cyberspace&lt;/i&gt;&lt;/a&gt;. Hackers are actually more willing to use this term than ‘cyberspace’, because it's not speculative — we already have a running meatspace implementation (the universe). Compare &lt;a href="http://www.catb.org/%7Eesr/jargon/html/R/RL.html" id="k0.h9"&gt;&lt;i class="glossterm" id="k0.h10"&gt;RL&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="ku.r"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="Mongolian-Hordes-technique"&gt;&lt;b id="ku.r1"&gt;Mongolian Hordes technique&lt;/b&gt;: &lt;span class="grammar" id="ku.r2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="ku.r3"&gt; &lt;p id="ku.r4"&gt;   [poss. from the Sixties counterculture expression &lt;span class="firstterm" id="ku.r6"&gt;Mongolian clusterfuck&lt;/span&gt; for a public orgy] Development by &lt;a href="http://www.catb.org/%7Eesr/jargon/html/G/gang-bang.html" id="ku.r7"&gt;&lt;i class="glossterm" id="ku.r8"&gt;gang bang&lt;/i&gt;&lt;/a&gt;. Implies that large numbers of inexperienced programmers are being put on a job better performed by a few skilled ones (but see &lt;a href="http://www.catb.org/%7Eesr/jargon/html/B/bazaar.html" id="ku.r9"&gt;&lt;i class="glossterm" id="ku.r10"&gt;bazaar&lt;/i&gt;&lt;/a&gt;). Also called &lt;span class="firstterm" id="ku.r11"&gt;Chinese Army technique&lt;/span&gt;; see also &lt;a href="http://www.catb.org/%7Eesr/jargon/html/B/Brookss-Law.html" id="ku.r12"&gt;&lt;i class="glossterm" id="ku.r13"&gt;Brooks's Law&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="q.-m"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="nipple-mouse"&gt;&lt;b id="q.-m1"&gt;nipple mouse&lt;/b&gt;: &lt;span class="grammar" id="q.-m2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="q.-m3"&gt; &lt;p id="q.-m4"&gt;   Var. &lt;span class="firstterm" id="q.-m6"&gt;clit mouse, clitoris&lt;/span&gt; Common term for the pointing device used on IBM ThinkPads and a few other laptop computers. The device, which sits between the ‘g’ and ‘h’ keys on the keyboard, indeed resembles a rubber nipple intended to be tweaked by a forefinger. Many hackers consider these superior to the glide pads found on most laptops, which are harder to control precisely. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="ttrk"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="optimism"&gt;&lt;b id="ttrk1"&gt;optimism&lt;/b&gt;: &lt;span class="grammar" id="ttrk2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="ttrk3"&gt; &lt;p id="ttrk4"&gt;   What a programmer is full of after fixing the last bug and before discovering the &lt;span class="emphasis" id="ttrk6"&gt;&lt;i id="ttrk7"&gt;next&lt;/i&gt;&lt;/span&gt; last bug. Fred Brooks's book &lt;i class="citetitle" id="ttrk8"&gt;The Mythical Man-Month&lt;/i&gt; (See &lt;i class="citetitle" id="ttrk9"&gt;Brooks's Law&lt;/i&gt;) contains the following paragraph that describes this extremely well: &lt;/p&gt; &lt;div class="blockquote" id="ttrk10"&gt;   &lt;blockquote class="blockquote" id="ttrk11"&gt;     &lt;p id="ttrk12"&gt; All programmers are optimists. Perhaps this modern sorcery especially attracts those who believe in happy endings and fairy godmothers. Perhaps the hundreds of nitty frustrations drive away all but those who habitually focus on the end goal. Perhaps it is merely that computers are young, programmers are younger, and the young are always optimists. But however the selection process works, the result is indisputable: “&lt;span class="quote" id="ttrk14"&gt;This time it will surely run,&lt;/span&gt;” or “&lt;span class="quote" id="ttrk15"&gt;I just found the last bug.&lt;/span&gt;”.     &lt;/p&gt;   &lt;/blockquote&gt; &lt;/div&gt; &lt;p id="ttrk16"&gt;   See also &lt;a href="http://www.catb.org/%7Eesr/jargon/html/L/Lubarskys-Law-of-Cybernetic-Entomology.html" id="ttrk18"&gt;&lt;i class="glossterm" id="ttrk19"&gt;Lubarsky's Law of Cybernetic Entomology&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt;&lt;br /&gt;&lt;dt id="pseudosuit"&gt;&lt;b id="fr921"&gt;pseudosuit&lt;/b&gt;: &lt;span class="pronunciation" id="fr922"&gt;/soo´doh·s[y]oot`/&lt;/span&gt;, &lt;span class="grammar" id="fr923"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="fr924"&gt; &lt;p id="fr925"&gt;   A &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/suit.html" id="fr927"&gt;&lt;i class="glossterm" id="fr928"&gt;suit&lt;/i&gt;&lt;/a&gt; wannabee; a hacker who has decided that he wants to be in management or administration and begins wearing ties, sport coats, and (shudder!) suits voluntarily. It's his funeral. See also &lt;a href="http://www.catb.org/%7Eesr/jargon/html/L/lobotomy.html" id="fr929"&gt;&lt;i class="glossterm" id="fr9210"&gt;lobotomy&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="x:gj"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="RTFS"&gt;&lt;b id="x:gj1"&gt;RTFS&lt;/b&gt;: &lt;span class="pronunciation" id="x:gj2"&gt;/R·T·F·S/&lt;/span&gt;&lt;/dt&gt; &lt;dd id="x:gj3"&gt; &lt;p id="x:gj7"&gt;   [Unix] 1. &lt;span class="grammar" id="x:gj9"&gt;imp.&lt;/span&gt; Abbreviation for ‘Read The Fucking Source’. Variant form of &lt;a href="http://www.catb.org/%7Eesr/jargon/html/R/RTFM.html" id="x:gj10"&gt;&lt;i class="glossterm" id="x:gj11"&gt;RTFM&lt;/i&gt;&lt;/a&gt;, used when the problem at hand is not necessarily obvious and not answerable from the manuals — or the manuals are not yet written and maybe never will be. For even trickier situations, see &lt;a href="http://www.catb.org/%7Eesr/jargon/html/R/RTFB.html" id="x:gj12"&gt;&lt;i class="glossterm" id="x:gj13"&gt;RTFB&lt;/i&gt;&lt;/a&gt;. Unlike RTFM, the anger inherent in RTFS is not usually directed at the person asking the question, but rather at the people who failed to provide adequate documentation. &lt;/p&gt; &lt;/dd&gt;  &lt;dt id="htem"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="Saturday-night-special"&gt;&lt;b id="htem1"&gt;Saturday-night special&lt;/b&gt;: &lt;span class="grammar" id="htem2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="htem3"&gt; &lt;p id="htem4"&gt;   [from police slang for a cheap handgun] A &lt;a href="http://www.catb.org/%7Eesr/jargon/html/Q/quick-and-dirty.html" id="htem6"&gt;&lt;i class="glossterm" id="htem7"&gt;quick-and-dirty&lt;/i&gt;&lt;/a&gt; program or feature kluged together during off hours, under a deadline, and in response to pressure from a &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/salescritter.html" id="htem8"&gt;&lt;i class="glossterm" id="htem9"&gt;salescritter&lt;/i&gt;&lt;/a&gt;. Such hacks are dangerously unreliable, but all too often sneak into a production release after insufficient review. &lt;/p&gt; &lt;/dd&gt;&lt;br /&gt;&lt;dt xmlns="" id="shotgun-debugging"&gt;&lt;b&gt;shotgun debugging&lt;/b&gt;: &lt;span xmlns="http://www.w3.org/1999/xhtml" class="grammar"&gt;n.&lt;/span&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt; The software equivalent of &lt;a href="http://www.catb.org/jargon/html/E/Easter-egging.html"&gt;&lt;i class="glossterm"&gt;Easter egging&lt;/i&gt;&lt;/a&gt;; the    making of relatively undirected changes to software in the hope that a bug    will be perturbed out of existence.  This almost never works, and usually    introduces more bugs.&lt;/p&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt id="space-cadet-keyboard"&gt;&lt;b id="hxtd1"&gt;space-cadet keyboard&lt;/b&gt;: &lt;span class="grammar" id="hxtd2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="nv7y"&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dd id="nv7y"&gt;Long one, but a must-see: &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/space-cadet-keyboard.html"&gt;http://www.catb.org/~esr/jargon/html/S/space-cadet-keyboard.html&lt;/a&gt;&lt;/dd&gt; &lt;dt id="noi-"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="Spinning-Pizza-of-Death"&gt;&lt;b id="noi-1"&gt;Spinning Pizza of Death&lt;/b&gt;: &lt;span class="grammar" id="noi-2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="noi-3"&gt; &lt;p id="noi-4"&gt; [OS X; common] The quartered-circle busy indicator on Mac OS X versions before 10.2, after which it was replaced by a sort of rainbow pinwheel thingy. It was analogous to the Microsoft Windows hourglass, but OS X 10.0's legendary slowness under the Aqua toolkit made this term rather more evocative. See &lt;a href="http://www.catb.org/%7Eesr/jargon/html/D/Death--X-of.html" id="noi-6"&gt;&lt;i class="glossterm" id="noi-7"&gt;Death, X of&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="lvxf"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="stealth-manager"&gt;&lt;b id="lvxf1"&gt;stealth manager&lt;/b&gt;: &lt;span class="grammar" id="lvxf2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="lvxf3"&gt; &lt;p id="lvxf4"&gt; [Corporate DP] A manager that appears out of nowhere, promises undeliverable software to unknown end users, and vanishes before the programming staff realizes what has happened. See &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/smoke-and-mirrors.html" id="lvxf6"&gt;&lt;i class="glossterm" id="lvxf7"&gt;smoke and mirrors&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="un-o"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="STFW"&gt;&lt;b id="un-o1"&gt;STFW&lt;/b&gt;: &lt;span class="grammar" id="un-o2"&gt;imp.&lt;/span&gt;, &lt;span class="pronunciation" id="un-o3"&gt;/S·T·F·W/&lt;/span&gt;&lt;/dt&gt; &lt;dd id="un-o4"&gt; &lt;p id="un-o5"&gt;   [Usenet] Common abbreviation for “&lt;span class="quote" id="un-o7"&gt;Search The Fucking Web&lt;/span&gt;”, a suggestion that what you're asking for is a query better handled by a search engine than a human being. Usage is common and exactly parallel to both senses of &lt;a href="http://www.catb.org/%7Eesr/jargon/html/R/RTFM.html" id="un-o8"&gt;&lt;i class="glossterm" id="un-o9"&gt;RTFM&lt;/i&gt;&lt;/a&gt;. A politer equivalent is &lt;a href="http://www.catb.org/%7Eesr/jargon/html/G/GIYF.html" id="un-o10"&gt;&lt;i class="glossterm" id="un-o11"&gt;GIYF&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="suit"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="l._6193"&gt;&lt;b id="l._6195"&gt;suit&lt;/b&gt;: &lt;span class="grammar" id="l._6196"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="l._6197"&gt; &lt;p id="l._6198"&gt; 1. Ugly and uncomfortable ‘business clothing’ often worn by non-hackers. Invariably worn with a ‘tie’, a strangulation device that partially cuts off the blood supply to the brain. It is thought that this explains much about the behavior of suit-wearers. Compare &lt;a href="http://www.catb.org/%7Eesr/jargon/html/D/droid.html" id="l._6200"&gt;&lt;i class="glossterm" id="l._6201"&gt;droid&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dd id="l._6202"&gt; &lt;p id="l._6203"&gt;   2. A person who habitually wears suits, as distinct from a techie or hacker. See &lt;a href="http://www.catb.org/%7Eesr/jargon/html/P/pointy-haired.html" id="l._6204"&gt;&lt;i class="glossterm" id="l._6205"&gt;pointy-haired&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/B/burble.html" id="l._6206"&gt;&lt;i class="glossterm" id="l._6207"&gt;burble&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/M/management.html" id="l._6208"&gt;&lt;i class="glossterm" id="l._6209"&gt;management&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/Stupids.html" id="l._6210"&gt;&lt;i class="glossterm" id="l._6211"&gt;Stupids&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/SNAFU-principle.html" id="l._6212"&gt;&lt;i class="glossterm" id="l._6213"&gt;SNAFU principle&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/P/PHB.html" id="l._6214"&gt;&lt;i class="glossterm" id="l._6215"&gt;PHB&lt;/i&gt;&lt;/a&gt;, and &lt;a href="http://www.catb.org/%7Eesr/jargon/html/B/brain-damaged.html" id="l._6216"&gt;&lt;i class="glossterm" id="l._6217"&gt;brain-damaged&lt;/i&gt;&lt;/a&gt;. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="r_uo"&gt;&lt;br /&gt;&lt;/dt&gt;  &lt;dt id="sysape"&gt;&lt;b id="pd1h1"&gt;sysape&lt;/b&gt;: &lt;span class="pronunciation" id="pd1h2"&gt;/sys´ayp/&lt;/span&gt;, &lt;span class="grammar" id="pd1h3"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="pd1h4"&gt; &lt;p id="pd1h5"&gt;   A rather derogatory term for a computer operator; a play on &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/sysop.html" id="pd1h7"&gt;&lt;i class="glossterm" id="pd1h8"&gt;sysop&lt;/i&gt;&lt;/a&gt; common at sites that use the banana hierarchy of problem complexity (see &lt;a href="http://www.catb.org/%7Eesr/jargon/html/O/one-banana-problem.html" id="pd1h9"&gt;&lt;i class="glossterm" id="pd1h10"&gt;one-banana problem&lt;/i&gt;&lt;/a&gt;). &lt;/p&gt; &lt;/dd&gt; &lt;dt id="m6w4"&gt;&lt;br /&gt;&lt;/dt&gt;  &lt;dt id="top-post"&gt;&lt;b id="yb3g1"&gt;top-post&lt;/b&gt;: &lt;span class="grammar" id="yb3g2"&gt;n.&lt;/span&gt;, &lt;span class="grammar" id="yb3g3"&gt;v.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="yb3g4"&gt; &lt;p id="yb3g5"&gt; [common] To put the newly-added portion of an email or Usenet response before the quoted part, as opposed to the more logical sequence of quoted portion first with original following. The problem with this practice is neatly summed up by the following FAQ entry: &lt;/p&gt; &lt;table class="zeroBorder" classname="zeroBorder" id="yb3g7" bgcolor="#e0e0e0" border="0"&gt;   &lt;tbody id="yb3g8"&gt;   &lt;tr id="yb3g9"&gt;     &lt;td id="yb3g10"&gt;       &lt;pre class="screen" id="yb3g11"&gt;A: No.&lt;br /&gt;Q: Should I include quotations after my reply?&lt;br /&gt;&lt;/pre&gt;     &lt;/td&gt;   &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt; &lt;p id="yb3g12"&gt;   This term is generally used pejoratively with the implication that the offending person is a &lt;a href="http://www.catb.org/%7Eesr/jargon/html/N/newbie.html" id="yb3g14"&gt;&lt;i class="glossterm" id="yb3g15"&gt;newbie&lt;/i&gt;&lt;/a&gt;, a Microsoft addict (Microsoft mail tools produce a similar format by default), or simply a common-and-garden-variety idiot. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="tjan"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="voodoo-programming"&gt;&lt;b id="tjan1"&gt;voodoo programming&lt;/b&gt;: &lt;span class="grammar" id="tjan2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="tjan3"&gt; &lt;p id="tjan8"&gt;   [from George Bush Sr.'s “&lt;span class="quote" id="tjan6"&gt;voodoo economics&lt;/span&gt;”] 1. The use by guess or cookbook of an &lt;a href="http://www.catb.org/%7Eesr/jargon/html/O/obscure.html" id="tjan10"&gt;&lt;i class="glossterm" id="tjan11"&gt;obscure&lt;/i&gt;&lt;/a&gt; or &lt;a href="http://www.catb.org/%7Eesr/jargon/html/H/hairy.html" id="tjan12"&gt;&lt;i class="glossterm" id="tjan13"&gt;hairy&lt;/i&gt;&lt;/a&gt; system, feature, or algorithm that one does not truly understand. The implication is that the technique may not work, and if it doesn't, one will never know why. Almost synonymous with &lt;a href="http://www.catb.org/%7Eesr/jargon/html/B/black-magic.html" id="tjan14"&gt;&lt;i class="glossterm" id="tjan15"&gt;black magic&lt;/i&gt;&lt;/a&gt;, except that black magic typically isn't documented and &lt;span class="emphasis" id="tjan16"&gt;&lt;i id="tjan17"&gt;nobody&lt;/i&gt;&lt;/span&gt; understands it. Compare &lt;a href="http://www.catb.org/%7Eesr/jargon/html/M/magic.html" id="tjan18"&gt;&lt;i class="glossterm" id="tjan19"&gt;magic&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/D/deep-magic.html" id="tjan20"&gt;&lt;i class="glossterm" id="tjan21"&gt;deep magic&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/H/heavy-wizardry.html" id="tjan22"&gt;&lt;i class="glossterm" id="tjan23"&gt;heavy wizardry&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/R/rain-dance.html" id="tjan24"&gt;&lt;i class="glossterm" id="tjan25"&gt;rain dance&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/C/cargo-cult-programming.html" id="tjan26"&gt;&lt;i class="glossterm" id="tjan27"&gt;cargo cult programming&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/W/wave-a-dead-chicken.html" id="tjan28"&gt;&lt;i class="glossterm" id="tjan29"&gt;wave a dead chicken&lt;/i&gt;&lt;/a&gt;, &lt;a href="http://www.catb.org/%7Eesr/jargon/html/S/SCSI-voodoo.html" id="tjan30"&gt;&lt;i class="glossterm" id="tjan31"&gt;SCSI voodoo&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt; &lt;/dd&gt;&lt;dd id="tjan32"&gt; &lt;p id="tjan33"&gt; 2. Things programmers do that they know shouldn't work but they try anyway, and which sometimes actually work, such as recompiling everything. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="zsex"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="Wintendo"&gt;&lt;b id="zsex1"&gt;Wintendo&lt;/b&gt;: &lt;span class="pronunciation" id="zsex2"&gt;/win·ten´doh/&lt;/span&gt;, &lt;span class="grammar" id="zsex3"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="zsex4"&gt; &lt;p id="zsex5"&gt;   [Play on “&lt;span class="quote" id="zsex7"&gt;Nintendo&lt;/span&gt;”] A PC running the Windows operating system kept primarily for the purpose of viewing multimedia and playing games. The implication is that the speaker uses a Linux or *BSD box for everything else. &lt;/p&gt; &lt;/dd&gt; &lt;dt id="p5fd"&gt;&lt;br /&gt;&lt;/dt&gt; &lt;dt id="zipperhead"&gt;&lt;b id="p5fd1"&gt;zipperhead&lt;/b&gt;: &lt;span class="grammar" id="p5fd2"&gt;n.&lt;/span&gt;&lt;/dt&gt; &lt;dd id="p5fd3"&gt; &lt;p id="p5fd4"&gt;   [IBM] A person with a closed mind. &lt;/p&gt; &lt;/dd&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-4903400661744916683?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=84tFzRFW"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=3knBzMpW"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=3knBzMpW" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=pLAMYrT0"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=pLAMYrT0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=tJDO9l7r"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/MqGg68i61B8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/4903400661744916683/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/best-of-jargon-file.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4903400661744916683?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4903400661744916683?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/best-of-jargon-file.html" title="Best of Jargon File" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEYNRn46cCp7ImA9WxdVEk0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-3199249102593445458</id><published>2008-07-16T13:54:00.004+03:00</published><updated>2008-07-16T14:03:17.018+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-16T14:03:17.018+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><title>What is Eclipse Mylyn anyway?</title><content type="html">Since the release of &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt; Europa, there was one new big feature - &lt;a href="http://www.eclipse.org/mylyn/"&gt;Mylyn&lt;/a&gt;. I was sceptic about it, besides it made the IDE slower, so I've &lt;a href="http://paranoid-engineering.blogspot.com/2008/04/make-your-eclipse-rock.html"&gt;kept removing it&lt;/a&gt; without getting to know what the hell is Mylyn anyway? After seeing this video I'm about to give it another try. If you're using Eclipse without Mylyn, you must see the video below:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/P34eFGdswOU&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/P34eFGdswOU&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-3199249102593445458?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=1z5k5gW5"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=7Qq9dz9H"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=7Qq9dz9H" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=wRMgVlSt"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=wRMgVlSt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=bd9SGWXA"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/X_Db2PnUY0Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/3199249102593445458/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/what-is-eclipse-mylyn-anyway.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3199249102593445458?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3199249102593445458?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/what-is-eclipse-mylyn-anyway.html" title="What is Eclipse Mylyn anyway?" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEcNRX09cCp7ImA9WxdVGEQ.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-800193108447008767</id><published>2008-07-10T17:35:00.017+03:00</published><updated>2008-07-24T13:41:34.368+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-24T13:41:34.368+03:00</app:edited><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="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle Exception Handling - Stack Trace</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHYlNU9xjdI/AAAAAAAAAKw/43lAFtERAlg/s1600-h/notooracle.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHYlNU9xjdI/AAAAAAAAAKw/43lAFtERAlg/s400/notooracle.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5221401728879005138" /&gt;&lt;/a&gt;&lt;br /&gt;Oracle PL/SQL is definitely the worst programming language I've ever encountered. Some time ago I thought that PHP was the worst, but well, things change. &lt;br /&gt;&lt;br /&gt;I've been searching for the source of a weird CLOB related bug in a big pile of PL/SQL &lt;strike&gt;sh..&lt;/strike&gt; mess for a couple of days till I got fed up and decided to find a way to get the stack trace or at least the last line of code where the error was triggered from. Would you believe that before Oracle 10g there was no normal way to get the trace? Here's some &lt;a href="http://thedailywtf.com"&gt;Daily WTF&lt;/a&gt; material from the official &lt;a href="http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm"&gt;PL/SQL User's Guide and Reference&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color:red;"&gt;----- WTF EXCERPT START -----&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using Locator Variables to Identify Exception Locations&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Using one exception handler for a sequence of statements can mask the statement that caused an error:&lt;br /&gt;&lt;pre&gt;BEGIN&lt;br /&gt;   SELECT ...&lt;br /&gt;   SELECT ...&lt;br /&gt;EXCEPTION&lt;br /&gt;   WHEN NO_DATA_FOUND THEN ...&lt;br /&gt;      -- Which SELECT statement caused the error?&lt;br /&gt;END;&lt;/pre&gt;Normally, this is not a problem. But, if the need arises, you can use a locator variable to track statement execution, as follows:&lt;br /&gt;&lt;pre&gt;DECLARE&lt;br /&gt;   stmt INTEGER := 1;  -- designates 1st SELECT statement&lt;br /&gt;BEGIN&lt;br /&gt;   SELECT ...&lt;br /&gt;   stmt := 2;  -- designates 2nd SELECT statement&lt;br /&gt;   SELECT ...&lt;br /&gt;EXCEPTION&lt;br /&gt;   WHEN NO_DATA_FOUND THEN&lt;br /&gt;      INSERT INTO errors VALUES ('Error in statement ' || stmt);&lt;br /&gt;END;&lt;/pre&gt;&lt;span style="font-weight: bold; color:red;"&gt;----- WTF EXCERPT END -----&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yes, they even have a name for this. Locator Variables. Damn. I can't decide whether to laugh or to cry...&lt;br /&gt;&lt;br /&gt;On a good note, since Oracle 10g you can use &lt;a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_util.htm"&gt;DBMS_UTILITY&lt;/a&gt;.&lt;a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_util.htm#i1003874"&gt;FORMAT_ERROR_BACKTRACE&lt;/a&gt; function to get a string representation of stack trace with procedure names and code line numbers. They still forgot to add this into the "Handling PL/SQL Errors" section of their manual... &lt;br /&gt;&lt;br /&gt;So, here's how you get the stack trace:&lt;br /&gt;&lt;pre&gt;declare&lt;br /&gt;  x number;&lt;br /&gt;begin&lt;br /&gt;  x := 1 / 0;&lt;br /&gt;  dbms_output.put_line(x);&lt;br /&gt;exception&lt;br /&gt;when others then&lt;br /&gt;  dbms_output.put_line(SQLERRM);&lt;br /&gt;  dbms_output.put_line(dbms_utility.format_error_backtrace);&lt;br /&gt;end;&lt;/pre&gt;Output:&lt;br /&gt;&lt;pre&gt;ORA-01476: divisor is equal to zero&lt;br /&gt;ORA-06512: at line 5&lt;/pre&gt;&lt;br /&gt;And it took them only 10 versions to implement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-800193108447008767?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=xbqpzfIg"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=PqXaXGv0"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=PqXaXGv0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=LdVum0wV"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=LdVum0wV" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Lkb5AFvz"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/s5xXBwOf8cc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/800193108447008767/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/oracle-exception-handling-stack-trace.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/800193108447008767?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/800193108447008767?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/oracle-exception-handling-stack-trace.html" title="Oracle Exception Handling - Stack Trace" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHYlNU9xjdI/AAAAAAAAAKw/43lAFtERAlg/s72-c/notooracle.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></entry><entry gd:etag="W/&quot;A0YCSXY5eyp7ImA9WxdWFk8.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-9028705697011319528</id><published>2008-07-09T20:53:00.017+03:00</published><updated>2008-07-09T21:46:08.823+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-09T21:46:08.823+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="being social" /><category scheme="http://www.blogger.com/atom/ns#" term="conferences" /><title>EuroPython 2008 - Day 3</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHT9GWphVZI/AAAAAAAAAJo/0Cli0DvXmwg/s1600-h/Europython2008-day3+033.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHT9GWphVZI/AAAAAAAAAJo/0Cli0DvXmwg/s400/Europython2008-day3+033.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221076153630021010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The third and final day of EuroPython 2008 started with a little bit of rocket science by Michael Meinel from &lt;a href="http://www.dlr.de/sc/"&gt;German Aerospace Center&lt;/a&gt;. He talked about FlowSimulator, which is a Python-controlled framework to unify massive parallel &lt;a href="http://en.wikipedia.org/wiki/Computational_fluid_dynamics"&gt;CFD&lt;/a&gt; workflows. Interesting point was that they used &lt;a href="http://www.swig.org/"&gt;SWIG&lt;/a&gt; to allow Python to control code written in C/C++, so basically Python was a glue code.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHT8XGgV-FI/AAAAAAAAAJg/W_YcoaZwXXI/s1600-h/Europython2008-day3+003.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHT8XGgV-FI/AAAAAAAAAJg/W_YcoaZwXXI/s400/Europython2008-day3+003.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221075341842708562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Second talk I attended was called "Small team, big demands? - Use the batteries included" by Jussi Rasinmäki. It was a tale of a software project which started with C, failed miserably and finally ended with Python. The outcome was twice as fast as C code with tenfold smaller code base. C can be slow if your code is really really bad.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHT_7hhHI2I/AAAAAAAAAJw/MJ_clTRe7rc/s1600-h/Europython2008-day3+012.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHT_7hhHI2I/AAAAAAAAAJw/MJ_clTRe7rc/s400/Europython2008-day3+012.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221079266103862114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I went there for the "Batteries Included" line, which really was as simple as this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUA7j-WVCI/AAAAAAAAAJ4/JbZeHY1IBD4/s1600-h/Europython2008-day3+012.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUA7j-WVCI/AAAAAAAAAJ4/JbZeHY1IBD4/s400/Europython2008-day3+012.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221080366274991138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There was one thing that I believe you should avoid in your code, and hell, in public presentations too. I mean a function named Age_pine_hemib_h_KalliovirtaTokola. Seriously, WTF?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUB2S5X0cI/AAAAAAAAAKA/j667GECgKEA/s1600-h/Europython2008-day3+013.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUB2S5X0cI/AAAAAAAAAKA/j667GECgKEA/s400/Europython2008-day3+013.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221081375302996418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next, Raymond D. Hettinger gave a good talk on "Core Python Containers - Under The Hood". Well, before that he managed to amuse the audience with the usual behavior of Windows in his laptop. Why the hell anyone would use Windows here anyway?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUDFCt0DVI/AAAAAAAAAKI/aUMBVDDETt4/s1600-h/Europython2008-day3+016.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUDFCt0DVI/AAAAAAAAAKI/aUMBVDDETt4/s400/Europython2008-day3+016.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221082728169213266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However, Raymond revealed some useful Python internals and told us how to make optimal use of the collections.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUEMmiyvUI/AAAAAAAAAKQ/RSOLKUxMR-k/s1600-h/Europython2008-day3+024.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUEMmiyvUI/AAAAAAAAAKQ/RSOLKUxMR-k/s400/Europython2008-day3+024.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221083957557378370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's the moral of his story:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUEjSYDT4I/AAAAAAAAAKY/Pst6N15ZWHg/s1600-h/Europython2008-day3+028.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHUEjSYDT4I/AAAAAAAAAKY/Pst6N15ZWHg/s400/Europython2008-day3+028.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221084347280609154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Last talk I've attended in this year's EuroPython was called "Functional Programming with Python, or Why It's Good To Be Lazy?" by &lt;a href="http://www.adambyrtek.net/"&gt;Adam Byrtek&lt;/a&gt;. It was a great talk that covered the concept of functional programming, which went down to Pythonic functional programming features - map/filter/reduce and lambda functions. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHUF5gLhdhI/AAAAAAAAAKg/_5GzOdx3xF0/s1600-h/Europython2008-day3+037.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHUF5gLhdhI/AAAAAAAAAKg/_5GzOdx3xF0/s400/Europython2008-day3+037.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221085828454905362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sadly I had some errands to run, so I couldn't make it to the Lightning Talks...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHUGxx8SvqI/AAAAAAAAAKo/Op-CwUe9xrg/s1600-h/Europython2008-day3+001.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHUGxx8SvqI/AAAAAAAAAKo/Op-CwUe9xrg/s400/Europython2008-day3+001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5221086795295538850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hopefully I'll see you all in EuroPython 2009, which is going to be held in Birmingham UK.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-9028705697011319528?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=LIQNAlCz"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Gagdyg1V"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=Gagdyg1V" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=LALkX1fZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=LALkX1fZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=QkTHlmQO"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/ksnXV4W_jrE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/9028705697011319528/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/europython-2008-day-3.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/9028705697011319528?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/9028705697011319528?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/europython-2008-day-3.html" title="EuroPython 2008 - Day 3" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHT9GWphVZI/AAAAAAAAAJo/0Cli0DvXmwg/s72-c/Europython2008-day3+033.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CE8FRXczeip7ImA9WxdWFUk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-2270095919889774942</id><published>2008-07-08T20:10:00.041+03:00</published><updated>2008-07-08T21:46:54.982+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-08T21:46:54.982+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="being social" /><category scheme="http://www.blogger.com/atom/ns#" term="conferences" /><title>EuroPython 2008 - Day 2</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOiVMu4EgI/AAAAAAAAAHQ/Za9IFjQLFJo/s1600-h/Europython2008-day2+001.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOiVMu4EgI/AAAAAAAAAHQ/Za9IFjQLFJo/s400/Europython2008-day2+001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220694878131327490" /&gt;&lt;/a&gt;
&lt;br /&gt;I took way too much coffee during breaks on &lt;a href="http://paranoid-engineering.blogspot.com/2008/07/europython-2008-day-1.html"&gt;Day 1&lt;/a&gt;, that kept me awake till 3AM, so it was a tough day. Nevertheless, today was better than Day 1. Let's see where I've been. 
&lt;br /&gt;
&lt;br /&gt;Designing Large-Scale Applications in Python by Marc-André Lemburg basically was a beginner oriented tutorial on how to do enterprisey stuff properly. It got more serious later on when he started mentioning concrete patterns and techniques. It's good that this conference has a (so so, but still) working WI-FI that kept me entertained till the next session. It's good to chew on some RSS feeds in the morning.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOiuqo6J0I/AAAAAAAAAHY/qWzfDHsCx7U/s1600-h/Europython2008-day2+005.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOiuqo6J0I/AAAAAAAAAHY/qWzfDHsCx7U/s400/Europython2008-day2+005.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220695315656091458" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Then Steve Alexander from &lt;a href="http://www.canonical.com"&gt;Canonical&lt;/a&gt; gave an inspiring talk on how they developed a very large python web application &lt;a href="http://en.wikipedia.org/wiki/Lean_software_development"&gt;LEAN&lt;/a&gt; style. &lt;a href="https://launchpad.net/"&gt;Launchpad&lt;/a&gt; to be exact. One of the greatest points was the use of pre-commit &lt;a href="http://en.wikipedia.org/wiki/Continuous_Integration"&gt;continuous integration&lt;/a&gt;, which ensures the developers that trunk is never broken. Also, he mentioned that canonical is hiring ~20 python developers (see their ad in my post about &lt;a href="http://paranoid-engineering.blogspot.com/2008/07/europython-2008-day-1.html"&gt;EuroPython 2008 Day 1&lt;/a&gt;).
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOlu6VRPeI/AAAAAAAAAHg/Ij8dUr_xNxo/s1600-h/Europython2008-day2+012.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOlu6VRPeI/AAAAAAAAAHg/Ij8dUr_xNxo/s400/Europython2008-day2+012.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220698618403569122" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Cool stuff with Jython by Frank Wierzbicki (from Sun) and Jim Baker was somehow boring and Jim's words "we write Java so you don't have to broke my heart, so I got back to reading RSS feeds". Frank was bragging about new hot &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; refactoring, which &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt; has since.. uh.. forever? Read more on this topic in &lt;a href="http://www.bileblog.org/2007/05/javaone-day-3-netbeans-refactoring-meets-2002/"&gt;this great post&lt;/a&gt;. Dear pythonists, throw away your NetBeans CDs and visit &lt;a href="http://www.eclipse.org"&gt;eclipse.org&lt;/a&gt; instead.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOohq42EXI/AAAAAAAAAHo/MHUoHdRwiik/s1600-h/Europython2008-day2+015.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOohq42EXI/AAAAAAAAAHo/MHUoHdRwiik/s400/Europython2008-day2+015.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220701689454399858" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;There were a few Lightning Talks worth noticing.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHOrd4F0NCI/AAAAAAAAAHw/UJt68A9tYcE/s1600-h/Europython2008-day2+019.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHOrd4F0NCI/AAAAAAAAAHw/UJt68A9tYcE/s400/Europython2008-day2+019.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220704922813871138" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Here's the full list.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOr2R5H8nI/AAAAAAAAAH4/1BUHNRju28c/s1600-h/Europython2008-day2+038.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOr2R5H8nI/AAAAAAAAAH4/1BUHNRju28c/s400/Europython2008-day2+038.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220705342056821362" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;I liked Jure Vrščaj's talk on Remote Module Importing where he showed us how to implement custom Python path resolvers that can seek modules from internet or source control repositories.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHOs3BBp0PI/AAAAAAAAAIA/nYYdOOfb38Q/s1600-h/Europython2008-day2+029.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHOs3BBp0PI/AAAAAAAAAIA/nYYdOOfb38Q/s400/Europython2008-day2+029.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220706454220689650" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Mikhail Kashkin introduced a better style of Python programming - The Drunken Monkey style. Thumbs up for this one. :)
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHOttTx-mOI/AAAAAAAAAII/QWv3fMqDQpQ/s1600-h/Europython2008-day2+039.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHOttTx-mOI/AAAAAAAAAII/QWv3fMqDQpQ/s400/Europython2008-day2+039.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220707386968152290" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;It was amazing to see how Holger Krekel unit-tested JavaScript with pytest.   
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHOug6OUAMI/AAAAAAAAAIQ/mAZJA-7lmB0/s1600-h/Europython2008-day2+042.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHOug6OUAMI/AAAAAAAAAIQ/mAZJA-7lmB0/s400/Europython2008-day2+042.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220708273460871362" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Geoffrey French deserves a medal for his very alpha code editor gSym Prototype, which visualizes Python code with as &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;AST&lt;/a&gt; and adds a Lisp View (with lots and lots of braces that all pythonists just love).
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOvnKLYcvI/AAAAAAAAAIY/gm1NRmT4Woc/s1600-h/Europython2008-day2+045.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOvnKLYcvI/AAAAAAAAAIY/gm1NRmT4Woc/s400/Europython2008-day2+045.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220709480334390002" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Here's a screenshot of gSym visualizing some mathematical functions.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHOv1y3o-6I/AAAAAAAAAIg/oNFoAXT9dg0/s1600-h/Europython2008-day2+046.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHOv1y3o-6I/AAAAAAAAAIg/oNFoAXT9dg0/s400/Europython2008-day2+046.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220709731775609762" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Finally, a charismatic professor from Sweden, &lt;a href="http://en.wikipedia.org/wiki/Hans_Rosling"&gt;Hans Rosling&lt;/a&gt;, made a totally mind blowing keynote called "Code that make sense of the world". It can be basically rephrased as "Instead of letting people generate images from raw statistics in their head we should generate images in front of their heads".
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHOw5XXI1NI/AAAAAAAAAIo/_MFeZKZwoOw/s1600-h/Europython2008-day2+053.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHOw5XXI1NI/AAAAAAAAAIo/_MFeZKZwoOw/s400/Europython2008-day2+053.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220710892622632146" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;It was one of the best talks I've seen in my life. This 60 year old professor knows people like &lt;a href="http://en.wikipedia.org/wiki/Larry_Page"&gt;Larry Page&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Bill_Gates"&gt;Bill Gates&lt;/a&gt;, he knew &lt;a href="http://en.wikipedia.org/wiki/Fidel_Castro"&gt;Fidel Castro&lt;/a&gt; he's also good at &lt;a href="http://en.wikipedia.org/wiki/Grand_Theft_Auto_2"&gt;GTA 2&lt;/a&gt;. Possibly this has something to do with Fidel Castro :).
&lt;br /&gt;
&lt;br /&gt;Some more pictures from his talk...
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOzwaBXc0I/AAAAAAAAAIw/oio1I3VrvO4/s1600-h/Europython2008-day2+054.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOzwaBXc0I/AAAAAAAAAIw/oio1I3VrvO4/s400/Europython2008-day2+054.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220714037252682562" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHO0Hd-0GlI/AAAAAAAAAI4/s4J9zHs2Yg4/s1600-h/Europython2008-day2+056.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHO0Hd-0GlI/AAAAAAAAAI4/s4J9zHs2Yg4/s400/Europython2008-day2+056.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220714433452710482" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHO0WlLDETI/AAAAAAAAAJA/A7D4NPXoH0k/s1600-h/Europython2008-day2+060.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHO0WlLDETI/AAAAAAAAAJA/A7D4NPXoH0k/s400/Europython2008-day2+060.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220714693081108786" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Here's a great point on how data should be represented to the public.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHO0unVjvvI/AAAAAAAAAJI/wAXxJojrt2g/s1600-h/Europython2008-day2+071.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHO0unVjvvI/AAAAAAAAAJI/wAXxJojrt2g/s400/Europython2008-day2+071.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220715105978924786" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;And the following symptom that technical people tend to have made the audience laugh and applaud.
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHO1MwTIxeI/AAAAAAAAAJQ/fH7Fw_aBtao/s1600-h/Europython2008-day2+073.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHO1MwTIxeI/AAAAAAAAAJQ/fH7Fw_aBtao/s400/Europython2008-day2+073.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220715623780763106" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Most of what he presented can be seen in the following video. You HAVE to see it.
&lt;br /&gt;
&lt;br /&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="320" height="285" id="VE_Player" align="middle"&gt;&lt;param name="movie" value="http://static.videoegg.com/ted/flash/loader.swf"&gt;&lt;PARAM NAME="FlashVars" VALUE="bgColor=FFFFFF&amp;file=http://static.videoegg.com/ted/movies/HANSROSLING_high.flv&amp;autoPlay=false&amp;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&amp;forcePlay=false&amp;logo=&amp;allowFullscreen=true"&gt;&lt;param name="quality" value="high"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="scale" value="noscale"&gt;&lt;param name="wmode" value="window"&gt;&lt;embed src="http://static.videoegg.com/ted/flash/loader.swf" FlashVars="bgColor=FFFFFF&amp;file=http://static.videoegg.com/ted/movies/HANSROSLING_high.flv&amp;autoPlay=false&amp;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&amp;forcePlay=false&amp;logo=&amp;allowFullscreen=true" quality="high" allowScriptAccess="always" bgcolor="#FFFFFF" scale="noscale" wmode="window" width="320" height="285" name="VE_Player" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/object&gt; 
&lt;br /&gt;
&lt;br /&gt;One day to go. See you tomorrow!
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHO1kvZ5aDI/AAAAAAAAAJY/38MbYWTUYhQ/s1600-h/Europython2008-day2+008.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHO1kvZ5aDI/AAAAAAAAAJY/38MbYWTUYhQ/s400/Europython2008-day2+008.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5220716035857541170" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-2270095919889774942?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=ZdtiYh4X"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=zp1EtQkd"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=zp1EtQkd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=TAi1ED1C"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=TAi1ED1C" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=qjDMNeeI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/42MreJ4vg34" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/2270095919889774942/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/europython-2008-day-2.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2270095919889774942?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2270095919889774942?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/europython-2008-day-2.html" title="EuroPython 2008 - Day 2" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHOiVMu4EgI/AAAAAAAAAHQ/Za9IFjQLFJo/s72-c/Europython2008-day2+001.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DE4NRng_fyp7ImA9WxdWFU4.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-439687323338580896</id><published>2008-07-07T17:23:00.039+03:00</published><updated>2008-07-08T20:09:57.647+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-08T20:09:57.647+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="being social" /><category scheme="http://www.blogger.com/atom/ns#" term="conferences" /><title>EuroPython 2008 - Day 1</title><content type="html">It's the end of first day of &lt;a href="http://www.europython.org/"&gt;EuroPython&lt;/a&gt; 2008, a good time to overlook what I've seen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHInwnDUNGI/AAAAAAAAAFo/Nvi1zEBvWXA/s1600-h/Europython2008-day1+011.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHInwnDUNGI/AAAAAAAAAFo/Nvi1zEBvWXA/s400/Europython2008-day1+011.jpg" alt="" id="BLOGGER_PHOTO_ID_5220278634145920098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI8Xd-CQnI/AAAAAAAAAHA/mkGhLG9DHWU/s1600-h/Europython2008-day1+008.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI8Xd-CQnI/AAAAAAAAAHA/mkGhLG9DHWU/s400/Europython2008-day1+008.jpg" alt="" id="BLOGGER_PHOTO_ID_5220301291955307122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Right after the keynote, which was short and uplifting, I've headed to the first session - Dynamic Compilation in Python and Jython by Tobias Ivarsson and Jim Baker. It was long and boring, but still inspiring. They looked into things like bytecode versus &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;AST&lt;/a&gt; manipulation, introduced nice tools like pyassem. It's nice to see that Java and JVM is a hot topic in smart programmer communities. I consider Python community as one of the smartest people in software development.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHIvZJ9iv9I/AAAAAAAAAFw/gyz5zYNwdYQ/s1600-h/Europython2008-day1+012.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHIvZJ9iv9I/AAAAAAAAAFw/gyz5zYNwdYQ/s400/Europython2008-day1+012.jpg" alt="" id="BLOGGER_PHOTO_ID_5220287027293110226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then I went to listen to my native speaker Ignas Mikalajūnas from &lt;a href="http://www.pov.lt/"&gt;Programmers of Vilnius&lt;/a&gt;. He told Why he Wants Us to Use &lt;a href="http://peak.telecommunity.com/DevCenter/PythonEggs"&gt;Eggs&lt;/a&gt;. I would disagree with saying "Eggs are to Pythons as Jars are to Java...". It's more like "Eggs may some day be to Pythons as &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; is for Java". For now Eggs look scary and unstable especially with things like &lt;a href="http://download.zope.org/zope3.4/versions.cfg"&gt;Known Good Set&lt;/a&gt; (compare it to &lt;a href="http://repo1.maven.org/maven2/"&gt;Maven Repository&lt;/a&gt;). Though I would definitely want to use it for Python projects. Better than nothing.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHIzqZKS1dI/AAAAAAAAAF4/9BzkH9cO0G4/s1600-h/Europython2008-day1+028.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHIzqZKS1dI/AAAAAAAAAF4/9BzkH9cO0G4/s400/Europython2008-day1+028.jpg" alt="" id="BLOGGER_PHOTO_ID_5220291721477412306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHI0bEEOhqI/AAAAAAAAAGA/8FLJVgt_qpM/s1600-h/Europython2008-day1+029.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHI0bEEOhqI/AAAAAAAAAGA/8FLJVgt_qpM/s400/Europython2008-day1+029.jpg" alt="" id="BLOGGER_PHOTO_ID_5220292557628409506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then I made a mistake by visiting John Pinner's "Python at Home" talk. He was going to tell how he automated his boiler at home with use of Python. I expected a lot from that, instead I've seen some photos of a boiler wired to a motherboard and some source code like "boiler.ignition(On)" and "boiler.ignition(Off)". I would recommend John (and all the other speakers) not to dig deep into source code but concentrate on big picture instead.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI2iW92NuI/AAAAAAAAAGI/UsP18i-v_IM/s1600-h/Europython2008-day1+032.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI2iW92NuI/AAAAAAAAAGI/UsP18i-v_IM/s400/Europython2008-day1+032.jpg" alt="" id="BLOGGER_PHOTO_ID_5220294881984263906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I didn't want to go to vendor pitch sessions or things that does not sound interesting (Advanced Searching for Plone and stuff), so my choice was the Barcamp / Open Space, where &lt;a href="http://eagain.net/"&gt;Tommi Virtanen&lt;/a&gt; was giving a talk on &lt;a href="http://twistedmatrix.com/trac/"&gt;Twisted&lt;/a&gt;. If you want messaging in Python, do it in Twisted. The guy gave a great quote of Torvalds Linus, which sounded something like "If you have to use debugging - you already have problems. Take a step back and review what could be wrong". It definitely was a great session.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI4jCgjMmI/AAAAAAAAAGQ/jArp9Bh-JQY/s1600-h/Europython2008-day1+039.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI4jCgjMmI/AAAAAAAAAGQ/jArp9Bh-JQY/s400/Europython2008-day1+039.jpg" alt="" id="BLOGGER_PHOTO_ID_5220297092695798370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I was going to visit "Discouraging the Use of Python" next, but I was tired and didn't want to be discouraged, so I've headed home to write all this down.&lt;br /&gt;&lt;br /&gt;Most of attendees I've spoken to admit that last year's EuroPython was way better than this. But well, two more days to go.&lt;br /&gt;&lt;br /&gt;Now for some fun moments:&lt;br /&gt;&lt;a href="http://www.canonical.com/"&gt;Canonical&lt;/a&gt; was hiring Django developers and senior engineers.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHI5igZrklI/AAAAAAAAAGY/WE6zA2c4hCg/s1600-h/Europython2008-day1+044.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SHI5igZrklI/AAAAAAAAAGY/WE6zA2c4hCg/s400/Europython2008-day1+044.jpg" alt="" id="BLOGGER_PHOTO_ID_5220298183051809362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Until the epic &lt;a href="http://failblog.org/"&gt;fail&lt;/a&gt;ure of their campaign:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI5wRdO9yI/AAAAAAAAAGg/w0Qg_njIFcw/s1600-h/Europython2008-day1+043.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI5wRdO9yI/AAAAAAAAAGg/w0Qg_njIFcw/s400/Europython2008-day1+043.jpg" alt="" id="BLOGGER_PHOTO_ID_5220298419558348578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All pythonistas got a copy of NetBeans 6.1 and Open Solaris (go &lt;a href="http://www.sun.com/"&gt;Sun&lt;/a&gt;! :)) along with geeky looking &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt; T-Shirt.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHI6hke0wrI/AAAAAAAAAGo/amRbU-XpECo/s1600-h/Europython2008-day1+023.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHI6hke0wrI/AAAAAAAAAGo/amRbU-XpECo/s400/Europython2008-day1+023.jpg" alt="" id="BLOGGER_PHOTO_ID_5220299266478883506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And of course, loads of free coffee, snacks and socializing!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHI7wDW8UyI/AAAAAAAAAGw/OnEhZJjECCg/s1600-h/Europython2008-day1+006.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHI7wDW8UyI/AAAAAAAAAGw/OnEhZJjECCg/s400/Europython2008-day1+006.jpg" alt="" id="BLOGGER_PHOTO_ID_5220300614797120290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI8FDET7iI/AAAAAAAAAG4/SV2rOjspL1c/s1600-h/Europython2008-day1+035.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SHI8FDET7iI/AAAAAAAAAG4/SV2rOjspL1c/s400/Europython2008-day1+035.jpg" alt="" id="BLOGGER_PHOTO_ID_5220300975496228386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHI8srha7kI/AAAAAAAAAHI/asybFvxURcQ/s1600-h/Europython2008-day1+030.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SHI8srha7kI/AAAAAAAAAHI/asybFvxURcQ/s400/Europython2008-day1+030.jpg" alt="" id="BLOGGER_PHOTO_ID_5220301656370638402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;See You there at Day 2!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Yesterday I forgot to mention that Guido Van Rossum did not participate in the conference like the last year. I did not participate in his video keynote either...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-439687323338580896?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=k9GAHMdl"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=4R8A4tjX"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=4R8A4tjX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=T6JEWFKt"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=T6JEWFKt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=puKD9Zvc"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/uUDrQrpkXjA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/439687323338580896/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/europython-2008-day-1.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/439687323338580896?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/439687323338580896?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/europython-2008-day-1.html" title="EuroPython 2008 - Day 1" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SHInwnDUNGI/AAAAAAAAAFo/Nvi1zEBvWXA/s72-c/Europython2008-day1+011.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEAESXs9cSp7ImA9WxdWEks.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-2578262572480004945</id><published>2008-07-05T16:29:00.011+03:00</published><updated>2008-07-05T17:05:08.569+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-05T17:05:08.569+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="geekery" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><title>Meet my new coffee mug</title><content type="html">Being the ever-coffee-hungry bastard requires serious gear, so I've got myself a very special container for it at the local store. Beware, the Smart Café Hot Cafetiere Mug:  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.smartcafe.co.uk/products/hot_cafetiere_mugs.asp"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SG94Uur8DCI/AAAAAAAAAFg/mC0rPABsJFA/s400/sc5110.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5219522790670732322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.smartcafe.co.uk/products/hot_cafetiere_mugs.asp"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SG93s3aIxGI/AAAAAAAAAFY/Dpw8eZ63SqQ/s400/06875_a_l.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5219522105817220194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looks sweet, right? Here are some specs:&lt;ul &gt;&lt;li&gt;Double walled, keeps tea/coffee hot for longer&lt;/li&gt;&lt;li&gt;Does not burn hands when holding it&lt;/li&gt;&lt;li&gt;Made of strong plastic material - light weight and unbreakable&lt;/li&gt;&lt;li&gt;Built-in mini french press!&lt;/li&gt;&lt;/ul&gt;I'll never want to drink my fuel from an ordinary ceramic mug again. Though nothing is perfect, this one lacks a built-in auto-clean button.&lt;br /&gt;&lt;br /&gt;There was no trace of it at Amazon, only a few &lt;a href="http://www.amazon.com/Big-Sky-Bistro-French-Press/dp/B000BBS7W6?tag=paranoengine-20"&gt;similar&lt;/a&gt; &lt;a href="http://www.amazon.com/MLB-Baseball-Team-Ounce-Thermo/dp/B000UZWUEY?tag=paranoengine-20"&gt;ones&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Alright, enough blabber. Time for my coffee break...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-2578262572480004945?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=uzbS6mjE"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=vyEce1LL"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=vyEce1LL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=n1b50How"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=n1b50How" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=dcSM1OsC"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/1BtsTRJfNfU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/2578262572480004945/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/meet-my-new-coffee-mug.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2578262572480004945?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/2578262572480004945?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/meet-my-new-coffee-mug.html" title="Meet my new coffee mug" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SG94Uur8DCI/AAAAAAAAAFg/mC0rPABsJFA/s72-c/sc5110.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;CEQDQ3c9fyp7ImA9WxdWEU0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-411462901858470898</id><published>2008-07-03T19:15:00.005+03:00</published><updated>2008-07-03T19:26:12.967+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-03T19:26:12.967+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="uncluttering" /><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Live happily with online services</title><content type="html">&lt;a href="http://picasaweb.google.co.uk/tomas.varaneckas/ParanoidEngineering/photo?authkey=wCOxklKyvE4#5218822429513348130"&gt;&lt;img src="http://lh5.ggpht.com/tomas.varaneckas/SGz7WWD79CI/AAAAAAAAAEw/IzmkwXjmjIw/s800/Online.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Live happily with any operating system. Use as many computers as you want. Forget backups. Use &lt;a href="http://www.getfirefox.com"&gt;Firefox&lt;/a&gt;. And use &lt;a href="http://customsoftwareconsult.com/extensions/febe/febe.html"&gt;FEBE&lt;/a&gt; for a roaming Firefox profile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-411462901858470898?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=6Gqwlq3j"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=thX73UNk"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=thX73UNk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=1sGydm8h"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=1sGydm8h" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=28m4NYjv"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/SCEnObrtyhs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/411462901858470898/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/live-happily-with-online-services.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/411462901858470898?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/411462901858470898?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/live-happily-with-online-services.html" title="Live happily with online services" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/tomas.varaneckas/SGz7WWD79CI/AAAAAAAAAEw/IzmkwXjmjIw/s72-c/Online.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;A08MSHk9eip7ImA9WxdXGUQ.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-8284561952788279382</id><published>2008-07-02T14:51:00.005+03:00</published><updated>2008-07-02T14:58:09.762+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-02T14:58:09.762+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="cms" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>CMS battle: Drupal vs Joomla vs Custom Programming</title><content type="html">In modern &lt;a title="Content Management System" href="http://en.wikipedia.org/wiki/Content_management_system" id="t9bb"&gt;Content Management System&lt;/a&gt; (CMS) world there are two major figures - &lt;a title="Joomla" href="http://joomla.org/" id="hmr6"&gt;Joomla&lt;/a&gt; (descendant of &lt;a title="Mambo CMS" href="http://mambo-foundation.org/" id="hr0c"&gt;Mambo CMS&lt;/a&gt; ) and &lt;a title="Drupal" href="http://drupal.org/" id="o-2i"&gt;Drupal&lt;/a&gt;. They both are open source and have large comunities with enormous amounts of extensions and themes. It's hard to choose which one to use without trying them out. As usually, there are more options - home grown custom programming or even building your own CMS (which I was once stupid enough to &lt;a title="Secma CMS" href="http://secma.tigris.org/" id="o5dm"&gt;do&lt;/a&gt;). Programming from scratch is always fun and beneficial for your skills, however, if you need things up and running in no time or you don't do (or don't want to do) any programming, using a CMS is the way to go.&lt;br /&gt;&lt;br /&gt;If you are digging for CMS comparisons and trying to decide which one is best for you, here is a quick and dirty answer - go for Drupal, you won't regret it.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;After test-driving them both I've came to these conclusions:&lt;br /&gt;&lt;ul id="d0.-0"&gt;&lt;li id="d0.-1"&gt;Joomla is bloated, Drupal is minimal&lt;/li&gt;&lt;li id="f8qa"&gt;Drupal is easy to use and intuitive, Joomla is confusing&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;That was more than enough for a minimalist like me.&lt;br /&gt;&lt;br /&gt;Here are some statistics from &lt;a title="CMS Matrix" href="http://www.cmsmatrix.org/" id="h4-:"&gt;CMS Matrix&lt;/a&gt; for a more detailed comparison. It shows that Drupal is extremely modular and Joomla has a heavy core, thus a terrible architecture. That means Joomla is hard to extend and messy under the hood. Drupal, on the other hand, looks beautiful.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table id="p86l1" style="font-size: 12px; font-family: helvetica,arial,sans-serif;" border="1" cellpadding="2" cellspacing="2"&gt; &lt;tbody id="p86l2"&gt;&lt;tr id="p86l3"&gt;&lt;td id="p86l4" style="border-bottom: 1px solid gray; font-weight: bold; font-size: 13px;"&gt;Product&lt;/td&gt;        &lt;td id="p86l5" style="border-bottom: 1px solid gray;"&gt;&lt;a id="p86l6" href="http://www.cmsmatrix.org/matrix/cms-matrix?func=viewDetail;listingId=1050"&gt;Drupal 6.2&lt;/a&gt;&lt;/td&gt;        &lt;td id="p86l7" style="border-bottom: 1px solid gray;"&gt;&lt;a id="p86l8" href="http://www.cmsmatrix.org/matrix/cms-matrix?func=viewDetail;listingId=VRQptHQyGsFCFf8IsmDB3g"&gt;Joomla! 1.5.3&lt;/a&gt;&lt;/td&gt;    &lt;/tr&gt; &lt;tr id="p86l9"&gt;   &lt;td id="p86l10" class="lastUpdated"&gt;Last Updated&lt;/td&gt;        &lt;td id="p86l11" class="lastUpdated" style="text-align: center;"&gt;4/10/2008&lt;/td&gt;        &lt;td id="p86l12" class="lastUpdated" style="text-align: center;"&gt;5/31/2008&lt;/td&gt;    &lt;/tr&gt;    &lt;tr id="p86l13"&gt;&lt;td id="p86l14" class="category"&gt;&lt;b id="p86l15"&gt;System Requirements&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l16" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l17" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l18" class="odd"&gt;            &lt;td id="p86l19" class="application_server"&gt;         Application Server                                   &lt;/td&gt;             &lt;td id="p86l20" class="php_435"&gt;         PHP 4.3.5+                &lt;/td&gt;             &lt;td id="p86l21" class="any_that_supports_php_apache_recommended"&gt;         Any that supports PHP (Apache recommended)                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l22" class="even"&gt;            &lt;td id="p86l23" class="approximate_cost"&gt;         Approximate Cost                                   &lt;/td&gt;             &lt;td id="p86l24" class="free"&gt;         Free                &lt;/td&gt;             &lt;td id="p86l25" class="free"&gt;         Free                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l26" class="odd"&gt;            &lt;td id="p86l27" class="database"&gt;         Database                                   &lt;/td&gt;             &lt;td id="p86l28" class="mysql_postgres"&gt;         MySQL, Postgres                &lt;/td&gt;             &lt;td id="p86l29" class="mysql"&gt;         MySQL                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l30" class="even"&gt;            &lt;td id="p86l31" class="license"&gt;         License                                   &lt;/td&gt;             &lt;td id="p86l32" class="gnu_gpl"&gt;         GNU GPL                &lt;/td&gt;             &lt;td id="p86l33" class="gnugpl_v2"&gt;         GNU/GPL v2                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l34" class="odd"&gt;            &lt;td id="p86l35" class="operating_system"&gt;         Operating System                                   &lt;/td&gt;             &lt;td id="p86l36" class="any"&gt;         Any                &lt;/td&gt;             &lt;td id="p86l37" class="any"&gt;         Any                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l38" class="even"&gt;            &lt;td id="p86l39" class="programming_language"&gt;         Programming Language                                   &lt;/td&gt;             &lt;td id="p86l40" class="php"&gt;         PHP                &lt;/td&gt;             &lt;td id="p86l41" class="php"&gt;         PHP                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l42" class="odd"&gt;            &lt;td id="p86l43" class="root_access"&gt;         Root Access                                   &lt;/td&gt;             &lt;td id="p86l44" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l45" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l46" class="even"&gt;            &lt;td id="p86l47" class="shell_access"&gt;         Shell Access                                   &lt;/td&gt;             &lt;td id="p86l48" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l49" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l50" class="odd"&gt;            &lt;td id="p86l51" class="web_server"&gt;         Web Server                                   &lt;/td&gt;             &lt;td id="p86l52" class="apache_iis"&gt;         Apache, IIS                &lt;/td&gt;             &lt;td id="p86l53" class="apache"&gt;         Apache                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l54"&gt;&lt;td id="p86l55" class="category"&gt;&lt;b id="p86l56"&gt;Security&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l57" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l58" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l59" class="odd"&gt;            &lt;td id="p86l60" class="audit_trail"&gt;         Audit Trail                                   &lt;/td&gt;             &lt;td id="p86l61" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l62" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l63" class="even"&gt;            &lt;td id="p86l64" class="captcha"&gt;         Captcha                                   &lt;/td&gt;             &lt;td id="p86l65" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l66" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l67" class="odd"&gt;            &lt;td id="p86l68" class="content_approval"&gt;         Content Approval                                   &lt;/td&gt;             &lt;td id="p86l69" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l70" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l71" class="even"&gt;            &lt;td id="p86l72" class="email_verification"&gt;         Email Verification                                   &lt;/td&gt;             &lt;td id="p86l73" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l74" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l75" class="odd"&gt;            &lt;td id="p86l76" class="granular_privileges"&gt;         Granular Privileges                                   &lt;/td&gt;             &lt;td id="p86l77" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l78" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l79" class="even"&gt;            &lt;td id="p86l80" class="kerberos_authentication"&gt;         Kerberos Authentication                                   &lt;/td&gt;             &lt;td id="p86l81" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l82" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l83" class="odd"&gt;            &lt;td id="p86l84" class="ldap_authentication"&gt;         LDAP Authentication                                   &lt;/td&gt;             &lt;td id="p86l85" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l86" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l87" class="even"&gt;            &lt;td id="p86l88" class="login_history"&gt;         Login History                                   &lt;/td&gt;             &lt;td id="p86l89" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l90" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l91" class="odd"&gt;            &lt;td id="p86l92" class="nis_authentication"&gt;         NIS Authentication                                   &lt;/td&gt;             &lt;td id="p86l93" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l94" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l95" class="even"&gt;            &lt;td id="p86l96" class="ntlm_authentication"&gt;         NTLM Authentication                                   &lt;/td&gt;             &lt;td id="p86l97" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l98" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l99" class="odd"&gt;            &lt;td id="p86l100" class="pluggable_authentication"&gt;         Pluggable Authentication                                   &lt;/td&gt;             &lt;td id="p86l101" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l102" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l103" class="even"&gt;            &lt;td id="p86l104" class="problem_notification"&gt;         Problem Notification                                   &lt;/td&gt;             &lt;td id="p86l105" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l106" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l107" class="odd"&gt;            &lt;td id="p86l108" class="sandbox"&gt;         Sandbox                                   &lt;/td&gt;             &lt;td id="p86l109" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l110" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l111" class="even"&gt;            &lt;td id="p86l112" class="session_management"&gt;         Session Management                                   &lt;/td&gt;             &lt;td id="p86l113" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l114" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l115" class="odd"&gt;            &lt;td id="p86l116" class="smb_authentication"&gt;         SMB Authentication                                   &lt;/td&gt;             &lt;td id="p86l117" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l118" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l119" class="even"&gt;            &lt;td id="p86l120" class="ssl_compatible"&gt;         SSL Compatible                                   &lt;/td&gt;             &lt;td id="p86l121" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l122" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l123" class="odd"&gt;            &lt;td id="p86l124" class="ssl_logins"&gt;         SSL Logins                                   &lt;/td&gt;             &lt;td id="p86l125" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l126" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l127" class="even"&gt;            &lt;td id="p86l128" class="ssl_pages"&gt;         SSL Pages                                   &lt;/td&gt;             &lt;td id="p86l129" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l130" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l131" class="odd"&gt;            &lt;td id="p86l132" class="versioning"&gt;         Versioning                                   &lt;/td&gt;             &lt;td id="p86l133" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l134" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l135"&gt;&lt;td id="p86l136" class="category"&gt;&lt;b id="p86l137"&gt;Support&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l138" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l139" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l140" class="odd"&gt;            &lt;td id="p86l141" class="certification_program"&gt;         Certification Program                                   &lt;/td&gt;             &lt;td id="p86l142" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l143" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l144" class="even"&gt;            &lt;td id="p86l145" class="code_skeletons"&gt;         Code Skeletons                                   &lt;/td&gt;             &lt;td id="p86l146" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l147" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l148" class="odd"&gt;            &lt;td id="p86l149" class="commercial_manuals"&gt;         Commercial Manuals                                   &lt;/td&gt;             &lt;td id="p86l150" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l151" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l152" class="even"&gt;            &lt;td id="p86l153" class="commercial_support"&gt;         Commercial Support                                   &lt;/td&gt;             &lt;td id="p86l154" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l155" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l156" class="odd"&gt;            &lt;td id="p86l157" class="commercial_training"&gt;         Commercial Training                                   &lt;/td&gt;             &lt;td id="p86l158" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l159" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l160" class="even"&gt;            &lt;td id="p86l161" class="developer_community"&gt;         Developer Community                                   &lt;/td&gt;             &lt;td id="p86l162" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l163" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l164" class="odd"&gt;            &lt;td id="p86l165" class="online_help"&gt;         Online Help                                   &lt;/td&gt;             &lt;td id="p86l166" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l167" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l168" class="even"&gt;            &lt;td id="p86l169" class="pluggable_api"&gt;         Pluggable API                                   &lt;/td&gt;             &lt;td id="p86l170" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l171" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l172" class="odd"&gt;            &lt;td id="p86l173" class="professional_hosting"&gt;         Professional Hosting                                   &lt;/td&gt;             &lt;td id="p86l174" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l175" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l176" class="even"&gt;            &lt;td id="p86l177" class="professional_services"&gt;         Professional Services                                   &lt;/td&gt;             &lt;td id="p86l178" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l179" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l180" class="odd"&gt;            &lt;td id="p86l181" class="public_forum"&gt;         Public Forum                                   &lt;/td&gt;             &lt;td id="p86l182" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l183" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l184" class="even"&gt;            &lt;td id="p86l185" class="public_mailing_list"&gt;         Public Mailing List                                   &lt;/td&gt;             &lt;td id="p86l186" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l187" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l188" class="odd"&gt;            &lt;td id="p86l189" class="test_framework"&gt;         Test Framework                                   &lt;/td&gt;             &lt;td id="p86l190" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l191" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l192" class="even"&gt;            &lt;td id="p86l193" class="thirdparty_developers"&gt;         Third-Party Developers                                   &lt;/td&gt;             &lt;td id="p86l194" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l195" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l196" class="odd"&gt;            &lt;td id="p86l197" class="users_conference"&gt;         Users Conference                                   &lt;/td&gt;             &lt;td id="p86l198" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l199" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l200"&gt;&lt;td id="p86l201" class="category"&gt;&lt;b id="p86l202"&gt;Ease of Use&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l203" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l204" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l205" class="odd"&gt;            &lt;td id="p86l206" class="dragndrop_content"&gt;         Drag-N-Drop Content                                   &lt;/td&gt;             &lt;td id="p86l207" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l208" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l209" class="even"&gt;            &lt;td id="p86l210" class="email_to_discussion"&gt;         Email To Discussion                                   &lt;/td&gt;             &lt;td id="p86l211" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l212" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l213" class="odd"&gt;            &lt;td id="p86l214" class="friendly_urls"&gt;         Friendly URLs                                   &lt;/td&gt;             &lt;td id="p86l215" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l216" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l217" class="even"&gt;            &lt;td id="p86l218" class="image_resizing"&gt;         Image Resizing                                   &lt;/td&gt;             &lt;td id="p86l219" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l220" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l221" class="odd"&gt;            &lt;td id="p86l222" class="macro_language"&gt;         Macro Language                                   &lt;/td&gt;             &lt;td id="p86l223" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l224" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l225" class="even"&gt;            &lt;td id="p86l226" class="mass_upload"&gt;         Mass Upload                                   &lt;/td&gt;             &lt;td id="p86l227" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l228" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l229" class="odd"&gt;            &lt;td id="p86l230" class="prototyping"&gt;         Prototyping                                   &lt;/td&gt;             &lt;td id="p86l231" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l232" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l233" class="even"&gt;            &lt;td id="p86l234" class="server_page_language"&gt;         Server Page Language                                   &lt;/td&gt;             &lt;td id="p86l235" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l236" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l237" class="odd"&gt;            &lt;td id="p86l238" class="site_setup_wizard"&gt;         Site Setup Wizard                                   &lt;/td&gt;             &lt;td id="p86l239" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l240" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l241" class="even"&gt;            &lt;td id="p86l242" class="spell_checker"&gt;         Spell Checker                                   &lt;/td&gt;             &lt;td id="p86l243" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l244" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l245" class="odd"&gt;            &lt;td id="p86l246" class="style_wizard"&gt;         Style Wizard                                   &lt;/td&gt;             &lt;td id="p86l247" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l248" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l249" class="even"&gt;            &lt;td id="p86l250" class="subscriptions"&gt;         Subscriptions                                   &lt;/td&gt;             &lt;td id="p86l251" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l252" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l253" class="odd"&gt;            &lt;td id="p86l254" class="template_language"&gt;         Template Language                                   &lt;/td&gt;             &lt;td id="p86l255" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l256" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l257" class="even"&gt;            &lt;td id="p86l258" class="ui_levels"&gt;         UI Levels                                   &lt;/td&gt;             &lt;td id="p86l259" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l260" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l261" class="odd"&gt;            &lt;td id="p86l262" class="undo"&gt;         Undo                                   &lt;/td&gt;             &lt;td id="p86l263" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l264" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l265" class="even"&gt;            &lt;td id="p86l266" class="wysiwyg_editor"&gt;         WYSIWYG Editor                                   &lt;/td&gt;             &lt;td id="p86l267" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l268" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l269" class="odd"&gt;            &lt;td id="p86l270" class="zip_archives"&gt;         Zip Archives                                   &lt;/td&gt;             &lt;td id="p86l271" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l272" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l273"&gt;&lt;td id="p86l274" class="category"&gt;&lt;b id="p86l275"&gt;Performance&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l276" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l277" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l278" class="odd"&gt;            &lt;td id="p86l279" class="advanced_caching"&gt;         Advanced Caching                                   &lt;/td&gt;             &lt;td id="p86l280" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l281" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l282" class="even"&gt;            &lt;td id="p86l283" class="database_replication"&gt;         Database Replication                                   &lt;/td&gt;             &lt;td id="p86l284" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l285" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l286" class="odd"&gt;            &lt;td id="p86l287" class="load_balancing"&gt;         Load Balancing                                   &lt;/td&gt;             &lt;td id="p86l288" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l289" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l290" class="even"&gt;            &lt;td id="p86l291" class="page_caching"&gt;         Page Caching                                   &lt;/td&gt;             &lt;td id="p86l292" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l293" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l294" class="odd"&gt;            &lt;td id="p86l295" class="static_content_export"&gt;         Static Content Export                                   &lt;/td&gt;             &lt;td id="p86l296" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l297" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l298"&gt;&lt;td id="p86l299" class="category"&gt;&lt;b id="p86l300"&gt;Management&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l301" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l302" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l303" class="odd"&gt;            &lt;td id="p86l304" class="advertising_management"&gt;         Advertising Management                                   &lt;/td&gt;             &lt;td id="p86l305" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l306" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l307" class="even"&gt;            &lt;td id="p86l308" class="asset_management"&gt;         Asset Management                                   &lt;/td&gt;             &lt;td id="p86l309" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l310" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l311" class="odd"&gt;            &lt;td id="p86l312" class="clipboard"&gt;         Clipboard                                   &lt;/td&gt;             &lt;td id="p86l313" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l314" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l315" class="even"&gt;            &lt;td id="p86l316" class="content_scheduling"&gt;         Content Scheduling                                   &lt;/td&gt;             &lt;td id="p86l317" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l318" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l319" class="odd"&gt;            &lt;td id="p86l320" class="content_staging"&gt;         Content Staging                                   &lt;/td&gt;             &lt;td id="p86l321" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l322" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l323" class="even"&gt;            &lt;td id="p86l324" class="inline_administration"&gt;         Inline Administration                                   &lt;/td&gt;             &lt;td id="p86l325" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l326" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l327" class="odd"&gt;            &lt;td id="p86l328" class="online_administration"&gt;         Online Administration                                   &lt;/td&gt;             &lt;td id="p86l329" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l330" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l331" class="even"&gt;            &lt;td id="p86l332" class="package_deployment"&gt;         Package Deployment                                   &lt;/td&gt;             &lt;td id="p86l333" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l334" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l335" class="odd"&gt;            &lt;td id="p86l336" class="subsites__roots"&gt;         Sub-sites / Roots                                   &lt;/td&gt;             &lt;td id="p86l337" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l338" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l339" class="even"&gt;            &lt;td id="p86l340" class="themes__skins"&gt;         Themes / Skins                                   &lt;/td&gt;             &lt;td id="p86l341" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l342" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l343" class="odd"&gt;            &lt;td id="p86l344" class="trash"&gt;         Trash                                   &lt;/td&gt;             &lt;td id="p86l345" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l346" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l347" class="even"&gt;            &lt;td id="p86l348" class="web_statistics"&gt;         Web Statistics                                   &lt;/td&gt;             &lt;td id="p86l349" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l350" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l351" class="odd"&gt;            &lt;td id="p86l352" class="webbased_styletemplate_management"&gt;         Web-based Style/Template Management                                   &lt;/td&gt;             &lt;td id="p86l353" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l354" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l355" class="even"&gt;            &lt;td id="p86l356" class="webbased_translation_management"&gt;         Web-based Translation Management                                   &lt;/td&gt;             &lt;td id="p86l357" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l358" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l359" class="odd"&gt;            &lt;td id="p86l360" class="workflow_engine"&gt;         Workflow Engine                                   &lt;/td&gt;             &lt;td id="p86l361" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l362" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l363"&gt;&lt;td id="p86l364" class="category"&gt;&lt;b id="p86l365"&gt;Interoperability&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l366" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l367" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l368" class="odd"&gt;            &lt;td id="p86l369" class="content_syndication_rss"&gt;         Content Syndication (RSS)                                   &lt;/td&gt;             &lt;td id="p86l370" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l371" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l372" class="even"&gt;            &lt;td id="p86l373" class="ftp_support"&gt;         FTP Support                                   &lt;/td&gt;             &lt;td id="p86l374" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l375" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l376" class="odd"&gt;            &lt;td id="p86l377" class="ical"&gt;         iCal                                   &lt;/td&gt;             &lt;td id="p86l378" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l379" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l380" class="even"&gt;            &lt;td id="p86l381" class="utf8_support"&gt;         UTF-8 Support                                   &lt;/td&gt;             &lt;td id="p86l382" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l383" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l384" class="odd"&gt;            &lt;td id="p86l385" class="wai_compliant"&gt;         WAI Compliant                                   &lt;/td&gt;             &lt;td id="p86l386" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l387" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l388" class="even"&gt;            &lt;td id="p86l389" class="webdav_support"&gt;         WebDAV Support                                   &lt;/td&gt;             &lt;td id="p86l390" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l391" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l392" class="odd"&gt;            &lt;td id="p86l393" class="xhtml_compliant"&gt;         XHTML Compliant                                   &lt;/td&gt;             &lt;td id="p86l394" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l395" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l396"&gt;&lt;td id="p86l397" class="category"&gt;&lt;b id="p86l398"&gt;Flexibility&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l399" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l400" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l401" class="odd"&gt;            &lt;td id="p86l402" class="cgimode_support"&gt;         CGI-mode Support                                   &lt;/td&gt;             &lt;td id="p86l403" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l404" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l405" class="even"&gt;            &lt;td id="p86l406" class="content_reuse"&gt;         Content Reuse                                   &lt;/td&gt;             &lt;td id="p86l407" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l408" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l409" class="odd"&gt;            &lt;td id="p86l410" class="extensible_user_profiles"&gt;         Extensible User Profiles                                   &lt;/td&gt;             &lt;td id="p86l411" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l412" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l413" class="even"&gt;            &lt;td id="p86l414" class="interface_localization"&gt;         Interface Localization                                   &lt;/td&gt;             &lt;td id="p86l415" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l416" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l417" class="odd"&gt;            &lt;td id="p86l418" class="metadata"&gt;         Metadata                                   &lt;/td&gt;             &lt;td id="p86l419" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l420" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l421" class="even"&gt;            &lt;td id="p86l422" class="multilingual_content"&gt;         Multi-lingual Content                                   &lt;/td&gt;             &lt;td id="p86l423" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l424" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l425" class="odd"&gt;            &lt;td id="p86l426" class="multilingual_content_integration"&gt;         Multi-lingual Content Integration                                   &lt;/td&gt;             &lt;td id="p86l427" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l428" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l429" class="even"&gt;            &lt;td id="p86l430" class="multisite_deployment"&gt;         Multi-Site Deployment                                   &lt;/td&gt;             &lt;td id="p86l431" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l432" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l433" class="odd"&gt;            &lt;td id="p86l434" class="url_rewriting"&gt;         URL Rewriting                                   &lt;/td&gt;             &lt;td id="p86l435" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l436" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l437"&gt;&lt;td id="p86l438" class="category"&gt;&lt;b id="p86l439"&gt;Built-in Applications&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l440" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l441" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l442" class="odd"&gt;            &lt;td id="p86l443" class="blog"&gt;         Blog                                   &lt;/td&gt;             &lt;td id="p86l444" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l445" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l446" class="even"&gt;            &lt;td id="p86l447" class="chat"&gt;         Chat                                   &lt;/td&gt;             &lt;td id="p86l448" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l449" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l450" class="odd"&gt;            &lt;td id="p86l451" class="classifieds"&gt;         Classifieds                                   &lt;/td&gt;             &lt;td id="p86l452" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l453" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l454" class="even"&gt;            &lt;td id="p86l455" class="contact_management"&gt;         Contact Management                                   &lt;/td&gt;             &lt;td id="p86l456" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l457" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l458" class="odd"&gt;            &lt;td id="p86l459" class="data_entry"&gt;         Data Entry                                   &lt;/td&gt;             &lt;td id="p86l460" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l461" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l462" class="even"&gt;            &lt;td id="p86l463" class="database_reports"&gt;         Database Reports                                   &lt;/td&gt;             &lt;td id="p86l464" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l465" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l466" class="odd"&gt;            &lt;td id="p86l467" class="discussion__forum"&gt;         Discussion / Forum                                   &lt;/td&gt;             &lt;td id="p86l468" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l469" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l470" class="even"&gt;            &lt;td id="p86l471" class="document_management"&gt;         Document Management                                   &lt;/td&gt;             &lt;td id="p86l472" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l473" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l474" class="odd"&gt;            &lt;td id="p86l475" class="events_calendar"&gt;         Events Calendar                                   &lt;/td&gt;             &lt;td id="p86l476" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l477" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l478" class="even"&gt;            &lt;td id="p86l479" class="events_management"&gt;         Events Management                                   &lt;/td&gt;             &lt;td id="p86l480" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l481" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l482" class="odd"&gt;            &lt;td id="p86l483" class="expense_reports"&gt;         Expense Reports                                   &lt;/td&gt;             &lt;td id="p86l484" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l485" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l486" class="even"&gt;            &lt;td id="p86l487" class="faq_management"&gt;         FAQ Management                                   &lt;/td&gt;             &lt;td id="p86l488" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l489" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l490" class="odd"&gt;            &lt;td id="p86l491" class="file_distribution"&gt;         File Distribution                                   &lt;/td&gt;             &lt;td id="p86l492" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l493" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l494" class="even"&gt;            &lt;td id="p86l495" class="graphs_and_charts"&gt;         Graphs and Charts                                   &lt;/td&gt;             &lt;td id="p86l496" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l497" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l498" class="odd"&gt;            &lt;td id="p86l499" class="groupware"&gt;         Groupware                                   &lt;/td&gt;             &lt;td id="p86l500" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l501" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l502" class="even"&gt;            &lt;td id="p86l503" class="guest_book"&gt;         Guest Book                                   &lt;/td&gt;             &lt;td id="p86l504" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l505" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l506" class="odd"&gt;            &lt;td id="p86l507" class="help_desk__bug_reporting"&gt;         Help Desk / Bug Reporting                                   &lt;/td&gt;             &lt;td id="p86l508" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l509" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l510" class="even"&gt;            &lt;td id="p86l511" class="http_proxy"&gt;         HTTP Proxy                                   &lt;/td&gt;             &lt;td id="p86l512" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l513" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l514" class="odd"&gt;            &lt;td id="p86l515" class="inout_board"&gt;         In/Out Board                                   &lt;/td&gt;             &lt;td id="p86l516" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l517" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l518" class="even"&gt;            &lt;td id="p86l519" class="job_postings"&gt;         Job Postings                                   &lt;/td&gt;             &lt;td id="p86l520" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l521" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l522" class="odd"&gt;            &lt;td id="p86l523" class="link_management"&gt;         Link Management                                   &lt;/td&gt;             &lt;td id="p86l524" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l525" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l526" class="even"&gt;            &lt;td id="p86l527" class="mail_form"&gt;         Mail Form                                   &lt;/td&gt;             &lt;td id="p86l528" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l529" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l530" class="odd"&gt;            &lt;td id="p86l531" class="matrix"&gt;         Matrix                                   &lt;/td&gt;             &lt;td id="p86l532" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l533" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l534" class="even"&gt;            &lt;td id="p86l535" class="my_page__dashboard"&gt;         My Page / Dashboard                                   &lt;/td&gt;             &lt;td id="p86l536" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l537" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l538" class="odd"&gt;            &lt;td id="p86l539" class="newsletter"&gt;         Newsletter                                   &lt;/td&gt;             &lt;td id="p86l540" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l541" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l542" class="even"&gt;            &lt;td id="p86l543" class="photo_gallery"&gt;         Photo Gallery                                   &lt;/td&gt;             &lt;td id="p86l544" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l545" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l546" class="odd"&gt;            &lt;td id="p86l547" class="polls"&gt;         Polls                                   &lt;/td&gt;             &lt;td id="p86l548" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l549" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l550" class="even"&gt;            &lt;td id="p86l551" class="product_management"&gt;         Product Management                                   &lt;/td&gt;             &lt;td id="p86l552" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l553" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l554" class="odd"&gt;            &lt;td id="p86l555" class="project_tracking"&gt;         Project Tracking                                   &lt;/td&gt;             &lt;td id="p86l556" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l557" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l558" class="even"&gt;            &lt;td id="p86l559" class="search_engine"&gt;         Search Engine                                   &lt;/td&gt;             &lt;td id="p86l560" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l561" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l562" class="odd"&gt;            &lt;td id="p86l563" class="site_map"&gt;         Site Map                                   &lt;/td&gt;             &lt;td id="p86l564" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l565" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l566" class="even"&gt;            &lt;td id="p86l567" class="stock_quotes"&gt;         Stock Quotes                                   &lt;/td&gt;             &lt;td id="p86l568" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l569" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l570" class="odd"&gt;            &lt;td id="p86l571" class="surveys"&gt;         Surveys                                   &lt;/td&gt;             &lt;td id="p86l572" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l573" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l574" class="even"&gt;            &lt;td id="p86l575" class="syndicated_content_rss"&gt;         Syndicated Content (RSS)                                   &lt;/td&gt;             &lt;td id="p86l576" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l577" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l578" class="odd"&gt;            &lt;td id="p86l579" class="tests__quizzes"&gt;         Tests / Quizzes                                   &lt;/td&gt;             &lt;td id="p86l580" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l581" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l582" class="even"&gt;            &lt;td id="p86l583" class="time_tracking"&gt;         Time Tracking                                   &lt;/td&gt;             &lt;td id="p86l584" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l585" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l586" class="odd"&gt;            &lt;td id="p86l587" class="user_contributions"&gt;         User Contributions                                   &lt;/td&gt;             &lt;td id="p86l588" class="yes"&gt;         Yes                &lt;/td&gt;             &lt;td id="p86l589" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l590" class="even"&gt;            &lt;td id="p86l591" class="weather"&gt;         Weather                                   &lt;/td&gt;             &lt;td id="p86l592" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l593" class="no"&gt;         No                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l594" class="odd"&gt;            &lt;td id="p86l595" class="web_services_front_end"&gt;         Web Services Front End                                   &lt;/td&gt;             &lt;td id="p86l596" class="limited"&gt;         Limited                &lt;/td&gt;             &lt;td id="p86l597" class="yes"&gt;         Yes                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l598" class="even"&gt;            &lt;td id="p86l599" class="wiki"&gt;         Wiki                                   &lt;/td&gt;             &lt;td id="p86l600" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l601" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;         &lt;tr id="p86l602"&gt;&lt;td id="p86l603" class="category"&gt;&lt;b id="p86l604"&gt;Commerce&lt;/b&gt;&lt;/td&gt;        &lt;td id="p86l605" align="center"&gt;Drupal&lt;/td&gt;        &lt;td id="p86l606" align="center"&gt;Joomla!&lt;/td&gt;      &lt;/tr&gt;      &lt;tr id="p86l607" class="odd"&gt;            &lt;td id="p86l608" class="affiliate_tracking"&gt;         Affiliate Tracking                                   &lt;/td&gt;             &lt;td id="p86l609" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l610" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l611" class="even"&gt;            &lt;td id="p86l612" class="inventory_management"&gt;         Inventory Management                                   &lt;/td&gt;             &lt;td id="p86l613" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l614" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l615" class="odd"&gt;            &lt;td id="p86l616" class="pluggable_payments"&gt;         Pluggable Payments                                   &lt;/td&gt;             &lt;td id="p86l617" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l618" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l619" class="even"&gt;            &lt;td id="p86l620" class="pluggable_shipping"&gt;         Pluggable Shipping                                   &lt;/td&gt;             &lt;td id="p86l621" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l622" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l623" class="odd"&gt;            &lt;td id="p86l624" class="pluggable_tax"&gt;         Pluggable Tax                                   &lt;/td&gt;             &lt;td id="p86l625" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l626" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l627" class="even"&gt;            &lt;td id="p86l628" class="point_of_sale"&gt;         Point of Sale                                   &lt;/td&gt;             &lt;td id="p86l629" class="no"&gt;         No                &lt;/td&gt;             &lt;td id="p86l630" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l631" class="odd"&gt;            &lt;td id="p86l632" class="shopping_cart"&gt;         Shopping Cart                                   &lt;/td&gt;             &lt;td id="p86l633" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l634" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l635" class="even"&gt;            &lt;td id="p86l636" class="subscriptions"&gt;         Subscriptions                                   &lt;/td&gt;             &lt;td id="p86l637" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l638" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;           &lt;/tr&gt;       &lt;tr id="p86l639" class="odd"&gt;            &lt;td id="p86l640" class="wish_lists"&gt;         Wish Lists                                   &lt;/td&gt;             &lt;td id="p86l641" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;             &lt;td id="p86l642" class="free_add_on"&gt;         Free Add On                &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;Hope this helps to make a choice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-8284561952788279382?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=kjO0LNIm"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=o2x4qncl"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=o2x4qncl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=1MwxpjYf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=1MwxpjYf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=DOnnDHBf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/6JH7HZsL5eI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/8284561952788279382/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/cms-battle-drupal-vs-joomla-vs-custom.html#comment-form" title="18 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8284561952788279382?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8284561952788279382?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/07/cms-battle-drupal-vs-joomla-vs-custom.html" title="CMS battle: Drupal vs Joomla vs Custom Programming" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">18</thr:total></entry><entry gd:etag="W/&quot;C04BRHc_eyp7ImA9WxdWGEU.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6986358526567149996</id><published>2008-06-19T08:40:00.006+03:00</published><updated>2008-07-12T19:59:15.943+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-12T19:59:15.943+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Lithuania hacks up Firefox 3 downloads to boost the World Record</title><content type="html">You must know that Mozilla is going for the &lt;a href="http://www.spreadfirefox.com/en-US/worldrecord/"&gt;World Record&lt;/a&gt; with &lt;a href="http://www.getfirefox.com"&gt;Firefox 3&lt;/a&gt; downloads.&lt;br /&gt;&lt;br /&gt;I was amazed to discover that Lithuania (my homeland) has downloaded Firefox 3 over 320,000+ times! We have 3,000,000 people living here, that means over 10% of citizens must have downloaded Firefox 3. That would be insane. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SFnyboP3fWI/AAAAAAAAAEo/LhExn_vRfC4/s1600-h/lithuania.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SFnyboP3fWI/AAAAAAAAAEo/LhExn_vRfC4/s400/lithuania.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5213464600132418914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some countries we beat:&lt;br /&gt;&lt;br /&gt;Canada - 291,000+&lt;br /&gt;Russia - 121,000+&lt;br /&gt;Australia - 160,000+&lt;br /&gt;Brazil - 230,000+&lt;br /&gt;India - 96,000+&lt;br /&gt;&lt;br /&gt;And of course, our Baltic neighbours:&lt;br /&gt;Latvia - 12,000+&lt;br /&gt;Estonia - 13,000+&lt;br /&gt;&lt;br /&gt;I'm so proud to be a part of this small cheating nation. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6986358526567149996?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=RB24mcMJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=xTaB2UCo"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=xTaB2UCo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=iKn48TqS"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=iKn48TqS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=w7LkuBZY"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/Kdiel7kJP5E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6986358526567149996/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/lithuania-hacks-up-firefox-3-downloads.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6986358526567149996?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6986358526567149996?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/lithuania-hacks-up-firefox-3-downloads.html" title="Lithuania hacks up Firefox 3 downloads to boost the World Record" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_nP8Aa6cTHpo/SFnyboP3fWI/AAAAAAAAAEo/LhExn_vRfC4/s72-c/lithuania.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></entry><entry gd:etag="W/&quot;CkYNRH07fCp7ImA9WxdQEk0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-4462811903449151907</id><published>2008-06-11T17:58:00.017+03:00</published><updated>2008-06-11T19:03:15.304+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-11T19:03:15.304+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title>Enterprise Journeymen and Free Souls</title><content type="html">Why do people work for big corporations? Why do they strive for things like career, bigger cubicle, higher salary? Most of them are even proud and happy of what they have achieved, even though they are wasting the greater deal of their productive time as slaves to someone who eats the cake and shares the crumbs. &lt;br /&gt;&lt;br /&gt;I call these people Average Enterprise Journeymen (AEJ). In fact, I'm AEJ myself, but at least I'm not proud of that. &lt;br /&gt;&lt;br /&gt;What is the opposite of an AEJ? It's a Free Soul who is not afraid of risk and loss, who does not value stable mid-average results but seeks for great heights. &lt;br /&gt;&lt;br /&gt;Why can't AEJ become a Free Soul? Perhaps because &lt;a href="http://en.wikipedia.org/wiki/Maslow's_hierarchy_of_needs"&gt;Maslow's Hierarchy of Needs&lt;/a&gt; forbids that. People want to feel safe and comfortable, yet, risks break the security down. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SE_p3imINwI/AAAAAAAAAEg/R5hO8YXyypY/s1600-h/400px-maslows_hierarchy_of_needssvg.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SE_p3imINwI/AAAAAAAAAEg/R5hO8YXyypY/s400/400px-maslows_hierarchy_of_needssvg.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5210640434279757570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A Free Soul, on the other hand, sacrifices safety and belonging for self esteem and actualization, with high chances of screwing up and hitting the bottom. But what are the chances to win for someone who is even afraid to try? What is the worst that can happen? The worst is that you'll waste 50% of your productive lifetime as a corporate slave.&lt;br /&gt;&lt;br /&gt;Many people tend to stick to their jobs for years, to build up their work reputation, so they can get a better job, higher position. &lt;br /&gt;&lt;br /&gt;High positions in enterprise hierarchy does not make you less of an AEJ. The only way to remain a Free Soul is to be The Owner. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Don't work for anyone but yourself and let others work for you.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's easy to say and many people understand this, but why don't they do a thing to change their lives? Is it because they are happy to be corporate slaves wearing uncomfortable suits and ties? No, it's because of FEAR.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The only thing we have to fear is fear itself.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;However, it's not that easy. Fear leads to denial, which is similar to what smokers say when they give arguments why they don't want to quit smoking. Positive motivation  is all you need to make miracles.&lt;br /&gt;&lt;br /&gt;To build up my motivation, I'm currently reading a great book - &lt;a href="http://www.amazon.com/4-Hour-Workweek-Escape-Live-Anywhere/dp/0307353133/?tag=paranoengine-20"&gt;The 4 Hour Work Week&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It has some really clever and uplifting points that will make your brain shift. If you will not refuse to accept the ideas it offers, this book may be one of those that can change your fate. I certainly hope it will help me to become a Free Soul. This may help you too, unless your denial and skepticism won't allow you to.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/4-Hour-Workweek-Escape-Live-Anywhere/dp/0307353133/?tag=paranoengine-20"&gt;&lt;br /&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51FSaZaVA3L._SL500_AA240_.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I feel sorry for all those who have to wear those uncomfortable suits and ties on daily basis. Honestly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-4462811903449151907?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=ScgQHRDI"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=xAuyQTKK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=xAuyQTKK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=YRu5cDUn"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=YRu5cDUn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=9OomRnPK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/nXCmGvSYQT4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/4462811903449151907/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/enterprise-journeymen-and-free-souls.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4462811903449151907?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4462811903449151907?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/enterprise-journeymen-and-free-souls.html" title="Enterprise Journeymen and Free Souls" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_nP8Aa6cTHpo/SE_p3imINwI/AAAAAAAAAEg/R5hO8YXyypY/s72-c/400px-maslows_hierarchy_of_needssvg.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUQNRHoyfyp7ImA9WxdQEEU.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-4830650025384664240</id><published>2008-06-10T07:40:00.001+03:00</published><updated>2008-06-10T11:43:15.497+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-10T11:43:15.497+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photography" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><title>Occasional Eye Candy</title><content type="html">&lt;a href="http://www.flickr.com/photos/somefolk/2566205125/" title="The Dune by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3114/2566205125_b61f6e9d88.jpg" width="500" height="375" alt="The Dune" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2567028558/" title="The dunes by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3084/2567028558_4c47e4ec79.jpg" alt="The dunes" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2567026834/" title="Freedom to move by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3113/2567026834_29a53f3302.jpg" alt="Freedom to move" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2567033344/" title="Heavenly straws by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3120/2567033344_54966fd10f.jpg" alt="Heavenly straws" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2566207801/" title="First glimpse at the sea by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3128/2566207801_211e87c92d.jpg" alt="First glimpse at the sea" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2566208749/" title="Sea shore by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3116/2566208749_8aee796138.jpg" alt="Sea shore" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2566203603/" title="The Delta by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3158/2566203603_cb83ce1956.jpg" alt="The Delta" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2567031912/" title="Sea waves by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3136/2567031912_b8ef43ace5.jpg" alt="Sea waves" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2567033608/" title="Beach biker by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3165/2567033608_47a6388b4d.jpg" alt="Beach biker" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2567029134/" title="Sailing by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3055/2567029134_bd70a4d228.jpg" width="500" height="375" alt="Sailing" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2567032412/" title="Sunset by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3113/2567032412_af62fb36b8.jpg" width="500" height="375" alt="Sunset" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2567031152/" title="The K by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3102/2567031152_5c6627b941.jpg" width="500" height="375" alt="The K" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2566205919/" title="Wired by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3193/2566205919_e893da9145.jpg" width="500" height="375" alt="Wired" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/somefolk/2566206381/" title="Steel Ruby by somefolk, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3046/2566206381_6208a895c0.jpg" width="500" height="375" alt="Steel Ruby" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's how much you can see in a single weekend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-4830650025384664240?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=0d8v3hsX"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=Fdhv3HDw"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=Fdhv3HDw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=XaEx3mc2"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=XaEx3mc2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=ZtP9IxMK"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/GW1e9wqXDcs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/4830650025384664240/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/occasional-eye-candy.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4830650025384664240?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4830650025384664240?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/occasional-eye-candy.html" title="Occasional Eye Candy" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DEMBRXozeSp7ImA9WxdRFkk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6065938785291161040</id><published>2008-06-04T08:02:00.011+03:00</published><updated>2008-06-05T09:14:14.481+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-05T09:14:14.481+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><title>The Death of Software Development</title><content type="html">According to &lt;a href="http://trends.google.com/"&gt;Google Trends&lt;/a&gt; software development is slowly dying. People are not interested in it anymore.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/trends?q=programming&amp;amp;ctab=0&amp;amp;geo=all&amp;amp;date=all&amp;amp;sort=0"&gt;Programming:&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SEYjMDy6syI/AAAAAAAAAEI/dfFLb6rWLuw/s1600-h/programming.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SEYjMDy6syI/AAAAAAAAAEI/dfFLb6rWLuw/s400/programming.png" alt="" id="BLOGGER_PHOTO_ID_5207888709184828194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.google.com/trends?q=software+development&amp;amp;ctab=0&amp;amp;geo=all&amp;amp;date=all&amp;amp;sort=0"&gt;Software development:&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SEYj_1Hfv_I/AAAAAAAAAEQ/721C5fthYJM/s1600-h/software.development.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SEYj_1Hfv_I/AAAAAAAAAEQ/721C5fthYJM/s400/software.development.png" alt="" id="BLOGGER_PHOTO_ID_5207889598597808114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.google.com/trends?q=java%2C+c%2B%2B%2C+python%2C+php%2C+ruby&amp;ctab=0&amp;geo=all&amp;date=all&amp;sort=0"&gt;Programming languages:&lt;/a&gt;&lt;br /&gt;&lt;img src="http://www.google.com/trends/images/dot1.gif" border="0" height="11" width="11" /&gt;&lt;b&gt; &lt;span style="color: rgb(70, 132, 238);"&gt;java&lt;/span&gt;    &lt;/b&gt;&lt;img src="http://www.google.com/trends/images/dot2.gif" border="0" height="11" width="11" /&gt;&lt;b&gt; &lt;span style="color: rgb(220, 57, 18);"&gt;c++&lt;/span&gt;    &lt;/b&gt;&lt;img src="http://www.google.com/trends/images/dot3.gif" border="0" height="11" width="11" /&gt;&lt;b&gt; &lt;span style="color: rgb(255, 153, 0);"&gt;python&lt;/span&gt;    &lt;/b&gt;&lt;img src="http://www.google.com/trends/images/dot4.gif" border="0" height="11" width="11" /&gt;&lt;b&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;php&lt;/span&gt;    &lt;/b&gt;&lt;img src="http://www.google.com/trends/images/dot5.gif" border="0" height="11" width="11" /&gt;&lt;b&gt; &lt;span style="color: rgb(73, 66, 204);"&gt;ruby&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SEYnQzYSMDI/AAAAAAAAAEY/Nyh8EgIwAH0/s1600-h/languages.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/SEYnQzYSMDI/AAAAAAAAAEY/Nyh8EgIwAH0/s400/languages.png" alt="" id="BLOGGER_PHOTO_ID_5207893188724011058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Noticed that India is #1 in all these queries? Most of the rest of total search volume comes from some other third world regions. It seems programming is poor man's activity. Are we the coal miners of the 21st century?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update&lt;/span&gt;&lt;br /&gt;My friend Viktoras Agejevas has found a &lt;a href="http://electrotek.wordpress.com/2008/06/04/is-software-development-melting/"&gt;logical explanation&lt;/a&gt; why this could be happening.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6065938785291161040?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=hSwFHCgH"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=lFSpZOdU"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=lFSpZOdU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=0Yar0frm"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=0Yar0frm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=HKD1YQ43"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/pPpM9vr5iRc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6065938785291161040/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/death-of-software-development.html#comment-form" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6065938785291161040?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6065938785291161040?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/death-of-software-development.html" title="The Death of Software Development" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nP8Aa6cTHpo/SEYjMDy6syI/AAAAAAAAAEI/dfFLb6rWLuw/s72-c/programming.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">12</thr:total></entry><entry gd:etag="W/&quot;D0ICQX8zfyp7ImA9WxdRFEo.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-4093093800644739444</id><published>2008-06-03T07:10:00.002+03:00</published><updated>2008-06-03T09:46:00.187+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-03T09:46:00.187+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>When to Refactor and when not to</title><content type="html">Refactoring is one of the key processes in software development. It maintains "health" and "beauty" of the source code. Question is, how to tell when to refactor. Here is my list signs which whisper that refactoring may be necessary:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Messy, ugly, spaghetti, freaky, wrong looking code.&lt;br /&gt;  &lt;li&gt;Copy-pasted code. Slight modifications do not count.  &lt;br /&gt;  &lt;li&gt;Long list of method parameters.  &lt;br /&gt;  &lt;li&gt;Compilation gives warnings. Keep them at zero.&lt;br /&gt;  &lt;li&gt;API docs generation gives warnings. Keep them at zero as well.&lt;br /&gt;  &lt;li&gt;Method is too long. My sane limit is around 20-40 lines of code.&lt;br /&gt;  &lt;li&gt;Class gets big and hard to maintain. &lt;br /&gt;  &lt;li&gt;Too many if/else statements, especially nested ones.&lt;br /&gt;  &lt;li&gt;Use of "switch" statement.&lt;br /&gt;  &lt;li&gt;Large blocks of code inside a control statement (if/else, while, for, etc..).&lt;br /&gt;  &lt;li&gt;Code looks that it could be tighter and more efficient.&lt;br /&gt;  &lt;li&gt;Class has different responsibilities.&lt;br /&gt;  &lt;li&gt;Over-engineered architecture. &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Final decision whether to refactor or not goes from the heart and sanity brain check. When in doubt, ask for your colleague's opinion.&lt;br /&gt;&lt;br /&gt;If you're looking for resources related to software refactoring, you should definitely check out this great classic book by Martin Fowler, Kent Beck &amp; co.:&lt;br /&gt;&lt;a href="http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672?ie=UTF8&amp;tag=paranoengine-20"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/519XT0DER6L._SL500_BO2,204,203,200_PIlitb-dp-500-arrow,TopRight,45,-64_OU01_AA240_SH20_.jpg" title="Refactoring: Improving the Design of Existing Code by Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts"/&gt;&lt;/a&gt;&lt;br /&gt;They also have good &lt;a href="http://www.refactoring.com"&gt;online resource&lt;/a&gt; for the book with extremely useful &lt;a href="http://www.refactoring.com/catalog/index.html"&gt;Catalog of Refactorings&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In case when you have piles of procedural code that you want to refactor into object oriented, this book will be really helpful:&lt;br /&gt;&lt;a href="http://www.amazon.com/Refactoring-Patterns-Addison-Wesley-Signature-Kerievsky/dp/0321213351/?ie=UTF8&amp;tag=paranoengine-20"&gt;&lt;br /&gt;&lt;img src="http://ecx.images-amazon.com/images/I/516pPX8YmvL._SL500_AA240_.jpg" title="Refactoring to Patterns by Joshua Kerievsky"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-4093093800644739444?l=paranoid-engineering.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=X7RQDyaf"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=fXPRrgVO"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=fXPRrgVO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=AkcfWG1N"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?i=AkcfWG1N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/ParanoidEngineering?a=rt3NjiEc"&gt;&lt;img src="http://feeds.feedburner.com/~f/ParanoidEngineering?d=131" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ParanoidEngineering/~4/TDokU0U0YCo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/4093093800644739444/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/when-to-refactor-and-when-not-to.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4093093800644739444?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/4093093800644739444?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2008/06/when-to-refactor-and-when-not-to.html" title="When to Refactor and when not to" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04372016181334649732" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry></feed>
