<?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-4062298710387829104</id><updated>2011-11-22T22:43:00.542-07:00</updated><category term='ruby'/><category term='ui'/><category term='eclipse'/><category term='business'/><category term='scala'/><category term='eclipsecon'/><category term='java'/><category term='fitness'/><category term='software'/><category term='development'/><title type='text'>The 11 O'Clock Drop</title><subtitle type='html'>These are my late night musings on programming languages, software, business, photography... just about anything that drives me to write.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-4922428807489932571</id><published>2011-03-21T15:46:00.001-06:00</published><updated>2011-03-21T17:48:36.500-06:00</updated><title type='text'>Dear TELUS</title><content type='html'>&lt;div style="font-family: Verdana; font-size: 13px; margin-bottom: 0px; margin-top: 0px;"&gt;March 21, 2010&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana; font-size: 13px; margin-bottom: 0px; margin-top: 0px;"&gt;TELUS Client Care&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 13px; margin-bottom: 0px; margin-top: 0px;"&gt;PO Box 7575&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 13px; margin-bottom: 0px; margin-top: 0px;"&gt;Vancouver, BC&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 13px; margin-bottom: 0px; margin-top: 0px;"&gt;V6B 8N9&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Verdana; font-size: 13px; margin-bottom: 0px; margin-top: 0px;"&gt;To Whom it May Concern,&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;I wanted to write this letter to express my extreme frustration and disappointment with TELUS. I have been a long-time customer, 20 years of phone services plus High-Speed Business Internet services since the day they were introduced.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;On Thursday March 17 2011, I decided to move from Bell's TV Satellite service to TELUS' Optik TV service. I spent 90 minutes on the phone with a very friendly customer services representative and completed the order, signing up for a three-year contract for Internet + Optic TV. As I was putting in the order, I cancelled my Business Internet service to make room for the new services. &amp;nbsp;The order was scheduled to be completed today, March 21st, at 8:00am. &amp;nbsp;The Internet service was turned off as scheduled, Monday morning around 9:00am. &amp;nbsp;We were told it'd probably be very close to 8:00am&amp;nbsp;because we were the first appointment, so I booked the morning off from work to be home during the installation. 8:00am Monday morning arrived and nobody. We waited until 10:00am, then we called TELUS. The CSR told us to be patient and that it shouldn't be too long now. Two hours later, I called again. This time, the CSR decided he'd investigate by calling dispatch to find out what's going on. To his surprise and mine, the order was not sent to an installer. The CSR said that we had been given high priority and someone would be coming to install the service "within an hour or two". I called my office and booked the rest of the day off. &amp;nbsp;Two hours later, at 2:30 pm, the same CSR called to inform us that there had been a mistake with our order and nobody was able to help us today. The order would have to be rescheduled for the next available time, Friday March 25th. &amp;nbsp;Really? &amp;nbsp;Wow.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;I took the day off work, had my working Internet turned off, and now I'm basically told to reschedule five days later. Obviously, that is not acceptable. The lack of competence that TELUS continues to show is remarkable. TELUS should thank its "lucky stars" that the CRTC is in place to protect TELUS' membership in a duopoly, essentially guaranteeing revenue. In a competitive market, I'm sure it wouldn't survive. It's unfortunate that there is no real competition and that my only other choice is Shaw, who I'm sure is similarly incompetent.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;One day maybe I'll be lucky enough to own a business where being incompetent is profitable.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Verdana; font-size: 13px; margin-bottom: 0px; margin-top: 0px;"&gt;Sincerely,&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px;"&gt;Andy Czerwonka&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-4922428807489932571?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/4922428807489932571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=4922428807489932571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/4922428807489932571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/4922428807489932571'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2011/03/dear-telus.html' title='Dear TELUS'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-4078334348651142683</id><published>2010-11-12T10:32:00.001-07:00</published><updated>2010-11-12T12:45:16.392-07:00</updated><title type='text'>Lesson in Canadian Geography</title><content type='html'>I live in Calgary. &amp;nbsp;I'm clearly not a master in&amp;nbsp;geodesy, but I'm pretty sure Mississauga is not somewhere between Richmond and Calgary. &amp;nbsp;Canada Post rocks. &amp;nbsp;And we're wondering where our tax dollars go...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_oxBqHPhpIMY/TN14b4D2nDI/AAAAAAAABCw/W2QS9vh00eI/s1600/wtf.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_oxBqHPhpIMY/TN14b4D2nDI/AAAAAAAABCw/W2QS9vh00eI/s1600/wtf.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-4078334348651142683?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/4078334348651142683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=4078334348651142683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/4078334348651142683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/4078334348651142683'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2010/11/lesson-in-canadian-geography.html' title='Lesson in Canadian Geography'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oxBqHPhpIMY/TN14b4D2nDI/AAAAAAAABCw/W2QS9vh00eI/s72-c/wtf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-1114945288152383807</id><published>2010-05-31T18:09:00.000-06:00</published><updated>2010-05-31T18:09:36.617-06:00</updated><title type='text'>Jamie Oliver's TED Prize wish: Teach every child about food | Video on TED.com</title><content type='html'>&lt;a href="http://www.ted.com/talks/jamie_oliver.html"&gt;Jamie Oliver's TED Prize wish: Teach every child about food | Video on TED.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-1114945288152383807?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ted.com/talks/jamie_oliver.html' title='Jamie Oliver&apos;s TED Prize wish: Teach every child about food | Video on TED.com'/><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/1114945288152383807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=1114945288152383807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/1114945288152383807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/1114945288152383807'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2010/05/jamie-olivers-ted-prize-wish-teach.html' title='Jamie Oliver&apos;s TED Prize wish: Teach every child about food | Video on TED.com'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-5362462584489120796</id><published>2010-02-26T06:09:00.001-07:00</published><updated>2010-03-02T07:55:36.678-07:00</updated><title type='text'>Know When to Stop</title><content type='html'>I get myself into these situations once in a while where I get really excited about a particular problem and end up with a mess as the solution. &amp;nbsp;Here's my workflow.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Think about it.&lt;/li&gt;&lt;li&gt;Sketch out a solution.&lt;/li&gt;&lt;li&gt;Code towards my solution.&lt;/li&gt;&lt;li&gt;Refactor (go to step 1)&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Somewhere in that loop I go from 4 to 3 to 4 to 3 a bunch of times and when I come up for air I have a complete mess. &amp;nbsp;Ideas pop into my head quickly and I seem to go down strange paths here and there. Before I know it my code is littered with random design thoughts that don't hang together in any way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;STOP!!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;... git here we come ...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-5362462584489120796?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/5362462584489120796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=5362462584489120796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/5362462584489120796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/5362462584489120796'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2010/02/know-when-to-stop.html' title='Know When to Stop'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-5291634044387752348</id><published>2010-02-17T18:54:00.000-07:00</published><updated>2010-02-17T18:54:26.305-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>Great UI == Damn Near Impossible</title><content type='html'>Getting a User Interface right is like scoring a 52 at your local Golf Championship? &amp;nbsp;Ain't gonna happen. &amp;nbsp;I'm currently working on a brand new UI for our users. &amp;nbsp;They want &lt;b&gt;an easy way to edit data&lt;/b&gt;. &amp;nbsp;Great. &amp;nbsp;I'm guessing they're meaning efficient and intuitive. &amp;nbsp;Well easy for me isn't easy for you. &amp;nbsp;Actually, quit the opposite. &amp;nbsp;If you take my Dad for instance, who is in his 70's, you are going to get someone that is not at all that interested in typing CTRL-Z to undo his changes. &amp;nbsp;In fact, unless he gets a giant icon on the screen that gives him a very obvious indication that he can&amp;nbsp;actually&amp;nbsp;undo his changes, he won't even know the feature is there. &amp;nbsp;On-the-other-hand, if you make me pick up the mouse to do anything I'm going to get pissed off. &amp;nbsp;So, that simple case tells me that getting it right for everyone is damn near impossible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-5291634044387752348?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/5291634044387752348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=5291634044387752348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/5291634044387752348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/5291634044387752348'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2010/02/great-ui-damn-near-impossible.html' title='Great UI == Damn Near Impossible'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-9205318937463846276</id><published>2010-02-15T14:12:00.001-07:00</published><updated>2010-02-15T14:21:08.781-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fitness'/><title type='text'>Let the Training Begin</title><content type='html'>Well, I survived my first &lt;a href="http://connect.garmin.com/activity/24777804"&gt;20 minute run&lt;/a&gt;&amp;nbsp;training session. &amp;nbsp;It wasn't pretty let me tell you, but my goal is to get out 5 days a week until the race.  Whether it's for a bike ride or a little run, I have to get out.  I'm hoping that after a couple of weeks I can sustain a 20 minute run.  That's a big goal for me because I can't keep a sustained run to 5 minutes.&lt;br /&gt;&lt;br /&gt;For those of you who don't know, I've been &lt;s&gt;encouraged&lt;/s&gt; suckered into signing up for an Adventure Race. &amp;nbsp;It's an 8 hour race (~55 km) that includes navigation, trail running, mountain biking, river canoeing and repelling off some cliff. &lt;br /&gt;&lt;br /&gt;I need to lose at least 60 lbs if I'm going to attempt this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-9205318937463846276?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/9205318937463846276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=9205318937463846276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/9205318937463846276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/9205318937463846276'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2010/02/let-training-begin.html' title='Let the Training Begin'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-8436253685298731137</id><published>2010-02-14T18:54:00.000-07:00</published><updated>2010-02-14T18:54:57.504-07:00</updated><title type='text'>Not Too Shabby</title><content type='html'>Well, a day of playing with Drupal has produced a fairly nice site for what I need. &amp;nbsp;I must say that I am quite impressed with it. &amp;nbsp;I'm sure if I grab the infamous &lt;a href="http://drupal.org/node/48429"&gt;CCK module&lt;/a&gt; the power will really come out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-8436253685298731137?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/8436253685298731137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=8436253685298731137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/8436253685298731137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/8436253685298731137'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2010/02/not-too-shabby.html' title='Not Too Shabby'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-8426378740572880841</id><published>2009-12-09T17:32:00.000-07:00</published><updated>2009-12-09T17:32:40.519-07:00</updated><title type='text'>xargs == awesome</title><content type='html'>find . -name *.java | xargs -n1 -I@ touch -c @&lt;br /&gt;&lt;br /&gt;For those times when commands like &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;touch &lt;/span&gt;won't take stdin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-8426378740572880841?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/8426378740572880841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=8426378740572880841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/8426378740572880841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/8426378740572880841'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2009/12/xargs-awesome.html' title='xargs == awesome'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-4885054076195732339</id><published>2009-03-25T10:57:00.086-06:00</published><updated>2009-03-27T08:21:42.199-06:00</updated><title type='text'>EclipseCon 2009 - Days 2 &amp; 3</title><content type='html'>I've gone to quite a few sessions over the last two days.  Cloud Computing, UI Showcase, Nebula, SOA... there's so much good stuff to see.  Some are great, some are not so great.  In most cases the speakers are rushing because they're running out of time.  There's no time to ask questions during the sessions, which wouldn't be so horrible if I weren't myself rushing to the next session, not allowing me to catch them for a quick Q&amp;amp;A.  Maybe these sessions were designed that way?  :-)&lt;br /&gt;&lt;br /&gt;About a third or the talks I've gone to are about &lt;a href="http://www.eclipse.org/e4/"&gt;e4&lt;/a&gt;.  That's code for "Eclipse 4.0" for those of us who don't know the lingo.  This is a really hard topic for me.  Let's see, where do we start?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;"Schizophrenia is a psychiatric diagnosis that describes a mental illness characterized by impairments in the perception or expression of reality, most commonly manifesting as auditory hallucinations, paranoid or bizarre delusions or disorganized speech and thinking in the context of significant social or occupational dysfunction.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Hmnn... &lt;span style="font-style: italic;"&gt;"...&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;impairments in the &lt;span style="font-weight: bold;"&gt;perception or expression of reality&lt;/span&gt;...".  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Given &lt;/span&gt;&lt;span style="font-size:100%;"&gt;that definition, either the speakers have it or I have it.  &lt;/span&gt;One minute I get it, thinking, "hey, you're bang on", and the next I'm thinking "what? are you insane?".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;The Sane Side of Our &lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Schizophrenia &lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I may not be on side with the approach to the problem, but the use cases driving the solution make sense - at least to me they do.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java 6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A small point in the grand scheme of things but nevertheless worth mentioning.  They're not stuck to Java 1.4 anymore.  I've seen the code.  It's undeniably &lt;span style="font-weight: bold;"&gt;not 1.4 compatible&lt;/span&gt;.  Finally.  Fantastic.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Modeled UI - Declarative User Interfaces&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I definitely like the idea.  The model approach is trying to lower the bar when it comes to entering the world of Eclipse-based development.  Build an EMF model, hook up a framework-supplied renderer, and off you go.  It's how we should be building UI's anyway.  The only reason we don't work this way today is because its an extremely hard problem to solve well.    It's been tried before.  This all feels very VisuageAge Smalltalk to me.   I don't want to discourage the research, but let's not ignore those learning's or we;ll repeat the mistakes.  What will most likely evolve out of e4 is a hybrid approach, where parts of your UI will made up of the EMF models plus renderers and parts will be made up of "do it the old way" code.  When I try an visualize what that would look like, I find myself getting back to where I am today. Inconsistency come to mind.  Isn't API inconsistency the root of this barrier-to-entry that this very solution is trying to break down? RCP development has a steep learning curve because it makes me learn 10 separate and inconsistent frameworks to do it well.  Platform, SWT, JFace, GEF, Preferences, Memento... to name a few.  I don't know - I'm just asking the question.  Think about it... is this really going to make it easier?  How am I going to build an EMF model that allows me to add that third-party widget library that's built on Swing and integrate its selection mechanism with the Workbench across two independent threads?  I'll tell you how.  It's not.  But guess what?  I do exactly that in my product today, which is built on the 3.x stack.  It wasn't easy to be sure, but I'm able to do it.  Please don't take that away from me.&lt;br /&gt;&lt;br /&gt;Another key will be tool support.  Dear e4 Committers: If you take away our refactoring tools, we won't use it.  We've proven that in the past.  Until the refactoring tools address the &lt;span style="font-weight: bold;"&gt;code &lt;/span&gt;in &lt;span style="font-family:courier new;"&gt;plugin.xml&lt;/span&gt;, then we're not going to put our stuff in &lt;span style="font-family:courier new;"&gt;plugin.xm&lt;/span&gt;l.  Luckily enough many of the PDE's refactorings do look in there today.  Let's just maintain a good level of support for whatever new XML files are introduced.&lt;br /&gt;&lt;br /&gt;In the end, the "model + renderer" approach makes a lot of sense to me.  As developers we definitely spend too much time solving UI problems instead of business problems.  This is a step in solving that problem. Saying that, I'm not betting my next business strategy on the Summer of 2010.   I do see this working for the trivial CRUD applications out there, but not for the more complex.  But you guys are smarter than me, so I look forward to it.  There is value here if you can pull it off - a tonne of it.  I'll be watching closely.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;The "Not So Sane" Side&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.eclipse.org/E4/SWT_Browser_Edition"&gt;&lt;span style="font-weight: bold;"&gt;SWT Browser Edition&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This makes me feel like we're trying to commercialize some mad scientist's experiment in human cloning.  Just because you can doesn't mean you should.  It's definitely interesting to build a cross-compiler from Java to ActionScript, but I need someone to help me with the use case.  Everyone is talking about bringing the IDE to the web.  What for?  I don't get it.  Please someone, give me one use case that isn't simply about some wow factor.  There was a lot of "Oooohhhh.. ahhhhhhhh" when the RCP Photo application demo was shown running inside the Adobe-powered browser.  I too think that's very cool.  But show that same demo to your boss see if you get the same reaction.  I'm not sure you will.  Is the desktop deployment model really that broken?  Why does everyone want to run their friggin applications in their browser?  Or do they?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CSS Styling&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This was also introduced as a&lt;span style="font-style: italic;"&gt; "someone had some time on their hands and thought it'd be cool if..."&lt;/span&gt; kinda thing.  This gets a "thumbs down" because every time I look at a CSS file I quickly turn away in fear of turning to stone.  Maybe I'm just scared that someday I'm going to wake up and my "to do" list is going to have a "fix screen layout" and its all in CSS.  What do I do know? The Idiots Guide to Assember - here we come.&lt;br /&gt;&lt;br /&gt;In my not-so-humble opinion, CSS is as bad an implementation of a good idea as I've seen.&lt;br /&gt;&lt;br /&gt;At least its optional.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;There's So Much More&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've clearly just scratched the surface. The first preview release is coming out in July.  I think it'll be fun to see where it is at that point.  I'm going to spend my time going a deeper dive, which will hopefully answer some of my own questions and undoubtedly uncover many more.&lt;br /&gt;&lt;br /&gt;Heading to a Scala talk today plus a few others.  See you tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-4885054076195732339?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/4885054076195732339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=4885054076195732339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/4885054076195732339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/4885054076195732339'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2009/03/eclipsecon-2009-e4.html' title='EclipseCon 2009 - Days 2 &amp; 3'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-4490990342394090678</id><published>2009-03-24T07:59:00.076-06:00</published><updated>2009-04-09T14:25:49.567-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>EclipseCon 2009 - Day 1</title><content type='html'>It was definitely time to visit EclipseCon.  I've been using Eclipse RCP for almost four years now, so I feel like if I'm going to visit a technical conference this year, this is the one.  Well... now that I think about it, there are probably others I'd like to visit too, but I'm here now so I'll write about this one.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;This Place Just Oozes Passion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I spent a lot of time here eight years ago, commuting between San Mateo and Calgary on a weekly basis for over a year.  It's nice to come back to the seems-like-recession-proof Bay Area for technical inspiration. It, like no other place I know of, absolutely oozes passion for technology - primarily software technology. There was a breakfast/registration this morning and it seemed like everyone was giddily running around like a bunch of crazed schoolgirls waiting in line for the premier of Twilight.  Honestly? I'd like to take some of that passion home with me and spread it around.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ya-Who?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As I walk down the street, within one hour I inadvertently find the homes of many of the technology companies we've come to love and hate.  Cisco, Citrix, AMD, Intel, WebEx, Oracle, Sun... err... IBM, Yahoo, etc. Seems like they're all here... all within a few square kilometers.  Speaking of Yahoo, their campus still has an incredibly large footprint.  It seems to go on and on.  Blocks and blocks of buildings, floral gardens, manicured courtyards, etc.  I bet they hire three gardeners for every programmer.  Every second car in the parking lot is BMW - although maybe they're 1999 vintage, purchased when the now 30-somethings where hired as up-and-coming 20-somethings looking to take over the world.  Who knows.  What the hell does Yahoo do anyway?  I thought they disappeared when Google came along.  I stopped using them - didn't you?  Guess not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mac's Everywhere&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another thing I'm noticing is the disproportionate number of MacBook versus Windowz machines.  I'd say it's at least 2:1 in favour of the Mac's.  The table I'm sitting at now is 4:1.  There's the odd Linux guy back there, but from what I can tell you're only using a PC because you didn't have to pay for it.  What's interesting to me is that a lot of the committers are using OSX too.  Maybe now that 3.5 runs native on OSX, everyone feels like the the Mac is now ready for Eclipse.  Not sure.  As a more-than-casual Mac user myself, I can tell you that Eclipse runs great on Windows and okay on OSX.  Saying that, I haven't been using 3.5 for very long and the SWT folks spent basically all of 3.5 porting the Carbon code to Cocoa.  Maybe I'm in for a pleasant surprise.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Morning Session - Binding, Commands &amp;amp; Common Navigator Framework&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Binding - The Better of Two Evils&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Anything to get rid of that boilerplate we have to write just to get our models in sync with our UI.  It's such a trivial problem that just begs for a declarative solution.  I must say, I think the Eclipse guys are going down the right path.  I find the same two problems, over and over, with most declarative solutions in this UI binding space.  Firstly, most solutions take away control when it comes to the timing/event that drives the binding. You lose to  fine grained control you need in rich-client UI's.  Secondly, bindings only work with a &lt;span style="font-style: italic;"&gt;specific &lt;/span&gt;handful of widgets.  I'm happy to say that there's a decent answer to both of these problems.&lt;br /&gt;&lt;br /&gt;For problem #1, the framework allows us to specify the event.&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;DataBindingContext dbc = new DataBindingContext();&lt;br /&gt;ISWTObservableValue ui = SWTObservables.observeText(myTextWidget, SWT.Modify);&lt;br /&gt;IObservableValue model = BeansObservables.observeDetailValue(myModel, "body", String.class);&lt;br /&gt;dbc.bindValue(ui, model);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Most of you are going to look at this code and cringe. At least I hope you will.  I'll give you the benefit of the doubt and assume you're going to say that this is a terrible way to express a binding because reflecting into a Bean to get its property value exposes you to a bunch of runtime errors where an alternative solution would allow compile-time error checking.  Well you're partly right.  The problem is not the framework, it's Java.  I don't see my way clear to an alternative solution.  If you do, please share.  Now if this were Scala, where I'm allowed to pass methods as parameters for example, I see a completely different approach that is both declarative and type safe.  But that's another topic for another day.  That day is probably right around the corner because its been bugging me for a while.&lt;br /&gt;&lt;br /&gt;For problem #2, just roll your own.  The binding is pure API, supported by a bunch of helpers all over the place.  There are built-in solutions for the most common elements: fields (text, date, boolean, etc), lists, tables and trees.  They even provide a solution to the common Master-Details problem.  But, if your use case calls for a new UI component that isn't covered, just write your own.  I haven't tried this yet, but look forward to do so.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update Strategies&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &amp;amp; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Validation - Arghhhh...&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; Java - You Suck!!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Good idea, bad implementation.  To be fair to the guys, they're handcuffed here.  Friggin' Eclipse is still hanging on to Java 1.4.  I mean really... we're on 6.  Does anyone really still use 1.4?  I think this topic deserves its own post, because if I see another snippet of code that looks like this I'm going to apply for one of those "Yahoo Gardener" gigs.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;new UpdateValueStrategy().setConverter(new IConverter(){&lt;br /&gt;&lt;br /&gt;public Object getToType() {&lt;br /&gt; return Date.class;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Object getFromType() {&lt;br /&gt; return String.class;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Object convert(Object from) {&lt;br /&gt; // convert your String to a Date&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Are you kidding me? That would never pass a code review anywhere I've worked.  Let me see, can we make this a little better?&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;new UpdateValueStrategy().setConverter(new IConverter&amp;lt;String, Date&amp;gt;(){&lt;br /&gt;&lt;br /&gt;public Date convert(String from) throws UnconvertableFormatException {&lt;br /&gt; // convert your String to a Date&lt;br /&gt; // because it's any string, I'll make you handle the exception&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Please tell me that its clear to the decisions makers over at Eclipse Headquarters that the lack of generics support in the Eclipse framework really creates a major problem when it relates to technology adoption.  Anytime I'm writing code that integrates my models with an Eclipse UI, I feel like I might as well be writing all this stuff in Ruby.  I might as well turn off incremental compilation because I'm passing a bunch of &lt;span style="font-family:courier new;"&gt;Object &lt;/span&gt;references around. Once the Eclipse frameworks get a hold of me, all my types have been lost.  To get them back, I'm casting all over the friggin' place.  Discussions with a couple of the committers indicates that they're also frustrated with these handcuffs. Rumors seem to point to e4, but I'm going to hunt for a definitive answer while I'm here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Commands - It's All About Scale and Extension&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'll just say a couple of things about the declarative Command framework.  First of all, for those of you looking for an 'undo' solution, this is not it.  Not that it can't be used for that use case, but that's not what it was developed for.  Secondly, there seems to be a bit of a bad smell around 'best practices'.  The guys running the session didn't get into the value proposition.  They started with "here's how you do this" and "here's how you do that".  Nobody wanted to talk about "why do I want to do this?".  When I asked the question, the answer was weak to say the least.  Don't get me wrong, I absolutely see the value proposition.  It's about extension and scale.  If I want my business application to also play the role of platform, i.e. host for extension, then I want the extender to have options too.  Perfectly valid.  But if I'm just building a small application on top of the RCP stack then I don't see why I'd want to declare my commands outside.  There's definitely an overhead I have to pay in terms of development and tool support.&lt;br /&gt;&lt;br /&gt;Assuming I want this capability, the Command declaration gives my application a way to show my commands in a menu without loading the class, which is all possible because of Equinox.  At-the-end-of-the-day, the Command framework is simply further UI decoupling of the legacy &lt;span style="font-family:courier new;"&gt;ActionSet &lt;/span&gt;strategy.  Again a step in the right direction.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Common Navigator Framework (CNF) - Platform Navigation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;CNF is about providing a solution for a common integration/extension use case.  "Let me put my stuff in your tree view".  One plugin can show Projects, another plugin can show Tasks.  CNF allows you to do this without binding the two plugins.  It does so in such a way that the user doesn't have to use two separate navigation views.  Nice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Afternoon Session - Advanced RCP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First things first - it's not that advanced. We were presented with "best practices in RCP" using a sample MP3 application.  All-in-all, I liked the session because it brought everything together.  The funny thing about it is that while it brought together many of the frameworks, it did uncover many inconsistencies.  For example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Best Practice #1 - Use Adapter Factories&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Use adapter factories (&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;IAdapterFactory&lt;/span&gt;&lt;span style="font-style: italic;"&gt;) to adapt your models to the binding context needed at the time".&lt;/span&gt;  For example, if you want your model to show up in a tree, do it this way.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;treeViewer = new TreeViewer(parent, SWT.BORDER| SWT.MULTI| SWT.V_SCROLL);&lt;br /&gt;IAdapterFactory adapterFactory = new AdapterFactory();&lt;br /&gt;Platform.getAdapterManager().registerAdapters(adapterFactory, Mp3File.class);&lt;br /&gt;treeViewer.setLabelProvider(new WorkbenchLabelProvider());&lt;br /&gt;treeViewer.setContentProvider(new BaseWorkbenchContentProvider());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simple.  Register your adapter and the &lt;span style="font-family:courier new;"&gt;BaseWorkbenchContentProvider &lt;/span&gt;will find the adaption in the factory.  We don't need to get into the adapter code here - it's not the point.  The point is that I don't have to use any content provider other than the one provided by the workbench.  That begs the question, "why are you making me specify it then?", but I'm not going to chase that down right now.  Anyway, not a big deal.  It works.  I get it. Great.  Sure.  Whatever.  Now for Best Practice #2.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Best Practice #2 - Use Virtual Tables&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"When you have large datasets, only load what you need"&lt;/span&gt;.  Ya, no kidding.  Sounds like a plan.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;TableViewertableViewer = new TableViewer(parent, SWT.VIRTUAL|SWT.BORDER|SWT.V_SCROLL);&lt;br /&gt;// skipping the noise&lt;br /&gt;tableViewer.setItemCount(100000);&lt;br /&gt;tableViewer.setContentProvider(new LazyContentProvider());&lt;br /&gt;tableViewer.setLabelProvider(new TableLabelProvider());&lt;br /&gt;tableViewer.setUseHashlookup(true);&lt;br /&gt;tableViewer.setInput(null);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What? &lt;span style="font-family:courier new;"&gt; LazyContentProvider&lt;/span&gt;? Didn't you tell me less than 10 minutes ago that I'm to adapt via an &lt;span style="font-family:courier new;"&gt;IAdapterFactory &lt;/span&gt;and use the &lt;span style="font-family:courier new;"&gt;BaseWorkbenchContentProvider?&lt;/span&gt;.  Make up your mind!  Turns out that #1 and #2 are not only incompatible, but they're mutually exclusive. Awesome.  NOT!!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enough About Day #1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the end, I don't want to be hard on the guys.  They're pumping out some good stuff and the Eclipse ecosystem is such a huge machine that it's almost impossible to keep it all together.  It's evolving in the right direction.  For the rants I do have I should probably put all this blogging energy into contributing to Eclipse.&lt;br /&gt;&lt;br /&gt;Looking forward to the e4 sessions tomorrow afternoon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-4490990342394090678?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/4490990342394090678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=4490990342394090678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/4490990342394090678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/4490990342394090678'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2009/03/eclipsecon-2009-day-1_24.html' title='EclipseCon 2009 - Day 1'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-3792348252118510446</id><published>2008-01-14T06:33:00.000-07:00</published><updated>2008-01-16T07:43:28.783-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Everything Looks Like a Nail</title><content type='html'>I've heard it before here and there, but it exactly describes how I feel working with Java for the last few years.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:times new roman;font-size:130%;"  &gt;"If all you have is a hammer, then everything looks like a nail."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've been writing code for over 20 years now; C, C++, Smalltalk, Java, C#, Python, Ruby, etc.  When I went to school, we were taught Pascal, C, Cobol (now that sure dates me) because the school I went to wanted to get me ready for the "real world" and that world was using those languages at the time.  Admittedly, I didn't learn much in school.  I didn't learn much about computer science.  I learned plenty about how to build simple CRUD applications using &lt;a href="http://en.wikipedia.org/wiki/Imperative_programming"&gt;imperative programming&lt;/a&gt; languages.  Sure, we all used &lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt;, but didn't spend much time understanding it.  Think about programmers today, most know enough SQL to get the job done. How many times have you seen SQL stored-procedure code written... well... procedurally?  I bet more than a few.  Did you even notice?  Did you care?  I didn't.  I should have.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Sucks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not going to sit here and tell you that Java sucks, but... well... Java sucks.  Why?  Because there's no evolution of the language.  Imperative only.  Cruft everywhere.  Powerless scoping rules.  And, most importantly, it's limited my ability to think about problems in different ways.  I naturally think procedural - give me Lisp, Haskell... forget it.  I've inadvertently trained myself to only see nails.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java is Powerful&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Huge community. Many tested frameworks.  I want to leverage that community, those frameworks. I want to make them better. I sure as hell don't want to start again. I'm not going to rewrite Hibernate.  I don't want to rewrite Wicket.  I don't want to rewrite JScience.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Why Not Ruby?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was there for a while, but I can't stay.  I really love the language.  It' has  almost everything I need.  It has a large community.  So why not?  I don't want to invest my time into a toy.  Sorry Ruby people, I only have enough bandwidth for one, and I see too many fundamental problems.  No compiler.  Not type-safe. &lt;span style="font-size:78%;"&gt;(dodging bullets)&lt;/span&gt; No concurrency. Hey, I was in that community and put up with all those problems because I couldn't take Java anymore.  Now I don't have to.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scala&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;, introduced to me by a colleague who's always on the lookout for a better way, seems to really impress.  It's multi-paradigm; &lt;span style="font-size:100%;"&gt;object-oriented, &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;functional&lt;/a&gt;, &lt;a href="http://alblue.blogspot.com/2007/06/programming-languages-and-multi-core.html"&gt;concurrent&lt;/a&gt;.  It's type-safe! Yeah! Powerful generics! &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Yeah! &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Closures!  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Yeah! &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Type-safe mix-ins!  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Yeah! &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Oh... did I mention... &lt;span style="font-size:78%;"&gt;(cue the drum roll)&lt;/span&gt; &lt;a href="http://scala.sygneca.com/faqs/interoperability#can-i-use-java-classes-from-within-my-scala-code"&gt;it's Java&lt;/a&gt;!  Can you imagine trying to write cross-cutting mix-ins in Java?  Scala generates&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; .class&lt;/span&gt;&lt;/span&gt; files that run in the standard Java 5 virtual machine.  You want to leverage your favorite Java framework?  Go ahead.  No problem.  What? You want your Java team to leverage a library you wrote in Scala?  No problem.  One drawback, and not really a language drawback, is the learning curve for all of us that see only nails.&lt;br /&gt;&lt;br /&gt;Some of you are thinking "what the hell is he talking about?".  "What's wrong with doing it the traditional way? 99% of the software we use today is built using imperative programming and they work just fine".  Well yes,  back some 2000 years ago, 99% or homes were built using straw and clay.  They were just fine then too.  Since then, homes have evolved because people wanted more.  Today, people are smarter, tools are better.  We want more.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tools&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ouch.  Scala isn't there.  Getting better, yes, but it needs some time.  Unless the tools get there, the masses won't come for the longer term.  I won't come for the long term if the tools don't evolve.  I've invested in Eclipse as a tool and a platform.  For me, it's as important as the language - especially if the language is cumbersome.  I'm not going back to &lt;span style="font-family:courier new;"&gt;vi&lt;/span&gt; and print statements.  Forget it.  I don't care how great the language is.  Thankfully, Scala has an Eclipse plugin that at least gives me the critical stuff, i.e. debugger, syntax highlighting, etc.  It's getting there.  It just needs some time.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scala-lang.org/"&gt;Give it a try.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-3792348252118510446?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/3792348252118510446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=3792348252118510446' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/3792348252118510446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/3792348252118510446'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2008/01/everything-looks-like-nail.html' title='Everything Looks Like a Nail'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4062298710387829104.post-6343895156748004750</id><published>2007-09-25T05:38:00.003-06:00</published><updated>2009-03-24T08:53:12.550-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Getting Real... Now That's What I'm Talking About</title><content type='html'>I've recently been thinking philosophically about the best way to build software, when I stumbled upon &lt;a href="http://gettingreal.37signals.com/toc.php"&gt;37signals' Getting Real book&lt;/a&gt;.  I decided to pick up a copy &lt;a href="http://www.lulu.com/content/383343"&gt;here&lt;/a&gt; because reading online for an extended period sucks.&lt;br /&gt;&lt;br /&gt;I'm not going to sit here and tell you it's the Holy Grail but it's the Holy Grail.  For the right type of business.  Sure, this book is specific to 37signals' business, or shall I say companies who make a living selling service-based software for the masses.  Regardless, take these points and interpret them for your business and you'll be better for it.&lt;br /&gt;&lt;br /&gt;The following points, directly from the book, are "bang-on".  I don't care what kind of software you're creating.  These points make a helluva-lot of sense to me, because I've either lived either &lt;span style="font-style: italic;"&gt;this &lt;/span&gt;side and experienced the joy or &lt;span style="font-style: italic;"&gt;that &lt;/span&gt;side and experienced the pain.  I'm not saying that I don't agree with the others points in the book, it's just that these are the ones that really shine for me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Note: These are in the order as taken from the book&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch02_Build_Less.php"&gt;Build Less&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch02_Fund_Yourself.php"&gt;Fund Yourself&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch02_It_Shouldnt_be_a_Chore.php"&gt;It Shouldn't Be A Chore&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch03_Less_Mass.php"&gt;Less Mass&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch03_The_Three_Musketeers.php"&gt;The Three Musketeers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch04_Whats_the_Big_Idea.php"&gt;What's The Big Idea&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch04_Ignore_Details_Early_On.php"&gt;Ignore Details Early On&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch04_Its_a_Problem_When_Its_a_Problem.php"&gt;It's a Problem When It's a Problem&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch04_Hire_the_Right_Customers.php"&gt;Hire the Right Customers&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch04_Scale_Later.php"&gt;Scale Later&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch04_Make_Opinionated_Software.php"&gt;Make Opinionated Software&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch05_Half_Not_Half_Assed.php"&gt;Half, Not Half-Assed&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch05_It_Just_Doesnt_Matter.php"&gt;It Just Doesn't Matter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch05_Start_With_No.php"&gt;Start With No&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch05_Hidden_Costs.php"&gt;Hidden Costs &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch06_Done.php"&gt;Done!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch07_Alone_Time.php"&gt;Alone Time&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch07_Meetings_Are_Toxic.php"&gt;Meetings Are Toxic&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch08_You_Cant_Fake_Enthusiasm.php"&gt;You Can't Fake Enthusiasm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch10_Less_Software.php"&gt;Less Software&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch10_Optimize_for_Happiness.php"&gt;Optimize for Happiness&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch10_Manage_Debt.php"&gt;Manage Debt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch11_Theres_Nothing_Functional_about_a_Functional_Spec.php"&gt;There's Nothing Functional About a Functional Spec&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch11_Dont_Do_Dead_Documents.php"&gt;Don't Do Dead Documents&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch11_Tell_Me_a_Quick_Story.php"&gt;Tell Me a Quick Story&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch14_Tough_Love.php"&gt;Tough Love&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/ch15_Better_Not_Beta.php"&gt;Better, Not Beta&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;There are a couple of points of my own I'd like to add that may &lt;span style="font-weight: bold;"&gt;arguably &lt;/span&gt;disagree with a couple of points in the book.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Stay The Course&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Be cautious about changing your mind.  Being flexible is not the same as being schizophrenic.  Embrace change when you know, not when you think.  See out the decisions you've made.  Test them on your market.  If you &lt;a href="http://gettingreal.37signals.com/ch04_Hire_the_Right_Customers.php"&gt;hire the right customer&lt;/a&gt;, you'll find this won't be a problem for you.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Don't Be Lazy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Agreed, you won't &lt;a href="http://gettingreal.37signals.com/ch06_Rinse_and_Repeat.php"&gt;get it right the first time&lt;/a&gt;, but don't let that be an excuse to being lazy.  See the big picture when you're building an application and pay attention to what you're doing.  Don't let the &lt;a href="http://gettingreal.37signals.com/ch06_Race_to_Running_Software.php"&gt;race to running software&lt;/a&gt; get in the way of &lt;a href="http://gettingreal.37signals.com/ch05_Half_Not_Half_Assed.php"&gt;quality&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4062298710387829104-6343895156748004750?l=11oclockdrop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://11oclockdrop.blogspot.com/feeds/6343895156748004750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4062298710387829104&amp;postID=6343895156748004750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/6343895156748004750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4062298710387829104/posts/default/6343895156748004750'/><link rel='alternate' type='text/html' href='http://11oclockdrop.blogspot.com/2007/09/getting-real-now-thats-what-im-talking.html' title='Getting Real... Now That&apos;s What I&apos;m Talking About'/><author><name>Andy Czerwonka</name><uri>http://www.blogger.com/profile/12753674450928055886</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_oxBqHPhpIMY/St-T02RxjnI/AAAAAAAAA0A/-vjiyI7eHrU/s1600-R/8203a5ff349b6a07063b1428fffbad65.png'/></author><thr:total>0</thr:total></entry></feed>
