<?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'><id>tag:blogger.com,1999:blog-7207235379759848020</id><updated>2009-04-16T17:52:54.658-06:00</updated><title type='text'>Scruffles.net</title><subtitle type='html'>Bryan Young is a computer programmer from St Louis Missouri.  He usually works in Java, but enjoys tinkering in .NET, Ruby and other languages.  He also enjoys Photography, computer graphics and talking about himself in the third person.</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.scruffles.net/blog/atom.xml'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>77</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-9198449292631517621</id><published>2009-04-14T17:11:00.005-06:00</published><updated>2009-04-14T17:53:48.535-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Optional Typing in Groovy'/><title type='text'>Optional Typing in Groovy</title><content type='html'>Groovy has a feature called &lt;em&gt;optional typing&lt;/em&gt; which allows types to be declared for fields, parameters and method return values despite Groovy being an otherwise dynamically typed language. This is a useful feature if for no other reason, than for interacting with statically typed languages such as Java. When Java calls Groovy code, it won't have to cast everything to its real type to use it.&lt;br /&gt;&lt;br /&gt;While the feature itself is useful, the name &lt;em&gt;optional typing&lt;/em&gt;, and how the feature is marketed is confusing and misleading. Many assume the phrase &lt;em&gt;optional typing&lt;/em&gt; is short for &lt;em&gt;optional &lt;strong&gt;static&lt;/strong&gt; typing&lt;/em&gt;&lt;sup&gt;1&lt;/sup&gt;. However, static typing is a term reserved for compile-time type checking&lt;sup&gt;2&lt;/sup&gt;, and Groovy does none of that. This will actually compile (but not run) in Groovy:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;int x = "I am not an int!"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I think the term &lt;em&gt;optional typing&lt;/em&gt; should be abandoned and the books should be updated to be a little more honest. Programming is difficult enough without having to fight mis-information.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;span style="font-style: italic;"&gt;Groovy In Action&lt;/span&gt; specifically states this to be the case, with two pages of text on how to choose between dynamic and static types when writing Groovy programs: "The choice between static and dynamic typing is one of the key benefits of Groovy".&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;While &lt;a href="http://en.wikipedia.org/wiki/Static_typing#Static_typing"&gt;wikipedia&lt;/a&gt; is never a definitive source, it states nicely that "A programming language is said to use static typing when type checking is performed during compile-time as opposed to run-time." It also provides some good references for those who would like a more definitive source of information.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-9198449292631517621?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/9198449292631517621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=9198449292631517621' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/9198449292631517621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/9198449292631517621'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2009/04/optional-typing-in-groovy.html' title='Optional Typing in Groovy'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-1767555680067364932</id><published>2009-04-03T20:25:00.007-06:00</published><updated>2009-04-05T21:40:49.136-06:00</updated><title type='text'>Managing By Metrics</title><content type='html'>People who work with me are probably getting sick of hearing my rant on &lt;span style="font-style: italic;"&gt;managing by metrics&lt;/span&gt;.  In a nutshell, I find that technical leaders have a tendency to be anti-social (a trait typical, if not slightly less damaging, in their previous career as developers).  The path of least resistance for these anti-social managers&lt;sup&gt;1&lt;/sup&gt; is to institute rules to take place of communication&lt;sup&gt;2&lt;/sup&gt;.  Rather than pairing with a developer for an hour or floating from project to project to get a grasp on capabilities and direction, the antisocial manager prefers metrics dealing with code coverage, defect rates and test failure rates.&lt;br /&gt;&lt;br /&gt;I only bring this up now, because I heard an &lt;a href="http://www.npr.org/templates/story/story.php?storyId=102670084"&gt;interesting story&lt;/a&gt; on NPR that I thought paralleled my problems with managing by metrics.  &lt;span style="font-style: italic;"&gt;All Things Considered&lt;/span&gt; compares the struggles the NBA has had with player pay incentives with those on Wall Street.  In both cases, employees were given bonuses for reaching individual goals.  In both cases, those individual achievements can have a negative impact on the team as a whole.  The individual is encouraged to act in the best interest of themselves over the short term to the determent to the larger organization.  In essence, people are making bad decisions, because we pay them extra if they do.&lt;br /&gt;&lt;br /&gt;Then later, they wonder why&lt;br /&gt;a) the star of the team breaks a scoring record, but the team doesn't make the playoffs&lt;br /&gt;b) the project has great code coverage, but very fragile code&lt;br /&gt;c) your company did so bad it helped drive the entire economy into the crapper, yet your employees somehow earned $270 million in bonuses.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; the phrase &lt;i&gt;anti-social manager&lt;/i&gt; should be an oxymoron&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; Ironically, this is the exact opposite of the first statement in the &lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;: &lt;i&gt;Individuals and interactions over processes and tools&lt;/i&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-1767555680067364932?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/1767555680067364932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=1767555680067364932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/1767555680067364932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/1767555680067364932'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2009/04/managing-by-metrics.html' title='Managing By Metrics'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-7159218298394691394</id><published>2009-02-05T20:17:00.004-06:00</published><updated>2009-02-05T21:43:25.362-06:00</updated><title type='text'></title><content type='html'>Whenever I start learning about a new language on the JVM, I always find myself wanting to sprinkle the new language into my Java code.  I never want to be the guy asking to scrap our project and start over in Groovy or Scala. I'd rather just drop down to Groovy to parse some XML, or write a quick Unit Test for my Java code with Scala.&lt;br /&gt;&lt;br /&gt;The problem I run into, is that adding code from another language always either involves altering the build process to compile the other language, or adding lots of boilerplate code to interpret an external script.  I really don't like either solution.&lt;br /&gt;&lt;br /&gt;I think if Sun is going to push multiple languages on the JVM, the first thing they should work on is natural integration with those language from Java.&lt;br /&gt;&lt;br /&gt;One solution that would be interesting is similar to GWT's JSNI.  In JSNI, you include your Javascript as a comment on a native method.  Rather than linking to a native library, the GWT compiler digs the javascript out and includes it in the generated Javascript.  Calling code can consider it to be just another Java method:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;public static native void alert(String msg) /*-{&lt;br /&gt;      $wnd.alert(msg);&lt;br /&gt;}-*/;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not really fond of putting the code in comments.  I think that part is just a work around so Google could add the feature without breaking compatibility with IDEs and tools.  Something like this might be a little cleaner:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;@script(language="javascript")&lt;br /&gt;public static void alert(String msg) {&lt;br /&gt;   $wnd.alert(msg);&lt;/span&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This would be a language change to Java, of course... but I think it would be worth any extra effort.  It would allow developers to use the best tool for the job at a much more granular level.&lt;br /&gt;&lt;br /&gt;The Java compiler could just shovel the contents of the method into a JSR223 eval block without much thought.  In time, other compilers, such as Scala's could be aware of this syntax and could compile the code.&lt;br /&gt;&lt;br /&gt;There are other ways to provide support for integrating languages cleanly.  Here's a great &lt;a href="http://channel9.msdn.com/pdc2008/TL16/"&gt;presentation on C# 4&lt;/a&gt; and how its support for dynamic types will help it integrate with other languages (here's an &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/MP4/TL16.mp4"&gt;ipod version&lt;/a&gt; for those who don't want to mess with Silverlight).  I would never expect Java to move forward this aggressively, so I won't bother go into the details. But it's a good presentation for those who like to daydream.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-7159218298394691394?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/7159218298394691394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=7159218298394691394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/7159218298394691394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/7159218298394691394'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2009/02/whenever-i-start-learning-about-new.html' title=''/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-5978431847053668526</id><published>2009-01-24T14:11:00.002-06:00</published><updated>2009-01-24T14:23:25.590-06:00</updated><title type='text'>Video Browsing by direct manipulation</title><content type='html'>This is just cool.&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WcIy9O344bI&amp;hl=en&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/WcIy9O344bI&amp;hl=en&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;and the explanation:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ib_g7F6WKAA&amp;hl=en&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ib_g7F6WKAA&amp;hl=en&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-5978431847053668526?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/5978431847053668526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=5978431847053668526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5978431847053668526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5978431847053668526'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2009/01/video-browsing-by-direct-manipulation.html' title='Video Browsing by direct manipulation'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-5736698413822673125</id><published>2008-10-13T18:04:00.006-06:00</published><updated>2008-10-13T21:51:34.454-06:00</updated><title type='text'>Dogma in Programming</title><content type='html'>One of the more harmful trends the programming industry is the tendency of programmers to create dogma to define good programming.  I believe there is a basic laziness in people encouraging us to boil down a chapter of thought provoking rational into a bumper sticker or a tag line: "Goto Considered Harmful".  In addition to laziness, I think this trend is enforced by a system that ensures that most programmers start with a solid foundation in math, science or engineering - fields of study with provable right and wrong answers to just about everything. I think this conflict leaves a lot of developers in limbo, unable to make forward progress because they will never accept programming as a craft.&lt;br /&gt;&lt;br /&gt;Good resources for programmers are everywhere.  Books like &lt;span style="font-style: italic;"&gt;Effective Java&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;The Pragmatic Programmer&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Clean Code&lt;/span&gt; seem like an echo chamber of good programming practices.  With the growing popularity of Agile methodologies and test driven development, there is no shortage of resources on how to write good code... from the concept to delivery.  But no matter how careful an author is when writing their advice, it will always be taken out of context. I suspect that is the case more in our industry than most due to the relative immaturity of our craft.&lt;br /&gt;&lt;br /&gt;Everyone knows a programmer who quotes books, and doesn't understand the meaning behind them.  Someone who insists on consistency at the cost of maintainability (hmmm.. why did I want consistency again?).  Someone who quotes &lt;span style="font-style: italic;"&gt;'You aren't going to need it'&lt;/span&gt; back to a customer advocate who is asking for a new feature.  Sometimes context is everything.  Sometimes concepts are more important than rules.&lt;br /&gt;&lt;br /&gt;Another common type of programmer I've seen a lot will read a great book like &lt;span style="font-style: italic;"&gt;Agile Principles &lt;/span&gt;and try to turn its practices into laws.  Once they identify two seeming conflicting 'laws' or find a rule that conflicts with the reality of their workplace, they stop in their tracks... unable to move forward.  "This stuff doesn't work! It doesn't deal with &lt;span style="font-style: italic;"&gt;this&lt;/span&gt; situation!" Of course all the principles still stand and would apply with a little flexibility, but doing so would require admitting that programmers are more craftsmen than engineers.&lt;br /&gt;&lt;br /&gt;Obviously the entire industry doesn't work this way, and the abilities of the typical developer vary greatly between regions, industries and even employers.  From time to time, I catch even catch myself over-generalizing things&lt;sup&gt;1&lt;/sup&gt;.  At those times I like to recite my rule: "Dogma in programming is always bad".&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; Several times, just while writing this&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; Yes, it's meant to be ironic. Its a play on one of my favorite quotes: "All extremists should be shot"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-5736698413822673125?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/5736698413822673125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=5736698413822673125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5736698413822673125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5736698413822673125'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2008/10/dogma-in-programming.html' title='Dogma in Programming'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-2853100990954103809</id><published>2008-09-17T20:32:00.001-06:00</published><updated>2008-09-17T20:34:37.605-06:00</updated><title type='text'>Agile and Geomery</title><content type='html'>In geometry we have the pathogen theorem: if you know the length of any two sides of a triangle, then the third is fixed.  I think this makes a great metaphor for the primary advantage of using Agile:&lt;br /&gt;&lt;br /&gt;Software projects have three variables as well: resources, time and features.  If you know two, you can no longer negotiate the third.  Resources are almost always fixed, which leaves two variables.  Agile forces you to choose a fixed timeline and encourages you to let the features reveal themselves.  Waterfall assumes resources and features are fixed, and leaves the deadline for you to discover as the project marches on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-2853100990954103809?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/2853100990954103809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=2853100990954103809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/2853100990954103809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/2853100990954103809'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2008/09/agile-and-geomery.html' title='Agile and Geomery'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-2301332251455398280</id><published>2008-04-24T18:43:00.004-06:00</published><updated>2008-04-24T18:49:42.138-06:00</updated><title type='text'>Springy</title><content type='html'>&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;How long do you need to work with Spring Webflow before it clicks and you wonder how you ever lived without it?&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;I only ask because I desperately look forward to that day.  Today I'm still doing repetitive text searches through a half-dozen xml files to find out what happens when the user presses the OK button.  &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-2301332251455398280?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/2301332251455398280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=2301332251455398280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/2301332251455398280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/2301332251455398280'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2008/04/springy.html' title='Springy'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-196766478996811869</id><published>2008-01-17T21:33:00.000-06:00</published><updated>2008-01-17T22:40:48.182-06:00</updated><title type='text'>Parleys Flex Client</title><content type='html'>I consume a lot of technical media, and one of my favorite sources is &lt;a href="http://www.Parleys.com"&gt;Parleys.com&lt;/a&gt;.  They provide recorded presentations from Javapolis, SpringOne and other shows.  They recently rolled out a beta &lt;a href="http://parleys.com/display/PARLEYS/Parleys.com+V2+BETA+Program?showComments=true"&gt;Flex version&lt;/a&gt; of their site and a companion Air desktop app.  It's a very cool application, offering a lot of long awaited features including local downloading of video and full screen viewing. &lt;br /&gt;&lt;br /&gt;Parleys is making this release just as I'm pushing out the first milestone of a small flex app at work. I may post a little about Flex after I've had a little time to absorb it.  Right now, I'm well within the honeymoon period, and don't think I can give a real balanced viewpoint.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-196766478996811869?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/196766478996811869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=196766478996811869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/196766478996811869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/196766478996811869'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2008/01/parleys-flex-client.html' title='Parleys Flex Client'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-2958361572447341458</id><published>2008-01-16T07:44:00.000-06:00</published><updated>2008-01-16T08:04:37.993-06:00</updated><title type='text'>Lines Of Code</title><content type='html'>There is a reoccurring misconception that I've seen at several job sites now.  Developers seem to be proud of their API, Framework or Library because of how few lines of code the user needs to write, without concern for how many concepts a user must understand.  A well written Library will expose as little of its implementation as possible.  It will provide a single mental model for the user and a consistent way of interacting with it.  While generally, this results in less repeated code, the success of the library cannot be judged on a strict line count. &lt;br /&gt;&lt;br /&gt;Too many times, I've seen internals of a library exposed for the sake of removing a 2-3 lines of code from the caller (usually a simple if or for loop).  The result is often obviously messy APIs, and a lot of learning on the user's part.  It seems that when developing APIs for use internal to their company, developers simply don't have much regard for usability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-2958361572447341458?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/2958361572447341458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=2958361572447341458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/2958361572447341458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/2958361572447341458'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2008/01/lines-of-code.html' title='Lines Of Code'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-4876825032395720233</id><published>2008-01-14T19:40:00.000-06:00</published><updated>2008-01-14T19:45:24.738-06:00</updated><title type='text'>Microsoft Volta</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.scruffles.net/blog/uploaded_images/logo-volta-768351.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://www.scruffles.net/blog/uploaded_images/logo-volta-768345.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I first heard about Volta on the Java Posse (&lt;a href="http://javaposse.com/index.php?post_id=288458"&gt;#154&lt;/a&gt;).  It was carelessly referred to as a GWT rip-off.  Being a long-time listener (and fan) of the Java Posse, I was well aware that opinions expressed about Microsoft products are seldom well researched.   I did a little more reading and was interested in what I found.&lt;br /&gt;&lt;br /&gt;While Volta does generate Javascript, it does so in a slightly different way than GWT.  While GWT reads Java code and compiles to Javascript, Volta reads bytecode (.NET IL) and compiles to Javascript.  And while GWT defines its own UI APIs, Volta uses the existing .Net APIs.  This means, you can write an app in C# or VB using the form designer, add some annotations to tell the system which parts are client code, and compile the same source to both a thick client and a web app.&lt;br /&gt;&lt;br /&gt;Of course, while I can't attest to how well it works (like those at the Java Posse, I don't own a Windows PC), I do think it give us some interesting things to think about in the Java community.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If GWT read bytecode rather than source code, it could support Groovy as well. For those who haven't tried, Groovy builders are a very clean way to write Swing code. They could have been helpful for GWT as well.&lt;/li&gt;&lt;li&gt;Could a single set of UI APIs apply for Applets, Applications and GWT-like Web apps, like Microsoft's Avalon APIs span Silverlight, Windows Apps and Volta UIs?&lt;/li&gt;&lt;li&gt;How many interesting ideas do we miss because we don't watch developments in competing environments?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-4876825032395720233?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/4876825032395720233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=4876825032395720233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/4876825032395720233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/4876825032395720233'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2008/01/microsoft-volta.html' title='Microsoft Volta'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-5831004248248591637</id><published>2007-12-13T16:11:00.000-06:00</published><updated>2008-01-13T16:51:58.017-06:00</updated><title type='text'>Applets Still Suck</title><content type='html'>Despite all the effort Sun announced at the last Java One, applets still suck.  They have for years, so why would it matter?  Because JavaFX Script, Sun's latest whiz-bang technology still needs a container to run in.  Embed one in a web page, and they still have all the disadvantages of an Applet.&lt;br /&gt;&lt;br /&gt;Recently, I've worked on a web project that took advantage of both Applets and Flash technology.  The difference in user experience is clear.  And despite a complete rewrite of the Java plugin in Java6 Update 10, Sun is still a day late and a dollar short.&lt;br /&gt;&lt;br /&gt;First the good news: Sun's version detection scripts work fairly well.  The rewrite of the plugin for Firefox was sorely needed and will make a dramatic difference.  And although I haven't seen the results, I suspect the modular nature of the new JRE will make for a much lighter weight experience for users. &lt;br /&gt;&lt;br /&gt;So what's still missing?&lt;br /&gt;&lt;br /&gt;The Applet framework has not been altered in any way.  An Applet is still heavy-weight.  It still makes an OS call to draw its window.  This means that applets (and by extension JavaFX scripts) embedded in your web site will not play nice with CSS Z-orders.  You cannot open a CSS dialog or popup on the same page as your applet, as your applet will always be on top.&lt;br /&gt;&lt;br /&gt;Although the new plugin will be available as part of Java 6 (beginning with Update 10), it will need to be manually enabled by the user from the control panel.  I assume this is because Sun doesn't want to ship new features in an update, which seems reasonable.  But because of this, it won't be safe to assume your users can view your applet in a reliable way until Java 7 is widely available.  Of course the new plugin won't work in Firefox 2 anyway. It requires Firefox 3. Oh, and it doesn't support Safari.  If you run Safari, your at the mercy of Apple.  Lets hope none of those JavaFx libraries get compiled to Java 6, because Apple doesn't seem to have plans to support my Powerbook with Java 6... ever.&lt;br /&gt;&lt;br /&gt;What about the current plugin? Using the existing plugin can cause unpredictable results.  In Firefox, resizing the applet can cause your applet to re-initialize (not just fire events, or call start() again).  I've also seen the plugin randomly ignore the page layout and get stuck in an odd place on the screen.  Refreshing the page usually fixes the problem, but that isn't something I really want to tell my end user to do. And of course the current plugin has none of the performance improvements made to the new plugin.&lt;br /&gt;&lt;br /&gt;With all the excitement over JavaFx lately, I thought it might be a good time to remind people that there isn't a JavaFx plugin.  JavaFx in the browser will still suck for all the same reasons Applets do.  I expect them to continue to suck, as I see no evidence from Sun that they plan to follow through and actually fix any of this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-5831004248248591637?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/5831004248248591637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=5831004248248591637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5831004248248591637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5831004248248591637'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/12/applets-still-suck.html' title='Applets Still Suck'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-8862190080806174979</id><published>2007-08-23T19:39:00.000-06:00</published><updated>2007-08-23T20:20:59.695-06:00</updated><title type='text'>JLINQ - Lame</title><content type='html'>Wow.&lt;br /&gt;&lt;br /&gt;IBM has outdone themselves.  I'm struggling to find words to express what I think of &lt;a href="http://www.ibm.com/developerworks/db2/library/techarticle/dm-0708ahadian/index.html?ca=drs"&gt;their latest announcement&lt;/a&gt;.  IBM has released a new Eclipse plugin that they call JLinq.  It's essentially an O/R mapping tool that does most of its work using design time code generation.  It generates SQL from beans or beans from SQL.  It's essentially a bunch of Eclipse wizards that generate code.  Not especially impressive, and a surprising direction after all the recent hype about JPA, Hibernate and EJB 3.&lt;br /&gt;&lt;br /&gt;Of course bad software being released from IBM is nothing new.  What I find truly exasperating about JLinq is the name.  Surly a Java technology named JLinq would have some resemlence to Microsoft's LINQ technology.  It's not only the same acronym, but it stands for the same thing in both technologies: "Language Integrated Query".  But while Microsoft's LINQ, is a query language integrated into the programming language (go figure), IBM's LINQ is a code generator integrated into an IDE.  WTF?&lt;br /&gt;&lt;br /&gt;These kinds of projects are not just an embarrassment to IBM, but might be harmful to the Java community as well.  Too many Java developers are completly ignorant of advancements outside thier own community. This kind of confusion isn't helpful.  How many developers are going to assume this is a Java port of LINQ, and judge LINQ on the merits of IBM's 3rd rate Eclipse plugin?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-8862190080806174979?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/8862190080806174979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=8862190080806174979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/8862190080806174979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/8862190080806174979'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/08/jlinq-lame.html' title='JLINQ - Lame'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-8750064119741549432</id><published>2007-07-07T11:30:00.000-06:00</published><updated>2007-07-07T11:45:47.972-06:00</updated><title type='text'>LINQ ScreenCast</title><content type='html'>&lt;a href="http://weblog.infoworld.com/udell/screenroom/"&gt;The Screening Room&lt;/a&gt; has a great &lt;a href="http://weblog.infoworld.com/udell/screenroom/linq_flv.html"&gt;screencast on LINQ&lt;/a&gt;.  It's a little early to get too excited about LINQ, but the demos are very impressive.  The combination of declarative type-safe queries and object oriented code makes many of our hot new trendy languages and language features seem like dirty hacks.  Specifically many of the new Java features and JSRs take advantage of EL or queries embedded in Strings to get the job done -- effectively dropping down into a dynamic language.  While dynamic languages may be the most pragmatic solution today, its nice to see someone is working on a more practical permanent solution.&lt;br /&gt;&lt;br /&gt;On a related note, O'Reilly has a good shortcuts book on the under-pinnings of LINQ (&lt;span class="book-title" style="font-weight: bold;"&gt;&lt;/span&gt;&lt;a href="http://www.oreilly.com/catalog/language1/index.html"&gt;&lt;span class="book-title"&gt;LINQ: The Future of Data Access in C# 3.0&lt;/span&gt;&lt;/a&gt;). My interest in it wasn't about learning about LINQ itself, but what language features had to be added to support it. It does a good job of showing how ambitious this project is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-8750064119741549432?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/8750064119741549432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=8750064119741549432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/8750064119741549432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/8750064119741549432'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/07/linq-screencast.html' title='LINQ ScreenCast'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-6803592204028528949</id><published>2007-06-30T22:22:00.000-06:00</published><updated>2007-06-30T22:43:11.955-06:00</updated><title type='text'>Bob on Design</title><content type='html'>Bob Lee had some &lt;a href="http://crazybob.org/2007/06/lies-damned-lies-and-xml.html"&gt;interesting comments&lt;/a&gt; on the advantages of using annotations rather than XML for configuration.  I didn't find the original post as interesting as the comments that followed.  Among them was a little pearl of wisdom I think deserves to be embroidered on a pillow:&lt;br /&gt;&lt;blockquote&gt;Contrary to Spring's philosophies, I think very few design decisions are "a matter of taste." Some ways of doing things are provably better than others, and one way of doing something is almost always better than two. Otherwise, you end up with the Perl of frameworks.&lt;/blockquote&gt;Ok. So it would have to be a big pillow. But I've regularly had to deal with co-workers who write code with all public members or write extra methods that are never called -- just in case.  They almost always plea &lt;span style="font-style: italic;"&gt;'a matter of taste'&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-6803592204028528949?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/6803592204028528949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=6803592204028528949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/6803592204028528949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/6803592204028528949'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/06/bob-on-design.html' title='Bob on Design'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-5484848923369960365</id><published>2007-06-19T20:24:00.001-06:00</published><updated>2007-06-19T20:44:18.921-06:00</updated><title type='text'>Hand Coded</title><content type='html'>Josh Marinacci recently wrote about using a &lt;a href="http://weblogs.java.net/blog/joshy/archive/2007/06/a_response_to_g.html"&gt;tool vs hand coding&lt;/a&gt; your Swing UI. While I don't completely disagree with all of his arguments, he tries to make a couple of points that burn me a bit. &lt;br /&gt;&lt;br /&gt;1) He tries to argue that you don't have to worry about vendor lock-in with Matisse because its open source&lt;br /&gt;2) Because the files generated by Matisse are hand-hackable, you don't need to be concerned with lock-in&lt;br /&gt;&lt;br /&gt;In my 8 years of Swing programming, I've used 5 visual editors for writing Swing GUIs.  While Matisse is currently the leader, I don't see any reason why it would still be the best next year.  The previous 4 visual editors didn't last long, I fail to see why Matisse's open source license is going to keep it in the number 1 spot throughout eternity.&lt;br /&gt;&lt;br /&gt;Also, each of the 5 visual editors I refer to generated hand-hackable code.  While we could always &lt;span style="font-style: italic;"&gt;survive&lt;/span&gt; without our old GUI tools, the crap code generated by those tools were never &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; maintainable. &lt;br /&gt;&lt;br /&gt;While standardizing the XML format Matisse uses won't hurt anything, I really don't see how it would help either.  It's not as if Eclipse, IDEA and JBuilder are all going to start playing nice with Matisse-generated code. &lt;br /&gt;&lt;br /&gt;We need more than just a defacto-standard JavaBeans editor.  We need a well thought out component model.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-5484848923369960365?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/5484848923369960365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=5484848923369960365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5484848923369960365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5484848923369960365'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/06/hand-coded.html' title='Hand Coded'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-4913819653279506090</id><published>2007-05-31T20:21:00.001-06:00</published><updated>2007-06-03T16:17:19.530-06:00</updated><title type='text'>More video content</title><content type='html'>I'm a big fan of the recent trends towards webinars and recorded presentations.  It's a great way to get a 1000 foot view of a topic with very little effort.  I've posted a few sources for &lt;a href="http://www.scruffles.net/blog/2006/08/presentations-reading-material.html"&gt;videos&lt;/a&gt; and &lt;a href="http://www.scruffles.net/blog/2006/06/good-audio-content.html"&gt;audio&lt;/a&gt; in the past, but I've recently found a couple new interesting links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ted.com/talks"&gt;TED Talks&lt;/a&gt; are online and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developers.sun.com/learning/javaoneonline/j1online.jsp?track=1&amp;yr=2007"&gt;JavaOne 2007 sessions&lt;/a&gt; are being released gradually (although I'm a little disappointed that the 2005 sessions have disappeared)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;EDIT (6/3)&lt;/span&gt;: It looks like I missed the release of the &lt;a href="http://www.javapolis.com/confluence/display/JP06/JavaPolis+2006+Conference+DVD"&gt;JavaPolis 2006 DVD&lt;/a&gt;.  I just ordered it, so I can't vouch for its content yet, but quite a few of the presentations are available from  &lt;a href="http://www.bejug.org/confluenceBeJUG/display/PARLEYS/Home"&gt;Parleys&lt;/a&gt;, and the &lt;a href="http://www.javapolis.com/confluence/display/JP05/JavaPolis+2005+DVD"&gt;2005 DVD&lt;/a&gt; was a great resource.  At 49€ (about $65) it's considerably cheaper than attending a conference in person.&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;EDIT (6/4): &lt;/span&gt; Google has released &lt;a href="http://www.youtube.com/rss/tag/googledeveloperday.rss"&gt;video from Google Developer Days&lt;/a&gt; including &lt;a href="http://youtube.com/watch?v=HsODVUvgvdk"&gt;a presentation on Google Gears&lt;/a&gt;, which is a neat little framework for writing off-line web apps.  They use a local database to store content.  And, of course, it's fully searchable.  They also have &lt;a href="http://youtube.com/watch?v=x_NpraeC3tk"&gt;a presentation on Juice&lt;/a&gt;, which was pretty interesting.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-4913819653279506090?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/4913819653279506090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=4913819653279506090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/4913819653279506090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/4913819653279506090'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/05/more-video-content.html' title='More video content'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-3503636044916548153</id><published>2007-05-20T21:40:00.001-06:00</published><updated>2007-05-20T22:10:57.890-06:00</updated><title type='text'>New Lens</title><content type='html'>Last week I got a macro lens I've been looking at for quite a while (Canon EF 100mm f/2.8).  I have mixed feelings about it so far. It does its job very well, but I'm a little frustrated at how completely useless it is outside of macro photography.  With my other lenses, I can work a little outside their area of expertise when a good shot presents itself, but because this lens is fixed at 100mm, using it for a casual photo in a pinch is a bit of a pain.  That aside, I really love what it does with macro photos.  It gives me a decent working distance from the subject and the short focal distance, while a little difficult to work with, can really make a photo stand out.&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/scruffles/507010930/" title="frog"&gt;&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/193/507010930_21dcab6d99.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;The detail in the Frog's eye is great (check out the full size version on flickr).  What you can't really see from this picture, is that the entire frog is about the size of my thumbnail.&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/scruffles/507006574/" title="ant"&gt;&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/212/507006574_65d273e46d.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I cropped this one a little.  Keeping the ant's head in focus was a bit tricky with a monopod.  I may need to start using my tripod a bit more often.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-3503636044916548153?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/3503636044916548153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=3503636044916548153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/3503636044916548153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/3503636044916548153'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/05/shallow-dof-frog-eye.html' title='New Lens'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-5964654445553315804</id><published>2007-05-17T21:27:00.000-06:00</published><updated>2007-05-17T21:45:55.382-06:00</updated><title type='text'>Distributed Version Control</title><content type='html'>&lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8"&gt;Linus gave a presentation&lt;/a&gt; on &lt;a href="http://en.wikipedia.org/wiki/Git_%28software%29"&gt;git&lt;/a&gt;, his distributed version control system.  I've heard a lot about git and &lt;a href="http://en.wikipedia.org/wiki/BitKeeper"&gt;bitkeeper&lt;/a&gt;, but hadn't paid much attention until this presentation.  If you haven't taken the time to learn about distributed version control, you should take an hour tonight and watch the presentation.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://kylecordes.com/2007/05/17/linux-git-distributed/"&gt;Kyle Cordes&lt;/a&gt; for posting the link on the JUG mailing list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-5964654445553315804?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/5964654445553315804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=5964654445553315804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5964654445553315804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5964654445553315804'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/05/distributed-version-control.html' title='Distributed Version Control'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-6364723202204370130</id><published>2007-05-12T21:19:00.000-06:00</published><updated>2007-05-12T22:01:16.070-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Building the IDEA Groovy Plugin</title><content type='html'>It took me a little effort to get Idea's Groovy Plugin built, so I thought I'd share my experiences for those who don't want to fall in the same traps.&lt;br /&gt;&lt;br /&gt;I started from some &lt;a href="http://intellij.net/forums/thread.jspa?threadID=267193&amp;tstart=0"&gt;instructions on the forums&lt;/a&gt;, but still had trouble. Some filenames were wrong, and working on the mac changed some of the details.  Here are my revised instructions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Update to a new EAP of IDEA. The plugin wasn't built for IDEA 6&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Checkout the project from  &lt;a href="http://svn.jetbrains.org/idea/Trunk/groovy/"&gt;http://svn.jetbrains.org/idea/Trunk/groovy/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;When you first open the project, you may be asked to make a variable association. I pointed the templates variable to ${project}/resources/fileTemplates&lt;/li&gt;&lt;li&gt;I had to create a new &lt;span style="font-style: italic;"&gt;Intellij IDEA SDK&lt;/span&gt; pointing it to my IDEA installation&lt;/li&gt;&lt;li&gt;Add &lt;span style="font-style: italic;"&gt;tools.jar&lt;/span&gt; (on windows) or &lt;span style="font-style: italic;"&gt;classes.jar&lt;/span&gt; (on the mac) from your JDK installation to the SDK classpath&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Add &lt;span style="font-style: italic;"&gt;idea.jar&lt;/span&gt; from your idea installation (on the mac, the file is &lt;span style="font-style: italic;"&gt;/Applications/Selena-6951.app/lib/idea.jar&lt;/span&gt;) to your SDK classpath&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There are already two ant scripts in the ant window. Run the one called &lt;span style="font-style: italic;"&gt;generate lexer from groovy&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Run the &lt;span style="font-style: italic;"&gt;build&gt;make&lt;/span&gt; command from IDEA's menu&lt;/li&gt;&lt;li&gt;Run the &lt;span style="font-style: italic;"&gt;build&gt;Prepare Plugin Module 'groovy' for deployment&lt;/span&gt; command from IDEA's menu&lt;/li&gt;&lt;li&gt;A zip file will be generated to the project directory. Copy it to IDEA's plugin directory and unzip it.&lt;/li&gt;&lt;li&gt;Restart IDEA&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I've attached the file for those daring enough to install software from some stranger's blog: &lt;a href="http://www.scruffles.net/blog/groovy.zip"&gt;groovy.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-6364723202204370130?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/6364723202204370130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=6364723202204370130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/6364723202204370130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/6364723202204370130'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/05/building-idea-groovy-plugin.html' title='Building the IDEA Groovy Plugin'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-5029612539437943828</id><published>2007-05-09T21:47:00.000-06:00</published><updated>2007-05-09T22:59:26.373-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>JavaFX in Perspective</title><content type='html'>The large number of discussion about JavaFX over the last few days seems be very polarized.  So far I have only read two opinions repeated over and over:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;JavaFX is the competitor to Flash and SilverLight that we've all been waiting for.&lt;/li&gt;&lt;li&gt;JavaFX is a weak attempt to cash in on the recent SilverLight announcements and has no chance for success.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;What most people don't seem to get, is that JavaFX isn't even in the same market as Flash and SilverLight.  It's much more appropriate to compare JavaFX with XAML or Flex (just the markup language, not the action script, runtime environment, multimedia support or animation).&lt;br /&gt;&lt;br /&gt;Both Adobe's product line and Microsofts are made up of several packages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A runtime environment - The Flash VM and the .Net Runtime&lt;/li&gt;&lt;li&gt;A declarative UI language including widgets - Flex and a light version of XAML&lt;/li&gt;&lt;li&gt;A declarative animation language - Flash and XAML&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A scripting language for procedural logic - Action Script and JavaScript&lt;/li&gt;&lt;li&gt;A development environment for each of these three languages&lt;/li&gt;&lt;li&gt;Multimedia components - video and audio playback is supported well as first class components in both frameworks&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Of course JavaFX runs on the Java runtime environment, and it defines a very nice language for declarative UI building and a decent language for animation... but that's all it tries to do.&lt;br /&gt;&lt;br /&gt;Sun has yet to show any interest in completing the rest of the picture.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It could be argued that some work would need to be done to the JRE before it could be light enough to compete with Flash or Silverlight as a runtime environment (at least ease of installation could use some work).&lt;/li&gt;&lt;li&gt;JavaFX has no equivalent to JavaScript.  Although one could theoretically use Java, Groovy, Javascript or some other language for procedural code, the binding isn't nearly as nice as the integration the other two frameworks have with their scripting languages.&lt;/li&gt;&lt;li&gt;Netbeans provides some syntax highlighting and code completion for the language, but it's barely better than notepad when compared to the authoring tools being offered by Adobe.  To take on the competition, Netbeans will need timeline driven animation and Matise-like component layout from day one.  On day two, we need vector drawing tools to compete with Illustrator and Expression (tie-in with existing tools might be a nice stop gap).&lt;/li&gt;&lt;li&gt;Multimedia support has always been a weakness in Java.  JavaFX is the neon sign pointing out one of Sun's often ignored weakesses. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;With all that said, JavaFX compares very nicely to Flex and XAML when ignoring their sister technologies.  Feature for feature it compares nicely.  Without the rest of the package, of course, it's all pretty academic. Assuming Sun is really serious about taking on Adobe and Microsoft, they still have a lot of work ahead of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-5029612539437943828?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/5029612539437943828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=5029612539437943828' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5029612539437943828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/5029612539437943828'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/05/javafx-in-perspective.html' title='JavaFX in Perspective'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-4361903307850613131</id><published>2007-03-19T20:35:00.000-06:00</published><updated>2007-03-19T21:52:44.488-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>WPF &amp; Flex</title><content type='html'>I went to a &lt;a href="http://www.stlnet.org/DesktopDefault.aspx?tabid=1"&gt;.Net User's Group&lt;/a&gt; meeting about WPF tonight. The speaker was Walt Ritscher.  The presentation was a pretty decent intro.  I was expecting it to be quite a bit more in depth.  I guess I figured .Net developers would already be up to speed on WPF and an intro presentation would be beyond them at this point.  I seem to make a habit of setting my expectations a little too high for most user group presentations.&lt;br /&gt;&lt;br /&gt;I recently signed up for a membership at &lt;a href="http://www.lynda.com"&gt;lynda.com&lt;/a&gt;, which provides instructional videos on many technical topics.  The subject matter tends to lean towards creative tools (Photoshop).  I've been watching the Flex training videos and I can't help notice the similarities to what Microsoft is doing with WPF.  Macromedia really seemed to have missed the boat by brining application development to Flash so late in the game, but they seem to be catching up well now that Microsoft has put some fear into them.  Since Adobe took over, they've kept going strong.&lt;br /&gt;&lt;br /&gt;Of course both Flex and WPF/E are both proprietary technologies that have fairly useless free SDKs and $600 development environments for the serious user.  I haven't seen any free alternatives with anything close to the capabilities.  Both SVG and &lt;a href="http://blogs.sun.com/chrisoliver/entry/f3"&gt;F3&lt;/a&gt; have similar capabilities, but F3 isn't open and lacks the development tools and SVG lacks good browser support.&lt;br /&gt;&lt;br /&gt;Oh well... guess we'll have to put up with Ajax for a few more years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-4361903307850613131?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/4361903307850613131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=4361903307850613131' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/4361903307850613131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/4361903307850613131'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/03/wpf-flex.html' title='WPF &amp; Flex'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-8115058751766322</id><published>2007-03-14T23:50:00.000-06:00</published><updated>2007-03-14T22:52:59.299-06:00</updated><title type='text'>IntelliLang</title><content type='html'>&lt;a href="http://www.jetbrains.net/confluence/display/CONTEST/IntelliLang"&gt;IntilliLang&lt;/a&gt; is a very cool plugin for Idea that (among other things) allows &lt;em&gt;stringified &lt;/em&gt;code to be parsed as any other code.  This means those regular expressions and html fragments you store as a Java String can be parsed, checked and auto-completed as a first-class citizen.&lt;br /&gt;&lt;br /&gt;Jetbrains shows some very cool examples including regular expressions, javascript and el.  It still has some rough edges, but once its cleaned up a bit, it could be a great tool for HQL queries and embedded SQL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-8115058751766322?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/8115058751766322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=8115058751766322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/8115058751766322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/8115058751766322'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/03/intellilang.html' title='IntelliLang'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-7442867019338076065</id><published>2007-02-25T23:30:00.000-06:00</published><updated>2007-02-26T08:08:37.293-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Photoshop'/><title type='text'>Lightroom</title><content type='html'>I had been using the beta of Lightroom since its first release.  Initially I wanted to use it rather than Apature because of Apature's lack of good Photoshop integration.  Ironically, Lightroom didn't play well with Photoshop either.  My biggest complaint was that Bridge and Camera Raw didn't recognize edits made from Lightroom. Although this is fixed in Lightroom 1.0, at the time I had to work in either Bridge/Camera Raw/Photoshop or Lightroom/Photoshop.&lt;br /&gt;&lt;br /&gt;I like the Bridge/Camera Raw workflow because it's filesystem based.  I don't like applications managing my files.  But Camera Raw, as powerful as it is, is a clunky tack-on dialog where I really want an emersive tool.  When I'm editing my photos, I work on them for hours at a time.  I don't want to jump around between dialogs and have to save copies of my files.&lt;br /&gt;&lt;br /&gt;After a couple months, I gave up completly on Bridge/Camera Raw.  I was soon using Lightroom for all my post-processing, and doing touchups in Photoshop.  As sad as it might be, I was using Photoshop solely for removing zits and cleaning up tape marks on my son's face (because of medical issues, he uses oxygen at night. His cannula has to be taped to his face).  $600 of image processing power, devoted to removing tape and pimples.&lt;br /&gt;&lt;br /&gt;And then Lightroom 1.0 was released.  One of it's new features: Spot Removal.  Here's the twist.  Rather than saving a copy of the RAW file to edit in Photoshop, Lightroom's edits are lossless changes to the RAW file.  While the Photoshop tool is more like a raster based brush, in Lightroom all the corrections are circles with source and destination references.  Those references can be altered or cleared at any time in the future.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.scruffles.net/blog/uploaded_images/lightroom-772923.jpg"&gt;&lt;img style="cursor: pointer;" src="http://www.scruffles.net/blog/uploaded_images/lightroom-768917.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the example above, I've made several corrections.  The active one is represented by the two circles at either end of the arrow.  The arrow is saying "copy everything in this circle to this one".  At first it seemed rather limiting to have to use circles rather than a brush, but after a little time, I've found it to be very powerful.&lt;br /&gt;&lt;br /&gt;What's more, this single tool has completely eliminated Photoshop from my regular workflow. While I still use Photoshop from time to time for other projects, I don't really need it for photo processing any more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-7442867019338076065?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/7442867019338076065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=7442867019338076065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/7442867019338076065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/7442867019338076065'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/02/lightroom.html' title='Lightroom'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-6641591511641857763</id><published>2007-02-07T19:10:00.000-06:00</published><updated>2007-02-07T19:14:24.107-06:00</updated><title type='text'>Thoughts On Music</title><content type='html'>For those who haven't read it, &lt;a href="http://www.apple.com/hotnews/thoughtsonmusic/"&gt;Steve Job's article denouncing DRM&lt;/a&gt; is a good read.  I was expecting typical corporate finger pointing related to the problems Apple is having in Europe, but Jobs makes some very good points.  He also points out a pretty decent explanation to why the Zune doesn't use playsforsure DRM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-6641591511641857763?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/6641591511641857763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=6641591511641857763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/6641591511641857763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/6641591511641857763'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/02/thoughts-on-music.html' title='Thoughts On Music'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7207235379759848020.post-2626513933536847076</id><published>2007-02-06T07:03:00.000-06:00</published><updated>2007-02-06T10:33:55.516-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Swing and Vendor Lock-in</title><content type='html'>10 years ago Sun introduced Swing, and with it, JavaBeans. JavaBeans were supposed to allow UI widgets to be defined as components. It would allow Swing developers to take advance of graphical layout editors without vendor lock-in. It failed.&lt;br /&gt;&lt;br /&gt;Those who tried to develop Swing apps with their IDE's drag and drop editor forced their way through limitations and learned how to hand-code fixes that wouldn't break their IDE's code parsing. Then support would dry up for their favorite tool and they would be left with no alternative, but to hand-code their Swing apps. Others recognized the graphical tools as Microsoft-style lock-in and avoided it early on. For almost a decade, hand-coded Swing apps have been the norm.&lt;br /&gt;&lt;br /&gt;10 years later, Sun is trying again. They seemed to have missed the point of their initial failure. They seem to be under the impression that had the first tools been of higher quality, people would have never resorted to hand-coding their Swing apps. In reality, it was the proprietary nature of the IDE-generated code that caused the failure. No matter how well the tools would have worked, Java developers have been conditioned to demand vendor neutrality.&lt;br /&gt;&lt;br /&gt;Vendor neutrality is not something developers get from Netbeans and Mattise. As nice as the platform is, the code it generates is not parseable by any other platform. Because it doesn't generate code to a standard, such ad-hock compatibility wouldn't be enough anyway.&lt;br /&gt;&lt;br /&gt;This problem has already been solved, of course. Ironically, one of the latest solutions is from Microsoft. Although XAML is a closed standard, it is a standard. It's well defined and parsable by multiple editors. A Swing solution wouldn't have to be as feature heavy as XAML. There are many open source solutions that fill the need. Of course they would need to be adoped by Sun (presumably via a JSR) and the IDE vendors to be a useful vendor-neutral solution. Until this happens, Mattise is just another way to lock your application to your IDE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/7207235379759848020-2626513933536847076?l=www.scruffles.net%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/2626513933536847076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7207235379759848020&amp;postID=2626513933536847076' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/2626513933536847076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7207235379759848020/posts/default/2626513933536847076'/><link rel='alternate' type='text/html' href='http://www.scruffles.net/blog/2007/02/swing-and-vendor-lock-in.html' title='Swing and Vendor Lock-in'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/06737057298359401295</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry></feed>