<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-982495715512338042</id><updated>2011-08-27T15:31:43.255+03:00</updated><category term='linux'/><category term='Swing'/><category term='KDE'/><category term='other'/><category term='GWT'/><category term='opensource'/><category term='java'/><category term='fantasy'/><category term='Eclipse'/><category term='SUSE'/><category term='Qt'/><category term='conversion'/><category term='performance'/><category term='LookAndFeel'/><category term='Warhammer'/><category term='NetBeans'/><category term='Warhammer 40.000'/><title type='text'>Heresylabs</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://heresylabs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-6828581586634502405</id><published>2010-02-06T15:08:00.001+02:00</published><updated>2011-01-22T23:03:25.507+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>Chaos Space Marines infantry</title><content type='html'>In Codex Chaos Space Marines we have too few infantry choices. I mean not cult troops but plain Chaos Marines. We have Elites, who are the same troops with Infiltrate and 5 of them can take cool but expensive weapons, Possessed units who are not stable enough to use them against tough opponent, and plain Marines. And that's all.&lt;br /&gt;&lt;br /&gt;As for me Chaos Space Marines, who are 10 000 years participating in eternal war, must have much more options. Few ideas I have:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Veterans&lt;/b&gt; are those who are killing for their Gods for 10.000 years already. There should be list of veteran skills and possibility to choose few of them. Also they have access to artificer weapons and armor (similar to loyal marines) and Terminator armor. All of them can have special weapons, because in 10.000 years they formed specialized groups. 2 Attacks in profile, because they are much more skilled than simple Marines. Also, in current Codex Chosen are able to buy power weapons, but it will cost 33 points for model, while you can buy Terminator for 30. So to make this option viable - power weapon cost should be lower (there is no point in rising Terminator cost, because it's already low in Loyal Codex, and rising it for Chaos will make Terminators not viable option).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Possessed Marines&lt;/b&gt;. In armies who are worshiping more than 2 Gods mutations are more common. If your army includes worshipers of more than 2 Gods (including Marks and Icons of Gods or cult troops) you must spread mutations on your squads. I am not sure what is the best way to do it, not all mutations are good one and of course depending on squad size there are different possibilities to have mutants.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beggar Marines&lt;/b&gt; once proud and noble they lost everything they had. Being still powerful Space Marines and very useful on the battlefield they lost all their supply factories and artificers. Their armor breached and broken in many places, they have few bolter rounds and lost all other weapons. Now they are fighting for trophies and ammunition, serving to anyone who will offer them more than others.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cost about 10 points&lt;/li&gt;&lt;li&gt;Ld value is 7, 8 for Champion.&lt;/li&gt;&lt;li&gt;&lt;i&gt;4+ power armor&lt;/i&gt;. Some parts of armor are lost, some are no longer functional, and some are just taken by someone stronger.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Wargear&lt;/i&gt;. Chainsword and Bolt Pistol. They are saving bolter rounds as treasure, not wasting more than one shot for single enemy.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Must have Champion&lt;/i&gt;. Without strong leader they will fight each other or just will separate in groups too small to operate as combat unit. If Champion is killed - another one must be chosen on his place. Roll a dice, on result 5+ another Champion is selected, on 1-4 two of Marines will fight each other and one of them will die, remove him as casualty.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Marauders&lt;/i&gt;. Beggar squads cannot have any special weapons until they'll salvage it from enemies. If Beggar Marines won the round they can try to take enemy weapons if they are fighting another Marines or Human race. They can take any ranged weapon or simple power weapons (but not Terminator's power weapon, because it's using more powerful energy sources). Roll a dice for each ranged weapon that looks useful to you (including bolters, meltaguns, plasmaguns, flamers, and heavy weapons), and on 4+ Beggar Marines can take it. Also there are some more valuable weapons, if you rolled 1 for Special Weapon or Heavy Weapon - marines are fighting for it and one of them receives wound and must immediately take armor save. You must write the list of weapons so your opponent will see it.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Marks&lt;/i&gt;. Beggar Marines can use only Mark of Chaos Undivided for 10 points and Mark of Khorne for 30 points, because of nature of other Gods their worshipers will not make good Beggar Marines.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;That's all for now. Later I will tell more ideas I have and some experience of using those units I suggested here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-6828581586634502405?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=6828581586634502405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/6828581586634502405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/6828581586634502405'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2010/02/chaos-space-marines-infantry.html' title='Chaos Space Marines infantry'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-370117361605602796</id><published>2010-02-01T18:20:00.003+02:00</published><updated>2010-02-01T18:20:20.648+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>How do you store your bits?</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;&lt;br /&gt;I am using box from Chaos Space Marines Battleforce to store most of my bits.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_OCDMbx08eVU/S2b-dAPtnVI/AAAAAAAAAjo/CirIAwr41Rc/s1600-h/dsc_0943-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_OCDMbx08eVU/S2b-dAPtnVI/AAAAAAAAAjo/CirIAwr41Rc/s320/dsc_0943-1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;And then every type of bits is packed in individual package and grouped by categories.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_OCDMbx08eVU/S2b-fVSK5NI/AAAAAAAAAjw/tayazKfALso/s1600-h/dsc_0945-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_OCDMbx08eVU/S2b-fVSK5NI/AAAAAAAAAjw/tayazKfALso/s320/dsc_0945-1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;It saves my time to search bits I need and allows me to see all available options at once.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-370117361605602796?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=370117361605602796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/370117361605602796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/370117361605602796'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2010/02/how-do-you-store-your-bits.html' title='How do you store your bits?'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_OCDMbx08eVU/S2b-dAPtnVI/AAAAAAAAAjo/CirIAwr41Rc/s72-c/dsc_0943-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-8881699875393930838</id><published>2010-01-26T13:23:00.001+02:00</published><updated>2010-01-26T13:24:12.369+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>Chaos Daemon Weapons</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;As I mentioned before, &lt;a href="http://wh40k.lexicanum.com/wiki/Codex:_Chaos_Space_Marines_(3rd_Edition,_2nd_Codex)"&gt;Codex Chaos Space Marines 2002&lt;/a&gt; is much more logical and looks better fluff-wise than current &lt;a href="http://wh40k.lexicanum.com/wiki/Codex:_Chaos_Space_Marines_(4th_Edition)"&gt;Codex Chaos Space Marines 2007&lt;/a&gt;. And now another thing I like more in older Codex - Daemon Weapons. I'll quote small block of description of Daemon Weapons in both Codexes to show you what I mean.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Chaos Space Marines 2002&lt;/b&gt;&lt;br /&gt;On page 13 of old Codex there is paragraph "Mastery":&lt;br /&gt;&lt;span style="font-family:sans-serif;"&gt;&lt;blockquote&gt;In any player turn that the bearer inflicts at least one casualty on the enemy with Daemon weapon, the Daemon may gain enough strength to resist it's owner. This battle of will can be draining or even fatal for the wielder. Make a Leadership test at the end of the turn. If the test is failed the wielder suffers a "Perils of the Warp" attack...&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Chaos Space Marines 2007&lt;/b&gt;&lt;br /&gt;Similar description from Codex 2007, on page 93:&lt;br /&gt;&lt;span style="font-family:sans-serif;"&gt;&lt;blockquote&gt;Adds an extra D6 Attacks in close combat. Roll the dice every time the model is about to attack. If the result is 1, the bound Daemon within the weapon rebels - the model may not make any attacks in this round and suffers one wound with no armour saves allowed.&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;In version 2007 it looks like Daemon does not want to fight, does not want to spill the blood. It's strange behavior for the Chaos Daemon, don't you think so? While in 2002 version everything looks fine, Daemon gains his strength from butchering and drinking the blood.&lt;br /&gt;&lt;br /&gt;I want to suggest to create some home rule that will improve fluff part of Daemon weapons for Codex 2007. While it is easier to pass Leadership test than get 1 on D6 I will not suggest to use 2002 version right away. There must be better options.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My first suggestion&lt;/b&gt; is to make 1 on Daemon weapon rolls work as +1 Attack, but to pass Leadership test at the end of the turn, but modify Leadership of wielder by -1 per each wound Daemon weapon inflicted. As a result Khornate Lord after inflicting 7 wounds will have to pass Leadership test against Ld 3. What do you think about it?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-8881699875393930838?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=8881699875393930838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8881699875393930838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8881699875393930838'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2010/01/chaos-daemon-weapons.html' title='Chaos Daemon Weapons'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-6677490878525636989</id><published>2010-01-25T13:39:00.000+02:00</published><updated>2010-01-25T13:39:23.813+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>The problem of Qt Jambi</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;I like desktop UI development. Especially I like architecture of Swing, but not so long ago I felt the power of Qt, thanx to &lt;a href="http://en.wikipedia.org/wiki/Qt_Jambi"&gt;Qt Jambi&lt;/a&gt;. Now I know that while Qt have some architecture problems it has superior Graphics, more usable widgets, and saves a lot of time on borders and pixels manipulations thanx to it's advanced widgets.&lt;br /&gt;&lt;br /&gt;But Nokia decided to stop supporting Qt Jambi, and gave it away to "community". While there are some smart guys on Qt Jambi mailing lists - it is not community yet. And of course I thought about ways to help Jambi survive.&lt;br /&gt;&lt;br /&gt;The problem is, I am Java developer, and Jambi was created for Java developers. Most of people on Jambi mailing list are Java developers. It is not very popular among C++ developers because they will not be able to use the result of their work. While Jambi generator is written in C++, and to be able to update Jambi according to Qt changes you should know C++.&lt;br /&gt;&lt;br /&gt;Ok, let's assume I am learning C++, to help Qt Jambi to write Java apps using Qt. Well, not Qt itself but bindings of Qt to Java. Do you see the problem? Why should I use Jambi if I already know C++ and I can use Qt itself, without bindings and additional abstraction levels. Then, why should I help Jambi if I will not use it?...&lt;br /&gt;&lt;br /&gt;As for me Jambi-like project will not survive without support of some company, and stopping Jambi support Trolltech/Nokia almost killed the project. Now it most likely some parts of Jambi will be salvaged, for example it's extremely cool generator. Maybe in some time I will learn C++ a bit better and will dive a bit inside of Generator sources, and maybe even write something similar in Java if I'll have nothing better to do...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-6677490878525636989?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=6677490878525636989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/6677490878525636989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/6677490878525636989'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2010/01/problem-of-qt-jambi.html' title='The problem of Qt Jambi'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-739125896848000701</id><published>2010-01-25T13:14:00.002+02:00</published><updated>2010-01-25T13:15:39.663+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>Chaos Space Marines Assembly Line</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;&lt;br /&gt;It takes rather long time to prepare and assemble full model, especially when you try to make it good one. When some interesting idea comes into your mind it takes you few minutes to clean legs, minute to glue it onto base, minute to glue body, minute to search for hands/head/shoulders, another 5 minutes to clean those parts, and another minute to clean glued body. So about 15 already wasted, your awesome idea had a good chance to flee away.&lt;br /&gt;&lt;br /&gt;Finally I found solution that works for me. I am preparing the most usable parts long before idea comes. Chaos Space Marines have 4 types of legs and 8 or 9 types of bodies. It is possible to prepare 12 legs, glue 12 bodies and put everything on the shelf. Now you can start modeling almost instantly, and it saves a lot of fun because boring process of cleaning legs and putting body together does not distracts you from the main idea.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_OCDMbx08eVU/S119QGcHOmI/AAAAAAAAAjg/ommCiFkjFrk/s1600-h/dsc_0942-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/_OCDMbx08eVU/S119QGcHOmI/AAAAAAAAAjg/ommCiFkjFrk/s400/dsc_0942-1.jpg" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-739125896848000701?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=739125896848000701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/739125896848000701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/739125896848000701'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2010/01/chaos-space-marines-assembly-line.html' title='Chaos Space Marines Assembly Line'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_OCDMbx08eVU/S119QGcHOmI/AAAAAAAAAjg/ommCiFkjFrk/s72-c/dsc_0942-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-3367980650887667467</id><published>2010-01-22T17:57:00.000+02:00</published><updated>2010-01-22T17:57:56.930+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>Codex Chaos Space Marines: Marks of the Dark Gods</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;&lt;b&gt;Intro&lt;/b&gt;&lt;br /&gt;I don't like &lt;a href="http://wh40k.lexicanum.com/wiki/Codex:_Chaos_Space_Marines_(4th_Edition)"&gt;current Codex Chaos Space Marines&lt;/a&gt;, for many-many reasons. One of them - there are too many places where I can't see any logic. Because of this I bought &lt;a href="http://wh40k.lexicanum.com/wiki/Codex:_Chaos_Space_Marines_(3rd_Edition,_2nd_Codex)"&gt;older Codex, written by Andy Chambers, Graham McNeill and others&lt;/a&gt;. And that Codex is totally awesome! It's a bit old to play with it though, but there are many things I like. Marks of the Dark Gods for example.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Current Codex, 4th edition&lt;/b&gt;&lt;br /&gt;In &lt;a href="http://wh40k.lexicanum.com/wiki/Codex:_Chaos_Space_Marines_(4th_Edition)"&gt;current Codex&lt;/a&gt;, released in 2007, Marks can be used everywhere and by everyone. And as for me it's breaking fluff by all means possible. For example, you can summon pack of Daemonettes without scatter on Mark of Khorne, or put your Sorcerer with Mark of Tzeench with 9 Berzerkers into Land Raider. How powerful and cruel Chaos Lord can allow this to happen? How is it possible when Dark Gods are watching you? I don't know, but it seems to me that Codex' author wanted to play Orks too much, so he made ones, using Chaos kits. But let's return to how Mark works. Summoned Daemons and Terminators can arrive on Mark without scattering, and also Mark somehow is visible from the transport vehicles, and adds some abilities to their bearers. That's it. No more restrictions, no more options, no more advantages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Codex Chaos Space Marines 2002&lt;/b&gt;&lt;br /&gt;&lt;p&gt;In &lt;a href="http://wh40k.lexicanum.com/wiki/Codex:_Chaos_Space_Marines_(3rd_Edition,_2nd_Codex)"&gt;this older Codex&lt;/a&gt; everything looks logical and close to perfect, almost like it really would be in Eye of Terror. Do you know that Khorne and Slaanesh are mortal enemies, like Tzeench and Nurgle? So, if your army's leader have Mark of one of four Gods - your army cannot contain any units, dedicated to God's mortal enemy. Of course it can't, just because your leader will kill all those bastards in the name of His favored God!&lt;/p&gt;&lt;p&gt;Next feature, Daemons can be summoned only onto Mark of their God or onto Chaos Undivided Mark. In Codex 2007 I always wondered why my Daemonettes would not attack unit of Berzerkers with Icon that summoned them, or why should they come at all? In Codex 2002 everything is just fine, like it should really be.&lt;/p&gt;&lt;p&gt;And my favorite, Daemon Icon. It's powerful Daemon binding artifact, and single Daemons unit can be nominated as target for this Mark. Then, when time comes, you can free those Daemons without rolling reserves or scatter, they're just coming out at the start of your turn. I like both how it works on the battlefield and how it sounds from the fluff point of view. But where did Chaos Marines lost it in 5 years from 2002 to 2007?...&lt;/p&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;Codex 2002 is a bit outdated, and as for me can be fairly used only in combination with Rulebook 4 and older enemy Codexes. It's navigation is not that simple, it's unit costs does not make any sense against Codex Space Marines 2008 or Space Wolves 2009, so heavy refresh is required before making it playable. But it's so awesome when comparing against current Codex Chaos Space Marines, with so many interesting features, and real feeling that it's Chaos Legions, cruel and glorious warriors of the Dark Gods, while current Codex 2007 makes it feel like you're playing some Chaos Orks or something. So I will better wait for Codex Blood Angels and will use it for my Night Lords army until next Chaos Codex will be released. It will represent Night Lords Legion a way better than Codex Chaos Space &lt;del&gt;Orks&lt;/del&gt; Marines.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-3367980650887667467?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=3367980650887667467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3367980650887667467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3367980650887667467'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2010/01/codex-chaos-space-marines-marks-of-dark.html' title='Codex Chaos Space Marines: Marks of the Dark Gods'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-7152016814904571292</id><published>2010-01-19T15:08:00.000+02:00</published><updated>2010-01-19T15:08:02.033+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>Chaos Space Marines Weapons</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;When you'll try to compare Codexes of Space Marines and Chaos Space Marines you will notice that their weapons list is different. But why is it so? They're almost similar armies. Here is the knowledge of different weapon types I know/heard/read about.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Assault Cannon&lt;/b&gt;&lt;br /&gt;Assault Cannon is powerful Space Marines, and Chaos have nothing similar. First I thought that it was created after Heresy, and Chaos Marines can't be equipped with those weapons because of this. But then one of Horus Heresy novels about Dark Angels mentioned Assault Cannon on Dreadnought.&lt;br /&gt;It is said that Assault Cannon is not stable weapon and jams from time to time. And in 10.000 years Chaos Marines lost all of their Assault Cannons, using more stable older pattern Autocannons instead.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Autocannon&lt;/b&gt;&lt;br /&gt;Autocannon exists in both Codexes, but it looks like only Predators and Dreadnoughts can use it. So, if weapon mentioned in both Codexes - it's obviously pre-heresy weapon. But then Chaos have Autocannon pattern for troops. Looks like this pattern was implemented just before Heresy, and Horus ordered to supply his legions first, then Mars was salvaged and loyal Marines got nothing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Storm bolter&lt;/b&gt;&lt;br /&gt;It's twice as effective as simple bolter, and Loyal Marines have it. It's obvious that it's pattern was found after Heresy, because otherwise Horus' elite terminators would be equipped with those things.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Demolisher Cannon&lt;/b&gt;&lt;br /&gt;Vindicators are powered by those huge and extremely powerful cannons. But it's strange that in Codex Space Marines 2004 and Codex Chaos Space Marines 2007 they're the same, but Codex Space Marines 2008 added "Barrage" to them. Why is that? I have no answer. Maybe Matthew Ward thought it is time to modify Demolisher according to 5th edition of Rulebook and made first step like this?...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Plasma cannon&lt;/b&gt;&lt;br /&gt;Chaos Marines can take Plasma cannons only for Dreadnoughts, and while their Dreadnoughts are a bit crazy - I never thought about it as about viable solution. But loyal Marines can give those fearsome template weapons even to simple tactical squads and Devastators. Why is that? I see 2 possible solutions:&lt;br /&gt;1. All Chaos Plasma cannons got hot, and Dark Mechanicus don't want to build more of them. Well, it doesn't looks like true, because Plasma guns are still used in Chaos forces, and effectiveness of weapon worth the risks of using it.&lt;br /&gt;2. Troop option appeared after Heresy, the same as Autocannon but from the other side.&lt;br /&gt;Still, I am not sure, if you know something or have some ideas - comment please.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Multi-melta&lt;/b&gt;&lt;br /&gt;Those things are accessible for Chaos Dreadnoughts too, but only for them. Maybe the story here is the same as with Plasma cannon? I'm not sure...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Still have no info&lt;/b&gt;&lt;br /&gt;I have no info about some weapons, so if you know why they are accessible to first but not accessible to second - please tell me. They are:&lt;br /&gt;&lt;b&gt;Cyclone Missile launcher&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Havoc Launcher&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-7152016814904571292?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=7152016814904571292' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7152016814904571292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7152016814904571292'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2010/01/chaos-space-marines-weapons.html' title='Chaos Space Marines Weapons'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-3298362517609986166</id><published>2010-01-16T11:18:00.001+02:00</published><updated>2010-01-16T11:19:23.153+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>Warhammer 40k Wounds Allocation</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;This article is about Wounds Allocation in Warhammer 40.000. Inspired by &lt;a href="http://www.belloflostsouls.net/2010/01/40k-rebuttal-wound-allocation-in-5th.html"&gt;BoLS article on the same topic&lt;/a&gt; and contains some my ideas and suggestions on how to improve current wound allocation rules.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4th edition&lt;/b&gt;&lt;br /&gt;Previous edition of Warhammer 40.000 rulebook used different wound allocation strategy. For instance, we have Chaos Space Marines squad of 5, without any special features.&lt;br /&gt;&lt;b&gt;a)&lt;/b&gt; We got 3 wounds. Nothing special here, we will just take 3 saves and will remove those who failed.&lt;br /&gt;&lt;b&gt;b)&lt;/b&gt; We got 5 wounds, and our opponent can choose who will take individual save. But all models are the same, so no need to choose between them. Each model will take exactly 1 save, so we have 0.33 chance to lose all our models.&lt;br /&gt;&lt;b&gt;c)&lt;/b&gt; We got 15 wounds. Book states that we will roll all the saves at the same time. And statistically 15 * 0.33 = 5 and all models will be lost. But it looks like the story of &lt;a href="http://en.wikipedia.org/wiki/Schr%C3%B6dinger's_cat"&gt;Schrödinger's cat&lt;/a&gt;, statistics can only show us probability and all 5 models somewhere between life and death. How will it look like if we have only 1 dice?&lt;br /&gt;&lt;b&gt;0.&lt;/b&gt; Each model have to roll 3 saves, so it still can be saved.&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; First roll - 2. First model is dead.&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Second roll - 1. Second model is dead.&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; And NOW they all will surely die, becase 3 models will roll other 13 dices.&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/_OCDMbx08eVU/S1GDfF9KyfI/AAAAAAAAAjA/a8ZM3ql8TQQ/s1600-h/2failed.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_OCDMbx08eVU/S1GDfF9KyfI/AAAAAAAAAjA/a8ZM3ql8TQQ/s320/2failed.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;5th edition&lt;/b&gt;&lt;br /&gt;5th edition came with new wounds allocation system, that from the one hand can help you to save few more units and from the other hand - risk to loose special model is higher.&lt;br /&gt;For example, we have Chaos Space Marines squad of 5, with Aspiring Champion and Meltagun.&lt;br /&gt;&lt;b&gt;a)&lt;/b&gt; We got 3 wounds. We will allocate them on simple models, so Champion and Meltagun will surely live.&lt;br /&gt;&lt;b&gt;b)&lt;/b&gt; We got 5 wounds. Now we must allocate them on all models, and Champion and Meltagun will take their own saves, while other 3 wounds will go to simple models. In this case chance to lose Champion or Meltagun is much higher than in 4th edition, where opponent was able to choose only one of them to pass it's own save.&lt;br /&gt;&lt;b&gt;c)&lt;/b&gt; We got 15 wounds. Now we will allocate 3 wounds on each model. Statistically all the squad will die, but being Warhammer 40.000 player will you just remove all the squad without rolling dices? Dice &lt;i&gt;does matter&lt;/i&gt;. We will roll for the Champion, then for Meltagun, and then - gues what - we will roll other 9 dices for 3 models &lt;b&gt;similar to 4th edition&lt;/b&gt;!&lt;br /&gt;Why is it so? It's only half solution of 4th edition, it's not complete working system.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Apply "special model" rules to everyone&lt;/b&gt;&lt;br /&gt;The first solution that comes in mind - let's roll separately for each model. Statistically it will lead us to the same result, but it will save us from problems of 4th edition. We will just roll 3 dices for each model, and that's it, some of them will get their chance to live another minute.&lt;br /&gt;But now imagine we have squad of 10 models, with Champion and Meltagun. Now you have to roll 10 times instead of 3 as in original 5th edition. And some Orkz will better lose few models more than rolling 20-30 separate rolls...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Minimize time wasting&lt;/b&gt;&lt;br /&gt;Well, we have working solution, now let's think about how to save some time.&lt;br /&gt;Here is my suggestion:&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Roll first line of saves and remove failed with all their other wounds:&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/_OCDMbx08eVU/S1GDgMvevTI/AAAAAAAAAjI/Ly80uT-VUDM/s1600-h/speed1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_OCDMbx08eVU/S1GDgMvevTI/AAAAAAAAAjI/Ly80uT-VUDM/s320/speed1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Roll second line of saves and remove failed with all their other wounds:&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/_OCDMbx08eVU/S1GDg_lgjsI/AAAAAAAAAjQ/ME3HE1syM28/s1600-h/speed2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_OCDMbx08eVU/S1GDg_lgjsI/AAAAAAAAAjQ/ME3HE1syM28/s320/speed2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Roll last line of wounds as normal, now each model have it's last roll, without taking rolls for their long-dead brothers. In my examples it's obvious that we just saved 3 of our Marines from another line of 3 wounds, minimizing chance to lose them by 0.33.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_OCDMbx08eVU/S1GDhpLmOLI/AAAAAAAAAjY/BSLv2cSHEfQ/s1600-h/speed3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_OCDMbx08eVU/S1GDhpLmOLI/AAAAAAAAAjY/BSLv2cSHEfQ/s320/speed3.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Maybe you have better suggestions? It would be great to improve current systems, to make them closer to perfect.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-3298362517609986166?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=3298362517609986166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3298362517609986166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3298362517609986166'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2010/01/warhammer-40k-wounds-allocation.html' title='Warhammer 40k Wounds Allocation'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_OCDMbx08eVU/S1GDfF9KyfI/AAAAAAAAAjA/a8ZM3ql8TQQ/s72-c/2failed.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-8522621121287792213</id><published>2009-12-25T18:10:00.000+02:00</published><updated>2009-12-25T18:10:20.082+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='other'/><title type='text'>Browsers usage share</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;&lt;br /&gt;Remind me, what did they said about the most used browser? My &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; is sure that the most popular browser is Firefox with almost 55%, than Chrome with 23.7%, and only then IE. And I am happy at last Konqueror got into list, with 0.67% share.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_OCDMbx08eVU/SzTjkrYRl2I/AAAAAAAAAi4/o0RfdJ6uZQE/s1600-h/Clipboard10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SzTjkrYRl2I/AAAAAAAAAi4/o0RfdJ6uZQE/s400/Clipboard10.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-8522621121287792213?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=8522621121287792213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8522621121287792213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8522621121287792213'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/12/browsers-usage-share.html' title='Browsers usage share'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_OCDMbx08eVU/SzTjkrYRl2I/AAAAAAAAAi4/o0RfdJ6uZQE/s72-c/Clipboard10.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-596033060107436273</id><published>2009-12-25T17:55:00.000+02:00</published><updated>2009-12-25T17:55:14.438+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Homegrown projects: versioning</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;From time to time you need to set up some project at home. There are plenty of reasons: you are starting new opensource project, want to write few HelloWorlds with new frameworks, or you just don't want to go to office today.&lt;br /&gt;&lt;br /&gt;And of course you want to use some &lt;a href=""http://en.wikipedia.org/wiki/Revision_control&gt;VCS&lt;/a&gt; with your project, because it allows you to perform development in steps, plus standard VCS features like revert/diff.&lt;br /&gt;&lt;br /&gt;I worked with CVS, SVN, Perforce and a tiny bit with VSS. And few days ago I tried &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt;. Mostly because great support from &lt;a href="http://wiki.netbeans.org/MercurialVersionControl"&gt;NetBeans&lt;/a&gt;. But now Mercurial is total winner for home usage, only &lt;a href="http://mercurial.selenic.com/guide/"&gt;two simple steps&lt;/a&gt; and your repository is up and ready to be used from &lt;a href="http://mercurial.selenic.com/wiki/OtherTools"&gt;your favorite IDE&lt;/a&gt;. With Mercurial you don't need to start servers, use network connection, configure some system files using root privileges, just install and init project. And enjoy lightweight source control system that will provide you with all benefits of versioning.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-596033060107436273?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=596033060107436273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/596033060107436273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/596033060107436273'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/12/homegrown-projects-versioning.html' title='Homegrown projects: versioning'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-1479860052981115557</id><published>2009-12-24T12:44:00.000+02:00</published><updated>2009-12-24T12:44:24.605+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>JPA 2.0 migration experience</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;Java EE 6 specification released not so long ago, and now includes release of JPA 2.0 specification. Obviously, you'd like to use JPA 2.0 for your new project. But the problem is, how to choose good implementation and where to get it?&lt;br /&gt;&lt;br /&gt;First you will go to Sun's &lt;a href="http://java.sun.com/javaee/technologies/persistence.jsp"&gt;persistance page&lt;/a&gt;. You'll read a bit and click on "download" link that will take you on &lt;a href="https://glassfish.dev.java.net/downloads/persistence/JavaPersistence.html"&gt;Glassfish Persistance page&lt;/a&gt;. But the problem is, you will not find JPA 2.0 reference implementations on that page.&lt;br /&gt;&lt;br /&gt;Ok, next step - &lt;a href="http://www.google.com/#hl=en&amp;source=hp&amp;q=jpa+2+reference+implementation&amp;aq=f&amp;aqi=g1&amp;oq=&amp;fp=b36c7832dbb01be6"&gt;ask google&lt;/a&gt;. Google sais that EclipseLink is reference implementation for JPA 2.0, and &lt;a href="http://en.wikipedia.org/wiki/EclipseLink"&gt;wikipedia confirms&lt;/a&gt;. Let's go to &lt;a href="http://www.eclipse.org/eclipselink/downloads/index.php#2.0.0"&gt;EclipseLink downloads&lt;/a&gt;. Yea, there are some files to download, but again everything is packed into single huge JAR with dozens of features we don't really need (yea, I have "classpath paranoia"), and the main component is missing - sources for JPA 2.0 API, that can be added to NetBeans libraries to read javadocs and to help it with method argument names (do you remember that Library Manager in NetBeans?).&lt;br /&gt;&lt;br /&gt;We must not give up. Let's go to JSR page and take a look. &lt;a href="http://en.wikipedia.org/wiki/Java_persistence_api#JPA_2.0"&gt;Wikipedia states&lt;/a&gt; it's &lt;a href="http://jcp.org/en/jsr/detail?id=317"&gt;JSR 317&lt;/a&gt;. After clicking on &lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr317/index.html"&gt;"Download"&lt;/a&gt; link we can see another link, that will direct us to &lt;a href="http://www.eclipse.org/eclipselink/downloads/ri.php"&gt;"EclipseLink's Reference Implementation Downloads"&lt;/a&gt;. After downloading both and taking a look inside of each package we can see that &lt;a href="http://www.eclipse.org/downloads/download.php?file=/rt/eclipselink/ri/eclipselink-2.0.0_JPA-2.0.0_RI.zip"&gt;"EclipseLink 2.0.0 - minimal bundles that are shipped in the Java EE6 RI"&lt;/a&gt; is what we really need. Finally, everything we may need and packed in separate small JARs, so we can include only features we need.&lt;br /&gt;&lt;br /&gt;Now, let's make it work. I have project that used JPA 1 with EclipseLink 1.2.0. I removed all EclipseLink libraries, added &lt;span style="font-family:monospace;"&gt;javax.persistence_2.0.0.v200911271158.jar&lt;/span&gt; (JPA 2.0 API) and &lt;span style="font-family:monospace;"&gt;org.eclipse.persistence.jpa_2.0.0.v20091127-r5931.jar&lt;/span&gt; (one that contains org.eclipse.persistence.jpa.PersistenceProvider). First few starts of application ClassNotFound were reported, I searched for required classes and added their JARs. Finally, here is the full list of JARs you need to work with standard JPA 2.0 feature set:&lt;br /&gt;        &lt;span style="font-family:monospace;"&gt;&lt;blockquote&gt;javax.persistence_2.0.0.v200911271158.jar&lt;br /&gt;        org.eclipse.persistence.jpa_2.0.0.v20091127-r5931.jar&lt;br /&gt;        org.eclipse.persistence.core_2.0.0.v20091127-r5931.jar&lt;br /&gt;        org.eclipse.persistence.asm_2.0.0.v20091127-r5931.jar&lt;br /&gt;        org.eclipse.persistence.antlr_2.0.0.v20091127-r5931.jar&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;and files to add to Sources tab (NetBeans will be able to show you sources, javadocs and read method argument names from those sources):&lt;br /&gt;        &lt;span style="font-family:monospace;"&gt;&lt;blockquote&gt;javax.persistence.source_2.0.0.v200911271158.jar&lt;br /&gt;        org.eclipse.persistence.jpa.source_2.0.0.v20091127-r5931.jar&lt;br /&gt;        org.eclipse.persistence.core.source_2.0.0.v20091127-r5931.jar&lt;br /&gt;        org.eclipse.persistence.asm.source_2.0.0.v20091127-r5931.jar&lt;br /&gt;        org.eclipse.persistence.antlr.source_2.0.0.v20091127-r5931.jar&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;That's all. Use JPA 2.0 with pleasure, support new versions and software evolution, because otherwise we all will become &lt;a href="http://www.google.com/#hl=en&amp;q=What+does+the+name+%22Mono%22+mean&amp;aq=f&amp;aqi=&amp;oq=&amp;fp=b36c7832dbb01be6"&gt;stupid monkeys&lt;/a&gt; and will return back on palms.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-1479860052981115557?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=1479860052981115557' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1479860052981115557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1479860052981115557'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/12/jpa-20-migration-experience.html' title='JPA 2.0 migration experience'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-4311110425826472587</id><published>2009-12-15T16:09:00.000+02:00</published><updated>2009-12-15T16:09:48.924+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><title type='text'>GWT EventDispatch and widgets width and height</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;When you're constructing Widget in GWT - it's size is 0 until it's rendered. It's different from Swing, Swing assumed that you're working in EventDispatcher and calculated all sizes instantly. It is not announced but looks like GWT have it's event dispatcher too, and you can use DeferredCommand class to place Command into events loop. Using this approach you can construct Widget, place it into some Container, and then add some Command to DeferredCommand to work with widget's size after current construction operation will be complete and Widget will get it's size.&lt;br /&gt;&lt;br /&gt;It looks like problem of all young widget toolkits, like Swing itself many years ago. They are showing it, its simple, its cool. But when you start coding real application using that toolkit - you'll get many problems, many different "hidden" features and many tricks and workarounds. After many years they'll tell you about EventDispatcher, then they'll implement different kinds of BackgroundWorkers, and different rules how to "use correctly" this toolkit. You can remember situation with "EventDispatcher rule" of Swing and how it was changed from Java5 to Java6 (while nothing inside was changed). Now we can see similar situation with JavaFX, and GWT goes the same way.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-4311110425826472587?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=4311110425826472587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4311110425826472587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4311110425826472587'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/12/gwt-eventdispatch-and-widgets-width-and.html' title='GWT EventDispatch and widgets width and height'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-7652240413048711583</id><published>2009-12-11T14:18:00.000+02:00</published><updated>2009-12-11T14:18:04.789+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>NetBeans 6.8 has come</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;NetBeans 6.8 is just released, introducing many new features. It's pity there is nothing interesting for me as for Java-GWT developer. And even nothing interesting for other guys I worked with - they are still using MyFaces 1.1 for some reason, OpenJPA 0.9.7 bundled with WebLogic 10.0.0.0.0, and other EE4 or EE5 stuff. New JIRA plugin can't authentificate into my JIRA server, and I'll better wait for next GWT4NB version, which I hope will support GWT 2.0 and NetBeans 6.8.&lt;br /&gt;&lt;br /&gt;Honestly, it's a pity that the most powerful Java IDE/editor is not improving it's Java stack, but working on some thirdparty features like Kenai, PHP, Ruby...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-7652240413048711583?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=7652240413048711583' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7652240413048711583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7652240413048711583'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/12/netbeans-68-has-come.html' title='NetBeans 6.8 has come'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-7124327659917448386</id><published>2009-12-10T13:27:00.000+02:00</published><updated>2009-12-10T13:27:36.216+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><title type='text'>Internationalization in UI toolkits</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;&lt;br /&gt;I have some experience with many different UI toolkits. The most with Swing, QtJambi, GWT, and some with SWT and Echo2. Some of them providing you with their own i18n techniques. Let's take a closer look...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Swing&lt;/b&gt; is the most comfortable tookit because it gives you full Java API, with source code, possibility to dive deep into it's internals and no external libraries or dependencies. And it gives you standard Java i18n engine: ResourceBundle. It's simple, powerful and effective. And it's customizable (if you know Java of course).&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/_OCDMbx08eVU/SyDXc4uMqWI/AAAAAAAAAis/-cB9y-lPgMA/s1600-h/Clipboard08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SyDXc4uMqWI/AAAAAAAAAis/-cB9y-lPgMA/s400/Clipboard08.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Qt Jambi&lt;/b&gt; gives you Qt's native internationalization engine. It works in other manner than ResourceBundles. API is clean and simple, every Qt widget have method &lt;span style="font-family: monospace;"&gt;tr(String)&lt;/span&gt; where you can specify default value, but not the key as ResourceBundle suggested. From one point of view it's good because you're hardcoding default values, and you will be sure that on any system it will at least show default version. From the other side - those messages can take a lot of space in your source files, plus they are actually keys in internationalization files, similar to properties files. Having keys like this is not very good, because modifying single char you have to modify all resource bundles, while in ResourceBundle you can leave code "as is", modifying only value but not key.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GWT&lt;/b&gt; is totally different. It's using properties files too, but you have to extend &lt;span style="font-family: monospace;"&gt;Constants&lt;/span&gt; interface, and add all your keys as &lt;span style="font-family: monospace;"&gt;String&lt;/span&gt; methods to interface. As for me GWT is the total winner, because you have properties files with key-value pairs and IDE support, and you have compile-time safety because you're getting those strings from Java class. In ResourceBundle you're operating mostly with Strings, and simple typo can waste lots of your time, while using GWT approach you must ensure your keys only once, then you're totally saved from any kinds of typos using Java methods to get your internationalized messages.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-7124327659917448386?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=7124327659917448386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7124327659917448386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7124327659917448386'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/12/internationalization-in-ui-toolkits.html' title='Internationalization in UI toolkits'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_OCDMbx08eVU/SyDXc4uMqWI/AAAAAAAAAis/-cB9y-lPgMA/s72-c/Clipboard08.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-7120383168419237533</id><published>2009-12-10T10:27:00.002+02:00</published><updated>2009-12-10T10:28:44.728+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>GWT 2.0: almost 6000 downloads in 33 hours</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;&lt;br /&gt;GWT 2.0 released yesterday, but almost reached 6000 downloads already!&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/_OCDMbx08eVU/SyCw1PZ6HLI/AAAAAAAAAik/oZqdQN0kb7Y/s1600-h/Clipboard07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SyCw1PZ6HLI/AAAAAAAAAik/oZqdQN0kb7Y/s400/Clipboard07.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Well, I am agree that GWT is pretty cool thing, especially if you must do something for web browsers, but 6000 in 33 hours... Can you remember any other toolkit with same download rate? Even Java developers are not bothering themselves with downloading of new versions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-7120383168419237533?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=7120383168419237533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7120383168419237533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7120383168419237533'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/12/gwt-20-almost-6000-downloads-in-33.html' title='GWT 2.0: almost 6000 downloads in 33 hours'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_OCDMbx08eVU/SyCw1PZ6HLI/AAAAAAAAAik/oZqdQN0kb7Y/s72-c/Clipboard07.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-1591373797186068858</id><published>2009-12-09T09:54:00.000+02:00</published><updated>2009-12-09T09:54:04.539+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>GWT 2.0 released, HTML drawbacks as new feature</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;Few minutes ago I read about release of GWT 2.0. It's great new release, with many useful features. Except one: UiBinder. HTML and XML both have their problem - they are page-oriented. You can't just replace some widget as long as it's Widget subclass. You need to repaint all page if you want to layout it in some other manner. GWT allowed you to avoid those drawbacks, providing you with great feature-rich component-based framework. You could do everything in plain Java, and as for me it's big advantage, because average quality of GWT project were relatively high (you at least need to know Java, and maybe some component-based framework like Swing, right?). And now any novice HTML coder can feel something native and ugly using GWT, lowering average code quality and writing another crappy application with cute HTML-like interface. Impossible to debug, impossible to apply any Java techniques, and even making harder to use version control system (I hope you noticed that modern DIFF algorithms are not very good with XML?).&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-1591373797186068858?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=1591373797186068858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1591373797186068858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1591373797186068858'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/12/gwt-20-released-html-drawbacks-as-new.html' title='GWT 2.0 released, HTML drawbacks as new feature'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-4374603543482679597</id><published>2009-11-27T13:24:00.000+02:00</published><updated>2009-11-27T13:24:18.577+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>Stupid frameworks are forcing you to do stupid things</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;I am working with GWT+GXT right now. And I have strange problem - I can't save some user object. Just can't. When user logined to the system I want to save user object, containing his name, mail, role, group and other things. But as soon as F5 pressed - all static is cleared from the application, so even static fields can't help me. Cookies can help me, but they're limited to String only...&lt;br /&gt;&lt;br /&gt;Of course my imagination works fine, and I can implement some GWT RPC service and get user from the server (where I have user's session, and I can save User object into that session). But it's stupid, isn't it?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-4374603543482679597?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=4374603543482679597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4374603543482679597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4374603543482679597'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/11/stupid-frameworks-are-forcing-you-to-do.html' title='Stupid frameworks are forcing you to do stupid things'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-4255784118869857620</id><published>2009-11-26T14:34:00.000+02:00</published><updated>2009-11-26T14:34:08.696+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='other'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>NetBeans and Safari</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;On my Windows box I am using &lt;a href="http://en.wikipedia.org/wiki/Safari_(web_browser)"&gt;Safari&lt;/a&gt; to read javadocs. Because of fonts antialiasing of course. And just noticed strange effect - NetBeans starts to lag when Safari is opened. Sources parsing is slower, autocomplete waits visibly longer before suggest something... Do you know where is the problem?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-4255784118869857620?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=4255784118869857620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4255784118869857620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4255784118869857620'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/11/netbeans-and-safari.html' title='NetBeans and Safari'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-5969960790562552167</id><published>2009-11-25T13:01:00.000+02:00</published><updated>2009-11-25T13:01:43.933+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>GWT2 Firefox plugin download</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;&lt;br /&gt;First release candidate of GWT2 released on November 17, it can be downloaded &lt;a href="http://google-web-toolkit.googlecode.com/files/gwt-2.0.0-rc1.zip"&gt;here&lt;/a&gt;. One of the first changes you'll notice - they removed their "hosted browser" and added plugins for some browsers that will help browser (Firefox?) to do the job of "hosted browser". The first time you'll run application - it will suggest you to download plugin. But what can you do it you want to copy your project on workstation with strict or no internet? Or it you're planning to clean Firefox profile from time to time?&lt;br /&gt;&lt;br /&gt;I asked question about where can I get those plugins on Google Groups for GWT, but 7 days passed and no answers...&lt;br /&gt;&lt;br /&gt;So here is the small guide how you can get it manually.&lt;br /&gt;1. Find folder where firefox storing it's plugins. For me it was &lt;span style="font-family: monospace;"&gt;C:\Documents and Settings\Username\Application Data\Mozilla\Firefox\Profiles\5zchoudq.default\extensions\gwt-dmp-ff35@gwt.google.com&lt;/span&gt; (yes, yes, I am still using Windows on my job).&lt;br /&gt;2. Open &lt;span style="font-family: monospace;"&gt;install.rdf&lt;/span&gt; in text editor. After reading it for some time the only interesting line you'll find looks like this: &lt;span style="font-family: monospace;"&gt;http://google-web-toolkit.googlecode.com/svn/trunk/plugins/xpcom/prebuilt/update.rdf&lt;/span&gt; in &lt;span style="font-family: monospace;"&gt;em:updateURL&lt;/span&gt; tag.&lt;br /&gt;3. Open that link in browser and read that file. Now you can see the link where you can get that extension, can't you? Here is it: &lt;span style="font-family: monospace;"&gt;&lt;a href="https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin.xpi"&gt;https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin.xpi&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;4. Now you can save it for farther usage.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-5969960790562552167?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=5969960790562552167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/5969960790562552167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/5969960790562552167'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/11/gwt2-firefox-plugin-download.html' title='GWT2 Firefox plugin download'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-1746117807817859791</id><published>2009-10-13T11:53:00.001+03:00</published><updated>2009-10-13T11:54:31.766+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Tablet on VirtualBox guest</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;&lt;br /&gt;If you're Linux user and you have Wacom Intuos3 tablet - it's obvious that GIMP will not satisfy your needs. Solution exists: you can download and install free &lt;a href="http://www.virtualbox.org/wiki/Downloads"&gt;VirtualBox&lt;/a&gt;, install WindowsXP as guest system and work with your tablet in guest system, installing your favourite graphics application on Windows guest.&lt;br /&gt;I did those steps: installed VirtualBox 3.0.8 on my SUSE Linux 11.1, installed WindowsXP as guest. But I couldn't configure it - checkbox to turn on tablet in guest system was disabled (grayed out).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_OCDMbx08eVU/StQ-sIfgTvI/AAAAAAAAAg8/kZd3Mwqutw8/s1600-h/tablet_on_virtualbox.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_OCDMbx08eVU/StQ-sIfgTvI/AAAAAAAAAg8/kZd3Mwqutw8/s320/tablet_on_virtualbox.png" /&gt;&lt;/a&gt;&lt;/div&gt;I spent few hours reading different forums and bugreports, most of them suggested to mount tablet as usbfs to your system, but it didn't worked for me. When I found solution - it was fast and simple:&lt;br /&gt;1. Open your &lt;span style="font-family: monospace;"&gt;/etc/udev/rules.d/10-vboxdrv.rules&lt;/span&gt; as root. You will see something like this:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;blockquote&gt;KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600"&lt;br /&gt;SUBSYSTEM=="usb_device", GROUP="vboxusers", MODE="0664"&lt;br /&gt;SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="vboxusers", MODE="0664"&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;2. Modify third line like this (adding name):&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;blockquote&gt;SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", NAME="VirtualBox/$env{BUSNUM}/$env{DEVNUM}", GROUP="vboxusers", MODE="0664"&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;3. Restart your system to be sure.&lt;br /&gt;&lt;br /&gt;That's it! Now checkbox will be enabled and you will be able to turn on your USB tablet for guest system. VirtualBox will fail with error (something like couldn't create usb proxy device) but only 2 times, when pressing third time - tablet will be recognised by guest system and you will be able to use it. Of course you should also disable mouse integration and your tablet will no longer be available to your host Linux system, but what for do you need it there anyway?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-1746117807817859791?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=1746117807817859791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1746117807817859791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1746117807817859791'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/10/tablet-on-virtualbox-guest.html' title='Tablet on VirtualBox guest'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_OCDMbx08eVU/StQ-sIfgTvI/AAAAAAAAAg8/kZd3Mwqutw8/s72-c/tablet_on_virtualbox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-1713517058738228664</id><published>2009-10-08T13:02:00.005+03:00</published><updated>2009-12-11T17:36:35.359+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='other'/><title type='text'>Problems of small opensource projects</title><content type='html'>&lt;span style="font-family: sans-serif;"&gt;Being Java developer and fan of OpenSource &lt;a href="http://heresylabs.googlecode.com/"&gt;I am writing&lt;/a&gt; lots of stuff. Mostly for myself, tools that I am missing or to get some experience with something. But of course there are projects that I think others will like and use if they will know more about it. Few examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Once I wrote small tool for Swing apps to choose LookAndFeel in runtime. It was &lt;a href="http://code.google.com/p/heresylabs/wiki/JLAFChooser"&gt;JLAFChooser&lt;/a&gt; and I hoped it will become popular very soon. But days passed and downloads count was small. I thought that mostly it's downloaded by different search engines, nobody cares about it. And I just forgot about it, didn't planned to make it better. Download rate is about 1.001 per day. No bugs, no feature requests, no thanx or private mails. Nothing. Maybe this project had it's future, but now it's as good as dead. And even java.net registration did nothing to improve the situation.&lt;/li&gt;&lt;li&gt;Then came &lt;a href="http://p4nb.googlecode.com/"&gt;p4nb&lt;/a&gt;. I did it for myself anyway, I am still using it at work because it's the best available Perforce plugin for NetBeans IDE. It's just enough for me. And nobody cares. Looks like nobody using NetBeans and Perforce at once. I can implement vast amount of features, including changes browsing, changelist management and many other. But I have more interesting projects for myself, and nobody else asks for it. Why should I do it?&lt;/li&gt;&lt;/ul&gt;You will ask what's the point of that moaning? But the point is, once one guy mailed me with words like "hey, I added few features to your p4nb plugin, maybe you need it?". That day I understood that I am not the only user of that plugin, there are at least another man using it. It was the new beginning for p4nb, it got completely rewritten with new and better feature set and better usability. And then it was forgotten again, because all users were glad with what they had, no bugs and no change requests fired.&lt;br /&gt;Today I got a mail from one guy who is using JLAFChooser, he asked about launching it from Java WebStart. Of course I answered him, but why so late? I have no interest in that peace of software now, and I will not get back to it's development. It's dead for me, because no one really needed it when it was interesting for me.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;How many projects died like this? What kind of project they were, maybe we lost something really interesting?&lt;/li&gt;&lt;li&gt;What should I do to prevent it in future? Post to slashdot? Buy Google Ads? Tell me what I did wrong to fix it in future.&lt;/li&gt;&lt;/ol&gt;Thanx for your attention, and I hope this post will not be just ignored in the same sad manner.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-1713517058738228664?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=1713517058738228664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1713517058738228664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1713517058738228664'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/10/problems-of-small-opensource-projects.html' title='Problems of small opensource projects'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-7344933051016459001</id><published>2009-08-11T14:17:00.000+03:00</published><updated>2009-08-11T14:18:53.173+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Using license with NetBeans project</title><content type='html'>&lt;span style="font-family:sans-serif;"&gt;&lt;br /&gt;&lt;br /&gt;When you're using GPL or LGPL with your project - you should add license statement to every source file of your project. Using NetBeans it's not that simple - you have to use PROJECT/nbproject/project.properties file to add project.license=default_2 for example, using file name of your license template (but not template name itself). To make your life even harder - GPL and LGPL statements are using name of your project three times. Because of this I created separate templates for each of my (L)GPL projects to include project name. Because of this is took a time to set a complete new project. Now I found solution how to make NetBeans use single GPL template for all projects:&lt;br /&gt;&lt;br /&gt;1. use ${project.name} for name of your project. For example: "This file is part of ${project.name}.".&lt;br /&gt;2. in file PROJECT/nbproject/project.properties add project.license=default_1 (or any other file name for your license).&lt;br /&gt;3. in same file (PROJECT/nbproject/project.properties) add project.name=MyNewProject&lt;br /&gt;&lt;br /&gt;Now create new Class file and check license header of your file. Hope you'll enjoy!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-7344933051016459001?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=7344933051016459001' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7344933051016459001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7344933051016459001'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/08/using-license-with-netbeans-project.html' title='Using license with NetBeans project'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-8612240064142983707</id><published>2009-07-23T09:37:00.002+03:00</published><updated>2009-07-23T09:38:21.508+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>KDE 4.3 RC3</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;You may already know that KDE 4.3 RC3 released, and release delayed for a week. I can't stand that news, I thought that is will be released this Monday, but another 2 weeks... And of course I want to try it without harming my every day system with KDE 4.2.4 and only stable packages. In that moment I remembered about kde4live CDs, that I used some time before SUSE 11.1 released. And of course I &lt;a href="http://home.kde.org/~binner/kde-four-live/"&gt;found it&lt;/a&gt; fast enought using Google. And there are good news - on top of the page there is message that KDE 4.3 RC3 already packed to LiveCD and can be downloaded from &lt;a href="http://download.opensuse.org/repositories/KDE:/Medias/images/iso/"&gt;SUSE's repositories&lt;/a&gt;. Well, Kubuntu users, don't you feel betrayed that your favourite "KDE-oriented" distro is far behind great and green OpenSUSE?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-8612240064142983707?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=8612240064142983707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8612240064142983707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8612240064142983707'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/07/kde-43-rc3.html' title='KDE 4.3 RC3'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-7694433544189944418</id><published>2009-07-09T15:05:00.010+03:00</published><updated>2009-07-10T11:14:43.836+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><title type='text'>Kompare - the only valuable diff for M$Windows</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;I used KDE and Linux for many years, and of course I was shocked when I had to switch to Windows in new office and I didn't found all those little but important tools KDE guys made for us all. Today I will tell you about &lt;a href="http://en.wikipedia.org/wiki/Kompare"&gt;Kompare&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;My history as Kompare user&lt;/b&gt;&lt;br /&gt;While being developer from time to time you need to diff between two files. Of course almost any IDE and other development-oriented tool have own diff UI. Of course I used many of them, some are more useful than others. For example older &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; diffs were so ugly that it was hard to look at, &lt;a href="http://www.jetbrains.com/idea/"&gt;IDEA&lt;/a&gt; had horizontal 3-way comparison, older &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; versions - vertical 3-was comparison, &lt;a href="http://kdiff3.sourceforge.net/"&gt;KDiff3&lt;/a&gt; showed too much of not required data and also was ugly enought. Only &lt;a href="http://www.syntevo.com/smartsvn/"&gt;SmartSVN&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Kompare"&gt;Kompare&lt;/a&gt; used two-way clean and informative diff, but while SmartSVN was written in Swing - Kompare used all possible KDE features including font antialiasing, user's colouring and icon theme and of course smooth comparison blocks. While being feature-rich it was only comparison tool with great UI, so I stuck with it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Switching to Windows&lt;/b&gt;&lt;br /&gt;Of course after I got used with pretty tool like this - it's hard to move to something ugly and not so usable. When on the new job I had use Windows - I went to &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools"&gt;wikipedia&lt;/a&gt; to search for another file comparison tool. And what do you think, I downloaded every free-to-download tool and tried it - and it failed. Some of them took 3-4 steps before show you actual diff, others were overloaded with features, others had ugly UIs. I couldn't make myself use them. I've been lucky and by that time NetBeans team swithed to 2-way diff, and I used NetBeans for even smallest comparison operations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;kde4win salvation&lt;/b&gt;&lt;br /&gt;I was lucky enought not to die before kde4win project released with Kompare ported to Windows. Of course few first releases didn't helped me also, but starting with 4.2.0 release Kompare was fully functional. And not with kde4win you can use this great tool if file comparison operations is critical for you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;installing&lt;/b&gt;&lt;br /&gt;It's not hard. You don't even have to compile something. Only few steps:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Go to &lt;a href="http://gnuwin32.sourceforge.net/packages/diffutils.htm"&gt;gnuwin32 diffutils&lt;/a&gt;, download and install.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download &lt;a href="http://www.winkde.org/pub/kde/ports/win32/installer/kdewin-installer-gui-latest.exe"&gt;kdewin installer&lt;/a&gt; and launch it.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;After installing kde4win - start kompare and in "Diff" section show him where your diff.exe (from gnuwin32 diffutils) is located.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Restart Kompare and it's ready to use!&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Now you can enjoy your life without feeling the pain of uncompared files on your system.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PS:&lt;/b&gt; Kompare can be used even for folders comparison - and it's much more powerfull than you can expect from simple file manager!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/Slb4ZmkrqkI/AAAAAAAAAfA/wISSOAOQmsQ/s1600-h/Kompare.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/Slb4ZmkrqkI/AAAAAAAAAfA/wISSOAOQmsQ/s320/Kompare.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5356741925538605634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-7694433544189944418?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=7694433544189944418' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7694433544189944418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7694433544189944418'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/07/kompare-only-valuable-diff-for-mwindows.html' title='Kompare - the only valuable diff for M$Windows'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_OCDMbx08eVU/Slb4ZmkrqkI/AAAAAAAAAfA/wISSOAOQmsQ/s72-c/Kompare.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-1927921997905830551</id><published>2009-07-06T16:29:00.000+03:00</published><updated>2009-07-06T16:30:02.013+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='SUSE'/><title type='text'>Yet another opinion in Mono case</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;a href="http://www.tuxmachines.org/node/37633"&gt;There&lt;/a&gt; &lt;a href="http://www.tuxmachines.org/node/37765"&gt;were&lt;/a&gt; &lt;a href="http://www.tuxmachines.org/node/37782"&gt;many&lt;/a&gt; &lt;a href="http://www.tuxmachines.org/node/37806"&gt;Mono&lt;/a&gt; &lt;a href="http://www.tuxmachines.org/node/37826"&gt;debates&lt;/a&gt; &lt;a href="http://www.tuxmachines.org/node/37924"&gt;on&lt;/a&gt; &lt;a href="http://www.tuxmachines.org/"&gt;Tuxmachines&lt;/a&gt; for last few weeks. Of course I have my own opinion on this topic. I will not blame Mono right now, just my thoughts about distributing it with Linuxes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Default distribution&lt;/b&gt;&lt;br /&gt;As far as I know, all those debates started when Debian guys thought about including Mono into default installation. But what it default installation? Isn't it related to target users? It's obvious that when you installing Ubuntu - you target home desktops, SLED or Mandrake - office, SLES or Slackware - servers. Depending on that choice "defaults" are very subjective. But is there any distribution problem? I don't see it. Being SUSE user I have my distribution on DVD media, lots of stuff could be fitted there, why not include Mono? If you're single CD distribution - you should think twice and count all Mono-based software you'd like to install. If it's just single application - it will be funny to install mono because of it.&lt;br /&gt;&lt;br /&gt;Next, most of Mono apps are made for GNOME. I see no reasons to install it with KDE-based distribution, or console installations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Thinking about users&lt;/b&gt;&lt;br /&gt;In perfect world user should never bother with technology used in his favourite apps. Application should just do it's job, not promote or blame something. To mono or not to mono should depend on those user apps, but should not be some politics or religion choice. As for me I hate beagle, banshee and f-spot. Mono should not be installed for me. And vice-versa. If user will notice any Mono application he will run - it will look like there is some problem with Mono, don't you think so?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;System core&lt;/b&gt;&lt;br /&gt;While it's completely OK to depend some desktop apps on Mono or other interpreted stuff - it's totally wrong to use it for system parts. Every next level of abstraction and interpretation adds additional level of possible problems, removes some part of integration and requires more resources to work. Can you imagine our world if HAL will be written in ruby or python or something like that? System must not be related on interpretator vendor or on subjective solutions. You may already see some bad examples like ZEN in SUSE 10.0, pulseaudio in current distributions, gcj instead of Sun JRE in fedoras and many more.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;From my perspective&lt;/b&gt;&lt;br /&gt;It's strange to see, but all mono-based apps I know makes me sick. Beagle that starts and scans event without any GUI installed. ZEN that made me think about switching away from SUSE. Banshee with it's crippled playlists. F-spot with it's lack of features. MonoDevelop with it's lame possibilities totally unexpected in any IDE. I think that the day I will not be able to set "taboo" on Mono in my SUSE installation will be the last day of me as SUSE user.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-1927921997905830551?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=1927921997905830551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1927921997905830551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1927921997905830551'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/07/yet-another-opinion-in-mono-case.html' title='Yet another opinion in Mono case'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-7703027137473106610</id><published>2009-07-06T11:33:00.003+03:00</published><updated>2009-07-30T19:57:34.033+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java things that make you go "hmm"</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;I am preparing myself to SCJP exam, and while reading preparation book I found "feature" I didn't knew about. Take a look at the following code:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:monospace;"&gt;public class Main {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;public static void main(String[] args) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;new B();&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;static class A {&lt;br /&gt;&amp;nbsp;&amp;nbsp;public A() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("A constructor");&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;static class B extends A {&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("B init");&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;public B() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("B constructor");&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;How do you think, what output will it generate?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-7703027137473106610?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=7703027137473106610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7703027137473106610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7703027137473106610'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/07/java-things-that-make-you-go-hmm.html' title='Java things that make you go &quot;hmm&quot;'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-2553389064653746004</id><published>2009-07-02T15:27:00.008+03:00</published><updated>2009-07-30T19:58:04.906+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java single inheritance questions</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;There are few structures in Java that are not so intuitive as others. Take a look:&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;blockquote&gt;public class InnerInvocation {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;String getValue() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;return "Outer Value";&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;private class InnerClass {&lt;br /&gt;&amp;nbsp;&amp;nbsp;String getValue() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "Inner Value";&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;void work() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// insert code here&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;What code do you need to invoke getValue() method from outer class?&lt;br /&gt;&lt;br /&gt;Here is the answer:&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;void work() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;InnerInvocation.this.getValue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;And now the question of the day: there &lt;b&gt;is&lt;/b&gt; syntax that possibly can allow multiple inheritance in Java, so why is it forbidden? Because you as developer can make lots of mistakes? Why then they allowed reflections?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-2553389064653746004?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=2553389064653746004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/2553389064653746004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/2553389064653746004'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/07/java-single-inheritance-questions.html' title='Java single inheritance questions'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-4005431388510778574</id><published>2009-06-30T15:25:00.014+03:00</published><updated>2009-06-30T15:47:20.681+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Eclipse and NetBeans compared</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Eclipse 3.5 released few days ago, and NetBeans 6.7 just released. Of course I am using NetBeans 6.7 starting from beta versions and I know how it works, so I wanted to test eclipse. After using it for few hours came this comparison.&lt;br /&gt;Both IDEs have clean install and run.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;About&lt;/h2&gt;&lt;br /&gt;Two about dialogs to show used versions&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFH82j6LI/AAAAAAAAAZc/JFmUt74rDLk/s1600-h/eclipse_about.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFH82j6LI/AAAAAAAAAZc/JFmUt74rDLk/s320/eclipse_about.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096741235452082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFmZpZpGI/AAAAAAAAAb8/9DVzMHdwD3k/s1600-h/nb_about.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 320px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFmZpZpGI/AAAAAAAAAb8/9DVzMHdwD3k/s320/nb_about.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097264360957026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Memory usage at the beginning&lt;/h2&gt;&lt;br /&gt;Memory usage just after startup. It's pretty comparable to say "there is no winner".&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFfQwBAjI/AAAAAAAAAbs/D3XOQS-SXiY/s1600-h/memory_usage_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 25px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFfQwBAjI/AAAAAAAAAbs/D3XOQS-SXiY/s320/memory_usage_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097141713699378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step 1: project creation&lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;Eclipse&lt;/h3&gt;&lt;br /&gt;New project dialog:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFe5XkaOI/AAAAAAAAAbc/q7kZj1BSJks/s1600-h/eclipse_project_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 319px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFe5XkaOI/AAAAAAAAAbc/q7kZj1BSJks/s320/eclipse_project_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097135437146338" /&gt;&lt;/a&gt;&lt;br /&gt;Eclipse gives lots of options on project creation page, and defaults are quite ugly. May be that is the reason why eclipse users are never writing small projects just to test some API?...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFfOYH2yI/AAAAAAAAAbk/EmVJLwXkL1g/s1600-h/eclipse_project_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 228px; height: 320px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFfOYH2yI/AAAAAAAAAbk/EmVJLwXkL1g/s320/eclipse_project_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097141076613922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans&lt;/h3&gt;&lt;br /&gt;New project dialog:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoF9RpXRII/AAAAAAAAAd8/oS7xFSi1Etg/s1600-h/nb_project_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoF9RpXRII/AAAAAAAAAd8/oS7xFSi1Etg/s320/nb_project_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097657350308994" /&gt;&lt;/a&gt;&lt;br /&gt;NetBeans gives option to create Main class for project at once, but we will ignore this suggesion for comparison purposes.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoF9mJtA3I/AAAAAAAAAeE/25dtQESBac4/s1600-h/nb_project_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 220px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoF9mJtA3I/AAAAAAAAAeE/25dtQESBac4/s320/nb_project_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097662854660978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step 2: main class&lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;Eclipse&lt;/h3&gt;&lt;br /&gt;Eclipse shows another overloaded window. Of course first bug in package input, Ctrl+Space just does not work there. As for me to save user's time it would be better to create just empty class as soon as possible, and editor will give possibilities to modify that options.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFetuolGI/AAAAAAAAAbU/oQEOkhic8uA/s1600-h/eclipse_main_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 268px; height: 320px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFetuolGI/AAAAAAAAAbU/oQEOkhic8uA/s320/eclipse_main_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097132312663138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans&lt;/h3&gt;&lt;br /&gt;Quite better options than Eclipse gives, you see all possible templates for your Java project organised in tree.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoF43RprZI/AAAAAAAAAds/i_abDIkhhTY/s1600-h/nb_main_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 220px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoF43RprZI/AAAAAAAAAds/i_abDIkhhTY/s320/nb_main_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097581552053650" /&gt;&lt;/a&gt;&lt;br /&gt;But there is next window to complete Main class creation. It's a bit more usable than Eclipse's version because of good focusing system, but still it's step 2.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoF9HZZhvI/AAAAAAAAAd0/KX3kbXHF5xY/s1600-h/nb_main_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 220px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoF9HZZhvI/AAAAAAAAAd0/KX3kbXHF5xY/s320/nb_main_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097654598993650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step 3: autocomplete&lt;/h2&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 1&lt;/h3&gt;&lt;br /&gt;Basic autocomplete is just ass-ugly. No text coloration, small and not monospaced fonts just suitable to print errors, but not information for developer.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFIECQgOI/AAAAAAAAAZk/u_uFb6MU-b0/s1600-h/eclipse_autocomplete_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFIECQgOI/AAAAAAAAAZk/u_uFb6MU-b0/s320/eclipse_autocomplete_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096743163560162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 1&lt;/h3&gt;&lt;br /&gt;Text coloration helps more than icons, but icons differs each other if compare to Eclipse's round icons with just letter changed. And of course monospaced font.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFmS3vuiI/AAAAAAAAAcE/W_QZNWqzxYA/s1600-h/nb_autocomplete_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 248px; height: 320px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFmS3vuiI/AAAAAAAAAcE/W_QZNWqzxYA/s320/nb_autocomplete_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097262542076450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 2&lt;/h3&gt;&lt;br /&gt;One point to Eclipse - after autocomplete focus is given to set type of list.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFIYhts_I/AAAAAAAAAZs/Fu9otGfeYNs/s1600-h/eclipse_autocomplete_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 168px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFIYhts_I/AAAAAAAAAZs/Fu9otGfeYNs/s320/eclipse_autocomplete_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096748664206322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 2&lt;/h3&gt;&lt;br /&gt;Not much to look at.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFmvMXOQI/AAAAAAAAAcM/QMjk3zVDp1I/s1600-h/nb_autocomplete_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFmvMXOQI/AAAAAAAAAcM/QMjk3zVDp1I/s320/nb_autocomplete_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097270144743682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 3&lt;/h3&gt;&lt;br /&gt;Another ugly autocomplete window.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFITBfPxI/AAAAAAAAAZ0/3drzkVp38As/s1600-h/eclipse_autocomplete_3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 270px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFITBfPxI/AAAAAAAAAZ0/3drzkVp38As/s320/eclipse_autocomplete_3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096747186863890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 3&lt;/h3&gt;&lt;br /&gt;Only imported types shown. Once this was IDEA's feature and it makes good job.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFm9AmHLI/AAAAAAAAAcU/F_dJ38ThIG0/s1600-h/nb_autocomplete_3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 268px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFm9AmHLI/AAAAAAAAAcU/F_dJ38ThIG0/s320/nb_autocomplete_3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097273853484210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 4&lt;/h3&gt;&lt;br /&gt;It's very strange to see icons and other information here, just can't understand who needs it.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFIrS3hzI/AAAAAAAAAZ8/j8H1o8dq_PA/s1600-h/eclipse_autocomplete_4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 246px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFIrS3hzI/AAAAAAAAAZ8/j8H1o8dq_PA/s320/eclipse_autocomplete_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096753702209330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 4&lt;/h3&gt;&lt;br /&gt;Quite lot of variants.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFnI5VD5I/AAAAAAAAAcc/RKjjqNNDQ_c/s1600-h/nb_autocomplete_4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 242px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFnI5VD5I/AAAAAAAAAcc/RKjjqNNDQ_c/s320/nb_autocomplete_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097277044232082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 5&lt;/h3&gt;&lt;br /&gt;Cool. 5 items in list and none will work for us.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFPARh2NI/AAAAAAAAAaE/ksEa1n3erCg/s1600-h/eclipse_autocomplete_5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 215px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFPARh2NI/AAAAAAAAAaE/ksEa1n3erCg/s320/eclipse_autocomplete_5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096862412953810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 5&lt;/h3&gt;&lt;br /&gt;Same problem, just showed everything it knew.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFwglaDaI/AAAAAAAAAck/lucwZu7w0xw/s1600-h/nb_autocomplete_5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 286px; height: 320px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFwglaDaI/AAAAAAAAAck/lucwZu7w0xw/s320/nb_autocomplete_5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097438021946786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 6&lt;/h3&gt;&lt;br /&gt;Nothing interesting.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFPSeaULI/AAAAAAAAAaM/1te4vR9JcxU/s1600-h/eclipse_autocomplete_6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 211px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFPSeaULI/AAAAAAAAAaM/1te4vR9JcxU/s320/eclipse_autocomplete_6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096867298824370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 6&lt;/h3&gt;&lt;br /&gt;The same.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFw9511EI/AAAAAAAAAcs/GRb2DsiqRdA/s1600-h/nb_autocomplete_6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 289px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFw9511EI/AAAAAAAAAcs/GRb2DsiqRdA/s320/nb_autocomplete_6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097445892281410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 7&lt;/h3&gt;&lt;br /&gt;Were there any worse possibilities?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFPR68iGI/AAAAAAAAAaU/0XjdEnVZ1Mo/s1600-h/eclipse_autocomplete_7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 201px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFPR68iGI/AAAAAAAAAaU/0XjdEnVZ1Mo/s320/eclipse_autocomplete_7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096867150071906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 7&lt;/h3&gt;&lt;br /&gt;Pretty good, all found List implementations will help us. Just why to show classes from com.sun.* packages?...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFw-LdgcI/AAAAAAAAAc0/HqsRIfXrQJk/s1600-h/nb_autocomplete_7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 285px; height: 320px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFw-LdgcI/AAAAAAAAAc0/HqsRIfXrQJk/s320/nb_autocomplete_7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097445966184898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 8&lt;/h3&gt;&lt;br /&gt;Still no help from IDE! I can do the same in plain text editor, why do I need IDE like this?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFPnz_1TI/AAAAAAAAAac/DrLQK6XDjAc/s1600-h/eclipse_autocomplete_8.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 195px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoFPnz_1TI/AAAAAAAAAac/DrLQK6XDjAc/s320/eclipse_autocomplete_8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096873026508082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 8&lt;/h3&gt;&lt;br /&gt;Perfect. The most suitable class and full javadoc for it.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFxMfLelI/AAAAAAAAAc8/YlTCb9msUtc/s1600-h/nb_autocomplete_8.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFxMfLelI/AAAAAAAAAc8/YlTCb9msUtc/s320/nb_autocomplete_8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097449806985810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 9&lt;/h3&gt;&lt;br /&gt;One more point to Eclipse. It's good to write type and brackets when class is already known.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFPwmROJI/AAAAAAAAAak/Pbfs94ncyBM/s1600-h/eclipse_autocomplete_9.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 161px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFPwmROJI/AAAAAAAAAak/Pbfs94ncyBM/s320/eclipse_autocomplete_9.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096875384846482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 9&lt;/h3&gt;&lt;br /&gt;No brackets... I have to press another autocomplete to see available constructors. Even no autopopup of autocomplete here.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFxWSVgvI/AAAAAAAAAdE/sxhqOSgbUJo/s1600-h/nb_autocomplete_9.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFxWSVgvI/AAAAAAAAAdE/sxhqOSgbUJo/s320/nb_autocomplete_9.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097452437471986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 10&lt;/h3&gt;&lt;br /&gt;Another ass-ugly autocomplete. No text coloration, no text alignment, some strange info about class of object, and that stupig "arg0" labels... I don't know, did Eclipse guys ever saw what they developed?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFVrqSkJI/AAAAAAAAAas/zKSq5XXRCS0/s1600-h/eclipse_autocomplete_10.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 271px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFVrqSkJI/AAAAAAAAAas/zKSq5XXRCS0/s320/eclipse_autocomplete_10.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096977138749586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 10&lt;/h3&gt;&lt;br /&gt;Just perfect. Bold marks methods implemented in class and plain - inherited methods, text aligned to let you browse return types with ease.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoF4GLOgYI/AAAAAAAAAdM/oc_xn9T6DC0/s1600-h/nb_autocomplete_10.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 227px; height: 320px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoF4GLOgYI/AAAAAAAAAdM/oc_xn9T6DC0/s320/nb_autocomplete_10.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097568371769730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 11&lt;/h3&gt;&lt;br /&gt;arg0?...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFVyC8zvI/AAAAAAAAAa0/P8Z2KthHOQc/s1600-h/eclipse_autocomplete_11.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 171px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFVyC8zvI/AAAAAAAAAa0/P8Z2KthHOQc/s320/eclipse_autocomplete_11.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096978852794098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 11&lt;/h3&gt;&lt;br /&gt;Well, it's really the best found option around.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoF4NbMrNI/AAAAAAAAAdU/4kJDcuoTHkI/s1600-h/nb_autocomplete_11.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 211px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoF4NbMrNI/AAAAAAAAAdU/4kJDcuoTHkI/s320/nb_autocomplete_11.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097570317806802" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 12&lt;/h3&gt;&lt;br /&gt;Hm... no text autoquoting?...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFV1MHmrI/AAAAAAAAAa8/noEPNAYC9xo/s1600-h/eclipse_autocomplete_12.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 177px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFV1MHmrI/AAAAAAAAAa8/noEPNAYC9xo/s320/eclipse_autocomplete_12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096979696556722" /&gt;&lt;/a&gt;&lt;br /&gt;It even can't put semicolon to the right place!...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFWbIaGiI/AAAAAAAAAbE/XoCiCSkTvTg/s1600-h/eclipse_autocomplete_13.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 170px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SkoFWbIaGiI/AAAAAAAAAbE/XoCiCSkTvTg/s320/eclipse_autocomplete_13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096989881539106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 12&lt;/h3&gt;&lt;br /&gt;Oh, here is text autoquoting, autoputting of semicolons... But it's NetBeans who helped me to save my time.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoF4ddtPGI/AAAAAAAAAdc/TDMlHYlu45w/s1600-h/nb_autocomplete_12.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SkoF4ddtPGI/AAAAAAAAAdc/TDMlHYlu45w/s320/nb_autocomplete_12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097574623296610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Eclipse 13&lt;/h3&gt;&lt;br /&gt;Wait... but there is src.zip with my JDK installation, it's full of javadocs! Why can't it just show me javadoc from there? Do I really need to go and download javadoc.zip in 21st century?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFWveq60I/AAAAAAAAAbM/viJdCEmbaLM/s1600-h/eclipse_autocomplete_14.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 194px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFWveq60I/AAAAAAAAAbM/viJdCEmbaLM/s320/eclipse_autocomplete_14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353096995343625026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;NetBeans 13&lt;/h3&gt;&lt;br /&gt;Here we go, it's not hard, is it?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoF4kIjT9I/AAAAAAAAAdk/yw-DPBTzTeo/s1600-h/nb_autocomplete_13.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 319px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SkoF4kIjT9I/AAAAAAAAAdk/yw-DPBTzTeo/s320/nb_autocomplete_13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097576413614034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Memory usage now&lt;/h2&gt;&lt;br /&gt;Memory usage after comparison above. And you will be next to say me that "native SWT is faster than interpreted Swing"? I'll write separate article about that myth.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFfU0jM9I/AAAAAAAAAb0/DfFinrNIh4I/s1600-h/memory_usage_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 25px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SkoFfU0jM9I/AAAAAAAAAb0/DfFinrNIh4I/s320/memory_usage_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353097142806459346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;br /&gt;"IDE" stands for integrated, but as naturally I expect my IDE to help me in my every day job. Help in this case stands for autoquoting, autosemicolons, simple and fast dialogs, and of course pretty and usable interface, that saves your time searching required items. Currently NetBeans is only IDE that really tries to help me as much as it can, though there are things to work on. And that makes me NetBeans user, not just big user base or Sun trademark.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-4005431388510778574?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=4005431388510778574' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4005431388510778574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4005431388510778574'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/06/eclipse-and-netbeans-compared_30.html' title='Eclipse and NetBeans compared'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_OCDMbx08eVU/SkoFH82j6LI/AAAAAAAAAZc/JFmUt74rDLk/s72-c/eclipse_about.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-997457687952103511</id><published>2009-05-27T13:57:00.002+03:00</published><updated>2009-05-27T14:00:31.870+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='other'/><title type='text'>Problem Silverlight: Micro$oft owns your computer</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;b&gt;Intro&lt;/b&gt;&lt;br /&gt;I am using official version of M$ Windows XP at work, and all the day yesterday I fought with it's updates. Yes, I am talking about Silverlight. I do not care about other possible updates as long as they have no impact on my work. But this one... "Why not?" you will ask... Well, I have few reasons.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. This computer is MINE!&lt;/b&gt;&lt;br /&gt;It installed without my approve. Just downloaded and made ready to install. And more, when I am checking box "Don't notify me about this updates again" it waits about 5 minutes, than downloads it again and installs it again. I can't cancel or forbid installation of this package. Just can't. I have no control over own operation system! I can put TABOO on any package on my SUSE Linux box, but I can't make Windows ignore this peace of "optional" crap.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/Sh0c64Zqw_I/AAAAAAAAATo/UE1Q4dcB9FY/s1600-h/screen42-cut.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 284px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/Sh0c64Zqw_I/AAAAAAAAATo/UE1Q4dcB9FY/s400/screen42-cut.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5340456531029312498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. User-agent of browsers&lt;/b&gt;&lt;br /&gt;When silverlight is installed - it changes user-agent string of web browser to include itself. M$ already changed user-agent of my Firefox to this one:&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;blockquote&gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; uk; rv:1.9) Gecko/2008052906 Firefox/3.0 (.NET CLR 3.5.30729)&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;What for? Someone is using those dirty techniques to determine silverlight or .NET installed on my machine? And why M$ hacks my browsers without my permission to do it? I can't agree with such politics.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Politics&lt;/b&gt;&lt;br /&gt;Development of Silverlight looks like politics solution from my point of view. If you can remember history of Netscape - you will see that M$ always releases own products of same kind after they're losing market. Market is totally occupied by Adobe with it's products and experience with graphical applications. M$ will easily take market back with such "optional" features as Silverlight.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Religion&lt;/b&gt;&lt;br /&gt;I am Java developer. And being Java developer I can see that no one believes in desktop java apps because of JRE on client's computer. Do you really think that JRE is harder to install than Flash Player? No it's not. But "everyone has a flash player, but no one has JRE installed" is already mature religion in most countries. So that will be my own religion - if something is written in silverlight - I don't need it with it's crappy silverlights.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-997457687952103511?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=997457687952103511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/997457687952103511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/997457687952103511'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/05/problem-silverlight-microoft-owns-your.html' title='Problem Silverlight: Micro$oft owns your computer'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_OCDMbx08eVU/Sh0c64Zqw_I/AAAAAAAAATo/UE1Q4dcB9FY/s72-c/screen42-cut.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-7765125581142253760</id><published>2009-05-07T11:45:00.003+03:00</published><updated>2009-05-07T11:47:31.121+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java and music player</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Today I found post on &lt;a href="http://elliotth.blogspot.com/2009/05/playing-mp3s-from-java.html"&gt;elliotth's blog&lt;/a&gt; about Java and MP3. Being developer of &lt;a href="http://www.xine-project.org/home"&gt;Xine&lt;/a&gt; engine for &lt;a href="http://www.atunes.org/"&gt;aTunes&lt;/a&gt; I have own thoughts about it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1: Target users&lt;/b&gt;&lt;br /&gt;At first you should decide who will be your users. Depending on this choice you have different amount of possibilities. For example, Qt Jambi with Phonon will fit for all systems, while Xine is not available for M$Windows users.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2: Engine&lt;/b&gt;&lt;br /&gt;Second part of music player is engine. I am long time &lt;a href="http://www.opensuse.org/"&gt;SUSE&lt;/a&gt; user and I prefer Xine over other because it ships with SUSE and all best &lt;a href="http://www.kde.org/"&gt;KDE&lt;/a&gt; apps are using it as engine. Also popular MPlayer, VLC and Gstreamer. Of course I hate Gstreamer because of strange format support politics and trashy sound, but it's your own choice.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 3: How to use engine&lt;/b&gt;&lt;br /&gt;After you decided what engine you want to use - there is a question how to use it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;a) JNI&lt;/b&gt;&lt;br /&gt;You can use some wrapper generator like &lt;a href="http://en.wikipedia.org/wiki/SWIG"&gt;SWIG&lt;/a&gt; to generate wrappers and use it from your application. While this is the fastest way to invoke engine - there are few possible problems:&lt;br /&gt;1. You have to build your application for all platforms yourself. It can be hard enough if you have no compilers for target platform and you have never used some of target platforms, or you have only 32bit CPU.&lt;br /&gt;2. Static vs dynamic linking. I am not C/C++ guru, but I noticed that some apps build on other systems than mine can't find libs from system folders like /usr/lib. It's easy to understand that there are some linking problems for target platform depending on libs path or libs versions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;b) JNA&lt;/b&gt;&lt;br /&gt;It's my favorite. &lt;a href="https://jna.dev.java.net/"&gt;JNA&lt;/a&gt; guys did a great job. They solved all possible problems in JNI approach, building jna.jar for all platforms and supporting dynamic linking. The only problem - mostly you have to read *.h files and write classes to wrap them. It is simple if you know a bit of C/C++.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;c) cmd line&lt;/b&gt;&lt;br /&gt;You always can invoke your engine from command line. MPlayer have it's own command line interface, so you can just send commands and read responses from Process stream. Also, Amarok supports commands like "amarok -s" to stop. May be your favorite player also does? Of course you should give user to choose path to your supported engine, while Linux platforms can be found in $PATH it will not work on M$Windows.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;d) Use Qt Jambi&lt;/b&gt;&lt;br /&gt;I already wrote about Qt Jambi. It's great solution for any desktop application, not just music player. And it have it's own media API, that can be found in examples. I suggest you to &lt;a href="http://www.qtsoftware.com/downloads"&gt;download&lt;/a&gt; and take a look yourself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;e) choose from existing wrappers&lt;/b&gt;&lt;br /&gt;Many engines have it's own wrappers already. Here are some of them:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://wiki.videolan.org/Java_bindings"&gt;VLC&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://libxine-java.ringwald.ch/"&gt;Xine&lt;/a&gt; have both JNI and JNA implementation (JNA is sound only)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/gstreamer-java/"&gt;Gstreamer&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.humatic.de/htools/dsj.htm"&gt;DirectShow&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-7765125581142253760?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=7765125581142253760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7765125581142253760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/7765125581142253760'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/05/java-and-music-player.html' title='Java and music player'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-172269116956330024</id><published>2009-03-06T13:03:00.008+02:00</published><updated>2010-01-16T11:20:49.678+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>Chaos Obliterators handmade</title><content type='html'>There are only two metal models of Obliterators on Games-Workshop. I really hate metal models. That's why I took Chaos Terminators box and pack of greenstuff to make my own obliterators.&lt;br /&gt;&lt;br /&gt;Obliterator-virus is technovirus by fluff, and I can't understand why original obliterators are covered with skin like some Nurglish followers. Skin should be visible in places of technology attachments as for me, but not to cover all the huge terminator armour.&lt;br /&gt;&lt;br /&gt;This guy got additional inputs into his brain, in addition to all his weapons in right arm and "power fist" made from terminator "possessed arm" and arm of possessed marine:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SbEDtDG_lnI/AAAAAAAAAQY/5hQZl955wEI/s1600-h/dsc_52241.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 297px; height: 320px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SbEDtDG_lnI/AAAAAAAAAQY/5hQZl955wEI/s320/dsc_52241.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5310029508110161522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Head of this guy is covered with small datacables, and he got servo arm somewhere. His "power fist" is a combination of terminator's shoulder and possessed arm to:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SbEDtoaLdcI/AAAAAAAAAQg/SsMGEsTVkao/s1600-h/dsc_52281.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 310px; height: 320px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SbEDtoaLdcI/AAAAAAAAAQg/SsMGEsTVkao/s320/dsc_52281.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5310029518122743234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once this guy was terminator, and got obliterator's bionic. Now he just can't get out of his terminator armour and have plenty of weapon to use:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_OCDMbx08eVU/SbEDsyDOn3I/AAAAAAAAAQQ/IYRnPamgrdg/s1600-h/dsc_52191.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 290px;" src="http://1.bp.blogspot.com/_OCDMbx08eVU/SbEDsyDOn3I/AAAAAAAAAQQ/IYRnPamgrdg/s320/dsc_52191.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5310029503530966898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-172269116956330024?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=172269116956330024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/172269116956330024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/172269116956330024'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/03/chaos-obliterators-handmade.html' title='Chaos Obliterators handmade'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_OCDMbx08eVU/SbEDtDG_lnI/AAAAAAAAAQY/5hQZl955wEI/s72-c/dsc_52241.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-5988660090332981055</id><published>2009-02-26T17:05:00.001+02:00</published><updated>2009-02-26T17:07:53.124+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='Qt'/><category scheme='http://www.blogger.com/atom/ns#' term='LookAndFeel'/><title type='text'>Qt Jambi first experience</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Being long time KDE user and Java developer - I couldn't ignore Qt Jambi release. Of course I downloaded it and tried as soon as version 1.0 vas released. Yes, at first it was version 1.0, built with Qt 4.3. Only after some time Jambi got version as its Qt.&lt;br /&gt;&lt;br /&gt;I was impressed even with first version, but it seemed a bit slow and not yet ready for every day usage. But last week there were some news about Qt 4.5 and LGPL license, so I downloaded last available version of Jambi and started few example apps.&lt;br /&gt;&lt;br /&gt;And now I am really impressed! I used to think about Swing as fast and developer-friendly when developing some desktop applications, but now I know Qt is really two heads higher in desktop apps development. Jambi evolved and now there is no problem of setting LD_LIBRARY_PATH and other params, you can simply include jar file with Qt and Jambi libs to your classpath.&lt;br /&gt;&lt;br /&gt;Then I started a bit bigger project to have complete application in Jambi. As long as there is no fast and stable notepads for Windows I wrote QEdit. You can see sources &lt;a href="http://code.google.com/p/heresylabs/source/browse/trunk/qedit/src/org/heresylabs/qedit/QEdit.java"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, after I have some first experience with Jambi I can compare Jambi and Swing:&lt;br /&gt;&lt;br /&gt;+ Jambi has better shortcuts system. You don't have to work with root panes and actionmaps, you can just ass some shortcut to your action.&lt;br /&gt;+ QStatusBar. I thought about writing something similar for Swing few month ago, but here you can assign statusTip to your action and that tip will appear in status bar on rollover.&lt;br /&gt;+ QSettings. It is much more usable than Properties for storing your settings.&lt;br /&gt;+ QToolBar. Even if it is possible to do something similar in Swing - you will never spend so much time to do it like Qt can. You can download and run QEdit to see how you can move toolbars to different parts of main window and this position will be saved between sessions.&lt;br /&gt;+ QFontDialog. Almost every Swing application have to implement Font Chooser themselves, while QFontDialog is almost the same in every application.&lt;br /&gt;+ Components already have their scrollbars, you can just enable or disable them. I can't remember at least one case when you don't need to wrap JTextArea into JScrollPane.&lt;br /&gt;+ Wide range of supported graphic formats and components adjust size of graphic automatically.&lt;br /&gt;- Jambi can't see if wrapped C++ classes extend some other classes.&lt;br /&gt;- Jambi QFile is very slow and locking file. I don't like when File object locks real file on file system, only io operation should block it. So don't try to use Qt Jambi for all your tasks at once.&lt;br /&gt;- No way to extend or customize QFileDialog. Even style is not applied to QFileDialog.&lt;br /&gt;- Signals in "action system"... It's just wrong in Java. Thanks that application fails on first start but not in time of invocation if something is wrong in source.&lt;br /&gt;- You can't give both small and large icon to QAction. After providing 22x22 icons some of them looks too smooth in main menu.&lt;br /&gt;- Lack of documentation. If you are not enough documentation and examples from Jambi distribution - even Google will not give you a lot.&lt;br /&gt;- Looks like all the work is performed in blocking QApplication.exec() method. I can't find is there anything like SwingWorker for Qt or Jambi...&lt;br /&gt;- There are lots of possible pitfalls when you are writing huge application, and Swing "experience base" is huge enough to help you in almost everything, plus Swing is pure Java where you can debug everything you want. But where to go with Jambi? There is support in Trolltech for commercial version...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-5988660090332981055?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=5988660090332981055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/5988660090332981055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/5988660090332981055'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/02/qt-jambi-first-experience.html' title='Qt Jambi first experience'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-1135947020402549967</id><published>2009-02-16T17:50:00.008+02:00</published><updated>2009-02-16T17:58:16.170+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java is faster than native</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;There is a myth that native is much faster than java. Lots of frameworks speculate this myth and using lots of native methods from java. But how often they are implementing same functionality and check native against true-java? They are often diving so deep in own fantasies about native performance that it is almost religion, they just don't accept facts. But how much it takes to JVM to invoke method from native library? And how much is it comparing to raw java interpretation?&lt;br /&gt;&lt;br /&gt;I don't like to use things that I don't understand. Almost all methods from Math class is native, and I can't see sources of that classes. There are some functions that would be hard to implement, like Math.sin() or Math.cos(), but there are some easy-to-implement methods. This time I need functionality of method Math.pow(). It is not hard to implement it in java:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:'courier new';"&gt;&lt;br /&gt;private double pow(double value, double pow) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;double result = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for (int i = 1; i &lt; pow; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result * value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;return result;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;And it is not hard to implement some raw test using case from current developed application:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:'courier new';"&gt;&lt;br /&gt;private static final int times = 1000000;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;// running test 10 times to "hotspot" it&lt;br /&gt;&amp;nbsp;&amp;nbsp;for (int i = 0; i &lt; 10; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// I know, I know, you can never &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// preallocate long, but I like it:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long start = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long end = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start = System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int j = 0; j &lt; times; j++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pow(10, 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end = System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("pow:  " + (end - start));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// cleaning JVM every time before next cycle:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.gc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.runFinalization();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.gc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start = System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int j = 0; j &lt; times; j++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Math.pow(10, 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end = System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("math: " + (end - start));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.gc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.runFinalization();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.gc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// and running once more to be sure in hotspot:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start = System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int j = 0; j &lt; times; j++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pow(10, 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end = System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("pow:  " + (end - start));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.gc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.runFinalization();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.gc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start = System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int j = 0; j &lt; times; j++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Math.pow(10, 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end = System.currentTimeMillis();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("math: " + (end - start));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.gc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.runFinalization();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.gc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I just wanted to figure out how slow is my implementation, but results were totally unexpected!&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:'courier new';"&gt;&lt;br /&gt;run-single:&lt;br /&gt;pow:  63&lt;br /&gt;math: 797&lt;br /&gt;pow:  78&lt;br /&gt;math: 797&lt;br /&gt;pow:  78&lt;br /&gt;math: 781&lt;br /&gt;pow:  78&lt;br /&gt;math: 781&lt;br /&gt;pow:  63&lt;br /&gt;math: 781&lt;br /&gt;pow:  63&lt;br /&gt;math: 781&lt;br /&gt;pow:  63&lt;br /&gt;math: 797&lt;br /&gt;pow:  63&lt;br /&gt;math: 797&lt;br /&gt;pow:  63&lt;br /&gt;math: 797&lt;br /&gt;pow:  63&lt;br /&gt;math: 782&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;It's 10 times faster than Math.pow() when raising power of 10!!&lt;br /&gt;&lt;br /&gt;Think different. Think faster!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-1135947020402549967?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=1135947020402549967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1135947020402549967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1135947020402549967'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/02/java-is-faster-than-native.html' title='Java is faster than native'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-4598698246511757856</id><published>2009-02-12T16:53:00.006+02:00</published><updated>2010-01-16T11:21:57.699+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer 40.000'/><title type='text'>Chaos Dreadnought conversion</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Games Workshop produces two kinds of kits - metal and plastic. I hate metal kits - it is hard to convert them, hard to keep them unbroken, hard to repair them if they're broken. And &lt;a href="http://www.games-workshop.com/gws/catalog/productDetail.jsp?catId=cat1300042&amp;prodId=prod1090270&amp;rootCatGameStyle="&gt;Chaos Dreadnought&lt;/a&gt; is metal model.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Modeling Plastic Chaos Dreadnought!&lt;/b&gt;&lt;br /&gt;All you need - &lt;a href="http://www.games-workshop.com/gws/catalog/productDetail.jsp?catId=cat1350002&amp;prodId=prod1080088&amp;rootCatGameStyle="&gt;Plastic Space Marines Dreadnought&lt;/a&gt;, few Terminator torso bits and few decorative chaos bits. And may be some greenstuff.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SZQ5PxkezRI/AAAAAAAAAKY/OTdv8W4XKfw/s1600-h/dsc_5182.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 252px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SZQ5PxkezRI/AAAAAAAAAKY/OTdv8W4XKfw/s320/dsc_5182.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5301925604489088274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SZQ5P27KDmI/AAAAAAAAAKQ/__5tvug_sAE/s1600-h/dsc_5178.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 269px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SZQ5P27KDmI/AAAAAAAAAKQ/__5tvug_sAE/s320/dsc_5178.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5301925605926375010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-4598698246511757856?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=4598698246511757856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4598698246511757856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/4598698246511757856'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2009/02/games-workshop-produces-two-kinds-of_12.html' title='Chaos Dreadnought conversion'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_OCDMbx08eVU/SZQ5PxkezRI/AAAAAAAAAKY/OTdv8W4XKfw/s72-c/dsc_5182.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-578259426622703030</id><published>2008-11-07T13:26:00.006+02:00</published><updated>2008-11-07T13:48:04.948+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><title type='text'>Swing and TreeTable component</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;div align="left"&gt;&lt;br /&gt;TreeTable combines functionality of two components - Tree and Table. And it is really comfortable to show some hierarchical information like file system structure or many others.&lt;br /&gt;TreeTable have great Qt implementation, it's fast, useful and pretty. It's a pity there is no standard Swing implementation of this component. But there are lots of third-party implementations. Let’s review them:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;b&gt;JEdit&lt;/b&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;JEdit uses TreeTable component for Open-Save dialog. It is extremely fast and pretty. But they did it for their own, with package-private constructor and double-linked to other JEdit components. To use it in other projects means to rewrite it almost from scratch, so JEdit is just a good demo of TreeTable possibilities for Swing.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OCDMbx08eVU/SRQpLI7hkKI/AAAAAAAAAF8/4lGJ2Yd5ptY/s1600-h/jedit-treetable.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 258px;" src="http://4.bp.blogspot.com/_OCDMbx08eVU/SRQpLI7hkKI/AAAAAAAAAF8/4lGJ2Yd5ptY/s320/jedit-treetable.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5265879135655399586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;b&gt;SwingX&lt;/b&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;a href="http://swinglabs.org/"&gt;SwingLabs&lt;/a&gt; has their implementation. It is feature-rich and customizable. But it has some rendering bugs, much slower than JEdit version, amount of code is too big to extend it yourself and it linked a lot to other SwingX packages.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_OCDMbx08eVU/SRQpLtkFjNI/AAAAAAAAAGU/In8PaFjv9II/s1600-h/swingx-treetable.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 319px;" src="http://2.bp.blogspot.com/_OCDMbx08eVU/SRQpLtkFjNI/AAAAAAAAAGU/In8PaFjv9II/s320/swingx-treetable.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5265879145489206482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;b&gt;NetBeans&lt;/b&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;a href="http://weblogs.java.net/blog/timboudreau/archive/2008/06/egads_an_actual.html"&gt;As Tim Boudreau told us&lt;/a&gt;, NetBeans only recently got a good implementation of TreeTable. And this implementation looks great! It works almost as fast as JEdit one, has no rendering bugs, needs only few classes to build it (but not all the framework as previous two implementations) and it's easy to use and customize. But one more problem - you may use it only under either GPL2 or CDDL, and you need to download NetBeans sources and copy org.netbeans.swing.outline package to your project to use it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_OCDMbx08eVU/SRQpLSHbqDI/AAAAAAAAAGI/USxDnYw1YOg/s1600-h/netbeans-treetable.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 257px;" src="http://3.bp.blogspot.com/_OCDMbx08eVU/SRQpLSHbqDI/AAAAAAAAAGI/USxDnYw1YOg/s320/netbeans-treetable.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5265879138121263154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All of them extends JTable. I think it's not good, JTable is the biggest class I have ever seen, about 9000 lines of code, and SwingX implementation adds another 4000 lines. It is hard to debug and hard to customize to internals. Swing is so big because backward compatibility, but what sense of JTable compatibility for totally new component? How do you think, may be it is time to write Tree, Table and TreeTable LGPL implementation by ourselves using best practices from core swing, SwingX, JEdit and NetBeans?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-578259426622703030?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=578259426622703030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/578259426622703030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/578259426622703030'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/11/swing-and-treetable-component.html' title='Swing and TreeTable component'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_OCDMbx08eVU/SRQpLI7hkKI/AAAAAAAAAF8/4lGJ2Yd5ptY/s72-c/jedit-treetable.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-3930172631973023504</id><published>2008-10-07T13:46:00.002+03:00</published><updated>2008-10-07T13:57:31.731+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Comparing two collections</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;There is standard task when you have GUI table and database table, and you need to merge differences.&lt;br /&gt;Most of people I know will do it like this:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Set source; // set of records from UI&lt;br /&gt;Set target; // set of records in database&lt;br /&gt;for (Object o : source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// if we have object in source without &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// same object in target - it was added by user:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!target.contains(o)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target.add(o);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;Iterator iterator = target.iterator();&lt;br /&gt;while (iterator.hasNext()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object o = iterator.next();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// if we have object in target without &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// same object in source - it was removed by user:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!source.contains(o)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iterator.remove();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;We have 2 full collection iterations. In most cases it will not cause big performance issue. But it looks bad and will cause performance problems with slow Collection implementations or with big amounts of data.&lt;br /&gt;&lt;br /&gt;After using my brain few minutes I found the best way of comparing, with only one iteration:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Set source; // set of records from UI&lt;br /&gt;Set target; // set of records in database&lt;br /&gt;// just checking:&lt;br /&gt;if (target.equals(source)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;}&lt;br /&gt;Iterator iterator = target.iterator();&lt;br /&gt;while (iterator.hasNext()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object o = iterator.next();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (source.contains(o)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// remove all checked objects for future&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;source.remove(o);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// if source does not contains object - &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// it was removed by user, removing it from target:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iterator.remove();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;// all object left in source are added by user. &lt;br /&gt;// Adding them to target:&lt;br /&gt;target.addAll(source);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;Simple enough, isn't it?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-3930172631973023504?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=3930172631973023504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3930172631973023504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3930172631973023504'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/10/comparing-two-collections.html' title='Comparing two collections'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-8422091703782481335</id><published>2008-08-15T11:12:00.000+03:00</published><updated>2008-08-15T11:13:44.400+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><title type='text'>KDE for Windows</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;KDE 4.1 is here, and &lt;a href="http://windows.kde.org/"&gt;windows.kde.org&lt;/a&gt; packed it for Win32 already. As long as there are lots of useful apps in KDE without good win32 alternatives - I installed it on my working XP machine.&lt;br /&gt;&lt;br /&gt;While Amarok is still in deep alpha - I couldn't start it. But there are two apps I can't live without - KWrite and Kompare. Both of them have great user interface, and gives you all advanced possibilities you can imagine. There is no other free editor to support about 90 different source file types and full encoding support, with possibility to open file with one encoding and to save with any other. There is no good file comparition program with such pretty and usable interface as Kompare. If you are interested - give it a try!&lt;br /&gt;&lt;br /&gt;I am still waiting for Krusader and Okular, but my life under windows is already much simpler.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-8422091703782481335?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=8422091703782481335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8422091703782481335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8422091703782481335'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/08/kde-for-windows.html' title='KDE for Windows'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-8692366065491507158</id><published>2008-08-15T11:08:00.001+03:00</published><updated>2008-08-15T11:10:15.493+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='other'/><title type='text'>Security circus</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;In big outsourcing offices there are lots of security policies, and most of them are stupid enough. Don't you think so?&lt;br /&gt;&lt;br /&gt;On my current job there is policy to change passwords every 3 weeks. What for? My first password was something like "R00mpel$htit$hen", while all the next password are "Anykey1", "Anykey2", ..., "AnykeyN". Same for all guys in my team. So, is office security much stronger now?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-8692366065491507158?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=8692366065491507158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8692366065491507158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8692366065491507158'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/08/security-circus.html' title='Security circus'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-904374276916200393</id><published>2008-08-05T17:30:00.004+03:00</published><updated>2008-08-05T17:39:18.627+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java5 forever or Codename: No Future</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Java6 exists almost two years now, and Java5 &lt;a href="http://java.sun.com/javase/downloads/index_jdk5.jsp"&gt;"is in its Java Technology End of Life (EOL) transition period"&lt;/a&gt;. While I admire people, using top versions of Sun's Java, there are lots of folks, who are still using Java5. All of them have different reasons: someone just don't want to bother saying "Why should I?", someone have some strange compatibility or porting problems. Someone saying about business, about cost of migrating from Java5 to Java6.&lt;br /&gt;&lt;br /&gt;But how long your project will exist on Java5? Year or two? You spent your money on your project, do you really want to join it's lifetime with Java5 lifetime?&lt;br /&gt;&lt;br /&gt;Let me explain. You have project, you have &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;N&lt;/span&gt;&lt;span style="font-family:arial;"&gt; services and &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;X&lt;/span&gt;&lt;span style="font-family:arial;"&gt; users. If your organization has no evolution - everything is just fine. But if your project grows - you have &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;N = N + 1&lt;/span&gt;&lt;span style="font-family:arial;"&gt; services and &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;X = X + 50&lt;/span&gt;&lt;span style="font-family:arial;"&gt; users each half-year. Once your current hardware will not be enough, you will move to better hardware. On better hardware you will have new operating system that supports all your hardware (for example, Windows 2003 Server supports only 4 CPUs/CPU kernels). And what if there will be no Java5 for that operating system? Sun is not supporting Java3, Java4 and soon Java5 anymore, who will care about your problems and your needs? Red Hat? Or Microsoft? Currently, &lt;a href="http://java.sun.com/j2se/1.3/download.html"&gt;there is even no possibility to download Java3 directly from Sun&lt;/a&gt;, or &lt;a href="http://java.sun.com/j2se/1.4.2/download.html"&gt;there is no Java4 for x86_64 platform&lt;/a&gt;. Do you want to make your business on zombie products?&lt;br /&gt;&lt;br /&gt;Sun gives you the best platform of our times. Sun gives you standards, public APIs, open and flexible platform. Sun gives you own implementation of it's platform, saying there are lots of them around. Sun also guarantee backward compatibility (Java4-Java5 is another step, I am talking only about Java5-Java6 now), and only possible compatibility problem - usage of sun.** API. But even here Sun gave you compiler warning: "sun.** is Sun proprietary API and may be removed in a future release", and it's some king of &lt;a href="http://en.wikipedia.org/wiki/Mental_retardation#Signs"&gt;mental retardation&lt;/a&gt; to ignore warnings like this.&lt;br /&gt;&lt;br /&gt;So, as for me - if you can't move from Java5 to Java6 - your project is dead, and you is guilty in its death, no matter how long will it take to make it smell like old corpse.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-904374276916200393?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=904374276916200393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/904374276916200393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/904374276916200393'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/08/java5-forever-or-codename-no-future.html' title='Java5 forever or Codename: No Future'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-3775528529937667368</id><published>2008-07-16T20:01:00.016+03:00</published><updated>2008-07-16T21:30:20.380+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='SUSE'/><title type='text'>KTorrent vs Anti-Cheater</title><content type='html'>&lt;span style="font-family:arial;"&gt;After updating to SUSE 11.0 torrent client for KDE updated from KTorrent 2.2.1 to KTorrent 3.0.x. But on my favourite tracker I receive "Anti-Cheater: You cannot use this agent" as status message while using KTorrent 3. I installed KTorrent 3.1 - and get same message. But after installing back 2.2.x - everything works fine. So, problem is User-Agent string. It is not very hard to search over KTorrent sources and modify it a bit to change User-Agent string. I already mentioned &lt;a href="http://www.novell.com/coolsolutions/feature/11793.html"&gt;great tutorial about rpm building&lt;/a&gt;, and this time it saved me again...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Get the source&lt;/b&gt;&lt;br /&gt;&lt;a href="http://download.opensuse.org/repositories/KDE:/KDE4:/Factory:/Desktop/openSUSE_11.0/src/ktorrent-3.1.1-2.4.src.rpm"&gt;Download the src.rpm file&lt;/a&gt; and unpack it. I am using mc to navigate into src.rpm and copy all files from there to &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;/home/to_build/src/ktorrent&lt;/span&gt;&lt;span style="font-family:arial;"&gt; folder.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Diff to change user-agent&lt;/b&gt;&lt;br /&gt;You can add diff to any spec file to apply it before build. It is much better than modify and pack sources back. So, &lt;a href="http://heresylabs.googlecode.com/files/user-agent.diff"&gt;here is my diff to change KTorrent 3.1 User-Agent string from "KTorrent + version" to plain "KTorrent"&lt;/a&gt;. Now just save it in same folder (&lt;span style="font-family:courier new;"&gt;"/home/to_build/src/ktorrent"&lt;/span&gt;&lt;span style="font-family:arial;"&gt; for me).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Modify spec file&lt;/b&gt;&lt;br /&gt;Now only few modifications to spec file and time to start building:&lt;br /&gt;Add this lines:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;Patch10:        user-agent.diff&lt;br /&gt;%patch10&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;It is easy enough to find where to insert it, there are already few patches applyed.&lt;br /&gt;&lt;br /&gt;And now, to enable blocked by SUSE trackers, comment this two lines:&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;#Patch2:         remove-links.diff&lt;br /&gt;#%patch2&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Now just build and use your favourite torrent-client with your favourite tracker!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-3775528529937667368?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=3775528529937667368' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3775528529937667368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3775528529937667368'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/07/ktorrent-vs-anti-cheater.html' title='KTorrent vs Anti-Cheater'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-6330231751621305137</id><published>2008-06-27T10:35:00.001+03:00</published><updated>2008-06-27T11:01:16.432+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='SUSE'/><title type='text'>SUSE 11.0 handmade</title><content type='html'>&lt;span style="font-family:arial;"&gt;SUSE 11.0 released about a week ago. As few previous versions, there is lack of proprietary multimedia formats support. And there is few ways to resolve it. First, most common way - to add &lt;a href="http://packman.links2linux.org/"&gt;packman&lt;/a&gt; repository and install everything from there, and to find other repositories for freetype2 and few other packages. But I don't like this way. SUSE team did a great job with packages and integration, downloaded from other sources packages rarely have this level of integration. My way - to take official SUSE src.rpm packages from &lt;a href="http://download.opensuse.org/distribution/11.0/repo/src-oss/"&gt;official source repositories&lt;/a&gt;, and build it with &lt;a href="http://en.opensuse.org/SUSE_Build_Tutorial"&gt;SUSE build tools&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Preparing:&lt;/b&gt;&lt;br /&gt;There is a &lt;a href="http://www.novell.com/coolsolutions/feature/11793.html"&gt;great tutorial&lt;/a&gt; about "build", it will introduce build procedure for you. It will prepare you for reading this article.&lt;br /&gt;Also, there is some packages from internet repository you will need. I don't know why aren't they on DVD. You can store them to folder of provided packages, "/home/to_build/provided" for me. I got them from &lt;a href="http://download.opensuse.org/distribution/11.0/repo/oss/suse/x86_64/"&gt;x86_64&lt;/a&gt; repository, and &lt;a href="http://download.videolan.org/pub/vlc/SuSE/11.0/x86_64/"&gt;videolan&lt;/a&gt; repository for libmad and libdvdcss.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;avahi-lang-0.6.22-68.1.x86_64.rpm&lt;br /&gt;flac-devel-1.2.1-43.1.x86_64.rpm&lt;br /&gt;gconf2-lang-2.22.0-28.1.x86_64.rpm&lt;br /&gt;gnome-vfs2-lang-2.22.0-33.1.x86_64.rpm&lt;br /&gt;gstreamer-0_10-lang-0.10.19-16.1.x86_64.rpm&lt;br /&gt;gstreamer-0_10-plugins-base-lang-0.10.19-24.1.x86_64.rpm&lt;br /&gt;libbonobo-lang-2.22.0-21.1.x86_64.rpm&lt;br /&gt;libcdio++0-0.80-3.1.x86_64.rpm&lt;br /&gt;libcdio-devel-0.80-3.1.x86_64.rpm&lt;br /&gt;libdvdcss-1.2.9-5.1.x86_64.rpm&lt;br /&gt;libgnutls-devel-2.2.2-17.1.x86_64.rpm&lt;br /&gt;libiso9660-5-0.80-3.1.x86_64.rpm&lt;br /&gt;libmad-0.15.1b-5.1.x86_64.rpm&lt;br /&gt;libmad-devel-0.15.1b-5.1.x86_64.rpm&lt;br /&gt;libtheora-devel-1.0.beta2-3.1.x86_64.rpm&lt;br /&gt;libudf0-0.80-3.1.x86_64.rpm&lt;br /&gt;speex-devel-1.1.99.3-28.1.x86_64.rpm&lt;br /&gt;vcdimager-0.7.23-132.1.x86_64.rpm&lt;br /&gt;vcdimager-devel-0.7.23-132.1.x86_64.rpm&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;Step One - xine&lt;/b&gt;&lt;br /&gt;The most important multimedia part of SUSE distro - &lt;a href="http://xinehq.de/"&gt;xine engine&lt;/a&gt;. Let's build it first.&lt;br /&gt;1. Download &lt;a href="http://download.opensuse.org/distribution/11.0/repo/src-oss/suse/src/xine-lib-1.1.12-8.1.src.rpm"&gt;xine-lib-1.1.12-8.1.src.rpm&lt;/a&gt; from SUSE repositories and unpack it to some (target) folder.&lt;br /&gt;2. Remove xine-lib-1.1.12-crippled.tar.bz2 from target folder.&lt;br /&gt;3. Download &lt;a href="http://prdownloads.sourceforge.net/xine/xine-lib-1.1.12.tar.bz2"&gt;xine-lib-1.1.12.tar.bz2&lt;/a&gt; from official sourceforge website and save it to target folder.&lt;br /&gt;4. Open xine-lib.spec with your favourite editor.&lt;br /&gt;5. Change line like this:&lt;br /&gt;from &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"%define BUILD_XINE %{?_with_internal:2}%{!?_with_internal:%build_xine_default}"&lt;/span&gt;&lt;span style="font-family:arial;"&gt; to &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"%define BUILD_XINE 2"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;.&lt;br /&gt;6. Set Release to "Release: 8.1.1" - it will with pleasure override already installed xine.&lt;br /&gt;7. Modify source declaration from crippled:&lt;br /&gt;from:&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Source:         xine-lib-%version-crippled.tar.bz2&lt;br /&gt;%if 0&lt;br /&gt;Source:         xine-lib-%version.tar.bz2&lt;br /&gt;%endif&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;to:&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Source:         xine-lib-%version.tar.bz2&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;8. Find and comment each of lines to let sources be uncrippled:&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Source99:       precheckin_cripple_tarball.sh&lt;br /&gt;Patch70:        xine-lib-crippled-LOCAL.diff&lt;br /&gt;%patch70&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;9. Also, change all &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"mad"&lt;/span&gt;&lt;span style="font-family:arial;"&gt; and &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"mad-devel"&lt;/span&gt;&lt;span style="font-family:arial;"&gt; dependencies to &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"libmad"&lt;/span&gt;&lt;span style="font-family:arial;"&gt; and &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"libmad-devel"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;.&lt;br /&gt;10. just build it:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;build --root /home/to_build/root --rpms /home/to_build/provided xine-lib.spec&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;11. Take your packages from &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"/home/to_build/root/usr/src/packages/RPMS/&lt;arch&gt;"&lt;/arch&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:arial;"&gt;&lt;arch&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step Two - Kaffeine&lt;/b&gt;&lt;br /&gt;Kaffeine is best front-end for xine ever-made. Let's build it with DVD support!&lt;br /&gt;1. Download &lt;a href="http://download.opensuse.org/distribution/11.0/repo/src-oss/suse/src/kaffeine-0.8.6-54.1.src.rpm"&gt;kaffeine-0.8.6-54.1.src.rpm&lt;/a&gt; and unpack it.&lt;br /&gt;2. Comment each of this lines:&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Patch0:         %name.diff&lt;br /&gt;Patch2:         messagebox-dvd.diff&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;3. Build it. I got small problem with some locale files, so you can just add locale files after icons packaging:&lt;br /&gt;from:&lt;/span&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/opt/kde3/share/appl*/*/*&lt;br /&gt;/opt/kde3/share/apps/kaffeine&lt;br /&gt;/opt/kde3/share/apps/konqueror&lt;br /&gt;/opt/kde3/share/apps/profiles&lt;br /&gt;/opt/kde3/share/icons/*&lt;br /&gt;/opt/kde3/share/mimelnk/*/*.desktop&lt;/span&gt;&lt;/blockquote&gt;to:&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/opt/kde3/share/appl*/*/*&lt;br /&gt;/opt/kde3/share/apps/kaffeine&lt;br /&gt;/opt/kde3/share/apps/konqueror&lt;br /&gt;/opt/kde3/share/apps/profiles&lt;br /&gt;/opt/kde3/share/icons/*&lt;br /&gt;/opt/kde3/share/locale/*/*/*&lt;br /&gt;/opt/kde3/share/mimelnk/*/*.desktop&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;b&gt;Step Three - FreeType2&lt;/b&gt;&lt;br /&gt;There is no subpixel font smoothing in SUSE, so it will be useful for LCD owners.&lt;br /&gt;1. Download &lt;a href="http://download.opensuse.org/distribution/11.0/repo/src-oss/suse/src/freetype2-2.3.5-62.1.src.rpm"&gt;freetype2-2.3.5-62.1.src.rpm&lt;/a&gt; from SUSE repository and unpack it, for example into "/home/to_build/src/freetype".&lt;br /&gt;2. Download &lt;a href="http://download.savannah.gnu.org/releases/freetype/freetype-2.3.5.tar.bz2"&gt;full FreeType2&lt;/a&gt; from official website into same folder ("/home/to_build/src/freetype"), replacing old one.&lt;br /&gt;3. Change two blocks:&lt;br /&gt;from&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;Source0:        http://download.savannah.gnu.org/releases/freetype/freetype-%{version}.tar.bz2&lt;br /&gt;Source1:        http://download.savannah.gnu.org/releases/freetype/freetype-doc-%{version}.tar.bz2&lt;/span&gt;&lt;/blockquote&gt;to&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;Source0:        freetype-%{version}.tar.bz2&lt;br /&gt;Source1:        freetype-doc-%{version}.tar.bz2&lt;/span&gt;&lt;/blockquote&gt;and from&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;%define enable_subpixel_rendering 0%{?opensuse_bs}&lt;/span&gt;&lt;/blockquote&gt;to&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;%define enable_subpixel_rendering 1&lt;/span&gt;&lt;/blockquote&gt;4. Just build it and install packages from same folder - &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;arch&gt;"/home/to_build/root/usr/src/packages/RPMS/&lt;arch&gt;"&lt;/arch&gt;&lt;/arch&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:arial;"&gt;&lt;arch&gt;&lt;span style="font-family:arial;"&gt;&lt;arch&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;That is all!&lt;/b&gt; Now you have your SUSE good as new, without less integrated third-party packages and without crippled multimedia. It's time to install &lt;a href="http://packman.links2linux.org/package/Win32-Codecs"&gt;win32 codecs from packman&lt;/a&gt; and &lt;a href="http://download.videolan.org/pub/vlc/SuSE/11.0/x86_64/"&gt;libdvdcss from videolan&lt;/a&gt; before first kaffeine launch, install amarok-xine and remove buggy amarok-yauap plugin.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-6330231751621305137?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=6330231751621305137' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/6330231751621305137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/6330231751621305137'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/06/suse-110-handmade.html' title='SUSE 11.0 handmade'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-3122881058728779980</id><published>2008-06-24T15:23:00.004+03:00</published><updated>2008-06-24T16:04:11.458+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='SUSE'/><title type='text'>SUSE 11.0 first impression</title><content type='html'>&lt;span style="font-family:arial;"&gt;Yesterday I have installed new SUSE 11.0 linux at home. Impressions are very ambiguous...&lt;br /&gt;&lt;br /&gt;1. Package manager works great! Starting from SUSE 10.0 it was slower and slower, scanning repositories for minutes, than hours, checking depencencies, updating indexes and doing lots of interesting, but totally unusable staff. New package manager in 11.0 is faster than light! Adding huge repositories takes less than second, depencency checks are done faster than you can even notice!&lt;br /&gt;Second great improvement for package manager - much better dependencies lists. I hate mono, banshee and other dotnet staff, I totally disregard it. But in SUSE 10.1 and 10.2 I HAD TO install mono just because of some yast pattern. That time I even downloaded few distros to look for SUSE replacement. Why, the Hell, I need software patterns for package manager if there are plain dependencies with straight structure?! But now I am totally happy - no mono, no beagle, no banshee, no gtk-sharps and other crap in my fresh system.&lt;br /&gt;&lt;br /&gt;2. Older SUSEs with first boot after installing loaded yast to configure different devices, network and graphics. This did not. It was very hard to read fonts with default screen resolution (1280x1024), while installer worked with 1024x768.&lt;br /&gt;&lt;br /&gt;3. Selection of KDE version is very hard. KDE 4.0.4 is very interesting, giving great fast new desktop experience. While there are some leaks: 1) I am not extreme enough to use PIM from unstable 4.1 sources; 2) Alt+Tab hangs sometimes when you have few windows from other users; 3) there is no printer configuration in KDE control center now, and YaST module changed from 10.2 and can't configure it for some reason... So, clicking few hours in KDE4 is great, but I'll wait a month for 4.1 to arrive.&lt;br /&gt;&lt;br /&gt;4. It is hard to choose all programs from one of KDE desktops. &lt;a href="http://ktorrent.org/"&gt;KTorrent&lt;/a&gt; is KDE4 by default, KGet in KDE4 is totally great. But &lt;a href="http://enzosworld.gmxhome.de/"&gt;Dolphin&lt;/a&gt; will never move &lt;a href="http://krusader.org/"&gt;Krusader&lt;/a&gt; away, &lt;a href="http://k3b.plainblack.com/"&gt;K3b&lt;/a&gt; and &lt;a href="http://amarok.kde.org/"&gt;Amarok&lt;/a&gt; still not ported to KDE4, &lt;a href="http://gwenview.sourceforge.net/"&gt;Gwenview&lt;/a&gt; of KDE4 differs too much from original KDE3 version, and older is much more usable.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-3122881058728779980?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=3122881058728779980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3122881058728779980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3122881058728779980'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/06/suse-110-first-impression.html' title='SUSE 11.0 first impression'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-472225078025228809</id><published>2008-06-19T21:08:00.003+03:00</published><updated>2008-06-19T22:24:58.707+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Warhammer'/><category scheme='http://www.blogger.com/atom/ns#' term='fantasy'/><title type='text'>No horses for Nurgle forces</title><content type='html'>&lt;span style="font-family:arial;"&gt;There are four major Chaos Gods in &lt;a href="http://en.wikipedia.org/wiki/Warhammer_Fantasy_(setting)"&gt;Warhammer&lt;/a&gt;. Each of them has it's own main idea. And each of them differs so much from others, that it's hard enough to put all of them to one army. But the most separated from others is &lt;a href="http://en.wikipedia.org/wiki/Nurgle"&gt;Nurgle&lt;/a&gt;.&lt;br/&gt;&lt;br /&gt;Khorne means rage, blood. It is not hard to give horses or other mounts to bloody berserkers. Tzeentch is hope - he is bad only because he is opposite to imperium or Emperor, so he can do everything. Slaanesh is pleasure - nothing evil, just pleasure. But Nurgle is decay. How many animals will accept decay? How many possibilities decay have? Medieval horses were scared by smell of camels, what can we say about Nurgle warriors? Griffins, dragons - who will take decayed champion close to himself? The only way to get horses or other mounts for Nurgle warriors - put decay deep in their minds and bodies. Small job for major Chaos God, but almost impossible for his cults. Only humanity is decayed enough to accept Nurgle without compromises. &lt;a href="http://uk.games-workshop.com/hordesofchaos/wallpapers/images/wp08-800x600.jpg"&gt;This guys&lt;/a&gt; far from "grean peace", in spite of being green to.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-472225078025228809?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=472225078025228809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/472225078025228809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/472225078025228809'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/06/no-horses-for-nurgle-forces.html' title='No horses for Nurgle forces'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-1899241568840346654</id><published>2008-05-21T08:21:00.008+03:00</published><updated>2008-05-21T09:12:56.600+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='LookAndFeel'/><title type='text'>LookAndFeel chooser</title><content type='html'>You will not dispute that modern desktop application needs some theming, right? And, being Swing developer, few times you tried to solve this problem, didn't you?..&lt;br /&gt;&lt;br /&gt;I have solution now: &lt;a href="http://code.google.com/p/heresylabs/wiki/JLAFChooser"&gt;JLAFChooser&lt;/a&gt;.&lt;br /&gt;Now, you can just put JLAFChooser component into your setting dialog, and it will make LookAndFeel chosing possible in runtime. Now you have no need to hardcode all the LookAndFeels you know into your classes or XML files, and user can just download few LookAndFeels and put it somewhere in classpath to make it available to JVM.&lt;br /&gt;&lt;br /&gt;It has two main variants: when Apply is allowed and when not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;When Apply is allowed&lt;/span&gt; your user can choose something from list and check it at once, and may be choose something else.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://heresylabs.googlecode.com/files/jlafchooser2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px;" src="http://heresylabs.googlecode.com/files/jlafchooser2.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;When Apply IS NOT allowed&lt;/span&gt; you can just show list of possible LookAndFeels, and save somewhere to preferences user selection, to apply it next startup.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://heresylabs.googlecode.com/files/jlafchooser3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px;" src="http://heresylabs.googlecode.com/files/jlafchooser3.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Usage is similar to JColorChooser, with few extensions - you can get LookAndFeel instance, it's name or it's class name. Methods to apply and restore LookAndFeel are public, you may use them for your controls.&lt;br /&gt;&lt;br /&gt;PS: feel free to mail me for suggestions, bugs, or just to talk about Java, Swing, religion, fantasy or anything...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-1899241568840346654?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=1899241568840346654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1899241568840346654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/1899241568840346654'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/05/lookandfeel-chooser.html' title='LookAndFeel chooser'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-3479256205244157727</id><published>2008-05-10T09:27:00.013+03:00</published><updated>2008-05-10T10:46:26.710+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>current KDE version determination</title><content type='html'>I have a problem. KDE4 is comming, and I need to determine current running version from Java application. Do you know how?&lt;br /&gt;&lt;br /&gt;After some investigations I found few ways. KDE is setting it's own env variables. For KDE3:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;KDE_FULL_SESSION=true&lt;br /&gt;DESKTOP_SESSION=kde&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;For KDE4:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;DESKTOP_SESSION=kde4&lt;br /&gt;KDE_SESSION_VERSION=4&lt;br /&gt;KDE_FULL_SESSION=true&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;But it works only for SUSE, Kubuntu have only KDE_SESSION_VERSION=4 and KDE_FULL_SESSION=true. And this is only for 8.04 KDE4 release of Kubuntu, there was no such flags in 8.04beta. So, determination is simple:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public static boolean isKDERunning() {&lt;br /&gt;  return "true".equals(System.getenv("KDE_FULL_SESSION"));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static boolean isKDE4Running() {&lt;br /&gt;  if (!isKDERunning()) {&lt;br /&gt;    throw new IllegalStateException("KDE is not running");&lt;br /&gt;  }&lt;br /&gt;  return "4".equals(System.getenv("KDE_SESSION_VERSION")) ||&lt;br /&gt;    "kde4".equals(System.getenv("DESKTOP_SESSION"));&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;If you feel paranoid and want to get 100% result it will be better to run Konsole (konsole --version) and parse output. Output for different versions looks like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;konsole --version&lt;br /&gt;Qt: 3.3.8&lt;br /&gt;KDE: 3.5.7 "release 72"&lt;br /&gt;Konsole: 1.6.6&lt;br /&gt;&lt;br /&gt;/usr/bin/konsole --version&lt;br /&gt;Qt: 4.3.4&lt;br /&gt;KDE: 4.0.3 (KDE 4.0.3) "release 9.1"&lt;br /&gt;Konsole: 2.0&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So, parsing code:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;b&gt;public static boolean isKDE4Version() throws Exception {&lt;br /&gt;  Process process = Runtime.getRuntime().exec("konsole --version");&lt;br /&gt;  InputStream in = process.getInputStream();&lt;br /&gt;  byte[] buffer = new byte[32];&lt;br /&gt;  ByteArrayOutputStream out = new ByteArrayOutputStream();&lt;br /&gt;  int read = 0;&lt;br /&gt;  while ((read = in.read(buffer)) &gt;= 0) {&lt;br /&gt;    out.write(buffer, 0, read);&lt;br /&gt;  }&lt;br /&gt;  String output = out.toString();&lt;br /&gt;  int indexOfKde = output.indexOf("KDE:");&lt;br /&gt;  if (indexOfKde &gt;= 0) {&lt;br /&gt;    char v = output.charAt(indexOfKde + 5);&lt;br /&gt;    return '4' == v;&lt;br /&gt;  }&lt;br /&gt;  throw new IllegalStateException("KDE version information not found");&lt;br /&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;And don't fear performance issues - on my Athlon X2 6000+ this operation takes only 26 millis!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-3479256205244157727?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=3479256205244157727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3479256205244157727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3479256205244157727'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/05/current-kde-version-determination.html' title='current KDE version determination'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-2879348971678691779</id><published>2008-04-04T13:26:00.009+03:00</published><updated>2008-04-10T11:51:10.430+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>life before KDE 4.1</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Lots of Linux distros will release major versions before KDE 4.1 will arrive. What for? May be better to still use KDE 3.5.x?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Software_versioning#Numeric"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;according to Wikipedia:&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;In principle, in subsequent releases, the major number is increased when there are significant jumps in functionality, the minor number is incremented when only minor features or significant fixes have been added, and the revision number is incremented when minor bugs are fixed.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;br /&gt;again, &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/KDE4"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;according to Wikipedia:&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;KDE 4.0 was released on January 11, 2008. Despite being a stable release, it is intended for early adopters.&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/KDE4#cite_note-21"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;[22]&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt; Users wanting a stable, "feature complete" desktop may wish to continue using KDE 3.5 for now.[&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/KDE4#cite_note-22"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;23]&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;&lt;br /&gt;&lt;br /&gt;Kubuntu will be released this month with KDE 4.0, Mandriva was released with KDE 4.0.2, and SUSE &lt;/span&gt;&lt;a href="http://en.opensuse.org/Roadmap"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;will be released&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt; just few days before &lt;/span&gt;&lt;a href="http://techbase.kde.org/index.php?title=Schedules/KDE4/4.1_Release_Schedule"&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;KDE 4.1 will arrive&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: arial;"&gt;, with latest KDE 4.0.x on board.&lt;br /&gt;&lt;br /&gt;I am not against releasing. I am just afraid of possible low quality of KDE 4.1 from update centers...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-2879348971678691779?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=2879348971678691779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/2879348971678691779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/2879348971678691779'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/04/life-before-kde-41.html' title='life before KDE 4.1'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-8704876995583809344</id><published>2008-04-02T13:22:00.006+03:00</published><updated>2008-04-02T13:34:37.384+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='other'/><title type='text'>Do you like April 1?</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial;"&gt;Day of no-news. Every site see their duty to publish some "jokes". What for? Most of them are not funny nor interesting. Titles are the same as everyday yellow press. The only really interesting joke i noticed is &lt;a href="http://weblogs.java.net/blog/fabriziogiudici/archive/2008/04/i_must_admit_ec.html"&gt;this one&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-8704876995583809344?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=8704876995583809344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8704876995583809344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/8704876995583809344'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/04/do-you-like-april-1.html' title='Do you like April 1?'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-3064851607163317669</id><published>2008-03-24T16:21:00.008+02:00</published><updated>2008-04-02T13:35:17.583+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Premature optimization is not THAT root of evil</title><content type='html'>Sometimes I can see really ugly code from my colleagues. Something like this:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style=""&gt;ArrayList&lt;/span&gt;&lt;item&gt;&lt;span class="Apple-style-span" style=""&gt; checkList = new ArrayList&lt;/span&gt;&lt;item&gt;&lt;span class="Apple-style-span" style=""&gt;();&lt;br /&gt;for (Item item : allItems) {&lt;br /&gt;    if (item.isModified) {&lt;br /&gt;        checkList.add(item);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;for (Item item : itemsList) {&lt;br /&gt;    if (checkList.contains(item)) {&lt;br /&gt;        doSomething(item);&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/item&gt;&lt;/item&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Yes, there are situations, where you need hacks like this. But why, why are they using &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;ArrayList&lt;/span&gt; to perform contains checks? &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;HashSet&lt;/span&gt; is created for this job, why not to use it? For 10 items you will not see speed problems. For 100 items speed will lose few millis. For 10000 item you will count seconds!&lt;br /&gt;&lt;blockquote&gt;No! I will not do it like you want! Premature optimization is root of evil!&lt;/blockquote&gt;&lt;br /&gt;Do you see premature optimization here? For me it is just making use of proper tool, tool that created for this task. Don't you think so?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-3064851607163317669?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=3064851607163317669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3064851607163317669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/3064851607163317669'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/03/premature-optimization-is-not-that-root.html' title='Premature optimization is not THAT root of evil'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-982495715512338042.post-6134420436006573287</id><published>2008-03-23T11:17:00.009+02:00</published><updated>2008-04-02T13:35:31.099+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='other'/><title type='text'>Less than Hello World</title><content type='html'>Once I started to learn Assembler. I had a book of one russian hacker. First chapter of this book started like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Every book starts with "Hello, World" program. But reader can see programs, that can do more, than just pring "Hello, World". So he might think, that there is programs, that can do less, than "Hello, World".&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;For now, Assembler is dead, and we are using Java, as perfect technology.&lt;br /&gt;So, less than "Hello, World!":&lt;br /&gt;&lt;blockquote&gt;&lt;span&gt;&lt;br /&gt;package helloworld;&lt;br /&gt;&lt;br /&gt;public class LessThanHello {&lt;br /&gt;&lt;br /&gt;     public static void main(String[] args) {&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/982495715512338042-6134420436006573287?l=heresylabs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=982495715512338042&amp;postID=6134420436006573287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/6134420436006573287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/982495715512338042/posts/default/6134420436006573287'/><link rel='alternate' type='text/html' href='http://heresylabs.blogspot.com/2008/03/less-than-hello-world.html' title='Less than Hello World'/><author><name>Aekold</name><uri>http://www.blogger.com/profile/08066927974130224638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp0.blogger.com/_OCDMbx08eVU/R-YUxpK-JeI/AAAAAAAAAAM/ZIkpkxpY7K8/S220/img_014-1.jpg'/></author><thr:total>0</thr:total></entry></feed>
