<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;DUYBQng8fyp7ImA9WhRVGUQ.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578</id><updated>2012-01-19T20:19:13.677+02:00</updated><category term="tools" /><category term="web" /><category term="maven" /><category term="open source" /><category term="being social" /><category term="git tools python" /><category term="presentation" /><category term="software development" /><category term="git tools" /><category term="multiunpacker" /><category term="python" /><category term="cms" /><category term="geekery" /><category term="tips" /><category term="hawkscope" /><category term="windows" /><category term="eclipse" /><category term="pikky" /><category term="productivity" /><category term="nonsense" /><category term="c++" /><category term="work" /><category term="database" /><category term="xml" /><category term="sarcasm" /><category term="gmail4j" /><category term="java" /><category term="photography" /><category term="php" /><category term="patterns" /><category term="howto" /><category term="xsle" /><category term="games" /><category term="music" /><category term="shell scripts" /><category term="hate" /><category term="uncluttering" /><category term="philosophy" /><category term="distributed computing" /><category term="oracle" /><category term="toys" /><category term="life" /><category term="opinion" /><category term="unix" /><category term="mac" /><category term="fun" /><category term="cheatsheet" /><category term="conferences" /><category term="svn" /><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><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>78</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>50</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ParanoidEngineering" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="paranoidengineering" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><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><entry gd:etag="W/&quot;CkQBR347fip7ImA9WhdWEEs.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-1935241519749075464</id><published>2011-09-03T17:32:00.000+03:00</published><updated>2011-09-03T17:32:36.006+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-03T17:32:36.006+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="pikky" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Pikky - Haters Gonna Hate</title><content type="html">Time to reveal my new spare time project - a social search and opinion service called &lt;a href="http://pikky.me/"&gt;Pikky&lt;/a&gt;. What the hell is a search and opinion service you say? Well, you can search things up, see a slideshow of the results and then love or hate it using two big buttons. You can read more in it's &lt;a href="http://pikky.me/about"&gt;About&lt;/a&gt; page.&lt;br /&gt;
&lt;br /&gt;
It's in an early stage of development, so there's nothing amazing. Here are some screens and features:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Home page&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PuYz785vMlM/TmI1sFRNrJI/AAAAAAAADOA/Usv9Ny-hbzs/s1600/Screen%2BShot%2B2011-09-03%2Bat%2B4.59.25%2BPM.png" imageanchor="1"&gt;&lt;img border="0" height="252" src="http://2.bp.blogspot.com/-PuYz785vMlM/TmI1sFRNrJI/AAAAAAAADOA/Usv9Ny-hbzs/s400/Screen%2BShot%2B2011-09-03%2Bat%2B4.59.25%2BPM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Search in action&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Kt_sADUZIhg/TmI2DfKEclI/AAAAAAAADOI/T_UzHZhJCr0/s1600/Screen%2BShot%2B2011-09-03%2Bat%2B5.00.12%2BPM.png" imageanchor="1"&gt;&lt;img border="0" height="323" src="http://2.bp.blogspot.com/-Kt_sADUZIhg/TmI2DfKEclI/AAAAAAAADOI/T_UzHZhJCr0/s400/Screen%2BShot%2B2011-09-03%2Bat%2B5.00.12%2BPM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;View what others were searching for&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--MVwqPNI74w/TmI2TwLDPHI/AAAAAAAADOQ/nmpnb5vPSI0/s1600/Screen%2BShot%2B2011-09-03%2Bat%2B5.00.58%2BPM.png" imageanchor="1" style=""&gt;&lt;img border="0" height="318" width="400" src="http://3.bp.blogspot.com/--MVwqPNI74w/TmI2TwLDPHI/AAAAAAAADOQ/nmpnb5vPSI0/s400/Screen%2BShot%2B2011-09-03%2Bat%2B5.00.58%2BPM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;See authenticated user searches in real time&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-v13o1A8Ov2c/TmI2gaNn6pI/AAAAAAAADOY/dVXMObc0WwM/s1600/Screen%2BShot%2B2011-09-03%2Bat%2B5.01.30%2BPM.png" imageanchor="1" style=""&gt;&lt;img border="0" height="299" width="400" src="http://1.bp.blogspot.com/-v13o1A8Ov2c/TmI2gaNn6pI/AAAAAAAADOY/dVXMObc0WwM/s400/Screen%2BShot%2B2011-09-03%2Bat%2B5.01.30%2BPM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Get awarded with stars for various actions.&lt;/b&gt; Perhaps this service will turn out to be a game.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wuHr6T8zpQI/TmI2-QUR-6I/AAAAAAAADOg/Ft3_umwnH7A/s1600/Screen%2BShot%2B2011-09-03%2Bat%2B5.03.25%2BPM.png" imageanchor="1" style=""&gt;&lt;img border="0" height="357" width="345" src="http://3.bp.blogspot.com/-wuHr6T8zpQI/TmI2-QUR-6I/AAAAAAAADOg/Ft3_umwnH7A/s400/Screen%2BShot%2B2011-09-03%2Bat%2B5.03.25%2BPM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;View slideshow in fullscreen mode&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pVm6APpvAjA/TmI3GraoZvI/AAAAAAAADOo/0w85iD0vwPA/s1600/Screen%2BShot%2B2011-09-03%2Bat%2B5.02.55%2BPM.png" imageanchor="1" style=""&gt;&lt;img border="0" height="328" width="400" src="http://3.bp.blogspot.com/-pVm6APpvAjA/TmI3GraoZvI/AAAAAAAADOo/0w85iD0vwPA/s400/Screen%2BShot%2B2011-09-03%2Bat%2B5.02.55%2BPM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Works on iPhone&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-lYHAeFgj-3I/TmI3WYJA1UI/AAAAAAAADOw/pE49aWPUMVc/s1600/IMG_0438.PNG" imageanchor="1" style=""&gt;&lt;img border="0" height="400" width="267" src="http://2.bp.blogspot.com/-lYHAeFgj-3I/TmI3WYJA1UI/AAAAAAAADOw/pE49aWPUMVc/s400/IMG_0438.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
This project is being developed using &lt;a href="http://www.djangoproject.com"&gt;Django&lt;/a&gt;, and I must say I'm loving the framework. It's much more fun than coding web applications with anything available in Java and it's way less lunatic than Ruby on Rails.&lt;br /&gt;
&lt;br /&gt;
If you want to know what's happening with Pikky, you can follow &lt;a href="http://twitter.com/#!/pikkyme"&gt;@pikkyme&lt;/a&gt; on Twitter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-1935241519749075464?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=O_6SXC_yjIc:oq1kya8XLx0: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=O_6SXC_yjIc:oq1kya8XLx0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=O_6SXC_yjIc:oq1kya8XLx0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=O_6SXC_yjIc:oq1kya8XLx0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=O_6SXC_yjIc:oq1kya8XLx0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=O_6SXC_yjIc:oq1kya8XLx0: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=O_6SXC_yjIc:oq1kya8XLx0: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/O_6SXC_yjIc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/1935241519749075464/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2011/09/pikky-haters-gonna-hate.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1935241519749075464?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/1935241519749075464?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2011/09/pikky-haters-gonna-hate.html" title="Pikky - Haters Gonna Hate" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-PuYz785vMlM/TmI1sFRNrJI/AAAAAAAADOA/Usv9Ny-hbzs/s72-c/Screen%2BShot%2B2011-09-03%2Bat%2B4.59.25%2BPM.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEQAQnc_fip7ImA9Wx9UE04.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-8763019971707683004</id><published>2011-02-10T12:05:00.000+02:00</published><updated>2011-02-10T12:05:43.946+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-10T12:05:43.946+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><title>Slogan FAIL</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Now4FVYNT3Y/TVO31_s9WhI/AAAAAAAADAk/psSdhYfWy3E/s1600/Screen%2Bshot%2B2011-02-10%2Bat%2B12.01.33.png" imageanchor="1" style=""&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Now4FVYNT3Y/TVO31_s9WhI/AAAAAAAADAk/psSdhYfWy3E/s800/Screen%2Bshot%2B2011-02-10%2Bat%2B12.01.33.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Rails deployment that just works!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-8763019971707683004?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=G8yPXi1KYbc:gN_x2-5Aizs: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=G8yPXi1KYbc:gN_x2-5Aizs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=G8yPXi1KYbc:gN_x2-5Aizs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=G8yPXi1KYbc:gN_x2-5Aizs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=G8yPXi1KYbc:gN_x2-5Aizs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=G8yPXi1KYbc:gN_x2-5Aizs: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=G8yPXi1KYbc:gN_x2-5Aizs: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/G8yPXi1KYbc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/8763019971707683004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2011/02/slogan-fail.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8763019971707683004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8763019971707683004?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2011/02/slogan-fail.html" title="Slogan FAIL" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Now4FVYNT3Y/TVO31_s9WhI/AAAAAAAADAk/psSdhYfWy3E/s72-c/Screen%2Bshot%2B2011-02-10%2Bat%2B12.01.33.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0EBQ34zfip7ImA9Wx9TE04.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-8290812487073960755</id><published>2010-11-21T13:40:00.001+02:00</published><updated>2010-11-21T13:40:52.086+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-21T13:40:52.086+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git tools" /><title>GitMon Quick Start Screencast</title><content type="html">A screencast showing how to install GitMon in 5 minutes on a Mac.&lt;br /&gt;
&lt;br /&gt;
&lt;embed src="http://blip.tv/play/hsQTgo6qeAA" type="application/x-shockwave-flash" width="640" height="480" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-8290812487073960755?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=r5BJMtV-KXw:xNkI0egY9jc: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=r5BJMtV-KXw:xNkI0egY9jc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=r5BJMtV-KXw:xNkI0egY9jc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=r5BJMtV-KXw:xNkI0egY9jc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=r5BJMtV-KXw:xNkI0egY9jc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=r5BJMtV-KXw:xNkI0egY9jc: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=r5BJMtV-KXw:xNkI0egY9jc: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/r5BJMtV-KXw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/8290812487073960755/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/11/gitmon-quick-start-screencast.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8290812487073960755?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8290812487073960755?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/11/gitmon-quick-start-screencast.html" title="GitMon Quick Start Screencast" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MDQHY9eip7ImA9Wx5aEE4.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6251801321989534309</id><published>2010-11-06T11:23:00.001+02:00</published><updated>2010-11-06T11:24:31.862+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-06T11:24:31.862+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git tools python" /><title>GitMon 0.3 - Easy Install!</title><content type="html">Since the &lt;a href="http://paranoid-engineering.blogspot.com/2010/10/gitmon-git-repository-monitor.html"&gt;last post&lt;/a&gt; GitMon has got many improvements, including the easy_install support (GitMon is hosted at &lt;a href="http://pypi.python.org/pypi/GitMon/"&gt;Python Package Index&lt;/a&gt;), so to install it, simply do:&lt;br /&gt;
&lt;pre name="code"&gt;sudo easy_install gitmon
&lt;/pre&gt;Then run &lt;code&gt;gitmon&lt;/code&gt; from terminal and it will create a default configuration file for you (~/.gitmon.conf). Edit it and you're good to go!&lt;br /&gt;
&lt;br /&gt;
Mac OS X users who have Growl installed can get it all working in 3 minutes. It will involve some additional configuration twiddling for Linux and Windows guys, but that will be improved in future releases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6251801321989534309?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=ryVM8ISJEUE:d2cBcWLPgbQ: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=ryVM8ISJEUE:d2cBcWLPgbQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=ryVM8ISJEUE:d2cBcWLPgbQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=ryVM8ISJEUE:d2cBcWLPgbQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=ryVM8ISJEUE:d2cBcWLPgbQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=ryVM8ISJEUE:d2cBcWLPgbQ: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=ryVM8ISJEUE:d2cBcWLPgbQ: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/ryVM8ISJEUE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6251801321989534309/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/11/gitmon-03-easy-install.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6251801321989534309?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6251801321989534309?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/11/gitmon-03-easy-install.html" title="GitMon 0.3 - Easy Install!" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0UDRnsyeip7ImA9Wx5UEkk.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-3138847845757294109</id><published>2010-10-16T14:23:00.004+03:00</published><updated>2010-10-16T20:14:37.592+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-16T20:14:37.592+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git tools python" /><title>GitMon - the git repository monitor</title><content type="html">&lt;b&gt;Dozens of git repositories? Want to know what's happening?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If you are actively using &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt;&amp;nbsp;(which you should, because it's awesome), you may have looked for a way to get those nice popup notifications when something is pushed to remote origin. When you have dozens of repositories to work with, it may get annoying to go through all of them and check for updates. I haven't found anything mature and worth using, so I decided to get my hands dirty...&lt;br /&gt;
&lt;br /&gt;
And finally, after many joyful hours of coding... Meet &lt;a href="http://github.com/spajus/gitmon"&gt;GitMon&lt;/a&gt; - an open source git monitoring tool. Here's how it looks like:&lt;br /&gt;
&lt;div style="float: none;"&gt;&lt;div style="float: left; margin: 5px;"&gt;&lt;div style="clear: left; float: left; margin: 5px;"&gt;&lt;a href="http://2.bp.blogspot.com/_nP8Aa6cTHpo/TLl2lPX64RI/AAAAAAAAC_o/gLlsgNPzJjY/s1600/Screen+shot+2010-10-16+at+11.24.50+AM.png"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_nP8Aa6cTHpo/TLl2lPX64RI/AAAAAAAAC_o/gLlsgNPzJjY/s400/Screen+shot+2010-10-16+at+11.24.50+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="float: none; margin: 5px;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_nP8Aa6cTHpo/TLl2U8gSX6I/AAAAAAAAC_k/95Jd2ych4qo/s1600/Screen+shot+2010-10-16+at+12.12.10+PM.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="clear: both;"&gt;You may have noticed that it's a typical &lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt; notification. GitMon can also be configured to use &lt;a href="http://dambalah.com/2008/11/23/ubuntu-notifications-using-libnotify-bin/"&gt;libnotify-bin&lt;/a&gt; on Linux and there is &lt;a href="http://www.growlforwindows.com/gfw/"&gt;Growl for Windows&lt;/a&gt; which may do the job (I haven't tried that yet though).&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;GitMon Features (0.1.6):&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
• Configurable notifications via command-line tools (growlnotify, notify-send, ...)&lt;br /&gt;
• Scheduling via standard tools (like crontab)&lt;br /&gt;
• Support for multiple git repositories&lt;br /&gt;
• Possibility to give repositories custom names&lt;br /&gt;
• Possibility to notify about new branches&lt;br /&gt;
• Possibility to notify about new tags&lt;br /&gt;
• Configurable limit of new commits in notification&lt;br /&gt;
• Configurable limit of file details in notification&lt;br /&gt;
• Possibility to perform 'git pull' automatically&lt;br /&gt;
• Variables in configuration file&lt;br /&gt;
• Recursive file system scanning for repositories (configurable roots)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Installing GitMon&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If you're willing to try it, there is no "next", "next", "finish" installation so far, so you will have to do this (shouldn't be too difficult to do for any developer):&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Clone the repo:&lt;/b&gt;&lt;br /&gt;
Fire up the terminal and go where you want 'gitmon' dir to appear. Then do:&lt;br /&gt;
&lt;pre&gt;git clone git://github.com/spajus/gitmon.git&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;2. Add gitmon to path:&lt;/b&gt;&lt;br /&gt;
You may want to put this in your ~/.profile:&lt;br /&gt;
&lt;pre&gt;export PATH="$PATH:/path/to/gitmon"&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;3. Make sure you have &lt;a href="http://growl.info/"&gt;growlnotify&lt;/a&gt; (Mac) or notify-send (Linux).&lt;/b&gt; &lt;br /&gt;
You can install notify-send command easily: &lt;br /&gt;
&lt;pre&gt;apt-get install libnotify-bin&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;4. Set up the configuration:&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;cp gitmon.conf.example ~/.gitmon.conf&lt;/pre&gt;Then edit ~/.gitmon.conf to suit your needs.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5. Make sure you have Python 2.6+ and &lt;a href="http://gitorious.org/git-python"&gt;GitPython&lt;/a&gt;:&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;python --version
easy_install gitpython&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;6. Test if your gitmon.conf works:&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;gitmon -v&lt;/pre&gt;A good output may look something like this:&lt;br /&gt;
&lt;pre&gt;GitMon v0.1.5
Loading configuration from /Users/tomasv/.gitmon.conf
Tracking repo: "GitMon Repo" at ~/Development/python/gitmon
Checking repo: GitMon Repo&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;7. Configure crontab:&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;crontab -e&lt;/pre&gt;Example:&lt;br /&gt;
&lt;pre&gt;#git must be in cron's path!
PATH=/usr/local/bin:/usr/bin:/bin
#check for repo updates every 5 minutes
*/5 * * * * gitmon&lt;/pre&gt;&lt;br /&gt;
That's it. Now just wait for those notifications!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Roadmap&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There is a small roadmap for future releases:&lt;br /&gt;
• Installation bundles for major operating systems&lt;br /&gt;
• Menubar / system tray icon&lt;br /&gt;
• GUI for configuration&lt;br /&gt;
• Integration with diff tools&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I have just found &lt;a href="http://psionides.github.com/gitifier/"&gt;Gitifier&lt;/a&gt;. Here's how GitMon and Gitifier notifications about same commit look next to each other:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://lh5.ggpht.com/_nP8Aa6cTHpo/TLnBQ8twHnI/AAAAAAAAC_s/6LIHhfFUOPc/Screen%20shot%202010-10-16%20at%206.13.01%20PM.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-3138847845757294109?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=RPz74eohey4:if3RfJRMEHo: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=RPz74eohey4:if3RfJRMEHo:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=RPz74eohey4:if3RfJRMEHo:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=RPz74eohey4:if3RfJRMEHo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=RPz74eohey4:if3RfJRMEHo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=RPz74eohey4:if3RfJRMEHo: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=RPz74eohey4:if3RfJRMEHo: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/RPz74eohey4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/3138847845757294109/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/10/gitmon-git-repository-monitor.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3138847845757294109?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/3138847845757294109?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/10/gitmon-git-repository-monitor.html" title="GitMon - the git repository monitor" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_nP8Aa6cTHpo/TLl2lPX64RI/AAAAAAAAC_o/gLlsgNPzJjY/s72-c/Screen+shot+2010-10-16+at+11.24.50+AM.png" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;CUIEQ3Y-eSp7ImA9Wx5SGEs.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7736594559825142898</id><published>2010-08-15T12:11:00.000+03:00</published><updated>2010-08-15T12:11:42.851+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-15T12:11:42.851+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="xml" /><title>XML Zen 0.2</title><content type="html">After a long break a new version of &lt;a href="http://xmlzen.googlecode.com"&gt;XML Zen&lt;/a&gt; was finally released. It has several bug fixes along with some new features. The changelog:&lt;br /&gt;
&lt;br /&gt;
Changes in version 0.2.0 (2010-08-15)&lt;ul&gt;&lt;li&gt;Fixed a bug which prevented getting attribute values in some cases (&lt;a href="http://code.google.com/p/xmlzen/issues/detail?id=11"&gt;Issue #11&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added a possibility to set some defaults for XmlBuilder (&lt;a href="http://code.google.com/p/xmlzen/issues/detail?id=10"&gt;Issue #10&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Added XmlBuilderOutput interface with String and OutputStream implementations (&lt;a href="http://code.google.com/p/xmlzen/issues/detail?id=8"&gt;Issue #8&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;XmlBuilder builds formatted XML with declaration (if charset is provided) (&lt;a href="http://code.google.com/p/xmlzen/issues/detail?id=9"&gt;Issue #9&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;File support in XmlBuilder (through XmlBuilderStreamOutput) and XmlSlicer (&lt;a href="http://code.google.com/p/xmlzen/issues/detail?id=7"&gt;Issue #7&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;I would like to thank &lt;a href="http://www.jetbrains.com"&gt;JetBrains&lt;/a&gt; for &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt; license which was issued for this project. I’m trying to switch from Eclipse to IDEA, and so far I feel quite excited about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7736594559825142898?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=pnPNziIXUyw:fQbo8exeUag: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=pnPNziIXUyw:fQbo8exeUag:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=pnPNziIXUyw:fQbo8exeUag:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=pnPNziIXUyw:fQbo8exeUag:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=pnPNziIXUyw:fQbo8exeUag:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=pnPNziIXUyw:fQbo8exeUag: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=pnPNziIXUyw:fQbo8exeUag: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/pnPNziIXUyw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7736594559825142898/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/08/xml-zen-02.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7736594559825142898?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7736594559825142898?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/08/xml-zen-02.html" title="XML Zen 0.2" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MDSXg5eip7ImA9WxFaEkg.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6086233206099230586</id><published>2010-07-15T17:25:00.002+03:00</published><updated>2010-07-16T07:44:38.622+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-16T07:44:38.622+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="distributed computing" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>SQL + NoSQL = SomeSQL</title><content type="html">Along with the &lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt; movement came a problem - how to query the data in distributed NoSQL databases?&lt;br /&gt;
&lt;br /&gt;
A possible solution is to use both SQL and NoSQL. Imagine using a conventional RDBMS for indexing your data along with NoSQL database for storing actual data. Then query your index RDBMS with SQL and fetch full results from NoSQL buckets.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Modeling&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Determine what parts of your data do you want to index.&lt;/li&gt;
&lt;li&gt;Model your RDBMS by putting only index fields there.&lt;/li&gt;
&lt;li&gt;Each table that represents some entity must contain a NoSQL id which links to actual object in your distributed database.&lt;/li&gt;
&lt;li&gt;Model your NoSQL database so that it will store your objects in a serialized way (JSON, XML, ...).&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;b&gt;Inserting&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Generate an identifier which will link your NoSQL entry with RDBMS. This can be some object hashcode or an SQL sequence value. &lt;/li&gt;
&lt;li&gt;Write your object into RDBMS (only indexed fields) providing the NoSQL ID. This can be done asynchroniously.&lt;/li&gt;
&lt;li&gt;Write your object into NoSQL DB.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;b&gt;Querying&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Query your RDBMS for indexed fields.&lt;/li&gt;
&lt;li&gt;Retrieve NoSQL ID from query results.&lt;/li&gt;
&lt;li&gt;Fetch objects from NoSQL DB using the NoSQL ID.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
This approach could be called as &lt;b&gt;SomeSQL&lt;/b&gt; (due to SQL + NoSQL). I haven’t tested it in real environments, so it would be interesting to know if anyone did this and if this approach proved to be useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-6086233206099230586?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=moZVNrdbKYo:YUOBoZhjyeQ: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=moZVNrdbKYo:YUOBoZhjyeQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=moZVNrdbKYo:YUOBoZhjyeQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=moZVNrdbKYo:YUOBoZhjyeQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=moZVNrdbKYo:YUOBoZhjyeQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=moZVNrdbKYo:YUOBoZhjyeQ: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=moZVNrdbKYo:YUOBoZhjyeQ: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/moZVNrdbKYo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/6086233206099230586/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/07/sql-nosql-somesql.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6086233206099230586?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/6086233206099230586?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/07/sql-nosql-somesql.html" title="SQL + NoSQL = SomeSQL" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;AkEHQ3ozfip7ImA9WxBbE00.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-8520698900858024378</id><published>2010-03-11T13:57:00.000+02:00</published><updated>2010-03-11T13:57:12.486+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-11T13:57:12.486+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="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>Compiling Java applications to native Windows executables</title><content type="html">Being a Java developer really sucks when it comes to making end-user desktop applications. You want these applications to be light, fast and easily redistributable. Packaging a bunch of jars along with startup script is the worst thing you can do. It may work quite well in various Linux distributions, where you can make a .deb or .rpm which automatically installs JRE, puts startup script to &lt;code&gt;/usr/local/bin&lt;/code&gt; and creates a nice launcher with icon in the applications menu. In Mac OS you can use that outdated JRE that comes by default and then easily bundle all scripts and jars into an .app. But in Windows it does not work that way. You can use &lt;a href="http://jsmooth.sourceforge.net/"&gt;JSmooth&lt;/a&gt; to make .exe out of .jar and use &lt;a href="http://nsis.sourceforge.net/"&gt;NSIS&lt;/a&gt; to create a nice installer, but there still is a problem. User may not have a compatible JRE, or he/she may choose not to have one just because Java sucks for running on it's bloated memory hogging virtual machine. I have to agree here. As a user, I have no faith in desktop applications that are written in Java.&lt;br /&gt;
&lt;br /&gt;
So what is the solution? Compile to native executable and forget JRE. It is possible, but it will not be a walk in the park. First, you will have to get familiar with &lt;a href="http://gcc.gnu.org/"&gt;GNU Compiler Collection&lt;/a&gt; and particularly with &lt;a href="http://gcc.gnu.org/java/"&gt;GCJ&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Let's compile a Hello World application like this one:&lt;br /&gt;
&lt;pre name="code" class="java"&gt;public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello native world!");
    }
}
&lt;/pre&gt;&lt;ol&gt;&lt;li&gt;Get the patched GCJ here: &lt;a href="http://www.thisiscool.com/gcc_mingw.htm#gcj43ecj"&gt;http://www.thisiscool.com/gcc_mingw.htm&lt;/a&gt; (120 MB)&lt;/li&gt;
&lt;li&gt;Extract it somewhere and add thisiscool-gcc/gcc-ejc/bin to your PATH&lt;/li&gt;
&lt;li&gt;Compile Hello.java as Hello.exe: &lt;code&gt;gcj --main=Hello -o Hello Hello.java&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Enjoy your statically linked Hello.exe which prints Hello native world! and runs without JRE.&lt;/li&gt;&lt;/ol&gt;Wait. Hello.exe is 37MB? Holy crap! Well, it's a little overhead you have to pay for loosing the JRE, this .exe contains the whole garbage collection mechanism, etc. Also, you will be able to compile SWT GUI applications! It is possible to get smaller executables with &lt;a href="http://www.mingw.org/"&gt;MinGW&lt;/a&gt; tooling. Hello.java compiled with MinGW is about 3MB, but it has other issues, I couldn't manage to get the system output working. You may be more lucky though.&lt;br /&gt;
&lt;br /&gt;
Anyway, when you compile native binaries, your Java code cannot be &lt;a href="http://www.varaneckas.com/jad"&gt;decompiled&lt;/a&gt;, so you have better protection than by using &lt;a href="http://proguard.sourceforge.net/"&gt;obfuscators&lt;/a&gt;. And the best thing is that end users won't complain that "it's crap because it's Java". They just wouldn't know.&lt;br /&gt;
&lt;br /&gt;
I wish Sun (I just can't say Oracle when referring to Java, it makes me sick, sorry) could create an official &lt;a href="http://en.wikipedia.org/wiki/AOT_compiler"&gt;AOT&lt;/a&gt; Java compiler so developers would not have to go through hellfire to make native executables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-8520698900858024378?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=xd1S8TQh23k:zL_foeC_WNA: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=xd1S8TQh23k:zL_foeC_WNA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=xd1S8TQh23k:zL_foeC_WNA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=xd1S8TQh23k:zL_foeC_WNA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=xd1S8TQh23k:zL_foeC_WNA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=xd1S8TQh23k:zL_foeC_WNA: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=xd1S8TQh23k:zL_foeC_WNA: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/xd1S8TQh23k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/8520698900858024378/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/03/compiling-java-applications-to-native.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8520698900858024378?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/8520698900858024378?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2010/03/compiling-java-applications-to-native.html" title="Compiling Java applications to native Windows executables" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>7</thr:total></entry><entry gd:etag="W/&quot;AkEAQHk4eCp7ImA9WxNbE0w.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-5349102237370273328</id><published>2009-11-15T22:37:00.008+02:00</published><updated>2009-11-15T22:57:21.730+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-15T22:57:21.730+02: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="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><title>Making Windows a better place to be</title><content type="html">&lt;div&gt;&lt;div style="text-align: left" id="rrmf"&gt;Many developers including me are forced to use Windows at work due to various corporate reasons even when our work has nothing to do with Microsoft technologies. And we are all stuck with that terrible &lt;a id="gu8w" href="http://en.wikipedia.org/wiki/Command_Prompt" title="Command Prompt"&gt;Command Prompt&lt;/a&gt; or a &lt;a id="w4wi" href="http://en.wikipedia.org/wiki/Windows_PowerShell" title="Power Shell"&gt;Power Shell&lt;/a&gt; which are crap compared to a proper terminal. However, there is a way to have a fully functional Unix terminal in Windows thanks to &lt;a id="leqp" href="http://www.cygwin.com/" title="Cygwin"&gt;Cygwin&lt;/a&gt; and a &lt;a id="c:3j" href="http://code.google.com/p/puttycyg/" title="patched version of Putty"&gt;patched version of Putty&lt;/a&gt;. &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am doing this for several years and this is one of the first things I do in any Windows machine that I want to do some software development on, so it's time to come up with a little tutorial.&lt;/div&gt;&lt;h1&gt;Setting up Cygwin and PuttyCyg&lt;/h1&gt;&lt;h2&gt;Getting Cygwin&lt;br /&gt;&lt;/h2&gt;&lt;div&gt;Go to &lt;a id="hy36" href="http://www.cygwin.com/" title="http://www.cygwin.com"&gt;http://www.cygwin.com&lt;/a&gt; to download and run the &lt;a id="chse" href="http://www.cygwin.com/setup.exe" title="setup.exe"&gt;setup.exe&lt;/a&gt;. Installation process is illustrated in screenshots below.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left" id="qhls"&gt;&lt;img src="http://lh3.ggpht.com/_nP8Aa6cTHpo/SwAS8jlsXOI/AAAAAAAACXA/PVnspbjVGvU/2009.11.14-21.36.04.png" style="width: 505px; height: 388px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="h6bg"&gt;&lt;img src="http://lh5.ggpht.com/_nP8Aa6cTHpo/SwAS8nEG-yI/AAAAAAAACXE/yDcOph9RSBw/2009.11.14-21.36.15.png" style="width: 505px; height: 388px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;I suggest you installing cygwin directly to C:\cygwin as it's recommended. It's a significant part of your system and it is really worth the place in C:\ directly.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="sbjx"&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/SwAS8tengwI/AAAAAAAACXI/GtuoHr64XsU/2009.11.14-21.36.30.png" style="width: 505px; height: 388px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="i6.0"&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/SwAS8phpwUI/AAAAAAAACXM/uORNkRZylFM/2009.11.14-21.36.53.png" style="width: 505px; height: 388px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Cygwin offers "C:\Windows\System32" as a place for local packages, however I don't like that idea and keep it all under "C:\cygwin".&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="b-_j"&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/SwAS80DWcsI/AAAAAAAACXQ/sVdetW-FFLs/2009.11.14-21.36.59.png" style="width: 505px; height: 388px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Some mirrors were failing for me with missing packages so I choose a respectable source and deal with slower download speed in exchange for reliability.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="nsas"&gt;&lt;img src="http://lh3.ggpht.com/_nP8Aa6cTHpo/SwATFS8FGtI/AAAAAAAACXU/hACjGrtrATE/2009.11.14-21.37.41.png" style="width: 505px; height: 388px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="lvw9"&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/SwATFQqI2JI/AAAAAAAACXY/a-xmkuqVxUg/2009.11.14-21.37.45.png" style="width: 505px; height: 388px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Choosing packages may take a while. You can go with default selection, however going through the long list is worth a while if you want to have goodies like vim, curl, ping, openssh, mc and so on.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="deqd"&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/SwATFj_LYwI/AAAAAAAACXc/O9nWWIeyVqg/2009.11.14-21.51.01.png" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Now go make yourself some coffee.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="yz-t"&gt;&lt;img src="http://lh3.ggpht.com/_nP8Aa6cTHpo/SwATFoS08HI/AAAAAAAACXg/JPRR3KdewUc/2009.11.14-21.52.01.png" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Don't add any icons or shortcuts because they open cygwin in that ugly command prompt we are about to get rid of.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="p553"&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/SwATFrt1e0I/AAAAAAAACXk/-kzHq4Vibbg/2009.11.14-22.21.25.png" style="width: 505px; height: 388px" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Introducing Cygwin to your Windows&lt;/h2&gt;&lt;div&gt;Now that you have the Cygwin, try it out by launching C:\cygwin\cygwin.bat. You will see something like this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left" id="d.ry"&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/SwBNACmJcJI/AAAAAAAACYA/_1jUXLTLBME/2009.11.15-20.47.13.png" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;As you can see, a few files can be modified to configure your environment. Keep them in mind for future:&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;~/.bashrc&lt;/li&gt;&lt;li&gt;~/.bash_profile&lt;/li&gt;&lt;li&gt;~/.inputrc&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now append these to the beginning of your Windows PATH environmental variable:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C:\cygwin\usr\local\bin;C:\cygwin\usr\bin;C:\cygwin\bin;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left" id="ywzb"&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/SwBRcXXCY8I/AAAAAAAACYE/wC8dd0zg5nY/2009.11.15-21.05.48.png" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="pvua"&gt;&lt;img src="http://lh5.ggpht.com/_nP8Aa6cTHpo/SwBR-qX-OvI/AAAAAAAACYQ/-2L5g9cmXzw/2009.11.15-21.06.21.png" style="width: 347px; height: 140px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Run a fresh Command Prompt (if you are using &lt;a id="maqo" href="http://www.launchy.net/" title="Launchy"&gt;Launchy&lt;/a&gt; or a similar program to run the cmd.exe, you have to restart it before the new PATH applies to programs you run.) and you will be able to do the following:&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="idrl"&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/SwBT3XX2r4I/AAAAAAAACYU/B9DftaWAUOE/2009.11.15-21.16.59.png" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;That's just a small benefit you get from cygwin, but it's handy to have unix commands anywhere in the system. If you think that cmd.exe is enough to enjoy unix commands, you are wrong. It fails to resize properly, it's hard to copy and paste. Compare using Putty with a remote machine to using Command Prompt on your local Windows box, It's like day and night.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Getting PuttyCyg&lt;br /&gt;&lt;/h2&gt;&lt;div&gt;&lt;div style="text-align: left"&gt;Get the latest puttycyg from &lt;a id="uarr" href="http://code.google.com/p/puttycyg/" title="http://code.google.com/p/puttycyg/"&gt;http://code.google.com/p/puttycyg/&lt;/a&gt;. For the past year it's this one: &lt;a id="thug" href="http://puttycyg.googlecode.com/files/puttycyg-20090811.zip" title="http://puttycyg.googlecode.com/files/puttycyg-20090811.zip"&gt;http://puttycyg.googlecode.com/files/puttycyg-20090811.zip&lt;/a&gt;. You can put it in c:\cygwin\puttycyg to avoid a mixup with the original &lt;a id="w.:p" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" title="Putty"&gt;Putty&lt;/a&gt; if you use it.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Configuring PuttyCyg to access local cygwin&lt;/h2&gt;&lt;div&gt;Create a shortcut to putty.exe from the puttycyg pack that you just extracted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left" id="gumi"&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/SwBcSjaVsQI/AAAAAAAACYY/tt3jYLdFpks/2009.11.15-21.51.53.png" style="width: 235px; height: 117px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Run it to configure the local connection. Check "Cygterm" in Connection type and enter a minus (-) in Command.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="o_e-"&gt;&lt;img src="http://lh5.ggpht.com/_nP8Aa6cTHpo/SwBd4xX5T9I/AAAAAAAACYc/ns8yt8r9VCA/2009.11.15-21.57.04.png" style="width: 456px; height: 435px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Be sure to go to Window configuration and set Lines of scrollback to something more reasonable than the default 200.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="d-4u"&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/SwBd4wWsVrI/AAAAAAAACYg/_XkAg7GskH4/2009.11.15-21.57.51.png" style="width: 456px; height: 435px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Save the settings. Name the session "localhost".&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="e:-x"&gt;&lt;img src="http://lh6.ggpht.com/_nP8Aa6cTHpo/SwBd5OSZtBI/AAAAAAAACYo/PlPJSykrfgY/2009.11.15-21.59.07.png" style="width: 456px; height: 435px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;Now click "Open" to test the configuration. You should see a working terminal.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="pcue"&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/SwBhrxus_FI/AAAAAAAACYs/8RL0FU-WO5o/2009.11.15-22.15.51.png"/&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;You can now enhance the shortcut you created earlier to load the "localhost" session automatically. Just append "-load localhost" to the end of Target.&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div style="text-align: left" id="ydru"&gt;&lt;img src="http://lh3.ggpht.com/_nP8Aa6cTHpo/SwBjLwO7EAI/AAAAAAAACY4/8iO41zsqVfo/2009.11.15-22.20.01.png" style="width: 392px; height: 522px" /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left"&gt;You're all set. A few resources to get you familiar with Cygwin:&lt;/div&gt;&lt;div style="text-align: left"&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="xhip" href="http://cygwin.com/cygwin-ug-net/" title="Cygwin User's Guide"&gt;Cygwin User's Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="vvg5" href="http://www.physionet.org/physiotools/cygwin/" title="An introduction to Cygwin"&gt;An introduction to Cygwin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="xq_5" href="http://lifehacker.com/software/top/geek-to-live--introduction-to-cygwin-part-i-179514.php" title="Lifehacker: Introduction to Cygwin"&gt;Lifehacker: Introduction to Cygwin&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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-5349102237370273328?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=qpZs-HW73Ro:lKzMYD8GMxE: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=qpZs-HW73Ro:lKzMYD8GMxE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=qpZs-HW73Ro:lKzMYD8GMxE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=qpZs-HW73Ro:lKzMYD8GMxE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=qpZs-HW73Ro:lKzMYD8GMxE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=qpZs-HW73Ro:lKzMYD8GMxE: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=qpZs-HW73Ro:lKzMYD8GMxE: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/qpZs-HW73Ro" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/5349102237370273328/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/11/making-windows-better-place-to-be.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5349102237370273328?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5349102237370273328?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/11/making-windows-better-place-to-be.html" title="Making Windows a better place to be" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_nP8Aa6cTHpo/SwAS8jlsXOI/AAAAAAAACXA/PVnspbjVGvU/s72-c/2009.11.14-21.36.04.png" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;D0MERno6cSp7ImA9WxNVF04.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7932122109832230247</id><published>2009-10-28T15:06:00.002+02:00</published><updated>2009-10-28T15:10:07.419+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-28T15:10:07.419+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>REST fan types</title><content type="html">While looking up some information about &lt;a id="mokg" href="http://en.wikipedia.org/wiki/Representational_State_Transfer" title="REST"&gt;REST&lt;/a&gt; and RESTful services I've encountered a &lt;a id="qkaq" href="http://tech.groups.yahoo.com/group/rest-discuss/message/13422" title="pretty amusing forum post"&gt;pretty amusing forum post&lt;/a&gt; that defines REST fan type hierarchy. Let me share the smile:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;API Makers&lt;/b&gt;: I find them everywhere. They have a system, usually not built thinking on REST, and they want an API created. They usually think REST is an API making technique or recipe, for the web.&lt;br /&gt; - &lt;b&gt;URI Jugglers&lt;/b&gt;. This are the ones that think REST is all about creating URIs, and nothing more. So their discussions are solely focused on URIs, and their presentations are about URIs definitions.&lt;br /&gt; - &lt;b&gt;RPCers&lt;/b&gt;. Bad group that think REST is a way to map RPC in disguise using URIs in a web API. The most of them don't know they speak RPC at all.&lt;br /&gt; - &lt;b&gt;Exposers&lt;/b&gt;: This type is repeated below. Those are the guys that think you need to expose things in REST using resources. So REST is an API for exposing things on the web.&lt;br /&gt; - &lt;b&gt;CRUDers&lt;/b&gt;: Another repeated group. They think REST is a web api for CRUD. Simple.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mappers&lt;/b&gt;: This other category may use the API idea, but they actually thing REST is a representation type and the work to be done is to map all that is know used to that new type. Interesting?&lt;br /&gt; - &lt;b&gt;CRUDers&lt;/b&gt;. Again, the idea is that CRUD can be mapped naturally to HTTP operations, and that makes it RESTful. &lt;br /&gt; - &lt;b&gt;HTTPers&lt;/b&gt;. They believe REST is HTTP. Deep enough.&lt;br /&gt; - &lt;b&gt;Exposers&lt;/b&gt;. Again too. They usually try to map all classes, data entities, elements into resources, and then call their systems RESTful.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;FAD followers&lt;/b&gt;: This is a group of the reminders of the types. Usually, they tend to follow a lead.&lt;/div&gt;&lt;div&gt; - &lt;b&gt;Standard Haters&lt;/b&gt;: Here you have all those that think Standards are evil and that REST is an anarchy where you have the freedom to do whatever you like, so they follow REST doing whatever they want.&lt;br /&gt;&lt;/div&gt; - &lt;b&gt;KISS lovers&lt;/b&gt;: This are the ones that like thinks to be simple. And someone told them REST is easy, so they follow doing easy things with URIs. There are lots of URI jugglers in this group.&lt;br /&gt; - &lt;b&gt;Servicers&lt;/b&gt;: They think Services is good, and someone told them REST is a way to do services without SOAP. So they follow.&lt;br /&gt;&lt;div&gt; - &lt;b&gt;BuzzWorders&lt;/b&gt;: This is a vast majority. They like buzz words, so they follow REST just because it is cool and all people talk about it. There are some Buzz creators too, with thinks like ROA and REST in WOA. No pun intended on REST-*.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That post has a missing type - the ones that properly understand and use REST. Perhaps there is no such group of people? And I guess the main reason for that is because REST is a style, not a standard. Yes, I am the Standard Hater. :)  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7932122109832230247?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=vUcyjLZYMJo:wtp8J__xyKs: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=vUcyjLZYMJo:wtp8J__xyKs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=vUcyjLZYMJo:wtp8J__xyKs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=vUcyjLZYMJo:wtp8J__xyKs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=vUcyjLZYMJo:wtp8J__xyKs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=vUcyjLZYMJo:wtp8J__xyKs: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=vUcyjLZYMJo:wtp8J__xyKs: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/vUcyjLZYMJo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7932122109832230247/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/10/rest-fan-types.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7932122109832230247?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7932122109832230247?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/10/rest-fan-types.html" title="REST fan types" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkAARHw9cCp7ImA9WxNXFUQ.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-7003578024300590636</id><published>2009-09-29T21:42:00.017+03:00</published><updated>2009-10-03T20:25:45.268+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-03T20:25:45.268+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="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><title>XML processing in Java</title><content type="html">&lt;div&gt;One of the things that most Java developers tackle on daily basis is dealing with &lt;a id="qfi9" href="http://www.w3.org/XML/" title="XML"&gt;XML&lt;/a&gt;. Despite the fact that XML is &lt;a id="xsb5" href="http://www.xml.com/pub/a/2004/11/03/deviant.html" title="taking"&gt;taking&lt;/a&gt; &lt;a id="rn.s" href="http://dataspora.com/blog/xml-and-big-data/" title="lots"&gt;lots&lt;/a&gt; &lt;a id="hkuw" href="http://myarch.com/why-xml-is-bad-for-humans" title="of"&gt;of&lt;/a&gt; &lt;a id="ob-v" href="http://javaoldschool.blogspot.com/2009/01/xml-sucks.html" title="criticism"&gt;criticism&lt;/a&gt; and new formats like &lt;a id="aygp" href="http://www.yaml.org/start.html" title="YAML"&gt;YAML&lt;/a&gt; are emerging and becoming more popular, you cannot avoid XML it's too widespread and used everywhere. It's the main format for interchanging data across systems and even people. There is a great deal of fat &lt;a id="qxl3" href="http://www.amazon.co.uk/s/ref=nb_ss?url=search-alias%3Dstripbooks&amp;amp;field-keywords=java+xml" title="books"&gt;books&lt;/a&gt; that show how to use various XML APIs and libraries to handle the beast with all it's standards and extensions. There are many solid tools that had been continuously developed for years by large communities (&lt;a id="ydfl" href="http://xml.apache.org/xalan-j/" title="Xalan"&gt;Xalan&lt;/a&gt;, &lt;a id="fsm7" href="http://xerces.apache.org/xerces2-j/" title="Xerces"&gt;Xerces&lt;/a&gt;, &lt;a id="w8qh" href="http://www.jdom.org/" title="JDOM"&gt;JDOM&lt;/a&gt;, &lt;a id="mr1c" href="http://www.dom4j.org/" title="DOM4J"&gt;DOM4J&lt;/a&gt;). &lt;/div&gt;&lt;br /&gt;&lt;div&gt;And still XML processing in Java is still a major &lt;a id="ru8f" href="http://fanf42.blogspot.com/2009/08/why-simple-xml-processing-is-so-painful.html" title="pain in the ass"&gt;pain in the ass&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I see two reasons for that: &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;XML is too bloated as a format. See the picture below (click to enlarge):&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_nP8Aa6cTHpo/Spdg41mFFPI/AAAAAAAACUQ/NkchfZ_RWz0/xml.gif"&gt;&lt;img src="http://lh4.ggpht.com/_nP8Aa6cTHpo/Spdg41mFFPI/AAAAAAAACUQ/NkchfZ_RWz0/s288/xml.gif" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Java libraries that deal with XML are bloated. It's natural because they simply try to implement the specifications&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Let's say you have a Java application which receives some data in form of simple XML:&lt;/div&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;data&amp;gt;&lt;br /&gt;  &amp;lt;entry id="1"&amp;gt;entry number one&amp;lt;/entry&amp;gt;&lt;br /&gt;  &amp;lt;entry id="2"&amp;gt;entry number two&amp;lt;/entry&amp;gt;&lt;br /&gt;&amp;lt;/data&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Your application has this class:&lt;/div&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class Entry {&lt;br /&gt;    private int id;&lt;br /&gt;    private String content;&lt;br /&gt;    //the usual setters and getters here&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;If you would want to parse this XML with Java, into Entry objects you would usually do something like this:&lt;/div&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;try {&lt;br /&gt;    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();&lt;br /&gt;    DocumentBuilder db = dbf.newDocumentBuilder();  &lt;br /&gt;    Document doc = db.parse(new File("data.xml"));&lt;br /&gt;    NodeList nl = doc.getElementsByTagName("entry");&lt;br /&gt;    for (int i = 0; i &amp;lt; nl.getLength(); i++) {&lt;br /&gt;        Entry entry = new Entry();&lt;br /&gt;        entry.setId(Integer.parseInt(nl.item(i).getAttributes()&lt;br /&gt;               .getNamedItem("id").getNodeValue()));&lt;br /&gt;        entry.setContent(nl.item(i).getTextContent());&lt;br /&gt;        System.out.println(entry);&lt;br /&gt;        //do real stuff&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;catch (final Exception e) {&lt;br /&gt;    System.out.println("Failed parsing: " + e);&lt;br /&gt;    //do real handling&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Expected output:&lt;/div&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;Entry:{id: 1; content: entry number one}&lt;br /&gt;Entry:{id: 2; content: entry number two}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;In Java 6 &lt;code&gt;DocumentBuilderFactory.newInstance()&lt;/code&gt; will usually return an instance of this implementation: &lt;code&gt;com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl&lt;/code&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is Xerces embedded into the JRE. What's wrong with that? First, it's a huge library with big memory footprint. It will be outdated in comparison with what you can get at the official homepage, so if you want to go for the latest version with all the bug fixes, you will have to add another megabyte of jars to your project, set a system property (javax.xml.parsers.DocumentBuilderFactory) to change the default implementation and hope your code works. Then you have to know DOM. You have to use an ugly for loop to iterate the results instead of doing it right (&lt;code&gt;for (Node n : doc.getElementsByTagName("entry") { ... }&lt;/code&gt;). &lt;/div&gt;&lt;div&gt;Even though Java aims to be loosely coupled, you can use the API and switch implementations, you should keep in mind that API changes over time, and implementations work differently. I have seen legacy code where you can find sick things like DocumentBuilderFactoryImpl = (DocumentBuilderFactoryImpl) DocumentBuilderFactory.newInstance();, I have seen Axis failing to parse complex SOAP messages after switching to different, newer JDK, I have seen third party software vendors who start cursing when you change your web service implementation and your WSDL is generated with minor cosmetic differences (i.e.: &lt;b&gt;xmlns:soap&lt;/b&gt;="http://schemas.xmlsoap.org/wsdl/soap/" instead of previous version: &lt;b&gt;xmlns:s&lt;/b&gt;="http://schemas.xmlsoap.org/wsdl/soap/"). In all these cases APIs and implementations failed to do what they were meant for. Of course, everything can be fixed, but it takes time and nerves, and these things are precious.&lt;/div&gt;&lt;div&gt;XML processing in Java is terrible, and the worst part is when you have to go through all this just to parse a simple piece of data. Why couldn't it be as simple as that:&lt;/div&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;for (XmlSlicer piece : XmlSlicer.cut(data).getTags("entry")) {&lt;br /&gt;    //each piece is: &amp;lt;entry id="..."&amp;gt;...&amp;lt;/entry&amp;gt;&lt;br /&gt;    Entry entry = new Entry();&lt;br /&gt;    entry.setId(Integer.parseInt(piece.getTagAttribute("entry", "id")));&lt;br /&gt;    entry.setContent(piece.get("entry").toString());&lt;br /&gt;    System.out.println(entry);    &lt;br /&gt;    //do real stuff&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;After being fed up with Java's great XML APIs and libraries I made a small tool for simple daily work with XML files.&lt;/div&gt;&lt;div&gt;The code above would work in &lt;a href="http://xmlzen.googlecode.com"&gt;XML Zen&lt;/a&gt; - a small and lightweight XML processing library that supports ~1% of what other XML processing libraries can do, however this 1% of functionality is what you use 90% of the time. There are no big APIs, just simple logic driven object oriented processing of XML strings. And it's just a little over 10Kb.&lt;/div&gt;&lt;div&gt;You can add XML Zen dependency with Maven, just set the dev.java.net repo first:&lt;/div&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;  &amp;lt;repository&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;maven2-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;Java.net Repository for Maven&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;url&amp;gt;http://download.java.net/maven/2&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;/repository&amp;gt;&lt;br /&gt;  &amp;lt;!-- other repositories --&amp;gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;Then the dependency:&lt;/div&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;com.googlecode.xmlzen&amp;lt;groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;xmlzen&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;0.1.1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;That's it, you are ready to go. And when it comes to building XML and XML Zen is not enough for your needs, check out this great project: &lt;a href="http://java.ociweb.com/mark/programming/WAX.html"&gt;http://java.ociweb.com/mark/programming/WAX.html&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-7003578024300590636?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=c9TBrSRLcYI:nHf1s-RlWKY: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=c9TBrSRLcYI:nHf1s-RlWKY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=c9TBrSRLcYI:nHf1s-RlWKY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=c9TBrSRLcYI:nHf1s-RlWKY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=c9TBrSRLcYI:nHf1s-RlWKY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=c9TBrSRLcYI:nHf1s-RlWKY: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=c9TBrSRLcYI:nHf1s-RlWKY: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/c9TBrSRLcYI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/7003578024300590636/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/09/xml-processing-in-java.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7003578024300590636?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/7003578024300590636?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/09/xml-processing-in-java.html" title="XML processing in Java" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_nP8Aa6cTHpo/Spdg41mFFPI/AAAAAAAACUQ/NkchfZ_RWz0/s72-c/xml.gif" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;CUAFRn09eSp7ImA9WxNTFkw.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-5096516881094383383</id><published>2009-08-18T19:30:00.004+03:00</published><updated>2009-08-18T19:41:57.361+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-18T19:41:57.361+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photography" /><category scheme="http://www.blogger.com/atom/ns#" term="geekery" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><category scheme="http://www.blogger.com/atom/ns#" term="hawkscope" /><title>MacBook Disassembly</title><content type="html">A few months ago my MacBook finally died.&lt;br /&gt;&lt;br /&gt;I will never buy a Mac again. Although I loved OS X, the hardware is terrible and heavily overpriced. My MacBook had bluetooth adapter and motherboard replacements in the first year of use, and it didn't really help. Then the warranty period was over and I used the all-broken-no-bluetooth-randomly-freezing-hard-drive-randomly-unavailable MacBook for another painful year untill one day the screen went black and never went back...&lt;br /&gt;&lt;br /&gt;Here is a slideshow with my little MacBook disassembly project.&lt;br /&gt;&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="600" height="400" flashvars="host=picasaweb.google.com&amp;amp;captions=1&amp;amp;hl=en_GB&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Ftomas.varaneckas%2Falbumid%2F5371334448498830577%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_GB" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;A month later I've bought myself a &lt;a href="http://reviews.dell.com/2341-en_ie/1562/reviews.htm?sortOrder=reviewTextLength"&gt;Dell Studio 1537&lt;/a&gt; (with 3GB of RAM, 1440x900 screen and 3 years of warranty).&lt;br /&gt;&lt;br /&gt;After installing &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 9.04 all I missed from MacBook was two finger scroll, which can be &lt;a href="http://ubuntu-snippets.blogspot.com/2009/03/multi-touch-for-anyall-synaptics.html"&gt;easily enabled&lt;/a&gt; anyway.&lt;br /&gt;&lt;br /&gt;Too bad I'll have to discontinue &lt;a href="http://hawkscope.googlecode.com"&gt;Hawkscope&lt;/a&gt; for Macs, unless someone is willing to join the development and perform the builds. Anyone?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/109529730340432578-5096516881094383383?l=paranoid-engineering.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Q2is-fRGq8c:3lmrxuo3zBk: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=Q2is-fRGq8c:3lmrxuo3zBk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=Q2is-fRGq8c:3lmrxuo3zBk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Q2is-fRGq8c:3lmrxuo3zBk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ParanoidEngineering?i=Q2is-fRGq8c:3lmrxuo3zBk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ParanoidEngineering?a=Q2is-fRGq8c:3lmrxuo3zBk: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=Q2is-fRGq8c:3lmrxuo3zBk: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/Q2is-fRGq8c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://paranoid-engineering.blogspot.com/feeds/5096516881094383383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/08/macbook-disassembly.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5096516881094383383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/109529730340432578/posts/default/5096516881094383383?v=2" /><link rel="alternate" type="text/html" href="http://paranoid-engineering.blogspot.com/2009/08/macbook-disassembly.html" title="MacBook Disassembly" /><author><name>Tomas Varaneckas</name><uri>http://www.blogger.com/profile/08399177196889385951</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total></entry><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' alt='' /&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="1 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_nP8Aa6cTHpo/SjhtmDh0ZNI/AAAAAAAABnQ/YhPuOQIm8ag/s72-c/mu1.png" height="72" width="72" /><thr:total>1</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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_nP8Aa6cTHpo/SfX4G7QSFlI/AAAAAAAABkM/Si5TvNdat_A/s72-c/2.PNG" height="72" width="72" /><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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="25 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>25</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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_nP8Aa6cTHpo/Sak5Ka7HqhI/AAAAAAAABcc/LUeItesCA8k/s72-c/Picture%202.png" height="72" width="72" /><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_nP8Aa6cTHpo/SZVfSTp7IUI/AAAAAAAABNE/aQGpXb_9a54/s72-c/about.png" height="72" width="72" /><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_nP8Aa6cTHpo/SYCilltvEbI/AAAAAAAABB0/KAf9OzKmf20/s72-c/hs-0.4.0-mac-cr.png" height="72" width="72" /><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_nP8Aa6cTHpo/SXgOYu9E6wI/AAAAAAAABAs/7jcJ-oQDerc/s72-c/hawkscope128.png" height="72" width="72" /><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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="2 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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="2 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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="15 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>15</thr:total></entry><entry gd:etag="W/&quot;DkcFQnY-cSp7ImA9WhdaFk0.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-5040655441728552009</id><published>2008-12-01T17:08:00.009+02:00</published><updated>2011-10-26T07:40:13.859+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-26T07:40:13.859+03: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 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' alt='' /&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="1 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>1</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' alt='' /&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="8 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>8</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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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="9 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>9</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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;C0ECQnk7fip7ImA9Wx5RFEs.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-6463652460172790469</id><published>2008-11-06T08:27:00.009+02:00</published><updated>2010-08-22T10:21:03.706+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-22T10:21:03.706+03: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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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="6 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>6</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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></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>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' alt='' /&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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUAHRHw6cCp7ImA9Wx5VE0o.&quot;"><id>tag:blogger.com,1999:blog-109529730340432578.post-3199249102593445458</id><published>2008-07-16T13:54:00.005+03:00</published><updated>2010-10-06T18:08:55.218+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-06T18:08:55.218+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 height="344" width="425"&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;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update&lt;/b&gt;&lt;br /&gt;
Mylin still sucks big time. Could not get used to it. It's most probably for people with ADD. Read the discussion in comments.&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' alt='' /&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="8 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:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>8</thr:total></entry></feed>

