<?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-6970241215942142415</id><updated>2012-02-16T17:51:26.067-08:00</updated><category term='web comics'/><category term='virgin blue'/><category term='firefox'/><category term='darwin'/><category term='shoemoney'/><category term='qantas'/><category term='active directory'/><category term='airfares'/><category term='tools'/><category term='budget'/><category term='java profiling'/><category term='non functional prototype'/><category term='spring'/><category term='novell'/><category term='dotnet'/><category term='opera'/><category term='blogs'/><category term='printers'/><category term='uber-geeky'/><category term='canberra'/><category term='google'/><title type='text'>Three Bright Lights...</title><subtitle type='html'>Matthew Kerle - ravings &amp;amp; ramblings of a software engineer.

I&amp;#39;ve been around the world and I&amp;#39;m back in Darwin. For a living I mostly write Java code, in my spare time... haha what spare time!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-7600088834540131205</id><published>2010-03-01T07:20:00.000-08:00</published><updated>2010-03-01T07:48:49.054-08:00</updated><title type='text'>How *not* to sell your product</title><content type='html'>lets play imagine... Imagine you have a killer app, it slays all it's competition. You, the author and chief architect have laboured tirelessly in the bowels of the corporate giant until one day you could take no more, and taking up the yoke of liberty you cast off the shackles of corporate dictatorship! Taking all your knowledge of how and how not to solve the problem, you go off and write your dream app, the one you always wanted to write, the one your old customers were clamouring for, it sings, it dances, it is &lt;i&gt;elegant!&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Armed with such perfection, and knowledge of your previous customers, you successfully market it to them, who migrate en masse and breathe collective sighs of relief as all the things that used to be hard or impossible become easy, turnkey even!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then what? Well, why stop there, you go on to find new customers and opportunities. But, your company being small and agile, you the chief developers find yourselves being the prime second tier salesmen/support, and sitting in bright rooms explaining why people should spend &lt;i&gt;large&lt;/i&gt; amounts of money buying your software.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is where you can go horribly wrong... Up to this point, you've played the game well, dodging and swerving and outmanoeuvring the competition. But now, the temptation is to continue as before, treating the problem as a purely technical one, with technical solutions. While this has been true up to now, to really succeed at this point you need to realise that you've crossed a boundary. As soon as someone in the room has a title like "Chief X Officer", or even "Manager of X", it's a whole different dialogue.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The worst thing you can do here is continue with what's worked so far, which is explaining what the software does, how it does it, and most importantly, how smart it is for doing it that way. The truth? They don't care. They want to know about &lt;b&gt;Value!&lt;/b&gt; How your software makes them money, saves them money, gives better visibility or makes life easier in some significant way. That's how you'll sell them your product.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even when talking to the poor developers who must customise your shining example of perfection, espousing it's glory in mundane detail will just bore them to tears. Explaining how things work is meaningless. Two weeks of descriptions and hand waving isn't worth a few thoughtful worked examples in source.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ah.. Source! If you're planing on letting customers or 3rd parties customise your application (notice I didn't say code), &lt;b&gt;give them the source!&lt;/b&gt; Hire a good lawyer to come up with a licence and a CiC or NDA if it makes you feel better. This sends a strong message of trust to the client/partner and makes life a *lot* easier for any customisers getting up to speed on the internals of your application. If you don't they'll just decompile it and hate you, so you might as well give it to them (once they've paid of course!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To summarise, being a great coder/architect is invaluable, but if you actually get successful at what you do then you need to realise that tailoring your pitch to your audience is the next skill to learn. When you know the internals inside-out (literally!) it's all too easy to wax lyrical on implementation details. It's a lot harder, but much more beneficial, to translate your knowledge into terms the people in front of you can understand. Then you're not just programming software, you're programming wetware.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-7600088834540131205?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/7600088834540131205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=7600088834540131205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7600088834540131205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7600088834540131205'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2010/03/how-not-to-sell-your-product.html' title='How *not* to sell your product'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-4449028176079215601</id><published>2009-03-19T22:35:00.000-07:00</published><updated>2009-03-19T22:59:53.405-07:00</updated><title type='text'>CYA security</title><content type='html'>&lt;div&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;span class="187382205-20032009"&gt;I read this  article when it came out a few years back;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;span class="187382205-20032009"&gt;&lt;a title="http://www.schneier.com/blog/archives/2007/02/cya_security_1.html" href="http://www.schneier.com/blog/archives/2007/02/cya_security_1.html"&gt;http://www.schneier.com/blog/archives/2007/02/cya_security_1.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;span class="187382205-20032009"&gt;Really good  coverage on why the existing security measures where ineffective against the  threats encountered until *after* the threat had already been encountered, which  is too late.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;span class="187382205-20032009"&gt;reading this  article now:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="187382205-20032009"&gt;&lt;a title="http://www.rollingstone.com/politics/story/26793903/the_big_takeover/print" href="http://www.rollingstone.com/politics/story/26793903/the_big_takeover/print"&gt;http://www.rollingstone.com/politics/story/26793903/the_big_takeover/print&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="187382205-20032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;reminded me of   it, especially this bit:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="187382205-20032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;"&lt;span class="Apple-style-span" style="word-spacing: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: 17px; font-size-adjust: none; font-stretch: normal; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2;font-family:verdana;font-size:100%;"  &gt;&lt;em&gt;In  the final three months of last year, (AIG) lost more than $27 million&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;every hour. That's $465,000 a minute, a  yearly income for a median American household every six seconds, roughly $7,750  a second. And all this happened at the end of eight straight years that America  devoted to frantically chasing the shadow of a terrorist threat to no avail,  eight years spent stopping every citizen at every airport to search every purse,  bag, crotch and briefcase for juice boxes and explosive tubes of toothpaste. Yet  in the end, our government had no mechanism for searching the balance sheets of  companies that held life-or-death power over our society and was unable to spot  holes in the national economy the size of Libya (whose entire GDP last year was  smaller than AIG's 2008 losses).&lt;/em&gt;&lt;/span&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="187382205-20032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;So ok, terrorists  haven't managed to fly anymore planes into buildings since 9/11, thats a good  thing. In the meantime personal liberties in western countries have been eroded  by an enormous degree, the US has &lt;em&gt;invaded a country&lt;/em&gt; (that still shocks  me!) on false pretences, and become a party to illegal detention and the use of  torture. What price your soul?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="187382205-20032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;em&gt;At the same  time&lt;/em&gt;, the greatest threat to US (perhaps the world?) National Security  since the end of the Cold War has been brewing, in the form of the current  freeze-up of the financial markets triggered by the sub-prime mortgage collapse.  So we successfully defended against future repeats of the last threat (arguably  some might say), while completely missing the next great threat. If you tally up  financial cost and increased mortality due to financial-related suicide &amp;amp;  murders during this period, I dare say the cost in dollars and human lives will  outstrip 9/11.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="187382205-20032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;Yes we need to  guard against attacks similar to what's been encountered in the past, but we  also need to have &lt;em&gt;open eyes&lt;/em&gt; in seeing dangers from new and unexpected  directions. Prior to 9/11 there was intelligence about a potential attack using  planes that &lt;em&gt;was ignored&lt;/em&gt;, leading up the current crisis there were  warning signs that &lt;em&gt;were ignored&lt;/em&gt;. We need to stop ignoring good  intelligence just because we haven't seen it before.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-4449028176079215601?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/4449028176079215601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=4449028176079215601' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4449028176079215601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4449028176079215601'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/03/cya-security.html' title='CYA security'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-9195813190647487186</id><published>2009-03-09T19:57:00.001-07:00</published><updated>2009-03-19T23:06:00.593-07:00</updated><title type='text'>Sheeple or the wisdom of crowds?</title><content type='html'>&lt;div&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;span class="110204502-10032009"&gt;This is  disturbing:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;a href="http://brainz.org/ten-most-revealing-psych-experiments/"&gt;http://brainz.org/ten-most-revealing-psych-experiments/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;But on the other  hand,what of the wisdom of crowds?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;a href="http://en.wikipedia.org/wiki/The_Wisdom_of_Crowds"&gt;http://en.wikipedia.org/wiki/The_Wisdom_of_Crowds&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;Whats going on  here? It seems that on the one hand individuals can be easily manipulated using  peer pressure from groups, and on the other crowds seem to make better decisions  than individuals? Perhaps these are complementary points of view, not  contradictory? Perhaps the conscious action of the majority of people can be  easily swayed, but the unconscious action of groups (displaying emergent  behavior?) tends to cluster to optimal points of maxima far faster and more  accurately than the conscious efforts of experts?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;Could it be that  while human psychology is deeply flawed, the behavior that emerges from  interactions between individuals and environments can be insightful?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;How do we engineer  society to avoid, or at least minimise the harmful effects of our own nature?  Sometimes we need to follow the crowd, sometimes we need to ignore the crowd and  travel against the flow, how do we decide when to do which?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="110204502-10032009"&gt;&lt;span style=";font-family:Georgia;font-size:85%;"  &gt;A lot of  questions, no real answers.&lt;br /&gt;&lt;br /&gt;(edit)&lt;br /&gt;Coming back to this post later, it occurs to me that perhaps we should &lt;span style="font-style: italic;"&gt;observe&lt;/span&gt; the crowd and be aware of what is causing it to cluster or disperse, but not necessarily&lt;span style="font-style: italic;"&gt; follow&lt;/span&gt; the crowd. Know thyself...&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-9195813190647487186?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/9195813190647487186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=9195813190647487186' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/9195813190647487186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/9195813190647487186'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/03/sheeple-or-wisdom-of-crowds.html' title='Sheeple or the wisdom of crowds?'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-172777025189819098</id><published>2009-03-05T17:58:00.000-08:00</published><updated>2009-03-05T19:14:24.000-08:00</updated><title type='text'>The joy of refactoring</title><content type='html'>Imagine you have an infrastructure that allows you to run batch jobs asynchronously. However, you can't specify exactly when you want it to run (à la cron) but rather all you have is a polling interface, so your "service" will start up every x mins, do something, then sleep again. Finer grained control is up to you.&lt;br /&gt;&lt;br /&gt;This is our situation, and we usually specify a start time, eg - "23:00", an end time "24:00", and have a bit of logic somewhere to abort the run if the current time is outside that window. I finally noticed the bit of logic that does this, and realised that it was duplicated in every service has a *copy* of the same code. behold:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0cxyCtzzCVo/SbCUrtA3tBI/AAAAAAAAA88/UPH6VWREd1Q/s1600-h/window-01.png"&gt;&lt;img style="cursor: pointer; width: 385px; height: 400px;" src="http://4.bp.blogspot.com/_0cxyCtzzCVo/SbCUrtA3tBI/AAAAAAAAA88/UPH6VWREd1Q/s400/window-01.png" alt="" id="BLOGGER_PHOTO_ID_5309907439208346642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yuck.&lt;br /&gt;&lt;br /&gt;Needless to say, I didn't like the duplication, or the code itself. I didn't have scope to retrofit the other services that used similar code, but I could fix this one and build a foundation for later.&lt;br /&gt;&lt;br /&gt;First step was to refactor that mess out to a common util class, leaving us with this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0cxyCtzzCVo/SbCUyB1HK4I/AAAAAAAAA9E/fXZkr2zBnt8/s1600-h/window-02.png"&gt;&lt;img style="cursor: pointer; width: 128px; height: 16px;" src="http://2.bp.blogspot.com/_0cxyCtzzCVo/SbCUyB1HK4I/AAAAAAAAA9E/fXZkr2zBnt8/s400/window-02.png" alt="" id="BLOGGER_PHOTO_ID_5309907547875388290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;...&lt;br /&gt;and this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0cxyCtzzCVo/SbCU5LtG-wI/AAAAAAAAA9M/d8FRwSyVg_8/s1600-h/window-03.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 78px;" src="http://1.bp.blogspot.com/_0cxyCtzzCVo/SbCU5LtG-wI/AAAAAAAAA9M/d8FRwSyVg_8/s400/window-03.png" alt="" id="BLOGGER_PHOTO_ID_5309907670785260290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first cut was just a raw refactor extract, the next step was to not use ugly Calendar code and handle the midnight cutover correctly (which is actually quite hard!). After a few false starts with Dates and dealing with GMT and daylight savings offsets, we ended up with this (convenience methods and javadoc not shown), which is unit-tested and guaranteed to work (except maybe during the daylight savings cutover itself..)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0cxyCtzzCVo/SbCU_VzY2kI/AAAAAAAAA9U/HFUHMOtiw5g/s1600-h/window-04.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 161px;" src="http://4.bp.blogspot.com/_0cxyCtzzCVo/SbCU_VzY2kI/AAAAAAAAA9U/HFUHMOtiw5g/s400/window-04.png" alt="" id="BLOGGER_PHOTO_ID_5309907776575167042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Much nicer, well we think so anyway.&lt;br /&gt;&lt;br /&gt;If you can see a bug in there please let me know!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-172777025189819098?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/172777025189819098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=172777025189819098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/172777025189819098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/172777025189819098'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/03/joy-of-refactoring.html' title='The joy of refactoring'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_0cxyCtzzCVo/SbCUrtA3tBI/AAAAAAAAA88/UPH6VWREd1Q/s72-c/window-01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-9152072940435542638</id><published>2009-03-05T17:42:00.001-08:00</published><updated>2009-03-05T17:58:11.826-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>The joy of Spring!</title><content type='html'>Had the opportunity to Springify a co-workers project while he was on leave the other day. It already sort-of used Spring, but he had inverted the inversion-of-control (yeah... think about it, passing the context everywhere and getting single beans out, scary) and because of the architecture we were variously running into "got minus one from read call" errors (Database-side connections exhausted) or "No ManagedConnections available within configured blocking timeout" (JBoss Connection pool exhausted) depending on whether you used his oracle config (multiple connection pools with max-size of 100) or mine (max-size 10 per pool).&lt;br /&gt;&lt;br /&gt;So! Time to throw out cruft, delete code and do proper dependency-injection! always great fun. I once did a project where most of the risk was in the business algorithm, but the data requirements started fairly simple. So I rolled my own database layer and got going. Later in the project the data requirements started to grow, transaction demarcation and correct handling became an issue so I took the time to Spring-ify it, and the joy of going from raw JDBC sql to JdbcTemplates and Hibernate HQL was huge! dozens of lines of verbose JDBC try-catch-finally evaporated to one-liners. just great!&lt;br /&gt;&lt;br /&gt;I do love taking well-written OO code and re-wiring it with Spring, you can throw out huge amounts of code and eliminate bugs that you might have never known about! Connection pooling issues, correct rollbacks, host of junk like that. A lot of the ugly casting and boilerplate code just evaporates, and you're left with get-setters (which is another issue entirely, we should have properties!)&lt;br /&gt;&lt;br /&gt;At the moment I tend to use a Builder pattern to boot-strap Spring from the init code (not a full spring stack yet...) and get a handle to a Spring bean configured with all the resources (it knows how to orchestrate the DAOs and usually contains most of the bus. logic) which then takes over processing. I could probably do better, but it works pretty well for the moment and is easy enough to unit test, so I'm happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-9152072940435542638?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/9152072940435542638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=9152072940435542638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/9152072940435542638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/9152072940435542638'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/03/joy-of-spring.html' title='The joy of Spring!'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-2475169860271408601</id><published>2009-02-19T20:02:00.000-08:00</published><updated>2009-02-19T21:21:58.778-08:00</updated><title type='text'>No more garbage collection pauses!!</title><content type='html'>I was listening to a back episode of &lt;a href="http://www.javaposse.com/index.php?post_id=199323"&gt;the Java Posse&lt;/a&gt; the other night from the '07 roundup "Whither java?" session (around 63:10), and heard someone  mention the "&lt;span style="font-family:courier new;"&gt;-Xincgc&lt;/span&gt;" option for the Sun JVM that changes from the default collector with pauses and all, to an incremental collector.&lt;br /&gt;&lt;br /&gt;This changes the behavior from big, ugly, noticeable pauses for garbage collection full sweeps to an incremental model where the pauses aren't noticeable, with the trade-off that it uses more CPU overall. So for batch-type, long-running CPU intensive operations the default collector will out-perform the incremental garbage collector marginally, but for user-visible operations the big noticeable pauses go away.&lt;br /&gt;&lt;br /&gt;Technically, this forces the JVM to use the &lt;a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#0.0.0.%20The%20Concurrent%20Low%20Pause%20Collector%7Coutline"&gt;Concurrent Low Pause Collector&lt;/a&gt;, as documented in  &lt;a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html"&gt;Tuning Garbage Collection with the 5.0 Java Virtual Machine&lt;/a&gt;. Interesting reading if you have the time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-2475169860271408601?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/2475169860271408601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=2475169860271408601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2475169860271408601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2475169860271408601'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/02/no-more-garbage-collection-pauses.html' title='No more garbage collection pauses!!'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-7623371628676884135</id><published>2009-02-19T04:33:00.000-08:00</published><updated>2009-02-19T05:16:49.790-08:00</updated><title type='text'>Script it Script it Script it!</title><content type='html'>this has been said many times before, but I'm gonna say it again, anything worth doing twice is worth scripting!&lt;br /&gt;&lt;br /&gt;In our environment the development databases are refreshed from production and sanitised weekly. This is scripted, it happens on the dot, every week, without fail (excepting catastrophies!).&lt;br /&gt;&lt;br /&gt;All of our local builds are automated, type &lt;span style="font-family: courier new;"&gt;ant&lt;/span&gt; or &lt;span style="font-family: courier new;"&gt;mvn compile&lt;/span&gt; and magic happens.&lt;br /&gt;&lt;br /&gt;All of our server builds are automated, &lt;span style="font-family: courier new;"&gt;svn ci&lt;/span&gt; causes a build to kick off automatically, and notifies you if something goes wrong.&lt;br /&gt;&lt;br /&gt;The project I'm currently working on requires some manual configuration and then proceeds to turn the database inside out, and is not easily backed out (I've tried, and it was more pain than it was worth!). So for every full integration test there's about 8 separate configuration steps before it can be run. They've all been scripted (SQL in this case). Now I know I can refresh my database from production with sanitised data, run one script to reload the config, and run a full 4hour integration test, all with complete confidence that I'm running off a fully reproducible slate.&lt;br /&gt;&lt;br /&gt;The first time you do something, fair enough, do it without regard to rigorous scripting (but save any commands you run). When you come to do it a second time, you have a hard decision to make. If there's &lt;span style="font-style: italic;"&gt;even the remotest&lt;/span&gt; chance that you'll be called on to do this again, then script it. In fact, even if you probably think you won't have to, script it anyway. The number of times I've had to repeat the thing that "&lt;span style="font-style: italic;"&gt;is surely just this once-off and never again!&lt;/span&gt;" and later wished I'd scripted it to start with.&lt;br /&gt;&lt;br /&gt;I've found in my experience that the time it takes to script something, most of the time, is only slightly slower than the time it takes to do it ad hoc.  When you script something you exercise the muscle between your ears, which is worth it if nothing else. Then as soon as you have to do it the second time, it pays for itself, and every single time after that.&lt;br /&gt;&lt;br /&gt;I once had to step in for a client and run some web statistics for them as the usual staffer who performed the role was away. This normally took him the best part of a day to perform, between copying log files from the server, setting up the config and waiting for the tool to process the logs, then copying to results to the web directory. The first time I did it, I took about 2 days, maybe three, this time included figuring out the process as well as scripting it while waiting. The second time it took me the 5mins to update the links on the stats page to point to the new stats, as everything had run automatically before I got to work. Time well spent.&lt;br /&gt;&lt;br /&gt;I'm sure I'm preaching to the choir here, and everyone reading this blog will be nodding their heads as if I'm ranting about how rocks fall down instead of up, but it's something we all too easily forget in the rush of everyday, to take the time to keep our minds and our tools sharp.&lt;br /&gt;&lt;br /&gt;Got a large log file to parse(1GB+?)? Instead of wrestling with some editor, try writing a perl/python script to parse it for you, or even a shell script with a grep pipeline.&lt;br /&gt;&lt;br /&gt;Let the machine work hard while you work smart. You'll save time, be more relaxed for it, and who knows, you might even enjoy it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-7623371628676884135?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/7623371628676884135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=7623371628676884135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7623371628676884135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7623371628676884135'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/02/script-it-script-it-script-it.html' title='Script it Script it Script it!'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-2115990164540734401</id><published>2009-02-09T18:52:00.000-08:00</published><updated>2009-02-19T18:40:36.906-08:00</updated><title type='text'>Two Random things I like about Java...</title><content type='html'>&lt;div style="font-family: georgia;font-family:georgia;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span class="763294002-10022009"&gt;1) the fact that  each and every class file needs to have 0xCAFEBABE in the first 4 byte  positions&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:georgia;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="763294002-10022009"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: georgia;"&gt;This actually  identifies the file as a valid Java class file in addition to the file  extension, no non-class file is likely to have this number in that  location.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:georgia;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="763294002-10022009"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;font-family:georgia;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span class="763294002-10022009"&gt;2 the fact that  there is a class called java.text.DontCareFieldPosition!!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;font-family:georgia;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span class="763294002-10022009"&gt;The name actually  makes sense, it's used by the DecimalFormatter and is package-local, so clients  of the API should never be aware of it, and is a null implementation of the  FieldPosition interface. Cudos to the developer that argued that name past the  API police!!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-2115990164540734401?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/2115990164540734401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=2115990164540734401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2115990164540734401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2115990164540734401'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/02/two-random-things-i-like-about-java.html' title='Two Random things I like about Java...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-4999906338431023167</id><published>2009-02-08T23:45:00.001-08:00</published><updated>2009-02-19T19:17:09.083-08:00</updated><title type='text'>The importance of trim()... or how much I hate whitespace!!</title><content type='html'>&lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;So... One of my  colleagues went on leave last friday, and Murphys law dictates that that is the  perfect time for the application he maintains to suddenly and precipitously  cease working in production. Of course this problem fell into my lap to resolve  so I set to it around about lunchtime...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;The situation is  that a third party regularly sends us a variety of data in plain text or  spreadsheet format, in this particular case it's spreadsheet. Once we get this,  we read it off the filesystem, look up data from the spreadsheet and compare it  to data in our systems and perform various actions based on it. This has been in  production for about 8months and has worked perfectly the whole time. Until the  maintainer went on leave... :-)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Digging in, the  first problem was that it wasn't reading dates properly. Hmmm, ok, so we  grab the last spreadsheet that worked and compare with that, ah, they'd changed  the date format from YYYY-MM-DD to DD/MM/YYYY for no reason at all. Ok, not a  biggie, one excel macro later it looks fine, reload but still no workie... what  tha?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;After more digging  we were being bitten by Excel date handling. A cell may look like a date, but if  the cell is formatted as a date then internally it's actually just an integer,  which needs to be converted. In my checked-out version of code this was handled  transparently, but in prod and QUAL this broke as numeric dates were being  missed, resulting in nulls. Ok, another excel macro and we have columns of  strings that look like dates instead of numbers that look like dates. Now  loading this file into QUAL the dates are picked up fine, at which point I  noticed that a lookup between the file and our system wasn't working. WTF mate?  Each row has several cells that contain codes that need to be converted into  rich data structures from a lookup, this data structure then being used for  calculations later.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;The lookup was  broken, why? Well, after several hours of checking differences in environment,  checking datasources, checking versions of code and finally in desperation  stepping through the lookup code, it dawned on me... The spreadsheet had  whitespace in it.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Normally when I read  tabular data from disk, or really any untrusted data at all, trim()'ing and  validation is the order of the day. If the field is an enumeration, then  validate that. If it's a number, check for alphas, dollar signs, commas  etc  and so on. It's the sort of paranoia that maintenance programming  gives you. I had ASSumed that my colleague would have done the same by default,  oops no. Which is fine, we all make mistakes.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;So, a quick google,  this &lt;a href="http://support.microsoft.com/kb/291047"&gt;handy KB  article&lt;/a&gt; and some VBA later, and the spreadsheet was all clean again.  Re-running the load it came up roses, which is to say it started working like  billy-o where it had previously just cruised through, and all was well with the  world.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Moral of the story  is, Excel is a pain to work with. Not because it's the spawn of pure evil, but  rather because although it *looks* like a datasource with strong data rules, it  isn't, and you can never, ever assume that anything inside it is what you think  it is until you've checked and made sure. Columns will move around, dates will  randomly be strings or numbers, any and every field will randomly be  space/tab/zero padded. You simply have to treat it as a hostile  datasource.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="904300807-09022009"  style="font-size:100%;"&gt;&lt;span style=""&gt;And never, ever fail  silently when something is wrong with the data!! Die loudly and with great  gusto!! Please for my sanity!!!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="904300807-09022009"&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;         &lt;strong&gt;else&lt;/strong&gt;&lt;br /&gt;        {&lt;br /&gt;           &lt;span style="color: rgb(0, 128, 0);"&gt;// No record exists may be something wrong with **** in the  input  file&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 128);"&gt;record&lt;/span&gt;.setVaild****Prev(&lt;strong&gt;false&lt;/strong&gt;);&lt;br /&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-4999906338431023167?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/4999906338431023167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=4999906338431023167' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4999906338431023167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4999906338431023167'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/02/importance-of-trim-or-how-much-i-hate.html' title='The importance of trim()... or how much I hate whitespace!!'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-6870538820472721452</id><published>2009-01-26T20:59:00.001-08:00</published><updated>2009-02-19T20:01:30.199-08:00</updated><title type='text'>java.lang.OutOfMemoryError: PermGen space</title><content type='html'>&lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;You know those  things that don't crop up very often, but when they do they're a complete pain  in the a**? well this is one of them!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Developing a plugin  for Atlassian Jira, I don't care about heap size, or space allocated to PermGen,  all I care about is getting functionality to the business.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;I've read  this:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;a href="http://wiki.caucho.com/Java.lang.OutOfMemoryError:_PermGen_space"&gt;http://wiki.caucho.com/Java.lang.OutOfMemoryError:_PermGen_space&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;and  this:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;a href="http://www.jroller.com/agileanswers/entry/preventing_java_s_java_lang"&gt;http://www.jroller.com/agileanswers/entry/preventing_java_s_java_lang&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;among many, enough  to know that PermGen isn't as simple as "make the heap bigger", enough to know  that it's probably the fact that I'm running the app server in debug mode that  contributes to this problem, but still, I'd rather not have to deal with  it.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;I understand that  there's a lot of complexity involved in the Java Memory Model, I understand that  people a lot smarter than me came up with it and decided on restrictions like  the fact that the JVM can't give memory back to the OS once it's freed it, to  make the problem of Performant Garbage Collection solvable, I'm cool with all  that!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;But... I just want  it to work! I wish there was a --XX:PromiscuosMemory flag that I could set to  say, hey, I'm developing here, this won't be used in production, I know what I'm  doing, I don't mind if I take a bit of a hit on performance, but I would like  you to eat memory as needed until you reach the system limit, running the  garbage collector whenever you want, and you know, if you get a whole lot to  spare? Just go on and give it back to the OS, thanks.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="473264704-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Of course that  doesn't exist, so I find myself adding "-XX:MaxPermSize=512m -Xms128m -Xmx512m"  to my startup script, and not caring about the memory model anyway. fun  fun.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-6870538820472721452?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/6870538820472721452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=6870538820472721452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/6870538820472721452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/6870538820472721452'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/01/javalangoutofmemoryerror-permgen-space.html' title='java.lang.OutOfMemoryError: PermGen space'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-4740675060524413764</id><published>2009-01-26T17:17:00.000-08:00</published><updated>2009-02-19T21:28:01.097-08:00</updated><title type='text'>Using Reflection to get around hard-coded dependencies</title><content type='html'>&lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Spring famously has  no cycles in it's dependency graph:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;a href="http://www.springsource.org/node/310"&gt;http://www.springsource.org/node/310&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Obviously writing  applications is different to writing frameworks, and we can't always take the  time to get things so polished. Also by the nature of the beast the domain model  will (should!) pervade the entire application (domain model should be the root  of your graph, with services/repositories/ etc depending on  them).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Sometimes though you  may want to enable some functionality if an object is an instance of some  special class, without introducing explicit dependencies on those classes.  reflection is your friend!!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Of course the price  is that you loose type-safety, so be warned here be  dragons!!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;simply at runtime  see if the string representing the class name is the class you want to twiddle,  if it is, reflectively invoke your methods &lt;em&gt;enabling additional  functionality&lt;/em&gt;, otherwise continue on in the boring type-safe way that only  deals with the interface or bace class you're dealing with. The key here is that  by default you deal with a standard interface or base class (such as  javax.activation.DataSource), and only if the instance of the object has the  extra bits you want (eg my.cool.SuperSmartDataSource), then you selectively  elect to do extra. Spring does this quite a lot with it's own DataSource  wrappers internally.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="439420501-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;handy  sometimes...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-4740675060524413764?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/4740675060524413764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=4740675060524413764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4740675060524413764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4740675060524413764'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/01/using-reflection-to-get-around-hard.html' title='Using Reflection to get around hard-coded dependencies'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-2500746328244509530</id><published>2009-01-26T16:51:00.001-08:00</published><updated>2009-02-19T21:29:15.420-08:00</updated><title type='text'>Classloading in Application Servers: JARmaggedon!</title><content type='html'>&lt;div style="font-family: georgia;"&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;original issue with  trying to access the tomcat security principal in IMGWS, but since class was  loaded from a sibling classloader, not a direct parent was unable to cast the  object to the correct class to access it, even though debugging revealed it to  be the correct object. Problem: class loaded from an unavailable classloader, so  unable to use any methods or fields related to the class, have to break in  through reflection.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;current issue:  upgrading JBoss 4.0.4 to JBoss 4.2.3, except that we use spring hibernate, and  JBoss tries to be helpful by providing those jars as well, thanks JBoss, now I  get &lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=";font-family:Courier;" &gt;java.lang.ClassCastException:  org.hibernate.search.event.FullTextIndexEventListener cannot be cast to  org.hibernate.event.PostInsertEventListener&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=";font-family:Courier;" &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Solution? remove  hibernate jars from jboss server/default/lib. this works ok in dev, but will  probably break advanced jboss functionality which relies on those jars, lucky I  don't use it... :-)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Our deployment  scenario is amenable to not having spring/hibernate etc jars provided by app  server, instead provided by each applications WAR. for us this works as we have  one app per app server, but as more come online this may change. On the other  hand, each application providing all it's own dependencies may cause some  duplication of libraries and cost disk space, but this is a cheap price to pay  for applications to evolve at their own rates and not be constrained by server  dependencies, eg - I need a feature in hibernate 3.3.0, but in prod we only have  3.2.2. No thanks!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="145203300-27012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;Personal opinion is  that applications should be as self-contained as possible to simplify deployment  and dependency management (leave that to maven). the exception to that is  infrastructure explicitly provided by the app server, eg servlets, ejb3  persistence maybe, JDBC drivers definitely. Big fat WAR is Not A Problem,  compared to Jarmeggadon...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-2500746328244509530?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/2500746328244509530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=2500746328244509530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2500746328244509530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2500746328244509530'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/01/classloading-in-application-servers.html' title='Classloading in Application Servers: JARmaggedon!'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-672133514572005693</id><published>2009-01-14T18:34:00.001-08:00</published><updated>2009-02-19T21:30:50.123-08:00</updated><title type='text'>System Antics</title><content type='html'>&lt;div style="font-family: georgia;"&gt;&lt;span class="634442702-15012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;I've had the 3rd  edition of this book in my amazon wishlist for ages, now I finally found an  online version of the first edition which is short &amp;amp; pithy. read the preface  then if you like it check out the rest. fantastic discussion of systems in  general (in the sense of systems that humans set up, including but not limited  to IT systems, including organisations, governments &amp;amp; companies etc)  especially relating to failure modes.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="634442702-15012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="634442702-15012009"  style="font-size:100%;"&gt;&lt;span style=""&gt;&lt;a href="http://www.ece.osu.edu/%7Efasiha/systemantics/"&gt;http://www.ece.osu.edu/~fasiha/systemantics/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-672133514572005693?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/672133514572005693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=672133514572005693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/672133514572005693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/672133514572005693'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2009/01/system-antics.html' title='System Antics'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-155343553841432788</id><published>2008-12-01T20:36:00.001-08:00</published><updated>2009-02-08T23:46:19.133-08:00</updated><title type='text'>Thought vs Action</title><content type='html'>&lt;div&gt;&lt;span class="179023504-02122008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Circus saying  "Thinking kills circus skills"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="179023504-02122008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="179023504-02122008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;thinking about what  you're doing in the middle of execution detracts from performance, but you need  to constantly self-evaluate and adjust course. This creates a tension between  thought &amp;amp; action, discuss.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-155343553841432788?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/155343553841432788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=155343553841432788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/155343553841432788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/155343553841432788'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2008/12/thought-vs-action.html' title='Thought vs Action'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-2795837643191290040</id><published>2008-10-21T22:15:00.001-07:00</published><updated>2009-02-08T23:46:25.841-08:00</updated><title type='text'>Interesting direction on fusion research...</title><content type='html'>&lt;div&gt; &lt;div dir="ltr" align="left"&gt;&lt;span style="font-family:Arial;font-size:85%;color:#0000ff;"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span class="386002205-19082008"&gt;start  here:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Polywell"&gt;http://en.wikipedia.org/wiki/Polywell&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;if you have time  read this (PDF):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a href="http://fusor.net/newbie/files/Ligon-QED-IE.pdf"&gt;http://fusor.net/newbie/files/Ligon-QED-IE.pdf&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;lots more  here:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a href="http://www.fusor.net/"&gt;http://www.fusor.net/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;basically, instead  of using tokamaks with magnetic confinement (that don't ach&lt;span class="757381405-22102008"&gt;ie&lt;/span&gt;ve breakeven), there's a revolutionary rethink  of the design. you can *really* build your own mini fusion reactor for a couple  grand. guy behind it is a Dr Bussard (Bussard ramjet anyone?) who got to the  point of a viable prototype and research group before he died at age 79 last  year.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;google talk he  presented on the Polywell (go nuclear google!)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a href="http://video.google.com/videoplay?docid=1996321846673788606"&gt;http://video.google.com/videoplay?docid=1996321846673788606&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="386002205-19082008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;this is all very  interesting and exciting. the PDF is a bit long and detailed, but def worth it  to get right into the guts of the theory. big potential  here!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-2795837643191290040?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/2795837643191290040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=2795837643191290040' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2795837643191290040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2795837643191290040'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2008/10/interesting-direction-on-fusion.html' title='Interesting direction on fusion research...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-1033496559536410147</id><published>2008-09-15T17:34:00.001-07:00</published><updated>2009-02-08T23:47:16.024-08:00</updated><title type='text'>5 stages of grief</title><content type='html'>&lt;div dir="ltr" align="left"&gt;&lt;span class="882452200-16092008"&gt;As applied to me coming  to terms with the end of the season....&lt;span class="838283300-16092008"&gt;&lt;span style="font-family:Arial;font-size:85%;color:#0000ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="882452200-16092008"&gt;&lt;span class="838283300-16092008"&gt;&lt;span style="font-family:Arial;font-size:85%;color:#0000ff;"&gt;(credit to wikipedia &lt;a href="http://en.wikipedia.org/wiki/K%C3%BCbler-Ross_model"&gt;http://en.wikipedia.org/wiki/K%C3%BCbler-Ross_model&lt;/a&gt;)&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;ol&gt;   &lt;li&gt;&lt;b&gt;&lt;a title="Denial" href="http://en.wikipedia.org/wiki/Denial"&gt;Denial&lt;/a&gt;&lt;/b&gt;:    &lt;ul&gt;     &lt;li&gt;Example - &lt;i&gt;"&lt;span class="882452200-16092008"&gt;The snow season's not over      yet, there's still a whole month til it closes! I can still      ski!&lt;/span&gt;&lt;/i&gt;&lt;i&gt;"&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a title="Anger" href="http://en.wikipedia.org/wiki/Anger"&gt;Anger&lt;/a&gt;&lt;/b&gt;:     &lt;ul&gt;     &lt;li&gt;Example - &lt;i&gt;"Why &lt;span class="882452200-16092008"&gt;aren't the lifts      opening? I came all this way and they're not opening the lifts, this      sucks!!&lt;/span&gt;&lt;/i&gt;&lt;i&gt;"&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a title="Bargaining" href="http://en.wikipedia.org/wiki/Bargaining"&gt;Bargaining&lt;/a&gt;&lt;/b&gt;:    &lt;ul&gt;     &lt;li&gt;Example - &lt;i&gt;"&lt;span class="882452200-16092008"&gt;What if I just walk up the      hill anyway and ski on my own? maybe that will      work...&lt;/span&gt;&lt;/i&gt;&lt;i&gt;"&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a title="Depression (mood)" href="http://en.wikipedia.org/wiki/Depression_%28mood%29"&gt;Depression&lt;/a&gt;&lt;/b&gt;:    &lt;ul&gt;     &lt;li&gt;Example - &lt;i&gt;"I'm so sad, why bother &lt;span class="882452200-16092008"&gt;trying&lt;/span&gt;&lt;/i&gt;&lt;i&gt; . . . What's the point?&lt;span class="882452200-16092008"&gt; Maybe if I buy some snow gear I'll feel      better...&lt;/span&gt;"&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a title="Acceptance" href="http://en.wikipedia.org/wiki/Acceptance"&gt;Acceptance&lt;/a&gt;&lt;/b&gt;:    &lt;ul&gt;     &lt;li&gt;Example - &lt;i&gt;"It&lt;span class="882452200-16092008"&gt; really is      over. But&lt;/span&gt;&lt;span class="882452200-16092008"&gt; there's always next      season, and in the meantime  surfing!!&lt;/span&gt;&lt;/i&gt;&lt;i&gt;"&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-1033496559536410147?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/1033496559536410147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=1033496559536410147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1033496559536410147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1033496559536410147'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2008/09/5-stages-of-grief.html' title='5 stages of grief'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-7933579137089441980</id><published>2008-04-30T16:38:00.001-07:00</published><updated>2008-12-09T00:27:36.603-08:00</updated><title type='text'>the value of a reliable email archiving solution</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0cxyCtzzCVo/SBqQzLQxrFI/AAAAAAAAAqw/81net0RdLC8/s1600-h/bush_e-mails.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_0cxyCtzzCVo/SBqQzLQxrFI/AAAAAAAAAqw/81net0RdLC8/s320/bush_e-mails.jpg" alt="" id="BLOGGER_PHOTO_ID_5195624328996170834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt; &lt;div&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;a href="http://arstechnica.com/articles/culture/bush-lost-e-mails.ars"&gt;http://arstechnica.com/articles/culture/bush-lost-e-mails.ars&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="492062123-30042008"&gt;&lt;span style=";font-size:85%;" &gt;the picture says it  all really, but this is the bit i love:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="492062123-30042008"&gt;&lt;span style=";font-size:85%;" &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="492062123-30042008"&gt;&lt;span style=";font-size:85%;" &gt;"&lt;span style=";font-size:100%;" &gt; In 1994, the Clinton administration reacted to  the previous year's court decision by rolling out an automated e-mail-archiving  system to work with the Lotus-Notes-based e-mail software that was in use at the  time. The system automatically categorized e-mails based on the requirements of  the FRA and PRA, and it included safeguards to ensure that e-mails were not  deliberately or unintentionally altered or deleted.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="492062123-30042008"&gt;&lt;span style=";font-size:85%;" &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span class="492062123-30042008"&gt;&lt;span style=";font-size:85%;" &gt;When the Bush  administration took office, it decided to replace the Lotus Notes-based e-mail  system used under the Clinton Administration with Microsoft Outlook and  Exchange. The transition broke compatibility with the old archiving system, and  the White House IT shop did not immediately have a new one to put in its place.  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;p style="font-family: georgia;"&gt;&lt;span style=";font-size:85%;" &gt;Instead, the White House has instituted a comically  primitive system called "journaling," in which (to quote from a &lt;/span&gt;&lt;a href="http://fas.org/sgp/congress/2008/022608supp.pdf"&gt;&lt;span style=";font-size:85%;" &gt;recent Congressional report&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;) "a  White House staffer or contractor would collect from a 'journal' e-mail folder  in the Microsoft Exchange system copies of e-mails sent and received by White  House employees." These would be manually named and saved as ".pst" files on  White House servers. &lt;span class="492062123-30042008"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;div&gt;&lt;span class="492062123-30042008"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="492062123-30042008"&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="492062123-30042008"&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style=";font-family:Arial;font-size:85%;"  &gt;&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-7933579137089441980?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/7933579137089441980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=7933579137089441980' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7933579137089441980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7933579137089441980'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2008/04/value-of-reliable-email-archiving.html' title='the value of a reliable email archiving solution'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0cxyCtzzCVo/SBqQzLQxrFI/AAAAAAAAAqw/81net0RdLC8/s72-c/bush_e-mails.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-1073777003269364264</id><published>2008-04-27T19:21:00.000-07:00</published><updated>2008-04-27T19:32:17.999-07:00</updated><title type='text'>a new unit: The Wikipedia</title><content type='html'>&lt;div style="font-family: georgia;"&gt;&lt;span style=";font-size:85%;" &gt;&lt;span class="284441102-28042008"&gt;question, of 'how do  people find the time to contribute to free projects?'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span style=";font-size:85%;" &gt;&lt;span class="284441102-28042008"&gt;answer: they're  watching less tv...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span style=";font-size:85%;" &gt;&lt;span class="284441102-28042008"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span style=";font-size:85%;" &gt;&lt;span class="284441102-28042008"&gt;we now have a unit  that defines the attention span of a group: the wikipedia, which is the amount  of person-hours of thought invested in wikipedia, about 100 million hours.  there's about 2000 wikipedia's spent watching TV each year in the US. **each  year**!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="font-family: georgia;"&gt; &lt;/div&gt; &lt;div style="font-family: georgia;"&gt;&lt;span style=";font-size:85%;" &gt;&lt;a href="http://www.herecomeseverybody.org/2008/04/looking-for-the-mouse.html"&gt;http://www.herecomeseverybody.org/2008/04/looking-for-the-mouse.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Personally I don't watch very much TV anymore. I go to the movies and watch DVD's occasionally, but I try to avoid actually watching TV because I find it an almost complete waste of time (with notable exceptions like Chasers war on everything, the daily show etc).&lt;br /&gt;&lt;br /&gt;So what do I do with all this extra time? (I used to spend 20-30 hours a week watching TV). Well, mainly i use it to hang out with Real People (tm) instead of the idiot box. I think this is a good thing. If you find yourself watching an hour or more of TV a day several times a week, then take the pepsi challenge, pack your TV up and do away with it for a month. you'll be surprised what will happen, maybe you'll reconnect with your friends or spouse or kids, maybe you'll just get the motivation to go for that exercise you've been meaning to do. try it...&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-1073777003269364264?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/1073777003269364264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=1073777003269364264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1073777003269364264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1073777003269364264'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2008/04/new-unit-wikipedia.html' title='a new unit: The Wikipedia'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-2541780617157580581</id><published>2008-04-20T08:18:00.000-07:00</published><updated>2008-04-20T08:37:15.824-07:00</updated><title type='text'>Kitten Auth Busted!</title><content type='html'>last week /. rocked to the news that bots had been able to get significant success rates cracking the CAPTCHA's that protect gmail &amp;amp; livemail. People half-seriously joked about replacing text-based CAPTCHA's with kitten-auth or hot-or-not-auth, despite the high success rate of even a random bot attack.&lt;br /&gt;&lt;br /&gt;now behold! Kitten Auth Busted! We only reveal this video of a live Kitten Auth CAPTCHA being broken now that the author of Kitten Auth has been notified of the vulnerability and the hole plugged.  Previously there was no variation in the hash of the same image between multiple displays, so if a human being taught the bot to recognise different animals, it could then recognise and correctly categorise the cute furry animals to get past kitten-auth and spam the hapless creator with viagra ads &amp;amp; offers of penis enlargement.&lt;br /&gt;&lt;br /&gt;The vuln has &lt;a href="http://www.thepcspy.com/contact"&gt;now been fixed&lt;/a&gt; with every image containing a random number embedded, which makes it impossible to recognise an image by it's hash alone.&lt;br /&gt;&lt;br /&gt;The exploit was written in Javascript and run from inside GreaseMonkey, but not by me, by the anonymous uber-h4xx0r, captain meat...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://potato.codefreaks.com.au/flash/KittenAuthBusted.swf.html"&gt;http://potato.codefreaks.com.au/flash/KittenAuthBusted.swf.html&lt;/a&gt;&lt;br /&gt;(note the video has been sped up, the first section is training the bot, after which it begins spamming constantly until disabled)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-2541780617157580581?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/2541780617157580581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=2541780617157580581' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2541780617157580581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2541780617157580581'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2008/04/kitten-auth-busted.html' title='Kitten Auth Busted!'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-1212615367375287742</id><published>2008-04-20T06:43:00.000-07:00</published><updated>2008-04-20T08:18:17.003-07:00</updated><title type='text'>Getting things done</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.foldedspace.org/images/gtdworkflow.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 382px; height: 426px;" src="http://www.foldedspace.org/images/gtdworkflow.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One of the talks at barcamp was on Getting Things Done, and they used a variation of the above flowchart to demonstrate a workflow for personal items. I haven't read the book yet (although it is on my toread list...), but the flow used in GTD above made me think about my own personal paradigm for dealing with todo's.&lt;br /&gt;&lt;br /&gt;So, work first. Currently we use &lt;a href="http://www.atlassian.com/software/jira/"&gt;Jira&lt;/a&gt;, just cos it rocks, and that takes care of assigning tasks among our team, recording requirements, work done, progress comments etc. However I find that the best way for me personally to deal with tasks is to make a pipeline of tasks in my immediate horizon (which is a subset of my currently assigned tasks), and record them in a low-tech format, currently a plain-text document called todo.txt which I leave open in textpad (textpad is never closed in my session ;-p ), ordered by descending priority.&lt;br /&gt;&lt;br /&gt;Then under each item I add a breakdown of the step-by-step tasks (down to an hour or two each) that I'll need to do to complete that task. As I complete sub-items I delete them from the task (for greater satisfaction they can be moved to a separate list at the bottom of the page of down things, that way you can look back over what you've done, feels good.). This gives a really &lt;span style="font-style: italic;"&gt;fast&lt;/span&gt; way to track immediate tasks as well as a handy scratch pad for dumping text. you don't get a lot of semantic tools, but if you're like me there's some mornings where you come in and you're like "what the hell am I supposed to be doing?". keeping todo.txt helps me answer that question and push my context back onto the stack.&lt;br /&gt;&lt;br /&gt;For my personal life, the usual answer is that I don't keep todo lists (although I know I should...). When I do though (usually when there's lots to get done and time-constraints requiring juggling), I just use the old pen &amp;amp; paper. I write three headings, short term (today or this week), medium term (next few weeks or months) and long term (one year to lifetime). Then I just brain-dump all the things I currently want to do under these headings. Sometimes I need to break it out a bit if there's a goal I want to achieve that doesn't fit into one of those timelines.&lt;br /&gt;&lt;br /&gt;The short term goals are the most satisfying. when you can get home at the end of a day and tick off all the items on your list, that's sex on wheels man. Medium term goals help focus the short-term goals and provide fodder for further short-term goals. Long term goals are more strategic and tend to reflect values, eg - getting married, having kids, becoming financially independent. I really should make them less fuzzy and more measurable though...&lt;br /&gt;&lt;br /&gt;Measurable outcomes  is key. This is easy with short-term goals, but with medium- and long-term goals it gets harder. You need to keep the pressure on by referring back to the goals periodically otherwise you can't measure your performance (or lack thereof) against them, and likely you're just spinning your wheels as time goes by. It's a good idea to make these goals highly visible and stick them on your wall/mirror/door etc. when I was at uni I had my unit-per-year plan in the front of my folder and avidly crossed out the units as I completed them. Big feeling of satisfaction!&lt;br /&gt;&lt;br /&gt;A few comments on how all this relates to GTD. I think the work flow above is very similar to the process of information-sifting that any decent geek does almost without thinking, that is, to cast the net as broad as possible and then filter it for "interesting" items to either action now, later, or to pass on to another. It's good to think about all the things you could/should do, but then you have to prune to the things that you &lt;span style="font-style: italic;"&gt;realistically&lt;/span&gt; can do, and then prioritise actually doing them. This helps triage between things that you vaguely think would be a good idea, and the things that you actually should do.&lt;br /&gt;&lt;br /&gt;And if you keep on &lt;span style="font-style: italic;"&gt;getting things done&lt;/span&gt;, then you're guaranteed to be better off than if you hadn't done anything at all, and ideally this should build momentum in your personal life for getting the things that you want.&lt;br /&gt;&lt;br /&gt;Lastly, don't forget to add "do nothing" to your immediate todo list every now and then... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-1212615367375287742?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/1212615367375287742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=1212615367375287742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1212615367375287742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1212615367375287742'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2008/04/getting-things-done.html' title='Getting things done'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-4661011636549508510</id><published>2008-04-17T16:47:00.001-07:00</published><updated>2008-04-20T05:56:09.077-07:00</updated><title type='text'>musings on the latest in CAPTCHA technology...</title><content type='html'>&lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;with the recent  reports of bots being able to crack the CAPTCHA's on &lt;a href="http://securitylabs.websense.com/content/Blogs/2907.aspx"&gt;windows live&lt;/a&gt;  and&lt;a href="http://securitylabs.websense.com/content/Blogs/2919.aspx"&gt;  gmail&lt;/a&gt;, the cutting edge in human recognition has shifted to the next  generation of image recognition combined with advanced  heuristics.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;the first example is  kitten auth, one example of using an AI hard problem to defeat captcha bots,  using a database of cute furry kittens to detect humans:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a href="http://www.thepcspy.com/contact"&gt;http://www.thepcspy.com/contact&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;also good is hot  captcha, backed by the hot or not database&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a href="http://www.hotcaptcha.com/"&gt;http://www.hotcaptcha.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;both of these  schemes use a grid of 9 images, 3 of which are of the target (either hot, or a  kitten, depending on auth scheme). Using the combinatorial formula 9 choose 3  where ordering isn't relevant, we get a random probability of choosing the  correct 3 images of 1 in 386 (point who cares...). So if you combine hotcaptha  or kitten auth with an IP-blocking scheme where say, you have a pool  of blocked IP's, after three failed attempts you add that IP to the pool which  expires after a given timeout (half an hour?).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Then a random bot  will have a 1 / 128 chance of cracking your captcha, a success rate of less than  1%, which is probably enough for most spam bots, but better than the 15% sucess  rate for the latest round of captcha bots against OCR captchas.  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;To attack this  captcha, it would help if you had... , oh say a  &lt;a href="http://en.wikipedia.org/wiki/Storm_botnet"&gt;massively distributed  botnet&lt;/a&gt; at your disposal and some kind of distributed multimedia database to  record the random correct categorisation of images to improve your hit  rate. you would end up duplicating the multimedia database of the target  captcha, but once you did your hit rate would climb towards 100%.  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;So at the end of the  day even these kinds of captchas are vulnerable, but would be good as a failover  from your regular captcha mechanism in the event it gets  broken...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;what we really need  is some kind of open-ended input based on an image that relies on human "common  sense". eg - a picture of george bush where 'miserable failure', 'ass-muppet' or  'clown' would be valid inputs to verify a human being. We're stuck in an arms  race, and as long as spam is profitable spammers will be paying crackers to do  AI...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;(note: this is all  written with tongue very firmly in cheek... ;-p )&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="874425522-17042008"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-4661011636549508510?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/4661011636549508510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=4661011636549508510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4661011636549508510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4661011636549508510'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2008/04/musings-on-latest-in-captcha-technology.html' title='musings on the latest in CAPTCHA technology...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-3369840735660251966</id><published>2007-12-19T22:15:00.000-08:00</published><updated>2007-12-19T22:32:19.083-08:00</updated><title type='text'>Refactoring from EJB's to Spring &amp; Hibernate, part I</title><content type='html'>As part of our infrastructure we have some "legacy" EJB applications. As usual these are slow, hard to test, hard to maintain, etc etc. As a result we'd like to refactor them to use Spring/Hibernate. One of these applications is a proprietary monster that it's easier to throw away and rewrite (one of the few occasions where I will agree to the rewrite over refactor path, it's that bad!!), the other two are prime candidates for refactoring: we  own the source and we control their lifecycle.&lt;br /&gt;&lt;br /&gt;I hope to post a few more articles on our experiences as we go along, but in the meantime here's some reading on other peoples experiences:&lt;br /&gt;&lt;br /&gt;First, lets review EJB's, the why and wherefore..&lt;br /&gt;http://dynamicsemantics.blog-city.com/abriefhistoryofejb.htm&lt;br /&gt;&lt;br /&gt;Example with a single entity application:&lt;br /&gt;http://kaksles.org/2007/08/11/how-to-migrate-a-legacy-ejb-application-to-spring-and-hibernate/&lt;br /&gt;&lt;br /&gt;High-level overview of the process :&lt;br /&gt;http://kaksles.org/2007/08/11/why-migrate-a-legacy-ejb-application-to-spring-and-hibernate/&lt;br /&gt;&lt;br /&gt;Story of migrating a large application:&lt;br /&gt;http://jdj.sys-con.com/read/140097_p.htm&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-3369840735660251966?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/3369840735660251966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=3369840735660251966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/3369840735660251966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/3369840735660251966'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/12/refactoring-from-ejbs-to-spring.html' title='Refactoring from EJB&apos;s to Spring &amp; Hibernate, part I'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-7940504036881772684</id><published>2007-12-19T20:57:00.000-08:00</published><updated>2007-12-19T22:15:18.539-08:00</updated><title type='text'>debugging SQL statements from EJB's</title><content type='html'>EJB's...(sigh!) I don't know what the ejb community was thinking when they went off onto this tangent. Granted that in the narrow domain of systems that genuinely need distributed transactions and tiers, and compared to the alternatives at the time for transaction management &amp;amp; ORM (CORBA &amp;amp; nothing), EJB was good.&lt;br /&gt;It could have been a lot better if not for standard-itis and if SUN had thought for 5 minutes about what most applications need (instead of how they could cash in), but it (++sh) happens. The problem then was every man and his dog j2ee developer going off and architecting systems with no distributed requirements at all with full-blown EJB architecture and every J2ee pattern in the catalogue. Enter the current breed of "legacy" applications less than ten years old...&lt;br /&gt;&lt;br /&gt;Anyway, if you are in the situation of wanting a non-proprietary way to see what SQL the container is producing on your behalf, then you're in trouble, it's not as easy as saying show_sql=true.&lt;br /&gt;&lt;br /&gt;Having just dug around on this topic, here's my two cents:&lt;br /&gt;1) use &lt;a href="http://log4jdbc.sourceforge.net/"&gt;Log4JDBC&lt;/a&gt;&lt;br /&gt;this is really the premier solution, Log4jdbc wraps your jdbc driver transparently, and you can fully configure the logging via standard log4j xml. The caveat with this method is that you need to keep in mind that the JDBC driver will be loaded in to a different ClassLoader than your application, and you need to be aware of this because it can cause some strange errors otherwise.&lt;br /&gt;The basic idea with log4j is to replace all references in your config (you don't configure your Datasources in code, do you?) to your JDBC driver with the log4jdbc driver, and prepend the jdbc url with "jdbc:log4". then configure your logging and you're away!&lt;br /&gt;This method is preferred, but can take a bit of configuring and hacking if you're many levels removed from the DriverManager, eg - in a managed environment.&lt;br /&gt;&lt;br /&gt;2) The retarded cousin...&lt;br /&gt;decompile your JDBC driver with JAD or similar, then *manually* add in logging statements to print SQL and parameters, then replace your existing driver with this hack version. This is an ugly hack and should only be used in the absolute last resort where all else has failed.&lt;br /&gt;&lt;br /&gt;Ideally *any* SQL abstraction should allow the printing of the SQL it generates as it executes, to allow debugging and profiling, but unfortunately it's not always possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-7940504036881772684?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/7940504036881772684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=7940504036881772684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7940504036881772684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7940504036881772684'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/12/debugging-sql-statements-from-ejbs.html' title='debugging SQL statements from EJB&apos;s'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-3387898892081925914</id><published>2007-12-19T16:09:00.001-08:00</published><updated>2007-12-19T16:09:35.998-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java profiling'/><title type='text'>Java Sizeof() &amp; sessions</title><content type='html'>&lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;I've just been doing  some stuff to optimise our infrastructure to stop it calling an external ejb 6  times per request, which I fixed by sticking stuff in the session. there's  similar problems in other places in our app and I was thinking about sticking  them in the session as well, but then the issues of session size/scalability  &amp;amp; stale data stopped me.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;long story short, I  found some interesting stuff on reinventing the sizeof operator for java. in C  you use it all the time, but in java such a thing doesn't exist. Now, you could  go and profile your application, but that usually takes a bit of setting up, and  if you want to instrument your app in production then it doesn't really work so  good.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Anyhoo, here's three  interesting links on the topic of figuring out how big objects in java are in  general, and session size in particular:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;[1] how big are  primitives? brute force approach, useful for boot-strapping&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a title="http://www.javaworld.com/javaworld/javatips/jw-javatip130.html" href="http://www.javaworld.com/javaworld/javatips/jw-javatip130.html"&gt;http://www.javaworld.com/javaworld/javatips/jw-javatip130.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;[2] Article  developing the issue and source of tool to get a good (approximate) idea of the  size of an arbitrary rooted graph.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a title="http://www.javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html" href="http://www.javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html"&gt;http://www.javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;[3] Java web parts  helper class to determine size of your session&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span class="429100706-19122007"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;a title="http://javawebparts.sourceforge.net/javadocs/javawebparts/session/SessionSize.html" href="http://javawebparts.sourceforge.net/javadocs/javawebparts/session/SessionSize.html"&gt;http://javawebparts.sourceforge.net/javadocs/javawebparts/session/SessionSize.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-3387898892081925914?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/3387898892081925914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=3387898892081925914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/3387898892081925914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/3387898892081925914'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/12/java-sizeof-sessions.html' title='Java Sizeof() &amp; sessions'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-4838366303812117213</id><published>2007-12-19T16:02:00.000-08:00</published><updated>2007-12-19T16:08:58.658-08:00</updated><title type='text'>and we're back...!</title><content type='html'>Ok I haven't posted for awhile, it's been pretty hectic with the new job. I've got a few posts in draft mode that I haven't had the chance to get to a point where I could publish them. They're coming, but in the meantime there's a few interesting thoughts that I thought I'd put up, so there may be some posts out-of-order coming up. ah well!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-4838366303812117213?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/4838366303812117213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=4838366303812117213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4838366303812117213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/4838366303812117213'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/12/and-were-back.html' title='and we&apos;re back...!'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-1947677471159914579</id><published>2007-09-03T21:28:00.000-07:00</published><updated>2008-05-15T10:04:43.360-07:00</updated><title type='text'>Essentials for the first day at your new job...</title><content type='html'>Ok, so you've decided that you're not happy at your old job, you've looked around and found a totally kick-ass firm to work for, and it's your first day. now what?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;dress up. you should have a good idea what everyone dresses like from when you came for the interview. dress above this mark, you can always come down later. first impressions count.&lt;/li&gt;&lt;li&gt;bring a pen and a notebook. The learning curve is gonna be steep, and a lot of knowledge is going to be dropped by you on your first few days, you'll need to write it down. Don't wait to raid the stationary cupbaord, bring your own.&lt;/li&gt;&lt;li&gt;Forms filled out. There's a million pieces of paper to get started on their way through the system, bank account details, next of kin, super, disclaimers, medical declarations etc. Fill them out the night before and bring them with you. the sooner you hand them in, the sooner your pay will arrive...;-p&lt;/li&gt;&lt;li&gt;ID. All that paperwork will probably need verification, so bring the requisite 100 points of ID, which is usually a drivers licence and passport or birth certificate.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;if you're starting in a position that requires security clearance, then you'll need 5- or 10 years worth of history, some places may require this before you start, some may let you provide it after you start, play it by ear.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Don't bring lunch. Carrying food will slow you down, plus you don't know where to put it yet. just bring tucker money, it's a good excuse to go out to lunch with a colleague.&lt;/li&gt;&lt;li&gt;Most importantly, get a good nights sleep the night before. You'll need it!&lt;/li&gt;&lt;/ul&gt;Ok, on day two you can start to enscounce yourself a bit...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bring your lunch today, now that you know where the staff fridge is...;-p&lt;/li&gt;&lt;li&gt;start setting up your environment, this includes your favorite utilities and programs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;bring some music. you may be lucky enough that they have a shared music drive somewhere, othewise you'll have to provide for yourself. depending on the corporate environment you may need to keep it all on a portable HD for quick removal...&lt;/li&gt;&lt;li&gt;bring in your personal coffee mug&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;What I haven't mentioned is day zero, before you start it's a good idea to come in, meet &amp;amp; greet (if you haven't already), but most importantly ask about your login profiles. If these can be kicked off before you start then you can be sure of doing something practical on your first day. otherwise you'll be twiddling your thumbs waiting for help desk to get back to you...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-1947677471159914579?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/1947677471159914579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=1947677471159914579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1947677471159914579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1947677471159914579'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/09/essentials-for-first-day-at-your-new.html' title='Essentials for the first day at your new job...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-5331371563169019574</id><published>2007-08-18T12:59:00.001-07:00</published><updated>2007-08-18T19:45:22.172-07:00</updated><title type='text'>Mandatory Reading</title><content type='html'>These are the blogs and articles that have shaped my thinking as a software engineer, and helped influence my professional values and attitudes. I think they should be compulsory reading for any neophyte hackers to get a solid grounding in the Tao of hacking...&lt;br /&gt;&lt;br /&gt;MS Junkies will notice that this list is heavily biased towards all things *nix. this is not an accident and I don't apologise.&lt;br /&gt;&lt;br /&gt;#1 - &lt;a href="http://www.joelonsoftware.com/Archive.html"&gt;Joel on Software&lt;/a&gt;&lt;br /&gt;the original. I was reading joel when i was still at uni. it took me a *long* time to get through his archive, but i finally did it, and it worth it. You should too. This gives you solid software design plus insight into some of the ways software companies (should) work, and treat their geeks.&lt;br /&gt;&lt;br /&gt;#2 - &lt;a href="http://www.randsinrepose.com/"&gt;Rands in Repose&lt;/a&gt;&lt;br /&gt;ditto, but less on the engineering side, and more on the management side. lots of good stuff here that will serve you in good stead if you work for a bunch of soulless suits.&lt;br /&gt;&lt;br /&gt;#3 - &lt;a href="http://catb.org/%7Eesr/writings/taoup/html/"&gt;The Art of Unix Programming&lt;/a&gt;&lt;br /&gt;Years before XP had a name, unix hackers were already doing it. may need to filter some of the rhetoric but.&lt;br /&gt;&lt;br /&gt;#4 - &lt;a href="http://catb.org/%7Eesr/writings/cathedral-bazaar/"&gt;The cathedral &amp; the bazaar&lt;/a&gt;&lt;br /&gt;ditto.&lt;br /&gt;&lt;br /&gt;#5 - &lt;a href="http://catb.org/%7Eesr/faqs/smart-questions.html"&gt;How to ask questions the smart way&lt;/a&gt;&lt;br /&gt;this should actually be higher in the list. If you ever want to post a question on a forum or a mailing list, then you *need* to read this, in detail. then apply it. or be prepared to get STFW &amp;amp; RTFM'd.&lt;br /&gt;&lt;br /&gt;#6 - &lt;a href="http://www.catb.org/%7Eesr/faqs/hacker-howto.html"&gt;How to become  a Hacker&lt;/a&gt;&lt;br /&gt;This is your pathway to technical development. I'm not talking about keeping up with maven, or spring, or GRails or the latest fad. I mean the solid things that will make you a fundamentally better programmer, regardless of your toolset. coming back to this after a few years I can recognise it's fundamental truth. you need to learn a few different languages, so that you can appreciate the essence of solving a problem abstracted from the details of your particular language or tool. At the very least you'll learn how to learn, which will help when Java &amp; .Net get made obsolete by the Next Big Thing, and we all have to learn how to write code in FORTRAN 3000.&lt;br /&gt;Interesting sidebar here, I read a while back that all modern programming languages were slowly evolving to become more like lisp. at the time I mocked this, but slowly I'm seeing it be more and more true. Compare Java to Ruby, then compare both to lisp, and the progression is obvious.&lt;br /&gt;&lt;br /&gt;#7 - &lt;a href="http://positivesharing.com/"&gt;Positive Sharing&lt;/a&gt;&lt;br /&gt;And after all that hardcore techo stuff, finally be happy &amp;amp; passionate about what you do, otherwise everything else is just chasing after the wind. The signal-to-noise on this one is a bit higher than the average, but if you start at the popular posts and work out, then you'll do well.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ps - &lt;a href="http://catb.org/%7Eesr/writings/unix-koans/index.html"&gt;Rootless Root&lt;/a&gt; and &lt;a href="http://www.canonical.org/%7Ekragen/tao-of-programming.html"&gt;the Tao of Programming&lt;/a&gt;, it's just fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-5331371563169019574?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/5331371563169019574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=5331371563169019574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/5331371563169019574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/5331371563169019574'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/08/mandatory-reading.html' title='Mandatory Reading'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-2489056562820493606</id><published>2007-08-18T12:40:00.001-07:00</published><updated>2007-08-18T12:51:43.745-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Development tools I'm currently using...</title><content type='html'>unlike the previous three lists, the status of these items is fragile and depends solely on the fact that at the moment they fill a niche, but they're not compelling. These are the tools that roll up the building blocks into something that I can use.&lt;br /&gt;&lt;br /&gt;#1 - &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt;&lt;br /&gt;Apparently it's the nicest IDE around, but it doesn't seem that smart to me. Good enough.&lt;br /&gt;&lt;br /&gt;#2 - &lt;a href="http://tora.sourceforge.net/"&gt;TOra - Toolkit for Oracle&lt;/a&gt;&lt;br /&gt;Free Open-Source. GUI PL/SQL client for oracle. Extremely fast (written in C++), uses QT Library by Trolltech.  Only shame is that it's still buggy in some area's (some instability, BLOB &amp;amp; error handling poor), otherwise very full-featured and *quick*! Unfortunately not actively maintained currently...&lt;br /&gt;&lt;br /&gt;#3 - &lt;a href="http://www.oracle.com/technology/products/database/sql_developer/index.html"&gt;Oracle SQL Developer&lt;/a&gt;&lt;br /&gt;When Tora runs out of horsepower, you can always trust SQL Developer to come through. It's often fast enough, but as it's written in Java it's a big memory hog, which I often prefer to avoid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-2489056562820493606?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/2489056562820493606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=2489056562820493606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2489056562820493606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/2489056562820493606'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/08/development-tools-im-currently-using.html' title='Development tools I&apos;m currently using...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-5695929352446839161</id><published>2007-08-18T09:08:00.000-07:00</published><updated>2007-08-18T10:03:58.460-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Firefox and Thunderbird extensions I can't live without...</title><content type='html'>this list isn't as big as my utils list, as FF2.0 &amp; TB2.0 are pretty good out-of-the-box.&lt;br /&gt;&lt;br /&gt;Firefox:&lt;br /&gt;&lt;br /&gt;#0 - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/775"&gt;MR Tech disable XPI delay&lt;/a&gt;&lt;br /&gt;one extension to rule them all!&lt;br /&gt;&lt;br /&gt;#1 - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1865"&gt;Adblock plus&lt;/a&gt;&lt;br /&gt;The web without ads, it's like a breath of fresh air...&lt;br /&gt;&lt;br /&gt;#2 - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/173"&gt;Gmail notifier&lt;/a&gt;&lt;br /&gt;the integration is nice, very unobtrusive.&lt;br /&gt;&lt;br /&gt;#3 - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1249"&gt;Restart Firefox&lt;/a&gt;&lt;br /&gt;"hmm, FF is over 300mb of ram, time for a re-start..."&lt;br /&gt;&lt;br /&gt;#4 - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/623"&gt;Plain Text To Link&lt;/a&gt;&lt;br /&gt;I got so sick of ctrl-c,ctrl-t,ctrl-v. this does it in 2 clicks.&lt;br /&gt;&lt;br /&gt;#5 - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/112"&gt;LastTab&lt;/a&gt;&lt;br /&gt;Firefox should work this way in the first place&lt;br /&gt;&lt;br /&gt;#6 - DOM Inspector (default, but still...)&lt;br /&gt;&lt;br /&gt;#7 - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60"&gt;Web Developer Toolbar&lt;/a&gt;&lt;br /&gt;Indispensible for hacking websites. However I'm being rapidly seduced by &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thunderbird:&lt;br /&gt;#1 - &lt;a href="https://addons.mozilla.org/en-US/thunderbird/addon/1064"&gt;miniBird theme&lt;/a&gt;&lt;br /&gt;oh yeah, test out your vision with this 5x5 icon set...;-p min to the max!&lt;br /&gt;&lt;br /&gt;#2 - &lt;a href="https://addons.mozilla.org/en-US/thunderbird/addon/562"&gt;Display Mail User Agent Extension&lt;/a&gt;&lt;br /&gt;hmmm, what mail client are you using?&lt;br /&gt;&lt;br /&gt;#3 - &lt;a href="http://en.www.mozilla.com/en/thunderbird/dictionaries.html"&gt;English (au) dictionary&lt;/a&gt;&lt;br /&gt;(sigh) I love the way americans assume everyone uses US english.&lt;br /&gt;&lt;br /&gt;#4 - &lt;a href="https://addons.mozilla.org/en-US/thunderbird/addon/611"&gt;Signature switch&lt;/a&gt;&lt;br /&gt;only use that crappy corporate signature when you *absolutely* have to!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-5695929352446839161?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/5695929352446839161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=5695929352446839161' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/5695929352446839161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/5695929352446839161'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/08/firefox-and-thunderbird-extensions-i.html' title='Firefox and Thunderbird extensions I can&apos;t live without...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-6831188970775598898</id><published>2007-08-18T05:58:00.000-07:00</published><updated>2007-08-18T12:58:33.984-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Tools I can't live without...</title><content type='html'>I'm talking software here. The tools of the trade that I use everyday to make life easier for me to write code, administer servers &amp; generally hack about. Note these aren't specifically dev tools, and in fact most of them aren't. The few that can be used that way are highly generic (textpad).&lt;br /&gt;&lt;br /&gt;Having composed this list, I notice that the common theme among most of these tools is that most of the time they work so well I don't even notice that I'm using them. they just work. I'm not constantly stressing because they annoy me, they just do what i ask, then they get out of the way. &lt;a href="http://www.randsinrepose.com/archives/2006/10/31/bright_patient_design.html"&gt;Bright, patient design&lt;/a&gt; as rands would say...&lt;br /&gt;&lt;br /&gt;Granted there's always a learning curve, and sometimes a bit of config'ing, but once that's done I don't have to think about it again, unless I want to change something. When things work well enough, you shouldn't even be aware of how well they work.&lt;br /&gt;&lt;br /&gt;#1 - &lt;a href="http://en.www.mozilla.com/en/firefox/"&gt;Firefox&lt;/a&gt;.&lt;br /&gt;ok! I admit it! I can't live without Firefox!!! I tried (see opera post), but I keep coming back to some &lt;a href="https://addons.mozilla.org/firefox/addon/60"&gt;plugin &lt;/a&gt;I &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;need &lt;/a&gt;or website that just won't work in opera, and I come back to FF. ok it's got some problems (=memory hog), but regular restarts and an extension diet can fix that. Firefox rules!&lt;br /&gt;&lt;br /&gt;#2 - &lt;a href="http://en.www.mozilla.com/en/thunderbird/"&gt;Thunderbird&lt;/a&gt;&lt;br /&gt;I've tried Outlook, I've tried Lotus notes, I've tried Evolution, and nothing compares to TB. it just works. It's got a few rough edges, and the calender still sucks, but for what it's designed to do (read email). It's faster &amp;amp; simpler than anything else that can compete on features. TB rocks!&lt;br /&gt;&lt;br /&gt;#3 - &lt;a href="http://launchy.net/"&gt;Launchy&lt;/a&gt;&lt;br /&gt;Wow. what else can I say? Launchy is a breed apart, it's freed me from the start menu, and decreased the cost of context-switching. It's so good I actually paid for it!! (and this is FREE software!) and I regularly want to pay more for it, it's that good. Download it, use it, love it.&lt;br /&gt;&lt;br /&gt;#4 - &lt;a href="http://www.microsoft.com/technet/sysinternals/Utilities/ProcessExplorer.mspx"&gt;Process Explorer&lt;/a&gt;&lt;br /&gt;Whenever some crappy app dies and goes unresponsive, or I need to see what's saoking all my resources, ProcExp is indispensible. I also use &lt;a href="http://www.microsoft.com/technet/sysinternals/SystemInformation/Autoruns.mspx"&gt;autoruns &lt;/a&gt;&amp; &lt;a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/Filemon.mspx"&gt;Filemon&lt;/a&gt;, but not nearly so much. If ProcExp isn't running then I just don't feel safe. Need to kill-restart explorer? ProcExp is your friend. kudos to Mark Russinovich for being such a legend, and continuing to be legend despite &lt;a href="http://www.microsoft.com/presspass/press/2006/jul06/07-18WinternalsPR.mspx"&gt;being beamed aboard the Mother Ship&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;#5 - &lt;a href="http://bb4win.sourceforge.net/bblean/"&gt;BBLean&lt;/a&gt;&lt;br /&gt;This is an Explorer Shell Replacement, and really in a category of it's own. I don't use it directly, but it allows me to fully distance myself from MS's cruddy &amp;amp; crufty shell as it completely replaces explorer.exe &lt;span style="font-style: italic;"&gt;as your shell&lt;/span&gt;. this saves me from having to go through all the pain of explorer freezing out on me, and the painfully slow start menu. Now when I have to use the start menu (which i rarely have to use, thanks to Launchy!), it's blazingly fast, instead of painfully slow. the benefit of bblean is indirect, in that you never notice it saving you time, until you use a PC that still has the windows shell and you remember how painful it was.&lt;br /&gt;&lt;br /&gt;#6 - Generic File manager&lt;br /&gt;I can't recommend a specific tool here, there are so many and no  really shine. However all of them aren't Windows Explorer &lt;span style="font-style: italic;"&gt;the file manager&lt;/span&gt;, so they all get a big plus! They all have extra functionality lacking from WE (multiple panes, tabs etc), and aren't &lt;span style="font-style: italic;"&gt;as&lt;/span&gt; prone to random freezing. They still use the windows components behind the scenes, so this is a marginal improvement. I'm currently using &lt;a href="http://zabkat.com/"&gt;XPlorer2&lt;/a&gt;, and before that I was using &lt;a href="http://www.mustangpeak.net/subdomains/ultraexplorer/index.html"&gt;Ultra Explorer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;#7 - &lt;a href="http://sourceforge.net/projects/console/"&gt;Console &lt;/a&gt;CLI shell&lt;br /&gt;the interface to CMD.exe suxx0rs. Console just makes it nice, I love that it's now easy to highlight select-copy/paste text, and resizing is just a breeze! plus tabs are nice...;-p&lt;br /&gt;&lt;br /&gt;#8 - &lt;a href="http://www.textpad.com/"&gt;Textpad&lt;/a&gt;&lt;br /&gt;though I'm being swayed by &lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm"&gt;Notepad++&lt;/a&gt;, textpad is fast &amp; just works. Ol' reliable. Also, being able to open 100MB log files without chugging out is a big plus!&lt;br /&gt;&lt;br /&gt;#9 - &lt;a href="http://www.7-zip.org/"&gt;7zip&lt;/a&gt;&lt;br /&gt;First winzip, then winRar, now 7zip. open source, clean, fast. nuff' said.&lt;br /&gt;&lt;br /&gt;#10 -&lt;a href="http://keepass.info/"&gt; Keepass Password Safe&lt;/a&gt;&lt;br /&gt;I need access to a lot of servers/databases/applications/web sites etc, keepass makes keeping all that info forever &lt;span style="font-style: italic;"&gt;securely&lt;/span&gt; just a breeaze. No more lost passwords, no more security worries#1&lt;br /&gt;&lt;br /&gt;#11 - &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt;&lt;br /&gt;simple &amp; easy to use SVN client. low impact.&lt;br /&gt;&lt;br /&gt;#11a - &lt;a href="http://winmerge.org/"&gt;Winmerge&lt;/a&gt;&lt;br /&gt;the diff/merge tool par excellence. and open-source too. tortoise + winmerge is &lt;span style=""&gt;muy bueno!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#12 - &lt;a href="http://www.gadwin.com/printscreen/"&gt;Gadwin Printscreen&lt;/a&gt;&lt;br /&gt;about a million times a day I need to grab a quick screeny of something, or measure the width of a html field. Printscreen is perfect for this. It replaces the standard windows functionality, so all I notice is that taking screenshots is a *lot* easier!&lt;br /&gt;&lt;br /&gt;#13 - &lt;a href="http://w3.win.tue.nl/nl/onderzoek/onderzoek_informatica/visualization/sequoiaview/"&gt;Sequoia View&lt;/a&gt;&lt;br /&gt;"Where's all my disk space gone!?! oh, there it is..."&lt;br /&gt;&lt;br /&gt;#14 - &lt;a href="http://www.foxitsoftware.com/pdf/rd_intro.php"&gt;FoxIt PDF Reader&lt;/a&gt;&lt;br /&gt;"hmm, lets open this tiny little 20k pdf.. oh no Acrobat Reader is loading every plugin known to man, it's gonna take a hour to start!". you can either &lt;a href="http://www.theinquirer.net/?article=11041"&gt;fight Reader&lt;/a&gt;, or just ignore it. FoxIt is fast, and only loads the plugins you need, when you need them.&lt;br /&gt;&lt;br /&gt;#15 - &lt;a href="http://unxutils.sourceforge.net/"&gt;Unix Utils for windows&lt;/a&gt;&lt;br /&gt;added to a directory in the PATH, this makes simple things even easier, and allows a consistent *nix-y feel to the CLI even on windoze...&lt;br /&gt;&lt;br /&gt;#16 - &lt;a href="http://www.uvnc.com/"&gt;UltraVNC&lt;/a&gt;&lt;br /&gt;only the best implementation of VNC client/server that runs on the windows platform. much more reliable than TightVNC I've found.&lt;br /&gt;&lt;br /&gt;#17 - &lt;a href="http://www.chiark.greenend.org.uk/%7Esgtatham/putty/"&gt;Putty&lt;/a&gt;&lt;br /&gt;The unsung hero of the network admin &amp;amp; DBA. Half the internet would stop without putty. Muchos Gracias Simon Tatham!&lt;br /&gt;&lt;br /&gt;#18 - &lt;a href="http://winscp.net/eng/index.php"&gt;WinSCP&lt;/a&gt;&lt;br /&gt;For a generic, user-friendly ftp/sftp/scp gui client that *just works*, winscp is the bomb. nuff said.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-6831188970775598898?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/6831188970775598898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=6831188970775598898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/6831188970775598898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/6831188970775598898'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/08/tools-i-cant-live-without.html' title='Tools I can&apos;t live without...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-9104689213012666706</id><published>2007-06-11T10:21:00.000-07:00</published><updated>2007-06-11T10:27:37.851-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='canberra'/><title type='text'>Canberra Craziness...</title><content type='html'>Things I expected moving to Canberra:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the cold (this includes cold toilet seats)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;traffic&lt;/li&gt;&lt;li&gt;increased living costs&lt;/li&gt;&lt;/ul&gt;Things I didn't expect:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;in Darwin the birds fly in the air, in Canberra for some reason they all seem to want to sit on the ground and eat the dirt. Must be stray radiation from Parliament House...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the static electricity. In Darwin it's so humid &lt;i&gt;all&lt;/i&gt; the time that you really have to work hard to get a charge up. In Canberra moving in the car seat is enough, so everytime I get out of the car I get zapped. It's new every time...&lt;/li&gt;&lt;li&gt;The drought, it really is pretty bad down here. I've never had to conceptualise water restrictions before, and it's still strange to me.&lt;/li&gt;&lt;/ul&gt;I think there were a few others that I've forgotten, but c'est la vie! &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-9104689213012666706?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/9104689213012666706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=9104689213012666706' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/9104689213012666706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/9104689213012666706'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/canberra-craziness.html' title='Canberra Craziness...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-7881705377247289113</id><published>2007-06-11T09:59:00.000-07:00</published><updated>2007-06-11T10:20:10.484-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='active directory'/><category scheme='http://www.blogger.com/atom/ns#' term='printers'/><title type='text'>HOWTO: assign Color &amp; B+W printing permissions</title><content type='html'>Problem:&lt;br /&gt;You have a printer that uses expensive color ink, and you (are asked by management to) restrict access to the colour ink to a small group of users (the managers), while still allowing other users to print B+W.&lt;br /&gt;&lt;br /&gt;Solution:&lt;br /&gt;This solution relies on obtaing two different drivers for your printer, one that &lt;a href="http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareDescription.jsp?lang=en&amp;cc=us&amp;prodTypeId=18972&amp;prodSeriesId=445194&amp;prodNameId=445197&amp;swEnvOID=1005&amp;swLang=8&amp;mode=2&amp;taskId=135&amp;swItem=ly-36470-2"&gt;only prints in Black &amp; White&lt;/a&gt;, &amp;amp; another&lt;a href="http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareDescription.jsp?lang=en&amp;cc=us&amp;prodTypeId=18972&amp;prodSeriesId=445194&amp;prodNameId=445197&amp;swEnvOID=1005&amp;swLang=8&amp;mode=2&amp;taskId=135&amp;swItem=ly-36433-2"&gt; that prints in color&lt;/a&gt;. The printer in this example is a HP COlor LaserJet 2840, for which said drivers can be downloaded from the HP website.&lt;br /&gt;&lt;br /&gt;There's different ways of doing this, and this method isn't perfect (I can think of several workarounds), but if you have the usual n00b users then it'll work perfectly...:-)&lt;br /&gt;&lt;br /&gt;Download the vanilla &amp; B+W drivers &amp;amp; create  the printer port on the FPS (File-Print-Server, assuming Server 2k3/XP) manually by using the add-printer wizard, selecting Local Printer-&gt;TCP/IP port-&gt;enter hostname.&lt;br /&gt;&lt;br /&gt;First install the B+W drivers and configure a printer from the printer port (last step), when the wizard asks you for the drivers browse to where the B+W driver installed itself, name this printer "MakerModelB+W" or similar.&lt;br /&gt;&lt;br /&gt;Now install the vanilla drivers that allow color printing, and create a printer from the port, but this time using the color drivers. Congratulations! you now have two virtual links to the same machine, one that will always print color, on that will always print B+W.&lt;br /&gt;&lt;br /&gt;Now open 'Active Directory Users &amp; Computers", browse to your Groups node, and create a group called "Colour Printer Users" or similar, add a few people (yourself &amp;amp; the managers).&lt;br /&gt;&lt;br /&gt;Go back to the two printers and configure printer sharing. Give printing rights on the B+W printer to your main User group ("Staff" or whatever), then go to the color printer, remove "Everyone" and add the Color printing group from the last step.&lt;br /&gt;&lt;br /&gt;Congratulations! Now you've got a mechanism for letting some users print color, while restricting everyone else to B+W! now just add the printers to your login script with a check for the color group so that they get the color mapping instead and you're done!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-7881705377247289113?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/7881705377247289113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=7881705377247289113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7881705377247289113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7881705377247289113'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/howto-assign-color-bw-printing.html' title='HOWTO: assign Color &amp; B+W printing permissions'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-1578422091854747343</id><published>2007-06-11T09:40:00.000-07:00</published><updated>2007-06-11T09:59:03.925-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='printers'/><title type='text'>state of the art user interfaces (pt 2)</title><content type='html'>(installs printer...)&lt;br /&gt;this experience wasn't so bad. the instructions were pretty good, step-by-step for idiots. There were a few gaps between what was in the tute and reality (eg-there's two piece's of sticky tape on the base not in the tute and I can't figure out how to get them off), but no show stoppers in plugging everything in and inserting the ink cartridges.&lt;br /&gt;&lt;br /&gt;It was obvious that the box team had been at the ink cartridges and internals as well, everything had guidelines and pretty pictures for the technically challenged (like me!), so that was a good experience. One thing lacking was some audio on the CD-ROM tutorial, as well as the ability for it to scale, the tutorial is a pre-packaged presentation about 600px by 480px that can't be resized, or rewound, so usability is a bit limited, but the content was good. pretty pictures and exploded diagrams everywhere.&lt;br /&gt;&lt;br /&gt;The big failing wasn't the hardware though, it was the software. Installing the drivers was a bit of a pain as the supplied disks don't support Server 2k3, which is a bit retarded considering this is a mid-range network printer, and you would expect it to be deployed as a shared printer from a 2k3 instance.&lt;br /&gt;&lt;br /&gt;Had to download the drivers from HP, the B+W &amp; vanilla  drivers and install them manually. This took a couple of goes, but not because of HP. That'll be in a coming-soon blog.&lt;br /&gt;&lt;br /&gt;Overall? It's a nice machine, very functional. can't comment on the price cos I wasn't involved in that stage. The most noticeable thing about it though, is that in operation it is *LOUD*! When you print you can hear every gear and cog inside grinding away and wheezing. This printer needs to be away from people or else it will drive them fair up the wall!! &lt;br /&gt;&lt;br /&gt;A close second is how slow it is, the quotes of about 7ppm is pretty close, if not a bit high, if you don't expect high performance then you won't be disappointed! ;-p&lt;br /&gt;&lt;br /&gt;How I managed to separate color &amp;amp; B+W printing permissions will be in another blog...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-1578422091854747343?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/1578422091854747343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=1578422091854747343' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1578422091854747343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1578422091854747343'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/state-of-art-user-interfaces-pt-2.html' title='state of the art user interfaces (pt 2)'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-1557438234322333479</id><published>2007-06-10T12:19:00.000-07:00</published><updated>2007-06-10T14:04:15.273-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='opera'/><title type='text'>Survival of the fittest...(browser)</title><content type='html'>The Browser war is dead, Long Live the Browser war!!&lt;br /&gt;&lt;br /&gt;I'm going back to Opera after a long hiatus. I've come to the conclusion that for actually  the net, as opposed to developing web pages etc Opera just leaves FF for dead. it's so much nicer to use day to day, it's pretty, smooth,&lt;span style="font-style: italic;"&gt; *fast&lt;/span&gt;* and it comes in the box with features that you need to muck around installing extensions in FF. Also the fact that I can have both browser &amp; mail client in less memory footprint than either FF or TB.&lt;br /&gt;&lt;br /&gt;I first got on the net in '98 or so, I stayed with IE long enough to discover that netscape existed. These were the bad old days when 56k was fast, and everything had to go around on floppy disks. Netscape had tabs and wasn't MS, that was enough for me. I stayed with NN until '03 when a friend introduced me to Opera 7, and I fell in love with its slick goodness. But that didn't last long as Firefox pre-release 0.9 came along shortly, was faster, lighter &amp;amp; had more functinality available through extensions, so that was a done deal.&lt;br /&gt;&lt;br /&gt;Well, 4 years later here I am, going back to Opera. Why? Well for a while now I've been having issues with FF+TB taking up a lot of memory and slowing down. yes I run a few extensions, but not that much! I was toying with &lt;a href="http://lynx.isc.org/lynx2.8.5/index.html"&gt;Lynx&lt;/a&gt; &amp; &lt;a href="http://www.washington.edu/pine/"&gt;Pine&lt;/a&gt;, and was impressed with the whole command-line test-only browser thing(fast!!). Searching for a modern equivalent of lynx gave a big fat blank except for a few comments about using Opera in text-only mode.&lt;br /&gt;&lt;br /&gt;This put me back onto trying out Opera again after a multi-year gap. And wow has it come along! no more ads, and it's &lt;span style="font-style: italic;"&gt;fast!&lt;/span&gt; start it and it's there before you realise what's happened! I remember when FF used to start like that...&lt;br /&gt;&lt;br /&gt;Add the fact that it has a mail client built into the browser (ok so does Seamonkey, but sorry I don't want something even bigger &amp; heavier than FF/TB). Plus the text-only mode is pretty cool, very-lynx when you disable images as well. If I could bothered to write a custom script I could probably get it looking like a console.&lt;br /&gt;&lt;br /&gt;Unfortunately this time it's not a black-and-white cut-over. I've got 2-and-a-half years of email in TB, and Opera doesn't do everything that FF does (Greasemonkey, Web developer, css viewer), so my browser/mail environment is going to be more of an ecosystem than a monoculture for a time to come yet.&lt;br /&gt;&lt;br /&gt;But then that's the power of choice at work, and it's all good! I can have as many browsers &amp;amp; mail clients as I want!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Opera things that don't work correctly:&lt;br /&gt; - random JS widgets (eg this blogger interface!)&lt;br /&gt;&lt;br /&gt;Things I'll miss from FF:&lt;br /&gt; - my plugins, &lt;a href="https://addons.mozilla.org/firefox/addon/10"&gt;adblock&lt;/a&gt; is just awesome, opera doesn't have anything even close, all my web development stuff, and FF's superior JS  compatibility, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt; &amp; &lt;a href="http://userscripts.org/scripts/show/9302"&gt;Taskinator,&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;Things I won't miss:&lt;br /&gt; - having each plugin update itself every time I start FF, just do it in the background please!&lt;br /&gt; - FF &amp; TB hogging about 400MB of memory for no known reason&lt;br /&gt; - waiting ten minutes for FF &amp; TB to load.&lt;br /&gt;&lt;br /&gt;Things I've missed from Opera:&lt;br /&gt; -  ctrl+plus /minus zooms the web page, **including  images**, fast forward/rewind buttons that work properly.&lt;br /&gt; - the way things 'just work', opera has a much tighter design that works within itself very well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-1557438234322333479?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/1557438234322333479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=1557438234322333479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1557438234322333479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/1557438234322333479'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/survival-of-fittestbrowser.html' title='Survival of the fittest...(browser)'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-8114089289865462992</id><published>2007-06-09T21:13:00.000-07:00</published><updated>2007-06-11T09:40:15.275-07:00</updated><title type='text'>State of the art user interfaces</title><content type='html'>not what you expect..&lt;br /&gt;&lt;br /&gt;installing the new HP Colo(u)r Laserjet 2840 at work on the weekend, must say I'm very impressed with the effort they've put into the the user interface of their....packaging.&lt;br /&gt;&lt;br /&gt;Yes thats right, the packaging.  when the box sits on the floor there's a very obvious line of sticky tape holding the top flaps together, it &lt;i&gt;affords&lt;/i&gt; cutting the tape as the obvious first step. Ok no rocket science here yet right?&lt;br /&gt;&lt;br /&gt;when you open the flaps, the first thing you see is diagrams (&amp;amp; instructions in 5 asian languages, lose marks for no english)instructing you how to continue. Oh look, the little man is popping out those plastic things on the side, I wonder what that's about..? Oh look! if you pop them out then the sides and top of the box detach and lift off!  (I hope someone makes a packet from that patent, they deserve it.)&lt;br /&gt;&lt;br /&gt;Now you've got the printer sitting on the floor on the box base. sticky-taped to the top of the printer is a sheet warning you to run the install   CD before plugging the printer in. oops! that's right, the little man on the box did that before he lifted the printer safely with another colleague. I'd better dig up the manual that i threw to the side and see what that's all about...&lt;br /&gt;&lt;br /&gt;See? good user interfaces &lt;i&gt;aren't that hard!!&lt;/i&gt; If a printer box can afford it's use, surely your hugely expensive enterprise application (or even that cool little utility that makes life easier) can afford it's use. It's as simple as making the following step as obvious as possible, and allowing for people to be lazy (not necessarily stupid, but the two can be hard to separate sometimes) and need reminding about the right way to do things, and the occasional polite reminder if they're not doing what they should be.&lt;br /&gt;&lt;br /&gt;Kudos HP, your packaging team deserve a bonus. Let's hope that the rest of the package is as easy to setup.&lt;br /&gt;&lt;br /&gt;I hate configuring printers, it always seems like black magic and secret incantations...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-8114089289865462992?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/8114089289865462992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=8114089289865462992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/8114089289865462992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/8114089289865462992'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/state-of-art-user-interfaces.html' title='State of the art user interfaces'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-3885098365792743914</id><published>2007-06-05T09:38:00.001-07:00</published><updated>2008-12-09T00:27:37.026-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virgin blue'/><category scheme='http://www.blogger.com/atom/ns#' term='uber-geeky'/><category scheme='http://www.blogger.com/atom/ns#' term='qantas'/><category scheme='http://www.blogger.com/atom/ns#' term='airfares'/><category scheme='http://www.blogger.com/atom/ns#' term='budget'/><title type='text'>air fares 2...</title><content type='html'>well, there goes $1,000 AUD I won't be seeing again. The trip's booked, with the sideline to sydney and all.&lt;br /&gt;&lt;br /&gt;see the budget/itinerary here: &lt;a href="http://spreadsheets.google.com/pub?key=pYkGXyqd2mcXUF8cTu9KVSQ"&gt;http://spreadsheets.google.com/pub?key=pYkGXyqd2mcXUF8cTu9KVSQ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;that little sydney trick just saved me a couple hundred dollars, total cost of the outward jaunt is $488, including bus, train &amp; plane. the next cheapest flights on that day (for much worse times) are:&lt;br /&gt;qantas - $650,  $778, $820, $900+&lt;br /&gt;virgin -  $625, $670&lt;br /&gt;&lt;br /&gt;It's the return leg that's a real killer, at around $520. So overall not the worst, but could have been a lot better. moral of the story? book plane tickets as early as possible!!&lt;br /&gt;&lt;br /&gt;&lt;uber-geeky&gt;&lt;br /&gt;interesting sidenote on the qantas web site (which by the way, although substantially better than virginblue still has a long way to go in terms of usability), the final booking confirmation page url looks like this: &lt;a href="https://book.qantas.com.au/pl/QFdomestic/en/BookTripPlanServlet;"&gt;https://book.qantas.com.au/pl/QFdomestic/en/BookTripPlanServlet;&lt;/a&gt;jsessionid=&lt;really_long_string&gt;&lt;really long="" string=""&gt;&lt;br /&gt;&lt;br /&gt;if in the same FF tab I overtype that with qantas.com.au, I get a SSL certname mismatch (the cert is against www.qantas.com.au, not qantas.com.au, oversight on their part I guess) &lt;span style="font-style: italic;"&gt;the briefest&lt;/span&gt; flash of the Sun logo: &lt;/really&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0cxyCtzzCVo/RmWTu0C3X6I/AAAAAAAAAAM/7C3xqbzQjPs/s1600-h/Sun+logo.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_0cxyCtzzCVo/RmWTu0C3X6I/AAAAAAAAAAM/7C3xqbzQjPs/s200/Sun+logo.PNG" alt="" id="BLOGGER_PHOTO_ID_5072622987756658594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;really long="" string=""&gt;which leads me to believe that the qantas web site is hosted on a Sun Application Server.&lt;br /&gt;&lt;br /&gt;The funniest bit tho, is that putting that url into another browser that doesn't have a current qantas session (like ie), it gets a 400 bad request error. strange...&lt;br /&gt;&lt;br /&gt;Virgin isn't much better though, drop the 'www' off their site name and it doesn't resolve to anything, even though they own the domain. slack. (and the less I say about their popup window calender the better, at least qantas has the common decency to float a div...)&lt;br /&gt;&lt;/uber-geeky&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ps - feel free to comment!!!!&lt;br /&gt;&lt;br /&gt;matt kerle&lt;br /&gt;&lt;/really&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-3885098365792743914?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/3885098365792743914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=3885098365792743914' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/3885098365792743914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/3885098365792743914'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/air-fares-2.html' title='air fares 2...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0cxyCtzzCVo/RmWTu0C3X6I/AAAAAAAAAAM/7C3xqbzQjPs/s72-c/Sun+logo.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-7890821826758489489</id><published>2007-06-05T07:50:00.000-07:00</published><updated>2007-06-06T00:41:36.145-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='web comics'/><title type='text'>Web comics &amp; blogs</title><content type='html'>Isn't the internet great? I find that on the internet is a never-ending source of things I can do instead of work! Here's some of them...&lt;br /&gt;&lt;br /&gt;Web-comics:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;User-friendly&lt;/span&gt; - &lt;a href="http://ars.userfriendly.org/cartoons/"&gt;http://ars.userfriendly.org/cartoons/&lt;/a&gt;&lt;br /&gt;These guys rock, the little hairball guy, pitr with the fake russian accent, the caffeine dependencies, it's just awesome, number #1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dilbert &lt;/span&gt;- &lt;a href="http://www.dilbert.com/comics/dilbert/archive/"&gt;http://www.dilbert.com/comics/dilbert/archive/&lt;/a&gt;&lt;br /&gt;The original, nuff' said.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PVPOnline &lt;/span&gt;- &lt;a href="http://www.pvponline.com/article"&gt;http://www.pvponline.com/article&lt;/a&gt;&lt;br /&gt;oldie but a goodie. getting a little bit tired now but still a classic of the genre&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Everybody loves Eric Raymond &lt;/span&gt;-&lt;a href="http://geekz.co.uk/lovesraymond/"&gt;http://geekz.co.uk/lovesraymond/&lt;/a&gt;&lt;br /&gt;so funny (sigh!), but only if you grok the fullness of the kernel...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Angst Technology &lt;/span&gt;- &lt;a href="http://www.inktank.com/AT/index.cfm?nav=1"&gt;http://www.inktank.com/AT/index.cfm?nav=1&lt;/a&gt;&lt;br /&gt;this one ended in 2005 after a slow decline. I'll always remember the great moments though, the web monkey flinging poo at Metallica, and what happened when web monkey had real coffee. One day I'm sure his hosting will run out and this wonderful thing will disappear from the web. I have vague intentions of spidering it before then...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Blogs:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Joel on software&lt;/span&gt; - &lt;a href="http://www.joelonsoftware.com/Archive.html"&gt;http://www.joelonsoftware.com/Archive.html&lt;/a&gt;&lt;br /&gt;The first series of articles I ever read about *real* software engineering, full of the principles and guidelines on how an IT company *should* work. If you run a company the way Joel does you'll never be able to own a medium sized african nation, but you will be well off, have a great job, a fantastic company surrounded by great people, &lt;span style="font-weight: bold;"&gt;and&lt;/span&gt; as a side-effect you'll produce amazing software. sounds ok to me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rands in Repose&lt;/span&gt; - &lt;a href="http://www.randsinrepose.com/"&gt;http://www.randsinrepose.com/&lt;/a&gt;&lt;br /&gt;Bit rambling at times (and I never got those SXSW things), but there's a lot of good stuff in here, especially if you're a minnow in a large pool, and you want to know the warning signs of when the barracudas are coming, and how to avoid them. valuable for that reason.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Shoemoney&lt;/span&gt; - &lt;a href="http://www.shoemoney.com/"&gt;http://www.shoemoney.com/&lt;/a&gt;&lt;br /&gt;Don't know if he's legit, but even the idea that you can make this kind of money off the internet is amazing. very smart operator, this blog is good because I don't know anything at all about the shallow world of internet advertising/marketing, and it educates me about things I never even knew existed, which is a good thing (you don't know what you don't know).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Honourable Mentions:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.jroller.com/page/dogsandcoffee/20060601"&gt;this&lt;/a&gt; page, for being so incredibly simple, yet managing without fail to be gotten wrong by most java developers, you  know, the ones who don't understand pointers.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://slashdot.org/"&gt;&lt;span style="font-weight: bold;"&gt;/.&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swik.net/"&gt;&lt;span style="font-weight: bold;"&gt;Swik.net&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lifehacker.com/"&gt;&lt;span style="font-weight: bold;"&gt;lifehacker&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;fin, matt kerle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-7890821826758489489?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/7890821826758489489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=7890821826758489489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7890821826758489489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/7890821826758489489'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/web-comics-blogs.html' title='Web comics &amp; blogs'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-6816962565235918188</id><published>2007-06-05T07:12:00.000-07:00</published><updated>2007-06-05T07:48:58.769-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='non functional prototype'/><category scheme='http://www.blogger.com/atom/ns#' term='novell'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>Non-Functional Prototypes Rock!</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Old &amp; Busted way to design an application interface:&lt;/span&gt;&lt;br /&gt;Use photoshop etc to mock up images of what a particular screen would look like, paste this into a html page and add hotspots. repeat for every page in the system.&lt;br /&gt;&lt;br /&gt;then the client decides they'd like the background to be a slightly different shade of puce (is that even a color?), so some poor grad (not me!!) has to go through and change every single screen.&lt;br /&gt;&lt;br /&gt;the client finally signs off on the design, you throw the whole thing away and start coding afresh in whatever the spaghetti framework du jour is. reusability: zero. blegh!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;New Hotness:&lt;/span&gt;&lt;br /&gt;(assuming it's a web app, would probably work as well for client app gui's) mock everything up in html/jsp/aspx/ whatever you're using. don't write any business logic at all, just pump out great steaming mounds of raw html, and just enough smarts to tie the pages together.&lt;br /&gt;then when the client decides they actually like chartreuse, you change a single style (you did use css right?) and the whole thing changes in one step. we save money and the grad doesn't get that crazed look in his eyes...&lt;br /&gt;Now when the client signs off on design, you hand the "non-functional prototype", aka the app minus the business logic, off to the coders, they pump out the business logic and you save a whole swag of time.&lt;br /&gt;&lt;br /&gt;It's just so easy, so simple, &lt;a href="http://www.ubergeek.tv/article.php?pid=54"&gt;I don't know why more people don't do it...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My first experience with this methodology was also &lt;a href="http://www.directory.deet.nt.gov.au/MapSearch.aspx"&gt;the first app&lt;/a&gt; I got to architect from the ground up (lol, the front map *still* doesn't work in FF, and it probably never will! one day I might blog about this one...)  instead of having to maintain someone else's cruft (these are mainly internal so they can stay nameless).&lt;br /&gt;&lt;br /&gt;I came on for the develop phase after the NFP was done. The entire application skeleton already existed so all I had to do was the little task of making it dynamic (yeah, easy) which meant learning about ldap &amp;amp; .NET, and how to plug the two together (thank God for &lt;a href="http://www.novell.com/coolsolutions/feature/11204.html"&gt;Novell&lt;/a&gt;, or I would've been stuffed!).  MS Visual Studio was also alarming productive, as a hard-core java fan I found that offensive!&lt;br /&gt;&lt;br /&gt;Anyway, I'm rambling. NFP's rock, they save lots of time. The guys I'm currently working with love their intellij/struts/hibernate, and with NFP's once the design phase is over, that's half the develop boilerplate done as well, leaving lots more time for business rules, just like those pesky dotnet developers do...&lt;br /&gt;&lt;br /&gt;Matt Kerle&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-6816962565235918188?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/6816962565235918188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=6816962565235918188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/6816962565235918188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/6816962565235918188'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/non-functional-prototypes-rock.html' title='Non-Functional Prototypes Rock!'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6970241215942142415.post-700627387761839904</id><published>2007-06-05T06:40:00.001-07:00</published><updated>2007-06-05T07:10:00.581-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='shoemoney'/><category scheme='http://www.blogger.com/atom/ns#' term='airfares'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='darwin'/><title type='text'>First post, air fares...</title><content type='html'>wow, no longer a blog virgin! now I'm gonna have to post some photo's and stuff up here.&lt;br /&gt;&lt;br /&gt;Anyhoo, organising my trip to darwin to work on the farm with EK. I've left this so late that plan prices are horrendous, and I'm looking at doing some crazy mucking around to get them back down, like catch the bus to sydney from canberra, train to the airport, to fly to darwin, just about to run the numbers to see if it's actually cheaper. bonus of that is that I get in fri night instead of saturday, so the extra day is worth it.&lt;br /&gt;&lt;br /&gt;I discovered that mid-week is the cheapest time to fly if you can, the wednesday flights are almost 3/4 the price of the weekend ones. was seriously tempted to swap but the beauty of leaving on a friday and getting back on a monday with 10 working days off is that you actually get 2 weeks + 2 days (the second weekend) instead of just two weeks. downside is that going to work after two weeks down the farm and a red eye flight, well, I don't think that monday will be super-productive...;-p&lt;br /&gt;&lt;br /&gt;ah well, bite the bullet and book it!&lt;br /&gt;&lt;br /&gt;btw - have I mentioned how much I love google stuff? I'm going to do my budget up in google docs, plot my course in google maps, and blog about it right here. Go Google!!!&lt;br /&gt;&lt;br /&gt;Other posts should be vaguely more techo, I intend to use this blog as a random repository of cool + neat tricks and hacks that make a coders life easier (there's plenty of them!).&lt;br /&gt;&lt;br /&gt;It seems that having an online presence is mandatory these days, if you type your name into Google, and the best hit you get is a friends &lt;a href="http://www.google.com.au/search?hl=en&amp;q=%22matt+kerle%22&amp;amp;btnG=Search&amp;meta="&gt;bebo comment&lt;/a&gt;, then somethings wrong. The only other best hit is&lt;a href="http://www.google.com.au/search?hl=en&amp;amp;q=matt+kerle&amp;btnG=Search&amp;amp;meta="&gt; my subversion posting&lt;/a&gt;, which is pretty ordinary.&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://www.shoemoney.com/2007/05/25/go-after-low-hanging-fruit-tfs-day-5/"&gt;Shoemoney&lt;/a&gt; points out, your signature is a valuable thing.  One of the goals in this blog is that if someone randomly types my name into Google, that the first hit they should get is my blog/website.&lt;br /&gt;&lt;br /&gt;Stuff WhereAreYouNow.com &amp;amp; other craps like that, just use google to index you and noone will ever loose you...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6970241215942142415-700627387761839904?l=threebrightlights.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://threebrightlights.blogspot.com/feeds/700627387761839904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6970241215942142415&amp;postID=700627387761839904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/700627387761839904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6970241215942142415/posts/default/700627387761839904'/><link rel='alternate' type='text/html' href='http://threebrightlights.blogspot.com/2007/06/first-post-air-fares.html' title='First post, air fares...'/><author><name>Edenist</name><uri>http://www.blogger.com/profile/06349188548281399277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
