<?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-2396018311141903513</id><updated>2011-12-21T23:54:22.339-05:00</updated><title type='text'>Development Musings</title><subtitle type='html'>Blogging on all things relating to software development. Hopefully, buzzword-free blogging.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-8070839479370712801</id><published>2011-07-10T07:04:00.000-04:00</published><updated>2011-07-10T07:04:09.137-04:00</updated><title type='text'>Functional UI programming</title><content type='html'>I started using Scala recently to develop a movie player as a side project, with the goal of using functional constructs whenever possible. I found myself using imperative-style programming when interacting with the UI framework. This got me thinking, is there a functional state-less way to develop UIs? A bit of Googling revealed the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/2672791/is-functional-gui-programming-possible/2672898#2672898"&gt;StackOverflow&lt;/a&gt; post that talks about this problem and references&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Functional_reactive_programming"&gt;functional reactive programming&lt;/a&gt;&amp;nbsp;(FRP).&amp;nbsp;&lt;/li&gt;&lt;li&gt;The Haskell people have developed UI frameworks around FRP.&lt;/li&gt;&lt;li&gt;For the rest of us non-Haskell people, there is &lt;a href="http://www.flapjax-lang.org/"&gt;Flapjax&lt;/a&gt;, an FRP model built on top of JavaScript for the web.&lt;/li&gt;&lt;li&gt;The spreadsheet is an example of a FRP model where cells are re-evaluated when dependent values change.&lt;/li&gt;&lt;li&gt;Clojure creater Rich Hickey &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/9d25ba047dc729fe"&gt;recommends&lt;/a&gt; sticking with state-ful programming but keeping it to a minimal.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-8070839479370712801?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/8070839479370712801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2011/07/functional-ui-programming.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/8070839479370712801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/8070839479370712801'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2011/07/functional-ui-programming.html' title='Functional UI programming'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-3415876588928827607</id><published>2011-01-13T23:31:00.000-05:00</published><updated>2011-01-13T23:31:38.315-05:00</updated><title type='text'>Drupal Developer Modules</title><content type='html'>Imagine if Firebug disappeared all of a sudden and you have to build     a website/app without it?&lt;br /&gt;&lt;br /&gt;I came across 3 Drupal modules for development that will help you do     better customization, improve performance and responsiveness of the     beast, and help flatten that learning curve. These modules may even     get you to start thinking about using Drupal in the web application     space, as opposed to a mere brochure-ware. After spending 30 minutes     with these modules, you're going to feel like you've been developing     without Firebug. Drupal development may even be fun.&lt;br /&gt;&lt;br /&gt;Devel - 61k sites report using it, which probably means that you should be using it. This is the core development module that     provides the usual SQL query profiling, node debugging, etc..&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://drupal.org/project/devel"&gt;http://drupal.org/project/devel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DrupalForFirebug - 5k sites using it. The name is exactly     what you think. Never again will you do var_dump($node). You can see     SQL queries profiled. And it's all organized in Firebug into     separate Drupal tab (as opposed to a Firebug console dump). There's     even a Chrome extension.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://drupal.org/project/drupalforfirebug"&gt;http://drupal.org/project/drupalforfirebug&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Devel Themer - 2k sites using it. The Firebug Drupal extension is a     sleeper compared to this. When enabled, you can hover almost any     piece of content (like Firebug) and see the Drupal function call     and/or theme file that emitted it. It even shows the arguments of     the method and tells you what template file to create to override     the function. This makes it MUCH easier to customize the output of     piece of content because you no longer have to track down the     10s/100s of files and piece together what is calling what. Watch     this screencast:     &lt;a class="moz-txt-link-freetext" href="http://ftp.drupal.org/files/videocasts/moshe-theme-developer.mov"&gt;http://ftp.drupal.org/files/videocasts/moshe-theme-developer.mov&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://drupal.org/project/devel_themer"&gt;http://drupal.org/project/devel_themer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-3415876588928827607?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/3415876588928827607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2011/01/drupal-developer-modules.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/3415876588928827607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/3415876588928827607'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2011/01/drupal-developer-modules.html' title='Drupal Developer Modules'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-4224071810059150231</id><published>2010-12-25T09:32:00.001-05:00</published><updated>2010-12-25T09:32:31.979-05:00</updated><title type='text'>Free to distribute fonts from Google</title><content type='html'>Web fonts can be boring. There are much nicer fonts on your desktop operating system or application. But these fonts are not free and can be very costly to distribute. Fortunately, there are nice looking free fonts for free distribution, provided by Google:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/webfonts"&gt;http://code.google.com/webfonts&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-4224071810059150231?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/4224071810059150231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2010/12/free-to-distribute-fonts-from-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4224071810059150231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4224071810059150231'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2010/12/free-to-distribute-fonts-from-google.html' title='Free to distribute fonts from Google'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-5359316157714360526</id><published>2010-10-30T11:28:00.002-04:00</published><updated>2010-10-30T11:29:31.329-04:00</updated><title type='text'>Writing Testable Code</title><content type='html'>Check out Misko Hevery, the clean code talk guy's guide to writing testable code:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://misko.hevery.com/code-reviewers-guide/"&gt;http://misko.hevery.com/code-reviewers-guide/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The page itself is a 5-minute read but download PDF for a more detailed explanation of the rationale for these guidelines, which are sort of a common realization among folks who have gone through the trials and tribulations of extensive unit testing.&lt;br /&gt;&lt;br /&gt;There's also quite a bit of other interesting stuff on his blog, including: &lt;angular&gt;augular, a RAD platform for developing CRUD apps on the web with only HTML (no server-side, no SQL); and CoffeeScript, a terser way of writing JavaScript.&lt;/angular&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-5359316157714360526?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/5359316157714360526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2010/10/writing-testable-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5359316157714360526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5359316157714360526'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2010/10/writing-testable-code.html' title='Writing Testable Code'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-5757216454261873293</id><published>2010-06-19T13:36:00.007-04:00</published><updated>2011-04-24T08:45:04.024-04:00</updated><title type='text'>Data recovery tutorial using Ubuntu Linux</title><content type='html'>I have an old hard disk with corrupt NTFS volumes and I want to recover the data. I'm not sure how the drives got corrupt but they cannot be fixed by &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;chkdsk /f.&lt;/b&gt; Fortunately, there's a plethora of open source data recovery tools available. Two such tools are &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;foremost&lt;/b&gt; and &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;photorec&lt;/b&gt; which specialize in combing through hard drive partitions to recover files based on header information. They can even recover files after accidental reformatting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Foremost&lt;/span&gt; is a tool originally developed by the U.S. Air Force and is available via &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo apt-get install foremost&lt;/b&gt;. It can recover common file types such as &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;txt&lt;/b&gt;, &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;jpg&lt;/b&gt;, &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;avi&lt;/b&gt;, and&lt;b&gt; &lt;/b&gt;etc.. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Foremost&lt;/span&gt; was &lt;a href="http://sourceforge.net/projects/foremost"&gt;last updated&lt;/a&gt; in 2008 which means that its knowledge of file headers is, at best, two years dated.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cgsecurity.org/wiki/PhotoRec" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Photorec&lt;/a&gt; is part of the &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;testdisk&lt;/span&gt;&lt;/b&gt; suite and is available via &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo apt-get install testdisk&lt;/b&gt;. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Testdisk&lt;/span&gt; is a tool that not only "tests your disk" but also rebuilds your partition table. This is the tool to use if your hard drive's master boot record or partition table is corrupt. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Photorec&lt;/span&gt;, like &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;testdisk&lt;/span&gt;, is a poorly named command-line tool. Like &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;foremost&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;photorec&lt;/span&gt; recovers files (not just photos) based on file headers. In fact, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;photorec&lt;/span&gt; supports more file types and is more up-to-date than &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;foremost&lt;/span&gt;, which is evident by the fact that I was able to recover more files with &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;photorec&lt;/span&gt; than &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;foremost&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;The problem with both &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;foremost&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;photorec&lt;/span&gt; is that they recover &lt;i&gt;file content&lt;/i&gt; but not &lt;i&gt;file names&lt;/i&gt;. So you end up with directories of randomly named files with only the file extension preserved. It's not ideal but it's still better than not having the data at all.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://help.ubuntu.com/community/DataRecovery"&gt;http://help.ubuntu.com/community/DataRecovery&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-5757216454261873293?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/5757216454261873293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2010/06/how-to-recover-files-from-corrupt-ntfs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5757216454261873293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5757216454261873293'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2010/06/how-to-recover-files-from-corrupt-ntfs.html' title='Data recovery tutorial using Ubuntu Linux'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-251247392737739050</id><published>2010-06-05T11:42:00.001-04:00</published><updated>2010-06-05T11:42:55.224-04:00</updated><title type='text'>Towards a Universal VM</title><content type='html'>Alex Buckley &lt;a href="http://www.infoq.com/presentations/Towards-a-Universal-VM"&gt;talks&lt;/a&gt; the features and progress that should make the JVM the universal run-time environment for languages. Interesting discussion in the talk include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the distinction between the roles of the byte-code compiler and JVM compiler.&lt;/li&gt;&lt;li&gt;a high-level overview of how the JVM does method inline optimizations.&lt;/li&gt;&lt;li&gt;the introduction of dynamicinvoke in the new JVM.&lt;/li&gt;&lt;/ul&gt;The talk is normally 1-2 steps lower level than what software developers deal with on a day-to-day basis but nevertheless very understandable and useful to know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-251247392737739050?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/251247392737739050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2010/06/towards-universal-vm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/251247392737739050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/251247392737739050'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2010/06/towards-universal-vm.html' title='Towards a Universal VM'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-9200140161468203832</id><published>2010-02-28T16:56:00.000-05:00</published><updated>2010-02-28T16:56:48.622-05:00</updated><title type='text'>Ubuntu Linux on a Syntax Olevia LT30HV</title><content type='html'>The Syntax Olevia LT30HV, like many off-brand low cost LCD HDTV, does not provide accurate EDID information which prevented me from running the LCD at the native resolution 1280x768. After extensive Googling, I finally found the necessary configuration to put in my &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/etc/X11/xorg.conf&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;1. First, make sure you have the proper Modeline in your Monitor Section: &lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Section "Monitor"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Default Monitor"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HorizSync&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 31.5 - 80.0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VertRefresh&amp;nbsp;&amp;nbsp;&amp;nbsp; 56.0 - 75.0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DisplaySize&amp;nbsp;&amp;nbsp;&amp;nbsp; 722 406&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Modeline "1280x768" 79.464 1280 1360 1488 1664 768 771 778 798&amp;nbsp; -Hsync +Vsync&lt;/b&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EndSection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;&amp;nbsp;2. Make sure your Screen include the Option UseEDID and ExactModeTimingsDVI like so:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Section "Screen"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Default Screen"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultDepth&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Monitor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Default Monitor"&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "UseEDID"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "false"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "ExactModeTimingsDVI"&amp;nbsp;&amp;nbsp;&amp;nbsp; "true"&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SubSection&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Display"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Depth&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Modes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "1280x768"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EndSubSection&lt;br /&gt;EndSection&lt;/blockquote&gt;3. And of course, make sure you use the nvidia driver:&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Section "Device"&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Default Device"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Driver&amp;nbsp; "nvidia"&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option&amp;nbsp; "NoLogo"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "True"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EndSection&lt;/span&gt;&lt;/blockquote&gt;That's it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-9200140161468203832?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/9200140161468203832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2010/02/ubuntu-linux-on-syntax-olevia-lt30hv.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/9200140161468203832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/9200140161468203832'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2010/02/ubuntu-linux-on-syntax-olevia-lt30hv.html' title='Ubuntu Linux on a Syntax Olevia LT30HV'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-92545772725164256</id><published>2010-01-17T15:13:00.000-05:00</published><updated>2010-01-17T15:13:53.974-05:00</updated><title type='text'>New features in Spring MVC 3.0</title><content type='html'>This &lt;a href="http://www.infoq.com/presentations/donald-overview-spring-3.0-web-stack"&gt;webcast&lt;/a&gt; gives an overview the new features in Spring MVC 3.0. The data binding and validation has been improved dramatically. This talk is useful if you are using version 2.5 and also want a sense of good practices to follow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-92545772725164256?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/92545772725164256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2010/01/new-features-in-spring-mvc-30.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/92545772725164256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/92545772725164256'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2010/01/new-features-in-spring-mvc-30.html' title='New features in Spring MVC 3.0'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-8384559577412690160</id><published>2009-12-30T19:31:00.002-05:00</published><updated>2010-01-03T10:41:20.725-05:00</updated><title type='text'>REST-style URLs for older Java web applications using UrlRewriteFilter</title><content type='html'>Say you have an old old Java Web application that uses URLs like this:&lt;br /&gt;&lt;br /&gt;/queryVehicles.jsp?make=Ford&amp;amp;model=Fusion&lt;br /&gt;&lt;br /&gt;You want your URLs to be pretty and more RESTful like so:&lt;br /&gt;&lt;br /&gt;/vehicles/ford/fusion&lt;br /&gt;&lt;br /&gt;Well, you have two options. You can re-write your web application to use newer web frameworks that supports REST-style URLs such as Spring MVC 3.0, which will probably take months to do. Or you can use &lt;a href="http://tuckey.org/urlrewrite"&gt;UrlRewriteFilter&lt;/a&gt; which should take no more than 30 minutes and will work with any existing Java web application.&lt;br /&gt;&lt;br /&gt;UrlRewriteFilter very easy to use. You basically:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Add UrlRewriteFilter as a servlet filter in your WEB-INF/web.xml&lt;/li&gt;&lt;li&gt;Populate WEB-INF/urlrewrite.xml with mappings of REST-style URLs to the corresponding URLs of your legacy web application (with query params and what not).&lt;/li&gt;&lt;/ol&gt;&amp;nbsp;That's pretty much it.&lt;br /&gt;&lt;br /&gt;UrlRewriteFilter is extremely powerful. It supports regular expression pattern matching, allowing you to perform pretty complex mapping. Check out the manual page for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-8384559577412690160?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/8384559577412690160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/12/rest-style-urls-for-older-java-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/8384559577412690160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/8384559577412690160'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/12/rest-style-urls-for-older-java-web.html' title='REST-style URLs for older Java web applications using UrlRewriteFilter'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-7895669098431447486</id><published>2009-12-14T21:39:00.026-05:00</published><updated>2009-12-26T08:44:37.140-05:00</updated><title type='text'>Remove ifs/switches from your JSPs through feature labeling</title><content type='html'>&lt;span style="font-style: italic;"&gt;In this post, I outline a technique I call "feature labeling" as a means of organizing your web application's HTML views into features that can be selectively enabled and disabled without unmaintainable if/switch statements. I will use JSP and Spring in my example though this technique can be generalized to any view technology that allows for custom tags and any dependency injection container.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Say we are writing a prototypical blogging web application. All blogging applications give authors the ability to edit a blog entry. One straightforward way to implement this is to check if logged user is the author of the blog and then displaying the edit link to the user like so:&lt;br /&gt;&lt;code&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;span style="color: black;"&gt;&amp;lt;c:if test="${user == blog.author}"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: black;"&gt;&amp;lt;a href="/blog/233/edit"&amp;gt;Edit Blog&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;Months later, say we decide that the administrator should also have the ability to edit blogs. We can add an 'or' condition to the if statement like so:&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;c:if test="${user == blog.author || user.role == 'admin'}"&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&amp;lt;a href="/blog/233/edit"&amp;gt;Edit Blog&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;The good developer, however, should see that we are going down the path of littering our JSP/HTML view with too much logic, which will ultimately become harder to test and less maintainable. The "right thing" to do is to push this logic to a middle tier.&lt;br /&gt;&lt;br /&gt;First, remove the if logic and replace it with the custom JSP tag "dm:feature"  (to be created) like so:&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&amp;lt;dm:feature name="blogEditing"&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&amp;lt;a href="/blog/233/edit"&amp;gt;Edit Blog&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/dm:feature&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Note the attribute name="blogEditing" which will effectively label the inside body as the blogEditing feature.&lt;br /&gt;&lt;br /&gt;Second, create a custom JSP tag that will:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get a FeatureService object from your Spring web application context.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Do a featureService.isEnabled(featureName) to determine whether the body should be evaluated or skipped.&lt;/li&gt;&lt;/ol&gt;Here is &lt;a href="http://www.stardeveloper.com/articles/display.html?article=2001081301&amp;amp;page=1"&gt;a tutoria&lt;/a&gt;l that covers the topic of creating custom JSP tag. Hint: Extend &lt;a href="http://java.sun.com/webservices/docs/1.5/api/javax/servlet/jsp/tagext/TagSupport.html"&gt;TagSupport&lt;/a&gt; instead of creating it from scratch.  Then to get the Spring web application context, do:&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;context = (ApplicationContext)pageContext.getAttribute(&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt;WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,&lt;br /&gt;&lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;code&gt;PageContext.APPLICATION_SCOPE&lt;br /&gt;);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Third, create your FeatureService interface and implementation. In this example, the implementation would need to be aware of the current user and the current blog so you can do the check "if current user is the blog author." Leave a comment if you want more details.&lt;br /&gt;&lt;br /&gt;This should dramatically reduce unnecessary logic in your view and make it more testable because you are pushing the logic into a middle-tier.&lt;br /&gt;&lt;br /&gt;Keep in mind that this only eliminates blog editing from the view. You still need to disable the controllers/services for blog editing as well. This is where &lt;a href="http://static.springsource.org/spring/docs/3.0.x/reference/html/aop.html"&gt;Spring's Aspect Oriented Programming&lt;/a&gt; comes in. Here's a brief outline of what you need to do:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create an @Feature annotation that requires feature name (e.g., @Feature("blogEditing"). This annotation will basically label methods as being part of a feature.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create a FeatureAspect bean with FeatureService as a dependency.&lt;/li&gt;&lt;li&gt;Create an around advice (method in the FeatureAspect bean annotated with @Around). This advice should check if the feature specified in the @Feature is enabled. If enabled, execute the method. Otherwise, throw a runtime FeatureNotEnabledException and add top-level handlers to redirect user to a 403 unauthorized page.&lt;/li&gt;&lt;/ol&gt;Note that the FeatureAspect uses the same logic (i.e., FeatureService) that is responsible for determining whether a feature should be enabled. There's no need to duplicate logic both in the view and middle tier.&lt;br /&gt;&lt;br /&gt;Helpful? Let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-7895669098431447486?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/7895669098431447486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/12/enabling-and-disabling-features-in-html.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/7895669098431447486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/7895669098431447486'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/12/enabling-and-disabling-features-in-html.html' title='Remove ifs/switches from your JSPs through feature labeling'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-2754082876601686845</id><published>2009-12-09T20:07:00.006-05:00</published><updated>2009-12-09T21:03:07.552-05:00</updated><title type='text'>Usability findings: You look where they look -- False!</title><content type='html'>I came across this article on &lt;a href="http://www.smashingmagazine.com/2009/09/24/10-useful-usability-findings-and-guidelines"&gt;10 Useful Usability Findings and Guidelines&lt;/a&gt;. Points listed are not too surprising. However, I disagree with #2. Essentially, the author is concluding that you can increase people's attention if you have a picture with a face looking at the target text. I think the "study" lacks the proper control to warrant such conclusion.&lt;br /&gt;&lt;br /&gt;It could be that a frontward face draws attention away from the text. In other words, the frontward face has a negative affect on attention as opposed to directional face having a positive affect. A simple control stimulus with a face looking in the opposite direction of the text would have revealed whether a directional face actually increases attention. There should have also been a control stimulus of no face or a non-face image to establish a baseline.&lt;br /&gt;&lt;br /&gt;The author is also concluding that glances directly translates into attention. The peer-reviewed eye tracking literature have shown that while this is generally true, there are many levels of attention that must be considered. The level of attention desired by content providers is one where the user is reading and comprehending the text, in other words, a high level of attentional processing. It could be the case that a significant number of the glances are accidental or reflexive glances as a result of being steered by the directional face. One way to tease out these accidental glances is to subtract the data from the first few glances across all the images. The glances remaining would be the more intentional ones, the ones that reflect higher level processing.&lt;br /&gt;&lt;br /&gt;This is a demonstration of the lack of rigor in non-peer reviewed studies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-2754082876601686845?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/2754082876601686845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/12/usability-findings-you-look-where-they.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/2754082876601686845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/2754082876601686845'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/12/usability-findings-you-look-where-they.html' title='Usability findings: You look where they look -- False!'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-4349774945586265903</id><published>2009-11-21T15:54:00.014-05:00</published><updated>2011-04-24T08:35:19.625-04:00</updated><title type='text'>Flashing BIOS in Ubuntu Linux without floppy</title><content type='html'>I was trying to update the flash BIOS of an old ECS K7SOM+, a 1 Ghz-era AMD Athlon motherboard. The problem is that most older motherboard flash upgrades are designed with a DOS bootable floppy in mind. I have no DOS, no Windows, no floppy drive, and no floppy disks. Fortunately, there's &lt;a href="http://unetbootin.sourceforge.net/"&gt;UNetbootin&lt;/a&gt;, a tool design specifically to make bootable USB flash drives from Linux. Here are the general instructions for Ubuntu Linux users:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use &lt;span style="font-weight: bold;"&gt;gparted&lt;/span&gt; to create a single &lt;b&gt;FAT16&lt;/b&gt; formatted &lt;b&gt;partition&lt;/b&gt; on the flash drive.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;You can install gparted using &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;apt-get install gparted&lt;/span&gt;&lt;/li&gt;&lt;li&gt; You may need to first umount the USB flash drive before you can partition and format it.&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;/ol&gt;&lt;li&gt;Use &lt;span style="font-weight: bold;"&gt;unetbootin&lt;/span&gt; to install a &lt;b&gt;bootable&lt;/b&gt; &lt;b&gt;FreeDOS&lt;/b&gt; onto the flash drive.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Install unetbootin using &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;apt-get install unetbootin&lt;/span&gt; or read WestCoastSuccess' &lt;a href="http://0sumgain.blogspot.com/2009/11/updating-motherboard-bios-from-ubuntu.html?showComment=1262429971912#c6813688077983055525"&gt;comment&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Run unetbootin and:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Select the distribution FreeDOS.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Select your USB flash drive&lt;/li&gt;&lt;li&gt;Click OK. This will download FreeDOS to create a DOS bootable flash drive.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Copy your motherboard's BIOS update and flashing utility files into the root of flash drive. These files will be located in &lt;b&gt;B: or C: drive&lt;/b&gt; when you boot into FreeDOS.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;That's it. Boot off your flash drive -- you may need to configure your CMOS setup to do so. &lt;br /&gt;&lt;br /&gt;Update 2010/01/02: Updated instruction as per WestCoastSuccess.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-4349774945586265903?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/4349774945586265903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/11/updating-motherboard-bios-from-ubuntu.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4349774945586265903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4349774945586265903'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/11/updating-motherboard-bios-from-ubuntu.html' title='Flashing BIOS in Ubuntu Linux without floppy'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-5118332265736684224</id><published>2009-11-16T21:55:00.003-05:00</published><updated>2009-11-16T22:13:54.210-05:00</updated><title type='text'>Maven database migration plugin</title><content type='html'>I finally got around to testing &lt;a href="http://code.google.com/p/c5-db-migration"&gt;c5-db-migration&lt;/a&gt; -- a database migration plugin for Maven. Essentially, it's tool for managing your database changes. The plugin is very straightforward to use:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Copy and paste the plugin configuration to your pom.xml.&lt;/li&gt;&lt;li&gt;Add a couple of SQL scripts into your src/main/db/migrations in the format of &lt;a name="Other_Details"&gt;yyyyMMddHHmmss_some_description.sql&lt;/a&gt;&lt;/li&gt;&lt;li&gt;And run mvn db-migration:migrate to run the SQL scripts against your database.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;The plugin tracks your migration in a table called schema_version.  It's not as comprehensive as Rail's database migration tool (e.g., it doesn't support downward migrations). Nevertheless, it's simple and unobtrusive.&lt;br /&gt;&lt;br /&gt;If you're managing database changes manually through collections of SQL scripts, there's no reason why you shouldn't give this plugin a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-5118332265736684224?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/5118332265736684224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/11/maven-database-migration-plugin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5118332265736684224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5118332265736684224'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/11/maven-database-migration-plugin.html' title='Maven database migration plugin'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-3009258034766511289</id><published>2009-11-11T21:40:00.003-05:00</published><updated>2009-11-11T21:51:12.853-05:00</updated><title type='text'>SpringSource tc Server Developers Edition</title><content type='html'>At the risk of becoming a SpringSource shrill, check out the video on Spring's Tomcat server for developers.&lt;br /&gt;&lt;a href="http://www.springsource.com/products/tcserver/devedition"&gt;&lt;br /&gt;http://www.springsource.com/products/tcserver/devedition&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's basically a modified version of Tomcat that makes it very easy to profile web applications. It's free but NOT open source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-3009258034766511289?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/3009258034766511289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/11/springsource-tc-server-developers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/3009258034766511289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/3009258034766511289'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/11/springsource-tc-server-developers.html' title='SpringSource tc Server Developers Edition'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-6395114857764553121</id><published>2009-10-19T23:48:00.004-04:00</published><updated>2009-10-19T23:52:11.066-04:00</updated><title type='text'>Saros Pair Programming Plugin for Eclipse</title><content type='html'>&lt;a href="http://dpp.sf.net/"&gt;Saros&lt;/a&gt; is a pretty impressive open source plugin for Eclipse that allows collaborative editing (i.e., pair programming). It requires only a &lt;a href="http://www.igniterealtime.org/downloads/index.jsp"&gt;Jabber&lt;/a&gt; server. Check out this 11 minute &lt;a href="https://www.inf.fu-berlin.de/w/SE/DPPDemoVideo"&gt;video&lt;/a&gt; of Saros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-6395114857764553121?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/6395114857764553121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/10/saros-pair-programming-plugin-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/6395114857764553121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/6395114857764553121'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/10/saros-pair-programming-plugin-for.html' title='Saros Pair Programming Plugin for Eclipse'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-8755363488962067823</id><published>2009-10-17T11:58:00.009-04:00</published><updated>2009-12-25T10:40:52.763-05:00</updated><title type='text'>Java Beans without getters/setters using lombok</title><content type='html'>&lt;a href="http://projectlombok.org/"&gt;Project Lombok&lt;/a&gt; is probably going to be one of the most useful library for Java. The library (requires Java 1.6) provides annotations that generate getters, setters, toString, hashCode, &amp;amp; equals for your POJOs. For example:&lt;br /&gt;&lt;blockquote&gt;@Data // Lombok annotation&lt;br /&gt;public class Person {&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;private String firstName;&lt;br /&gt;private String lastName;&lt;br /&gt;&lt;/blockquote&gt;}&lt;br /&gt;&lt;br /&gt;// Now your class has all the getters, setters,&lt;br /&gt;// equals(), hashCode(), and toString()&lt;br /&gt;&lt;/blockquote&gt;C#/.NET has had this syntactic sugar built into the language for years but I was ambivalent about the approach. I'm more of a fan of languages with sparse syntax set such as C but the downside is that you end up writing much more boilerplate code. I think Lombok's approach is a nice compromise between bloated language feature set and having verbose code because of sparse language feature set. And it's supposedly supported in Eclipse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-8755363488962067823?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/8755363488962067823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/10/project-lambok.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/8755363488962067823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/8755363488962067823'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/10/project-lambok.html' title='Java Beans without getters/setters using lombok'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-3152436013754286134</id><published>2009-10-06T22:49:00.006-04:00</published><updated>2009-10-06T22:55:59.849-04:00</updated><title type='text'>Integration testing with Spring</title><content type='html'>Watch this Rod Johnson talk if you're not already familiar with rolling back transaction as a means of performing integration tests:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/system-integration-testing-with-spring"&gt;http://www.infoq.com/presentations/system-integration-testing-with-spring&lt;br /&gt;&lt;br /&gt;&lt;/a&gt; You can probably skip to the 30 minute mark if you're already familiar with the reasons for testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-3152436013754286134?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/3152436013754286134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/10/integration-testing-with-spring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/3152436013754286134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/3152436013754286134'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/10/integration-testing-with-spring.html' title='Integration testing with Spring'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-7780915656131059702</id><published>2009-09-27T19:31:00.010-04:00</published><updated>2009-10-03T12:29:03.298-04:00</updated><title type='text'>Languages for JVM</title><content type='html'>The Java language is mature and that in the software development world means that it's dying. The Java language was designed around object-oriented programming but the trend now is moving towards more functional programming (which is arguably better suited in concurrent environments). I've been looking at newer languages built on top of JVM: Groovy, Scala, and Clojure.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Groovy&lt;/span&gt; is basically a dynamic version of the Java language with some new language features such as closures (a feature in functional programming). In essence, Groovy is "Java scripted" inspired from Python and Ruby.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scala&lt;/span&gt; is an object oriented language with functional language features. It is not a scripting language and has features such as type inference:&lt;br /&gt;&lt;br /&gt;var t = new Tiger();&lt;br /&gt;&lt;br /&gt;The compiler knows that t is a Tiger -- no need to do:&lt;br /&gt;&lt;br /&gt;Tiger t = new Tiger();&lt;br /&gt;&lt;br /&gt;This type information is available at compile-time which allows for compile-time optimizations, making Scala on par with native Java performance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Clojure&lt;/span&gt; essentially Lisp-inspired language running on the JVM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All the above languages do not differ much with their Java interop (i.e., you can pretty much call existing Java code directly). All reduces the verbosity of Java. If I had to learn one language, I would pick Scala. I think Groovy is too small of an evolution over Java (i.e., not much benefits). Clojure just seems to radical for object-oriented developers.&lt;br /&gt;&lt;br /&gt;Here's some additional points in no particular order:&lt;br /&gt;&lt;br /&gt;- Martin Odersky, father of Groovy, said "I can honestly say if someone had shown me the Programming Scala book by by Martin Odersky, Lex Spoon &amp;amp; Bill Venners back in 2003 I'd probably have never created Groovy." &lt;a href="http://java.dzone.com/articles/scala-long-term-replacement"&gt;http://java.dzone.com/articles/scala-long-term-replacement&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;- Scala is available both JVM and .NET. &lt;a href="http://programming-scala.labs.oreilly.com/ch01.html"&gt;http://programming-scala.labs.oreilly.com/ch01.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-7780915656131059702?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/7780915656131059702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/09/languages-for-jvm.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/7780915656131059702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/7780915656131059702'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/09/languages-for-jvm.html' title='Languages for JVM'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-2292041342444826487</id><published>2009-09-16T07:16:00.008-04:00</published><updated>2009-10-03T12:10:31.137-04:00</updated><title type='text'>Integration test hell</title><content type='html'>For those of you spending lots of time fixing up integration tests, J.B. Rainsberger explains why he thinks integration tests are a scam:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/integration-tests-scam"&gt;http://www.infoq.com/presentations/integration-tests-scam&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think the point he is driving home is that we should be focusing more on comprehensive unit tests rather than comprehensive integration tests. I've started changing how I write my integration tests: They should only be verifying the &lt;span style="font-style: italic;"&gt;interactivity&lt;/span&gt; of components, rather the expected &lt;span style="font-style: italic;"&gt;results&lt;/span&gt; of the component.&lt;br /&gt;&lt;br /&gt;Let's say that a User Service class (UserService) that calls a User Data Access Object class (UserDAO). The unit tests for UserService should use a mock of UserDao and asserting exact equality with the data and exceptions returned from UserDao properly (-- nothing new here). Your integration tests for UserService should use a real UserDao that is connected database (-- again, nothing new here). However, these types of test should NOT be asserting data and exceptions equality. Rather, these integration tests should just be verifying that &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; data/exceptions are returned. Integration tests should be testing the seams between the UserService and UserDao components, rather than asserting the equality of the value themselves.&lt;br /&gt;&lt;br /&gt;Overally, I recommend watching this talk if you have done lots of unit and integration tests writing and wondering if you are duplicating effort.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-2292041342444826487?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/2292041342444826487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/09/integration-test-hell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/2292041342444826487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/2292041342444826487'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/09/integration-test-hell.html' title='Integration test hell'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-8106574192054500319</id><published>2009-08-31T20:23:00.005-04:00</published><updated>2009-10-03T11:28:20.914-04:00</updated><title type='text'>Review: The Cathedral &amp; The Bazaar</title><content type='html'>I finished reading Eric S. Raymond's &lt;span style="font-style:italic;"&gt;The Cathedral &amp; The Bazaar&lt;/span&gt; (catb). Just a couple of points I want to metion:&lt;br /&gt;&lt;br /&gt;- Raymond makes a critical distinction between sale versus use value. I think this is the seminal point in the book. Closed source software that derives most of its value from sales price. Providing technical support eats away at the sale value so it's fundamentally in the interest of closed source companies to limit technical support for at given sale price. In other words, the ideal situation for closed source software companies is for people buy their software and never use it. In contrast, open source derives most of its value from use. The business model of open source companies is centered around support. The more people use the software, the more support resources that will be consumed which benefits these companies that center around support.&lt;br /&gt;&lt;br /&gt;- Raymond is not as hardcore open source advocate as I assumed. He does acknowledges places where open source would not be suitable.&lt;br /&gt;&lt;br /&gt;- Open source excels in domains where software is a commodity, e.g., infrastructure such as operating system, middle ware space, browsers.&lt;br /&gt;&lt;br /&gt;- Open source development is analogous to academic peer review. I would what would Raymond say about more artistic work?&lt;br /&gt;&lt;br /&gt;Raymond's writing style is like that of a hacker: It may not be pretty at times but he gets his point through. There's plenty of self-citation which hurts the credibility of some of his arguments. Overall, I'd recommend reading catb primarily as a historical reference. Those of you aware of the open source revolution probably will not benefit much from it. I think it is a must read if you want to start a business centered around open source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-8106574192054500319?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/8106574192054500319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/08/catb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/8106574192054500319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/8106574192054500319'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/08/catb.html' title='Review: The Cathedral &amp; The Bazaar'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-4626004136502651111</id><published>2009-08-01T21:07:00.004-04:00</published><updated>2009-08-26T21:16:40.863-04:00</updated><title type='text'>Lean start-ups</title><content type='html'>Here's a thoughtful webcast talk about 'lean start-ups':&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=EnaLQiQL9ec"&gt;http://www.youtube.com/watch?v=EnaLQiQL9ec&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lean start-up is not limited to your traditional start-up company. Rather, it can also refer to a small department in a large company. Essentially, the speaker, Ries, believes that an effective lean start-up can be boiled down to rapid releases. Ries suggests a couple of techniques to get to rapid releases. One of the more radical technique is continuous deployment where source check-ins that pass integration tests are deployed automatically. Of course, there would need to be a mechanism in place to revert back quickly. Ries also describes split testing where new features are tested in parallel with existing code, essentially a control and experimental group comparison. Ries also recommends asking the 5-why's on every issue (e.g., asking why did this bug occur 5 times at different level from the programming level to the management level).&lt;br /&gt;&lt;br /&gt;This talk is worth the hour if you are interested in improving your development process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-4626004136502651111?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/4626004136502651111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/08/lean-start-ups.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4626004136502651111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4626004136502651111'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/08/lean-start-ups.html' title='Lean start-ups'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-5798514666728456306</id><published>2009-07-24T07:59:00.020-04:00</published><updated>2009-09-20T19:36:51.791-04:00</updated><title type='text'>Java Templating APIs</title><content type='html'>Many web view technologies are very difficult to unit test. This includes JSP/JSTL, PHP views, Rails views, and probably ASP.NET views. The problem is the lack of the ability to set an arbitrary model to a view and doing a string assertion on the view. (Correct me of I'm wrong.)&lt;br /&gt;&lt;br /&gt;I did a bit of research on templating engines for Java. Here they are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Freemarker&lt;/span&gt; - Not specific to the web, unit testable without servlet container, replacement of JSP. Last update in December 2008.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Velocity&lt;/span&gt; - Greater community than Freemarker (according to Freemarker themselves). Also not web specific and a replacement for JSP. Last update in May 2009.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;String Template&lt;/span&gt; - Very minimalistic approach to templating with ports to Python and C#.  Also not specific to the web. Last update June 2008.&lt;br /&gt;&lt;br /&gt;All of these technologies basically solve the problem of making the view accessible without a servlet container. This makes it easier to pass the responsibility of HTML/CSS design and JavaScript coding off to other developers. Spring supports Velocity and Freemarker though it shouldn't be too difficult to write an adapter for String Template. Right now, I'm leaning towards Velocity because of the better community support.&lt;br /&gt;&lt;br /&gt;In addition to templating engines, I also looked at page composition frameworks:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tiles&lt;/span&gt; - Originally part of Struts. Employs the composite pattern where each page explicitly define header, footers, and etc. to include. Support for Freemarker and Velocity templates.   Last release in February 2009.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SiteMesh&lt;/span&gt; - Alternative to Tiles. Employs the decorator pattern where pages are not aware of the header and footer. Can work with other web technologies (CGI, PHP, and etc.) -- this is COOL. Last update in March 2009.&lt;br /&gt;&lt;br /&gt;I am really excited about using SiteMesh. Here's a &lt;a href="http://www.benmccann.com/dev-blog/sitemesh-tutorial-with-examples/"&gt;SiteMesh tutorial&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-5798514666728456306?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/5798514666728456306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/07/java-templating-apis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5798514666728456306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5798514666728456306'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/07/java-templating-apis.html' title='Java Templating APIs'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-1246508171179825753</id><published>2009-07-19T17:26:00.004-04:00</published><updated>2009-07-19T17:36:43.519-04:00</updated><title type='text'>Database anti-patterns that all developers should know</title><content type='html'>Josh Berkus, one of the core developers of PostgreSQL, gives a tongue-in-check talk on 10 ways to wreck your database.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oreillynet.com/pub/e/1371"&gt;http://www.oreillynet.com/pub/e/1371&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The talk is about 40 minutes long -- a decent enough talk. However, the Q&amp;amp;A portion that followed the talk is stellar. Unfortunately, you can't really just skip to the Q&amp;amp;A portion and you definitely don't want to stop watching after the talk because you would get the wrong impression.&lt;br /&gt;&lt;br /&gt;The most important point for me was that I need to start using natural keys in my database and normalized through natural keys rather than primary keys.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-1246508171179825753?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/1246508171179825753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/07/database-anti-patterns-that-all.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/1246508171179825753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/1246508171179825753'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/07/database-anti-patterns-that-all.html' title='Database anti-patterns that all developers should know'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-6137855547748983768</id><published>2009-07-14T18:29:00.009-04:00</published><updated>2009-07-23T21:53:52.623-04:00</updated><title type='text'>Why and how of test first development</title><content type='html'>Test-first development is the process of writing your test code before your implementation code. I have always felt this was the ideal approach but NOT necessarily the pragmatic approach to development. The thought of writing a full test before writing the code was essentially writing the specifications first and feels almost like a micro-waterfall approach to development.&lt;br /&gt;&lt;br /&gt;I attended a couple of talks recently that made me realize that test-first is not necessarily about writing the entire test case before the implementation. Rather, you can take a very iterative approach. The idea is that you write just enough of the test code to get your implementation code to fail followed by just enough implementation code to get it to pass. Then you write just enough test code to get your implementation code to fail again and repeat the process until your test and implementation code is complete.&lt;br /&gt;&lt;br /&gt;To be more specific, the first line of test code could simply be calling a method that does not exist in your implementation. This will cause a compile error (for those of us on stronger typed languages). Then you write just enough code to get the compile error to go away. Some of you may be thinking that compiling is not unit testing which is true but it is a form of testing nevertheless.&lt;br /&gt;&lt;br /&gt;The second line of test code could simply be an assertion that the returned object is not null. This should result in a test failure. To pass this test, you can simply return a dummy object. Now obviously your implementation code should not be returning dummy objects. So, the third line of test code could compared the return value with an expected value which should cause the test to fail since it was initially returning a dummy value. Then at this point you would modify the implementation method to return the appropriate value dummy object.&lt;br /&gt;&lt;br /&gt;Note that this approach breaks up your test into finer grain assertions. Had you write the test first, you would probably have never thought about performing an assertNull which would aid in debugging. In more complex methods, there would probably be many forgotten assertions. This finer grain approach also makes the test easier to write since we are taking a small bite at a time.&lt;br /&gt;&lt;br /&gt;I have been using this approach for the last few months and this has actually become my preferred means of development. In fact, I now get that dirty feeling when I write tests after implementation, much in the same way a test-infected person feels dirty pushing code without unit tests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-6137855547748983768?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/6137855547748983768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/07/why-test-first.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/6137855547748983768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/6137855547748983768'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/07/why-test-first.html' title='Why and how of test first development'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-5549975718985959992</id><published>2009-07-11T19:11:00.003-04:00</published><updated>2009-07-11T19:14:00.524-04:00</updated><title type='text'>Rolling your own security authentication/authorization?</title><content type='html'>Before you do, watch this 50 minute video on Spring Security:&lt;br /&gt;&lt;a href="http://www.viddler.com/explore/oredev/videos/22"&gt;&lt;br /&gt;http://www.viddler.com/explore/oredev/videos/22&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Make sure your implementation of security rolling matches the ease of implementation and features of Spring Security. If not, use Spring Security.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-5549975718985959992?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/5549975718985959992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/07/rolling-your-own-security.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5549975718985959992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5549975718985959992'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/07/rolling-your-own-security.html' title='Rolling your own security authentication/authorization?'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-3080861921816241090</id><published>2009-07-04T09:43:00.005-04:00</published><updated>2009-07-04T10:16:35.722-04:00</updated><title type='text'>Database Connection Pooling: c3p0 versus dbcp</title><content type='html'>I was looking at database connection pooling the other day and was trying to decide between &lt;a href="http://sourceforge.net/projects/c3p0/"&gt;c3p0&lt;/a&gt; and Apache Common's &lt;a href="http://commons.apache.org/dbcp"&gt;dbcp&lt;/a&gt;. Both are open source (of course) and implement the standard &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/sql/DataSource.html"&gt;DataSource&lt;/a&gt; interface, which means that you can pretty much swap out one for the other without breaking functionality. Both are not very up-to-date with their last stable releases being over two years ago: The last stable release of dbcp (1.2.2) was 2007-04-04  while for c3p0 (0.9.1.2) was 2007-5-21. The consensus appears to say that dbcp is better for single threaded applications while c3p0 is better on multi-threaded applications (which would include your webapp). Based on this alone, I favor c3p0.&lt;br /&gt;&lt;br /&gt;Reference:&lt;br /&gt;&lt;a href="http://forum.springsource.org/showthread.php?t=45575"&gt;Spring Forum posting&lt;/a&gt;&lt;br /&gt;&lt;a href="http://javatech.org/2007/11/c3p0-vs-dbcp-the-straight-dope/"&gt;Javatech comparison of c3p0 versus dbcp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/520585/connection-pooling-options-with-jdbc-dbcp-vs-c3p0"&gt;Stack Overflow discussion&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-3080861921816241090?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/3080861921816241090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/07/database-connection-pooling-c3p0-versus.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/3080861921816241090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/3080861921816241090'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/07/database-connection-pooling-c3p0-versus.html' title='Database Connection Pooling: c3p0 versus dbcp'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-2920321983830845506</id><published>2009-07-01T20:33:00.006-04:00</published><updated>2009-07-04T09:42:41.637-04:00</updated><title type='text'>Spring versus Hibernate Validator</title><content type='html'>I looked at both Hibernate and Spring Validation briefly today.&lt;br /&gt;&lt;br /&gt;Hibernate is annotation-based and works something like this: (1) You annotate with the proper validation rule (e.g., @NotNull) on the fields of your bean; (2) You call Hibernate's ClassValidator to validate, which returns the validation errors. Presumably, it inspects the annotations on the bean fields and performs the appropriate validation.&lt;br /&gt;&lt;br /&gt;Pros: Easy declaration based validation.&lt;br /&gt;Cons: I haven't figure out a way to perform database check for uniqueness.&lt;br /&gt;&lt;br /&gt;Spring's validation is programatically-based. You implement the Validator interface which contains two methods, one of which is the validate method. You perform your validation manually, either writing the rules yourself or using Spring's utility methods, e.g., ValidationUtils.rejectIfEmpty(...)&lt;br /&gt;&lt;br /&gt;Pros: Very flexible which allows for database record-based validation&lt;br /&gt;Cons: More complex than Hibernate's Validator.&lt;br /&gt;&lt;br /&gt;Neither solution is particularly ideal. Hibernate seems too simplistic while Spring's requires too much programming. I lean towards Spring's Validator mainly because it's very apparent as to how one would perform database record validation.&lt;br /&gt;&lt;br /&gt;Reference:&lt;br /&gt;&lt;a href="http://wheelersoftware.com/articles/hibernate-validator.html"&gt;Tutorial: Getting Started with Hibernate Validator&lt;/a&gt;&lt;br /&gt;&lt;a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch06s02.html"&gt;[Chapter] 6.2 Validation using Spring's Validator interface&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-2920321983830845506?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/2920321983830845506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/07/spring-versus-hibernate-validator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/2920321983830845506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/2920321983830845506'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/07/spring-versus-hibernate-validator.html' title='Spring versus Hibernate Validator'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-5491389823683485847</id><published>2009-06-20T23:33:00.005-04:00</published><updated>2009-06-21T00:02:00.360-04:00</updated><title type='text'>Groovy over Java</title><content type='html'>Dynamic languages, once relegated to hobbyist and small mom-pop development shops, now (as in the last 2-3 years) seem to be the latest fad in "enterprise" development shops. I think this was largely due to the success of Ruby on Rails and Python which showed that you can write maintainable large scale software using dynamic languages.&lt;br /&gt;&lt;br /&gt;Groovy appears to be the Java community's answer to dynamic languages. Groovy is a superset of Java which means that your existing Java code should mostly work in a Groovy interpreter. Groovy provides many of the syntactic sugar that you see in dynamic languages such as key-value dictionaries (hash tables), named parameters, closure, and etc.. Groovy has been submitted to Java Community Process program for standardization.&lt;br /&gt;&lt;br /&gt;I'm still a bit mixed about using dynamic languages because I like the security of compile-time type checking. However, I do see myself using Groovy to write my unit tests since the syntactic sugar can potentially make my unit tests easier and faster to write.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-5491389823683485847?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/5491389823683485847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/06/groovy-over-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5491389823683485847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/5491389823683485847'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/06/groovy-over-java.html' title='Groovy over Java'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-4218227933874345438</id><published>2009-06-09T21:46:00.008-04:00</published><updated>2009-06-21T00:04:33.690-04:00</updated><title type='text'>Spring MVC</title><content type='html'>&lt;span&gt;Here is a nice link describing the features of Spring MVC:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/articles/spring-2.5-ii-spring-mvc"&gt;http://www.infoq.com/articles/spring-2.5-ii-spring-mvc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The information may be outdated with Spring 3.0 just around the corner.&lt;br /&gt;&lt;br /&gt;One of things I like about the Spring Framework in general is that it's not very intrusive. Depending on your requirements, you can use the Spring Framework without: extending any class,  implementing any interface; nor writing any adapter classes. This makes the framework extremely flexible because you are not locked into their application programming interface (API). If you're reading this blog, then you probably know that using open source frameworks is a way to avoid vendor lock-in. However, using open source alone is not enough to prevent vendor lock-in. We also have to think about API lock-in. The more your framework requires implementing/extending framework specific interfaces/classes, the more at-risk you are to API lock-in.&lt;br /&gt;&lt;br /&gt;The Spring Framework also has a la carte style approach of integration into your existing software components. You use what you need and can add the incrementally framework as you evolve as a developer. In my current project, I started off using Spring's mock (stub) objects for testing (instead of writing my own MockHttpServletRequest). Then I used Spring's Object/XML Mapping (OXM) framework to domain convert objects to XML and vice versa. Now I'm looking to use Spring's MVC framework and eventually move all my object configuration and construction using Spring's core bean container.&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/2396018311141903513-4218227933874345438?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/4218227933874345438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/06/here-is-nice-link-describe-features-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4218227933874345438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4218227933874345438'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/06/here-is-nice-link-describe-features-of.html' title='Spring MVC'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-6441763450252938963</id><published>2009-06-05T21:40:00.008-04:00</published><updated>2010-07-16T11:33:40.179-04:00</updated><title type='text'>Failed Searches</title><content type='html'>I'm lazy. Very lazy. I don't like keyword searches that do not return what I want on the first page. I don't like it because I have to make extra mouse clicks to find what I want. And I don't like extra mouse clicks because I'm lazy.&lt;br /&gt;&lt;br /&gt;I'm sure I'm not alone. As obvious as this may seem, many commerce websites don't get it. They develop interfaces that make me perform unnecessary mouse clicks. They make me turn pages. If I have to turn to the next page of a results set, then your search has failed. Your search should have return the relevant results on the first page. Many sites also make me sort my search results. If I have to waste mouse clicks to sort my results, then your search has failed. Your search should have returned in the order of most relevant results. Some sites have even gone as far as making me filter my results set. If I have to filter the results set, then your search has failed. Your search should have returned only filtered results.&lt;br /&gt;&lt;br /&gt;This all may seem a bit harsh. The point, however, is not to set unrealistically high criteria of what constitutes a good search engine. Rather, I'm suggesting that as developers we need to value mouse clicks. Every mouse click is precious and should not be wasted on paging, sorting, and filtering -- none of which would be needed if the search was done right in the first place. In the end, paging, sorting, and filtering are all crutches for broken searches.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-6441763450252938963?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/6441763450252938963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/06/failed-searches.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/6441763450252938963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/6441763450252938963'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/06/failed-searches.html' title='Failed Searches'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-4567388223839058442</id><published>2009-05-24T00:18:00.002-04:00</published><updated>2009-05-26T22:36:22.810-04:00</updated><title type='text'>Review: Java FTP Servers</title><content type='html'>I needed an FTP server to perform functional testing of some FTP client Java code (commons vfs). The top 5 Google results for "Java FTP Server" were:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mina.apache.org/ftpserver"&gt;Apache MINA FtpServer&lt;/a&gt; - Runs as standalone or embedded; free and open source (Apache License)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cellspark.com/ftpserver.html"&gt;FtpGoServer&lt;/a&gt; - Runs as standalone; source can be purchased&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ryanheise.com/software/jftpd"&gt;jftpd&lt;/a&gt; - Runs as standalone; appears outdated (last release in 2001); incomplete implementation&lt;br /&gt;&lt;br /&gt;&lt;a href="http://javasecureftpd.sourceforge.net/"&gt;Java Secure FTP Server&lt;/a&gt; - Runs as standalone; free and open source (GPL)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cftp.coldcore.com/"&gt;Colorado FTP&lt;/a&gt; - Runs as standalone; free and open source (LGPL)&lt;br /&gt;&lt;br /&gt;My pick is Apache Mina FtpServer. It's an active project. It can be easily embedded into any functional test -- the alternatives require peering into the source, writing adapter classes, etc.. It's also the only one that shows significant activity in Google Trends.&lt;br /&gt;&lt;br /&gt;UPDATE 5/26/09: Documentation of Apache Mina is pretty thin (as with the other FTP packages).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-4567388223839058442?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/4567388223839058442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/05/review-java-ftp-servers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4567388223839058442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/4567388223839058442'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/05/review-java-ftp-servers.html' title='Review: Java FTP Servers'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-9076948478235996375</id><published>2009-05-24T00:07:00.001-04:00</published><updated>2009-05-26T20:12:33.081-04:00</updated><title type='text'>Reduce IDE clutter with Mylyn</title><content type='html'>One of the problems with working on a large project in Eclipse (or in any IDE) is navigating through various project resources (e.g., classes, methods, and etc..). Mylyn, a Eclipse feature, attempts to solve this problem by providing a focused view that shows only the relevant resources for a given task:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tasktop.com/videos/mylyn/webcast-mylyn-3.0.html"&gt;http://tasktop.com/videos/mylyn/webcast-mylyn-3.0.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Skip the first 4 section because the speaker blathers on and on about various impediments to a software developer's productivity. Begin at section 5 and watch until you get bored (~30 minutes).&lt;br /&gt;&lt;br /&gt;Key features of Mylyn include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Integrated view with ticket issue tracker software such as Bugzilla, Trac, and JIRA. Issues assigned to you are downloaded into the Eclipse project so that they can be viewed offline without the delay of launching a browser and waiting for a page load.&lt;/li&gt;&lt;li&gt;As you work on an issue, Mylyn tracks your visits to classes, methods, and resources to create a task context. You can upload the task context to share with other developers who would be able to view the classes, methods, and resources relevant to the ticket issue.&lt;/li&gt;&lt;li&gt;Bug numbers inlined in code comments can be clicked to bring the ticket issue into view.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In other words, Mylyn integrates Eclipse with your issue tracker so that only the relevant project resources are visible at any given time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-9076948478235996375?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/9076948478235996375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/05/reduce-ide-clutter-with-mylyn.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/9076948478235996375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/9076948478235996375'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/05/reduce-ide-clutter-with-mylyn.html' title='Reduce IDE clutter with Mylyn'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-1112577515293506659</id><published>2009-05-17T20:01:00.000-04:00</published><updated>2009-05-18T09:45:03.962-04:00</updated><title type='text'>JavaScript is elegant</title><content type='html'>I used to think that jQuery made JavaScript elegant. I was wrong. JQuery just helped me understand what is already a quite elegant language. Watch this entertaining 1 hour Google Tech Talk by Douglas Crockford, author of JSLint, JS Min, and several essays on JavaScript misconceptions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=hQVTIJBZook"&gt;http://www.youtube.com/watch?v=hQVTIJBZook&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Among the things he discusses are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The origins of JavaScript and the design flaws&lt;br /&gt;&lt;/li&gt;&lt;li&gt;General constructs to avoid in JavaScript&lt;/li&gt;&lt;li&gt;How closures are used to create objects&lt;/li&gt;&lt;li&gt;Benefits of using as a functional language&lt;/li&gt;&lt;li&gt;Uses of the triple equality (===) operator&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Probably his best statement about JavaScript is that most of us know how to use JavaScript without taking the time to understand it.&lt;br /&gt;&lt;br /&gt;If you've done or will do any work in JavaScript, please take the full one hour to watch this talk. It's worth it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-1112577515293506659?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/1112577515293506659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/05/javascript-is-beautiful.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/1112577515293506659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/1112577515293506659'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/05/javascript-is-beautiful.html' title='JavaScript is elegant'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-710269864493773380</id><published>2009-05-16T08:22:00.001-04:00</published><updated>2009-12-25T10:41:45.971-05:00</updated><title type='text'>Inspirational talk</title><content type='html'>Damien Katz talks about the path that led him to develop CouchDB, an open source document oriented database. It's not very technical and it's inspirational in an ordinary down-to-earth way.&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/katz-couchdb-and-me"&gt;&lt;br /&gt;http://www.infoq.com/presentations/katz-couchdb-and-me&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-710269864493773380?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/710269864493773380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/05/inspiration-talk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/710269864493773380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/710269864493773380'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/05/inspiration-talk.html' title='Inspirational talk'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396018311141903513.post-36151716055387578</id><published>2009-05-14T00:59:00.001-04:00</published><updated>2009-05-25T21:28:15.696-04:00</updated><title type='text'>Clean code talks</title><content type='html'>Below are four fantastic talks (~30 min each + Q&amp;amp;A) on clean code and unit testing. I wish I came across them a few years ago when I was first starting out unit testing -- would have saved me so much pain.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/results?search_type=&amp;amp;search_query=clean+code+talks+misko"&gt;http://www.youtube.com/results?search_type=&amp;amp;search_query=clean+code+talks+misko&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you're a developer with a few years down your belt, you should know why:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;if&lt;/span&gt; statements are bad&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; statements are generally bad&lt;/li&gt;&lt;li&gt;singletons are an anti-pattern&lt;br /&gt;&lt;/li&gt;&lt;li&gt;service locators were the pre-cursor to dependency injection&lt;/li&gt;&lt;/ul&gt;If not, watch the talks and you will feel much smarter!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396018311141903513-36151716055387578?l=0sumgain.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0sumgain.blogspot.com/feeds/36151716055387578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://0sumgain.blogspot.com/2009/05/clean-code-talks.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/36151716055387578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396018311141903513/posts/default/36151716055387578'/><link rel='alternate' type='text/html' href='http://0sumgain.blogspot.com/2009/05/clean-code-talks.html' title='Clean code talks'/><author><name>0sumgain</name><uri>http://www.blogger.com/profile/01490276062330433865</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
