<?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-33118148</id><updated>2011-12-12T08:19:31.775-06:00</updated><category term='C#'/><category term='Venting CSS'/><category term='Book Review'/><category term='Websphere'/><category term='jQuery'/><category term='TDD'/><category term='JRuby'/><category term='Agile'/><category term='CSS'/><category term='Ruby'/><category term='quote'/><category term='Tools'/><category term='Tips'/><category term='JavaScript'/><category term='Java'/><category term='Venting'/><category term='Processes'/><title type='text'>A geek at heart.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default?start-index=101&amp;max-results=100'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>176</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33118148.post-8346581910546239640</id><published>2011-09-30T14:43:00.001-05:00</published><updated>2011-09-30T14:43:09.308-05:00</updated><title type='text'>Root Cause</title><content type='html'>I've picked up a fun nickname at work. &amp;nbsp;Root Cause. &amp;nbsp; I take it all in fun because I have been the root cause of a few problems, but I cause far less problems than I fix.&lt;br /&gt;&lt;br /&gt;Today at work someone sent me a quote.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;For every effect there is a root cause. Find and address the root cause rather than try to fix the effect, as there is no end to the latter.&lt;br /&gt;-- Author Unknown&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's almost like there is a quote about me now. &amp;nbsp;That's lots of fun.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8346581910546239640?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8346581910546239640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8346581910546239640' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8346581910546239640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8346581910546239640'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2011/09/root-cause.html' title='Root Cause'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8521830373695492695</id><published>2011-03-22T18:36:00.002-05:00</published><updated>2011-03-22T18:36:00.518-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Websphere'/><title type='text'>Accessing Websphere Variables at runtime.</title><content type='html'>&lt;div class="MsoNormal"&gt;I'm using Redis and&amp;nbsp;I had a security need to keep the production configuration values hidden. &amp;nbsp;However, I wanted to allow other developers to run against test with minimal configuration.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;I decided that I wanted to be able to&amp;nbsp;read the Webpshere Variables that are configured on the WAS server through code.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;I started with some code I found on IBM's site to get the data, but added a simple null check to make it return null if the code is not running on a server.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;script src="https://gist.github.com/881502.js?file=WebsphereVariable"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;I had to add a reference to com.ibm.jaxws.thinclient_7.0.0.jar (this was the recommended reference by RAD) this .jar is needed for the AdminService class.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;A few quirks&lt;/div&gt;&lt;div class="MsoNormal"&gt;1. if the server is not running (when unit tests run) you have to handle a default value, this method will return null.&lt;/div&gt;&lt;div class="MsoNormal"&gt;2. If the property does not exist on the server it returns in ${propertyname}.&amp;nbsp; &lt;/div&gt;&lt;div class="MsoNormal"&gt;3. Any changes to the values on the server require a restart before they can be used by the application.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;I handled this with a properties file that will be used when running unit tests or on my local server, and the values from Websphere variables will only be used in production. &amp;nbsp;I structured it in a way that the production values take precedence over the test values.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;ResourceBundle settings=ResourceBundle.getBundle("twitter");&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;// if the values are not set then this will return ${variablename}&lt;/div&gt;&lt;div class="MsoNormal"&gt;String redisServer = expandVariable("REDIS_SERVER");&lt;/div&gt;&lt;div class="MsoNormal"&gt;if (redisServer == null || redisServer.startsWith("${")) {&lt;/div&gt;&lt;div class="MsoNormal"&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; redisServer = settings.getString("redis.server");&lt;/div&gt;&lt;div class="MsoNormal"&gt;}&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;String redisPassword = expandVariable("REDIS_PASSWORD");&lt;/div&gt;&lt;div class="MsoNormal"&gt;if( redisPassword == null || redisPassword.startsWith("${")) {&lt;/div&gt;&lt;div class="MsoNormal"&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; redisPassword = settings.getString("redis.password"); &lt;/div&gt;&lt;div class="MsoNormal"&gt;}&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;String redisPort = expandVariable("REDIS_PORT");&lt;/div&gt;&lt;div class="MsoNormal"&gt;if( redisPort == null || redisPort.startsWith("${")) {&lt;/div&gt;&lt;div class="MsoNormal"&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; redisPort = settings.getString("redis.port");&lt;/div&gt;&lt;div class="MsoNormal"&gt;}&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;I still recommend clearing out the test values when deploying to production, this will ensure that if the production property has not been set and the server restarted that the application is not accidentally pointing at test. &amp;nbsp;I'd rather have an error that a production application pointing at test.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8521830373695492695?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8521830373695492695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8521830373695492695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8521830373695492695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8521830373695492695'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2011/03/accessing-websphere-variables-at.html' title='Accessing Websphere Variables at runtime.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-781214101356944243</id><published>2010-11-29T18:36:00.000-06:00</published><updated>2010-11-29T18:36:00.342-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>if statement failure.</title><content type='html'>Looking at an if statement I noticed a problem. &amp;nbsp; This works, but is technically incorrect.&lt;br /&gt;&lt;br /&gt;if( a == null || b==null) {&lt;br /&gt;// do something&lt;br /&gt;} else if( a!=null || b != null) {&lt;br /&gt;// do something else&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;The intention here is really.&lt;br /&gt;if( isSomeState(a,b) ) {&lt;br /&gt;// do something&lt;br /&gt;} else if( !isSomeState(a,b)) {&lt;br /&gt;// do something else&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;which means ultimately it's looking for&lt;br /&gt;(a == null || b==null)&lt;br /&gt;and&lt;br /&gt;!(a == null || b==null)&lt;br /&gt;However !(a == null || b==null) translates into&lt;br /&gt;a != null &amp;amp;&amp;amp; b!=null&lt;br /&gt;&lt;br /&gt;It happens to work by accident because if either are null the code will go into the if statement and never evaluate the else if portion, however, if the statement were to get more complex intentionally then it could cause all kinds of mistaken errors.&lt;br /&gt;&lt;br /&gt;What if the code changed to be&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;if( a == null || b==null || c==null) {&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;// do something&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;} else if( a!=null || b != null) {&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;// do something else&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;only now the intention is&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;if( isSomeState(a,b) &amp;nbsp;|| c==null ) {&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;// do something&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;} else if( !isSomeState(a,b)) {&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;// do something else&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;}&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;What was previously be handled by the if statement is no longer handled, and the else if, will handle situations that it did not evaluate before, the something else will happen a lot more than it's supposed to.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;When writing complex if statements and the else if is supposed to be the opposite state of the if, then refactor that logic into method and use the method and !method to ensure that the correct logic is used.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-781214101356944243?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/781214101356944243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=781214101356944243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/781214101356944243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/781214101356944243'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/11/if-statement-failure.html' title='if statement failure.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1831624807545460984</id><published>2010-10-04T18:36:00.000-05:00</published><updated>2010-10-04T18:36:00.289-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>How to reliably set the width of an input box.</title><content type='html'>&lt;div class="MsoNormal"&gt;Input boxes are a pain to get the right length.&amp;nbsp; There are a few ways you can do it, but only one that is cross browser compatible.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The best way to limit the width is to use the display tag or css.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;input 80px;”="" display="”width:" /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The css method would be to have a style&lt;/div&gt;&lt;div class="MsoNormal"&gt;.width80 {&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;width: 80px;&lt;/div&gt;&lt;div class="MsoNormal"&gt;}&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;input class="”width80”" /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;There is a tag that is also supported across browsers, the Size tag this is less reliable.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;input size="”30”" /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The size lets the browser know that this text box should big enough to hold 30 characters.&amp;nbsp;&amp;nbsp; The different browsers interpret this differently.&amp;nbsp; They have their own internal math that they do and the fonts may be different across browsers, so using the size attribute to define the width of a text box may mean that on one screen the text box is too long and messes with the appearance of the screen that you want to design.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Many times I'm trying to align columns with more of a fixed width, using size to set the width of a text box causes me problems across browsers. &amp;nbsp;Keep this in mind as you style your own input boxes.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1831624807545460984?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1831624807545460984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1831624807545460984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1831624807545460984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1831624807545460984'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/10/how-to-reliably-set-width-of-input-box.html' title='How to reliably set the width of an input box.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8032306534636316498</id><published>2010-09-28T18:36:00.001-05:00</published><updated>2010-09-28T18:36:00.552-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>IE7 ghost text</title><content type='html'>&lt;div class="MsoNormal"&gt;This week we ran into an odd problem with Ghost text showing up in our application &amp;nbsp;Google turned up a lot of similar problems with no clear cause or solution, &amp;nbsp;I used the development tools to help me figure out a way to solve the problem. &amp;nbsp;The scenario that it appears to cause it is if there is a div that is floating, it has a width of 100%, and a margin, then the text inside of it may cause ghost text. &amp;nbsp; Oddly, the same html did not cause the same problem everywhere on the page.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/__QvT6eRwS2w/TJ4UsKOBNHI/AAAAAAAAAtQ/bQ0Sr_Vu-H0/s1600/ghost-text.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://3.bp.blogspot.com/__QvT6eRwS2w/TJ4UsKOBNHI/AAAAAAAAAtQ/bQ0Sr_Vu-H0/s320/ghost-text.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;This is setup like this.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div 100%;="" 5px;”="" left;="" margin-left="" width:=""&gt;PRODUCT DETAILS&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Unfortunately, I’m not sure if that is the only thing required to cause this problem.&amp;nbsp;&amp;nbsp; While I tried to fix the problem it went away with several different things.&amp;nbsp; &lt;/div&gt;&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;When I removed float: left, the ghost text disappeared.&lt;/li&gt;&lt;li&gt;When I set margin-left: 0px; the ghost text disappeared.&lt;/li&gt;&lt;li&gt;When I changed the structure to the following the ghost text disappeared.&lt;br /&gt;&lt;div 0px;”="" 100%;="" left;="" margin-left="" width:=""&gt;&lt;span 5px;”=""&gt;PRODUCT DETAILS&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;I went with the last option.&amp;nbsp; It kept the integrity of the rest of the CSS in place, and made the end result look the way that I wanted it to look.&amp;nbsp; I’ve seen lots of blog posts about the same problem.&amp;nbsp; Nobody, including Microsoft, seems to have a clear understanding of what the official cause is.&amp;nbsp; It only happened in some places in tye application and not in others, even though they were set up the exact same way.&amp;nbsp;&amp;nbsp; For safety I changed them all to option 3.&amp;nbsp; IE7 had the problem, but IE8 did not.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;A quick note on IE7 vs. IE8,&amp;nbsp; If you have IE8 installed, you can use the developer tools (F12) to change how the page displays and view it as if it were IE7.&amp;nbsp; I frequently do this while testing applications because IE7 and IE8 do not show everything the same way, sometimes you have to handle things a little bit differently.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8032306534636316498?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8032306534636316498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8032306534636316498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8032306534636316498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8032306534636316498'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/09/ie7-ghost-text.html' title='IE7 ghost text'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__QvT6eRwS2w/TJ4UsKOBNHI/AAAAAAAAAtQ/bQ0Sr_Vu-H0/s72-c/ghost-text.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-362614680883588291</id><published>2010-09-27T18:36:00.000-05:00</published><updated>2010-09-27T18:36:00.799-05:00</updated><title type='text'>jQuery UI Autocomplete extensions</title><content type='html'>&lt;div class="MsoNormal"&gt;Scott Gonzalez posted a blog post August 24th about some auto-complete extensions that he wrote. &amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;One of these is the ability to automatically select the item that is highlighted, so once it’s highlighted the user can hit enter, click it, or just tab off of the field and it will select that item.&amp;nbsp; There are also some other nice advanced features here, I encourage you to read this post.&amp;nbsp; &lt;a href="http://blog.jqueryui.com/2010/08/extensible-autocomplete/"&gt;http://blog.jqueryui.com/2010/08/extensible-autocomplete/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-362614680883588291?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/362614680883588291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=362614680883588291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/362614680883588291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/362614680883588291'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/09/jquery-ui-autocomplete-extensions.html' title='jQuery UI Autocomplete extensions'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6449332154164000456</id><published>2010-09-25T18:36:00.000-05:00</published><updated>2010-09-25T10:25:26.352-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery UI 1.8.5 released</title><content type='html'>&lt;div class="MsoNormal"&gt;jQuery 1.8.5 was release September 17&lt;sup&gt;th&lt;/sup&gt;&amp;nbsp; &lt;a href="http://blog.jqueryui.com/2010/09/jquery-ui-1-8-5/"&gt;http://blog.jqueryui.com/2010/09/jquery-ui-1-8-5/&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;This is a bug fix release mostly, but it has one powerful new feature that I've been waiting for. &amp;nbsp;We now have more power over the buttons on the dialog.&amp;nbsp; We can set them to primary and secondary buttons, as well as disabled.&amp;nbsp; The styles of these buttons are built into the theme. &amp;nbsp;There is ui-priority-primary, ui-priority-secondary, and ui-state-disabled.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Also the text on the button is no longer limited to a string, we can now include html, so if we wanted to bold a single word on a multiword button we could have something like “&lt;b&gt;Find&lt;/b&gt; account”&amp;nbsp; &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Here’s an example of how to use the new functionality, &amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;el = $("&lt;/div&gt;&lt;div&gt;&lt;/div&gt;").dialog({&lt;br /&gt;&lt;div class="MsoNormal"&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; buttons: [&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&amp;nbsp; {&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; text: "a button 1",&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; "class": "ui-priority-primary",&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; id: "my-button-id-1",&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; click: function() {&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("button 1 clicked");&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&amp;nbsp; },&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&amp;nbsp; {&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; text: "a button 2",&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; "class": "ui-priority-secondary",&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; id: "my-button-id-2",&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; click: function() {&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("button 2 clicked");&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&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;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div class="MsoNormal"&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;&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;&amp;nbsp; }&lt;/div&gt;&lt;div class="MsoNormal"&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; ]&lt;/div&gt;&lt;div class="MsoNormal"&gt;});&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6449332154164000456?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6449332154164000456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6449332154164000456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6449332154164000456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6449332154164000456'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/09/jquery-ui-185-released.html' title='jQuery UI 1.8.5 released'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3783076657271098407</id><published>2010-08-16T18:36:00.000-05:00</published><updated>2010-08-16T18:36:00.599-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Unit tests catch documentation flaws.</title><content type='html'>I wanted to set a date and clear the time fields for it. &lt;br /&gt;&lt;br /&gt;I quickly grabbed a calender object.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;Calendar tomorrow = Calendar.getInstance();&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;tomorrow.add(Calendar.DATE, 1);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;tomorrow.clear();&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The JavaDoc for .clear() states "Clears the values of all the time fields." &amp;nbsp;Which is awesome because I want the value to be tomorrow's date with no time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, the value of tomorrow at this point is 1/1/1970. &amp;nbsp;The writer of the documentation considered the date as part of the time fields. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instead I have to do this.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;Calendar tomorrow = Calendar.getInstance();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;tomorrow.add(Calendar.DATE, 1);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;tomorrow.set(Calendar.HOUR_OF_DAY, 0);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;tomorrow.set(Calendar.MINUTE, 0);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;tomorrow.set(Calendar.SECOND, 0);&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;tomorrow.set(Calendar.MILLISECOND, 0);&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will set the value to tomorrow without any time values.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Documentation is great, but be sure to test the results of the function yourself or you may end up with something other than what you expect.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3783076657271098407?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3783076657271098407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3783076657271098407' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3783076657271098407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3783076657271098407'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/08/unit-tests-catch-documentation-flaws.html' title='Unit tests catch documentation flaws.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2375567470601317505</id><published>2010-08-06T09:36:00.000-05:00</published><updated>2010-08-06T09:36:54.901-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Don't clone an object when you don't need to.</title><content type='html'>I was working with a piece of code today and I stumbled across a method that had this chunk of code in it.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Iterator iter = results.iterator();&lt;br /&gt;while(iter.hasNext())&lt;br /&gt;{&lt;br /&gt;MyRecords existingTO = (MyRecords)iter.next();&lt;br /&gt;MyRecords newTO = new MyRecords();&lt;br /&gt;newTO.setDateLoaded(existingTO.getDateLoaded());&lt;br /&gt;newTO.setFileExtension(existingTO.getFileExtension());&lt;br /&gt;newTO.setFilenetID(existingTO.getFilenetID());&lt;br /&gt;newTO.setFilenetName(existingTO.getFilenetName());&lt;br /&gt;newTO.setOriginalName(existingTO.getOriginalName());&lt;br /&gt;newTO.setDescription(existingTO.getDescription());&lt;br /&gt;&lt;br /&gt;newTO.setFileSize(getFileSize(existingTO.getFilenetName()));&lt;br /&gt;result.add(newTO);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This code gets data from a data access layer, then makes a clone of each item adding it to a new list while setting the FileSize. &amp;nbsp; However, there is no need to create a clone of the object. &amp;nbsp;The only thing required is to get the file size and set it. &amp;nbsp; A much cleaner smaller method is.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Iterator iter = results.iterator();&lt;br /&gt;while(iter.hasNext())&lt;br /&gt;{&lt;br /&gt;MyRecords existingTO = (MyRecords)iter.next();&lt;br /&gt;existingTO.setFileSize(getFileSize(existingTO.getFilenetName()));&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This does the exact same thing without creating all the extra objects to store in memory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2375567470601317505?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2375567470601317505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2375567470601317505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2375567470601317505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2375567470601317505'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/08/dont-clone-object-when-you-dont-need-to.html' title='Don&apos;t clone an object when you don&apos;t need to.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1205943304524845349</id><published>2010-05-28T09:36:00.000-05:00</published><updated>2010-05-28T09:36:24.947-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>The power of a character.</title><content type='html'>I was faced with an issue this week. &amp;nbsp; Code was not working like it should, yet all of my unit tests passed.&lt;br /&gt;&lt;br /&gt;The problem, I didn't have a unit test set up correctly.&lt;br /&gt;&lt;br /&gt;Here's the scenario. &amp;nbsp;There are fields in the database that are used for tracking who the last person to update a record is and when that happened. &amp;nbsp;These fields do not get passed to the front end to prevent someone from using them. &lt;br /&gt;&lt;br /&gt;When I save I cannot just insert/update the data from the front end I have to transfer that information into an object that includes the extra fields from the database.&lt;br /&gt;&lt;br /&gt;But I only want to deal with that if the record has changed, so I use code that looks like this.&lt;br /&gt;&lt;br /&gt;public ViewRecord save(ViewRecord viewRecord) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;ViewRecord savedRecord = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;DBRecord existingRecord = db.getRecord(viewRecord.getId());&lt;br /&gt;&amp;nbsp;&amp;nbsp;if( recordChanged(viewRecord, existingRecord) ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DBRecord saveRecord = buildRecord(viewRecord, existingRecord);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DBRecord record = db.saveRecord(saveRecord);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;savedRecord = new ViewRecord(record);&lt;br /&gt;&amp;nbsp;&amp;nbsp;} else {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;savedRecord = viewRecord; &amp;nbsp;// did not save, but it didn't need to.&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;return savedRecord;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Basically every business object in my project does this exact same thing at save time. &amp;nbsp; The problem I ran into was with recordChanged();&lt;br /&gt;&lt;br /&gt;It's code is this&lt;br /&gt;private boolean recordChanged(ViewRecord viewRecord, DBRecord existingRecord) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;if( existingRecord == null || !viewRecord.equals(new ViewRecord(existingRecord)) ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Missing the ! on the equals means that a save will only happen if it is a new record or if nothing has changed. &amp;nbsp;Effectively turning the object into a write once object.&lt;br /&gt;&lt;br /&gt;Code coverage tools may not catch this either. &amp;nbsp; There is nothing wrong with this code other than it doesn't do what I want. &amp;nbsp; I even had a unit test that had no changes and made sure that everything was being called to act as if it were saved. &amp;nbsp;&lt;br /&gt;&lt;br /&gt;Unit tests are great, but be sure that you don't use copy and paste when setting them up. &amp;nbsp; Stop and think about each thing that you want to happen given a scenario, then make sure that you configure the mocks to expect only the calls that you want to have happen. &amp;nbsp;When you do that, the unit tests will help you catch quirks like a single missing !.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1205943304524845349?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1205943304524845349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1205943304524845349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1205943304524845349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1205943304524845349'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/05/power-of-character.html' title='The power of a character.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2634484157598214946</id><published>2010-05-26T09:06:00.000-05:00</published><updated>2010-05-26T09:06:13.448-05:00</updated><title type='text'>Omar Vizquel mulls retirement after season - MLB - SI.com</title><content type='html'>&lt;a href="http://sportsillustrated.cnn.com/2010/baseball/mlb/05/25/vizquel.retirement.ap/index.html"&gt;Omar Vizquel mulls retirement after season - MLB - SI.com&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a Sox fan, I wish he would have mulled over retirment before the season.  During the season won't bother me either.  Heck the sooner the better.  Omar, I hated you when you played for the Indians and beat us in the 90s, but not quite as much as I hate you now that you suck and play for us.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2634484157598214946?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://sportsillustrated.cnn.com/2010/baseball/mlb/05/25/vizquel.retirement.ap/index.html' title='Omar Vizquel mulls retirement after season - MLB - SI.com'/><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2634484157598214946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2634484157598214946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2634484157598214946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2634484157598214946'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/05/omar-vizquel-mulls-retirement-after.html' title='Omar Vizquel mulls retirement after season - MLB - SI.com'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7310566429670304056</id><published>2010-05-25T14:17:00.002-05:00</published><updated>2010-05-25T14:17:30.234-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Test, Test, Test</title><content type='html'>Lately my driving force has been more, easier, unit tests. &amp;nbsp;I want to get my code tested with as little duplicate code as possible and make both my unit tests and actual code easier to read and use.&lt;br /&gt;&lt;br /&gt;I will be posting some tips from things that I've been learning soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7310566429670304056?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7310566429670304056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7310566429670304056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7310566429670304056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7310566429670304056'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/05/test-test-test.html' title='Test, Test, Test'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3308790022605442199</id><published>2010-02-23T14:35:00.000-06:00</published><updated>2010-02-23T14:36:10.321-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quote'/><title type='text'>Quote</title><content type='html'>Hope is not enough to deliver a successful project.&lt;br /&gt;-- Manage It&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3308790022605442199?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3308790022605442199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3308790022605442199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3308790022605442199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3308790022605442199'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2010/02/quote.html' title='Quote'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7606301394468741935</id><published>2009-12-31T08:01:00.002-06:00</published><updated>2009-12-31T08:26:53.660-06:00</updated><title type='text'>The end and start of a decade</title><content type='html'>Listening to the radio the other day it occured to me that this is the end of the 2000's.  &lt;br /&gt;&lt;br /&gt;I thought back to 2000 and what I was doing.  I was writing C programs for DOS., writing batch files, reading Charles Petzold and Windows API programming, and playing with VB5 as a faster RAD development tool.  I knew how to drag and drop the basic controls onto the form and that was about it.&lt;br /&gt;&lt;br /&gt;In 2000 I started a new job.  Working where I still work.   I spent the rest of the decade learning and writing programs.  I learned VB6 and earned an MCSD in it. I learned Transact SQL and SQL Server 7, SQL Server 2000, DTS.  Perl, C#, and Java, Javascript, earned an SCJP. &lt;br /&gt;&lt;br /&gt;I went from using my own copy method as source control to Visual Source Safe, to CVS.  I've started playing with Git now.&lt;br /&gt;&lt;br /&gt;I've started learning Ruby, which looks like the first language in the new decade that I'll learn.  I've played very minimally with Rails and JRuby.  Those will be right there too.  But where will I be in 10 years, what will I be learning and doing?  I don't know.  I do know that I love to read and learn new things, so without a doubt I will definitely be learning new things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7606301394468741935?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7606301394468741935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7606301394468741935' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7606301394468741935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7606301394468741935'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/12/end-and-start-of-decade.html' title='The end and start of a decade'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7293921423485923294</id><published>2009-10-24T22:26:00.003-05:00</published><updated>2009-10-24T22:35:29.726-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Override backspace as the back button</title><content type='html'>I have a common problem.  I write a lot of web applications that run in a portal.  When a user hits the back button it will take them to a different portlet or log them out of the portal completely.  I can't prevent them from clicking the back button, but IE and Firefox both have the backspace key set up as a shortcut for the back button.  This is annoying because the users will accidentally type it thinking that the cursor is in a text field.   When it's not the back button is pressed and the user complains that they were randomly logged off.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To prevent this I use the javascript &lt;a href="http://www.openjs.com/scripts/events/keyboard_shortcuts/shortcut.js"&gt;Shortcut.js&lt;/a&gt; and a small chunk of code. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;shortcut.add("backspace", function() {&lt;br /&gt; // override backspace as the back button&lt;br /&gt;},{ 'type':'keydown', 'disable_in_input':true, 'propagate':false });&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;That's all there is to it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7293921423485923294?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7293921423485923294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7293921423485923294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7293921423485923294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7293921423485923294'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/10/override-backspace-as-back-button.html' title='Override backspace as the back button'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3742224483706538046</id><published>2009-07-02T11:10:00.002-05:00</published><updated>2009-07-02T11:12:29.046-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Tool tips thought</title><content type='html'>I don't know why it didn't occur to me before, but a tooltip does not have to be hidden when the link to hover loses focus.  Especially if the tooltip should remain up for the user to interact with.&lt;br /&gt;&lt;br /&gt;Instead ensure that the tooltip shows up where the mouse cursor is currently located, covering the underlying link, then hide it on mouse out of the tooltip instead of on mouseout of the initiating link.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3742224483706538046?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3742224483706538046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3742224483706538046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3742224483706538046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3742224483706538046'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/07/tool-tips-thought.html' title='Tool tips thought'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8380195840299517638</id><published>2009-06-22T19:35:00.002-05:00</published><updated>2009-06-22T19:40:44.027-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>clueTip zindex tip</title><content type='html'>OK, so the title isn't great, but that's what this is.&lt;br /&gt;&lt;br /&gt;I had an issue where I'm using the &lt;a href="http://plugins.learningjquery.com/cluetip/#getting-started"&gt;clueTip jQuery plugin&lt;/a&gt; to show tooltips in my page.  Everything was working great until I tried to show one inside of a dialog. &lt;br /&gt;&lt;br /&gt;Even when I used the cluezIndex setting to show the tooltip and set the value to 3000 it wouldn't work.&lt;br /&gt;&lt;br /&gt;    $('a.toolTip').cluetip({cluezIndex: 3000, local: true, hidelocal: true, cursor: 'pointer', arrows: false, positionBy: 'mouse'});&lt;br /&gt;&lt;br /&gt;After tracing through the code I found the problem.   Once a tooltip is added to the page the cluezIndex value that it has stays the same, you can't change it with this setting.  &lt;br /&gt;&lt;br /&gt;For me, I made sure that all of my cluetip showings set the cluezIndex to 3000.   Be sure to set the cluezIndex to a value that's higher than everything you want it to be above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8380195840299517638?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8380195840299517638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8380195840299517638' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8380195840299517638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8380195840299517638'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/06/cluetip-zindex-tip.html' title='clueTip zindex tip'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7447581123689544835</id><published>2009-06-16T09:58:00.004-05:00</published><updated>2009-06-16T10:14:29.136-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>jQuery annoyances</title><content type='html'>Mostly I love jQuery, but there are few annoyances that I have struggled with.&lt;br /&gt;&lt;br /&gt;Datepicker&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I have not been able to bind a date picker to elements that are dynamically added to the page after load.   This causes a problem.&lt;/li&gt;&lt;li&gt;The z-index did not allow the datepicker to show up on top of a dialog, I had to tweak the CSS to make that happen.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Dialog&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My element is stripped from the location on the page and moved into the dynamically generated dialog html element.  this causes inherited CSS settings to be lost and the layout within a dialog must be specifically set.&lt;/li&gt;&lt;li&gt;Building the same dialog multiple times puts multiple copies in the DOM instead of cleaning up itself.&lt;/li&gt;&lt;li&gt;.remove() removes the dialog from the DOM by completely destroying the HTML, but it also destroys my HTML that was ripped from another location on my page.&lt;/li&gt;&lt;li&gt;the maxHeight value is ignored when initially building a dialog, and I have to check the height and specifically fix it if it is too big.&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/33118148-7447581123689544835?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7447581123689544835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7447581123689544835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7447581123689544835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7447581123689544835'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/06/jquery-annoyances.html' title='jQuery annoyances'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8089259029110865316</id><published>2009-04-16T12:48:00.002-05:00</published><updated>2009-04-16T13:17:03.655-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>Branching code for Development and test.</title><content type='html'>One of the biggest problems that's happened on projects that past few years was that web service changes that I was working on would break the UI that used it.  This would cause testing to come to a halt until I could also add in the UI enhancements and redeployed it for test.&lt;br /&gt;&lt;br /&gt;On the project that I'm working on now we're trying to implement some changes based on those problems.&lt;br /&gt;&lt;br /&gt;First, we have set up a new web server to deploy a Development version of the web service to.  This stems directly from the fact that new enhancements require changes to the web service and UI.  The rules or additional features of the web service may break the UI until it is enhanced to take advantage of the new features.   Having this new server now, I can break the web service and also use this development version to update the UI.  When both are ready then they can be deployed for the tester.&lt;br /&gt;&lt;br /&gt;Second, with multiple developers, sometimes one persons changes are ready to deploy for testing before the other persons.  However, in an environment where everyone is using the main branch of the Source Code Repository (CVS for me) the code may not be in a deployable state due to one of the developers changes.   In order to keep code synchronized with CVS, just in case my local hard drive dies, and have things in an easily deployable state, we are planning to branch each Story.&lt;br /&gt;&lt;br /&gt;Timing is odd, it's something I was planning on doing, before I started implementing it I had the article &lt;a href="http://blog.hasmanythrough.com/2008/12/18/agile-git-and-the-story-branch-pattern"&gt;The Story of the Branch Pattern&lt;/a&gt; sent to me.  I'm doing basically the same thing. &lt;br /&gt;&lt;br /&gt;Head is always deployable and the version that the Testers are testing.   Defect fixes (unless they are very big) are done directly in Head so they can be redeployed quickly. &lt;br /&gt;&lt;br /&gt;A new branch is created for each story.  Development of the stories are done stand alone until they are ready to be tested, then they are merged in with Head and deployed for testing.&lt;br /&gt;&lt;br /&gt;The only problem that I still have not figured out a way to work through is that this project has multiple developers.  Each one is working on Web Service changes at the same time, and needs to have that web service deployed somewhere in order to make changes to the UI.  We only have one development web server.  Ultimately I think this could be fixed if I could figure out a way to get both the backend web server and the front end web server running on my local box.  Each developer would then do everything locally until they are ready to merge.   Until then I think the only solution is going to be to merge web service changes together outside of Head and deploy that merged version to the development web server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8089259029110865316?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8089259029110865316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8089259029110865316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8089259029110865316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8089259029110865316'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/04/branching-code-for-development-and-test.html' title='Branching code for Development and test.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2552082004747148457</id><published>2009-03-11T19:00:00.000-05:00</published><updated>2009-03-11T19:00:00.782-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Ultra Edit is coming for Linux and Mac</title><content type='html'>&lt;div&gt;&lt;a href="http://www.ultraedit.com/products/uex.html"&gt;Ultra Edit&lt;/a&gt; (my favorite editor) is finally making a version that will run on Linux and Mac.  I think that this is a very telling step.   It may mean that software makers are finally feeling that Microsoft is losing it's grip on the OS.   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even without some of the more popular pieces of software being available for Mac, and to a smaller extent Linux, people have been switching away from Windows.   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If Software Vendors update their applications to work on these other systems, I expect that even more people will be willing to make that leap.&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 26, 139); text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2552082004747148457?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2552082004747148457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2552082004747148457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2552082004747148457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2552082004747148457'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/03/ultra-edit-is-coming-for-linux-and-mac.html' title='Ultra Edit is coming for Linux and Mac'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6984369109914028236</id><published>2009-03-05T07:00:00.001-06:00</published><updated>2009-03-05T07:00:02.264-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review: The Little Book of Ruby</title><content type='html'>SaphireSteel.com gave away the free book &lt;a href="http://www.sapphiresteel.com/The-Little-Book-Of-Ruby"&gt;The Little Book of Ruby&lt;/a&gt; and I took advantage of it.   Due to some things I was working on I had to restart the book several times.  Now that I've finally finished it I thought I'd write up my thoughts.&lt;br /&gt;&lt;br /&gt;The Little Book of Ruby does a decent job of explaining the very basics of Ruby.   It does not delve into detail or give best practices on things, however, it's enough that a Ruby Beginner can read through the 85 page eBook and be able to figure out mostly what's happening in Ruby code that they look at.&lt;br /&gt;&lt;br /&gt;It's a better start to Ruby than Why the Lucky Stiff's into.  Why is an interesting character, but he gets too sidetracked, The Little Book of Ruby is a much better starting place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6984369109914028236?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6984369109914028236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6984369109914028236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6984369109914028236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6984369109914028236'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/03/book-review-little-book-of-ruby.html' title='Book Review: The Little Book of Ruby'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7936901415029483966</id><published>2009-03-04T12:46:00.005-06:00</published><updated>2009-03-04T12:48:57.816-06:00</updated><title type='text'>What I'm up to.</title><content type='html'>Off and on for the past year I've been trying to pick up Ruby.  Last year I ended up getting sidetracked specializing in some Java code.   However, since December I have been a reading machine and plowing through books.  I've started absorbing everything I can about Javascript and jQuery.   Now I'm also Reading about Ruby and Rails and JRuby.  &lt;br /&gt;&lt;br /&gt;I plan to have some posts coming up from things that I have learned and played with recently, and that I'll continue to work with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7936901415029483966?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7936901415029483966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7936901415029483966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7936901415029483966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7936901415029483966'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/03/what-im-up-to.html' title='What I&apos;m up to.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8899612707762181852</id><published>2009-01-08T07:00:00.001-06:00</published><updated>2009-01-08T10:01:14.400-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Almost as good as code reviews.</title><content type='html'>Right now code reviews seem to be what everyone is pushing.   TDD is good, but code reviews are better.   I recently read "&lt;a href="http://smartbear.com/codecollab-code-review-book.php"&gt;Best Kept Secrets of Peer Code Review&lt;/a&gt;" which says about the same thing.&lt;br /&gt;&lt;br /&gt;Code reviews can be hard to come by.  Some companies just don't want do dedicate the time to doing code reviews.  &lt;br /&gt;&lt;br /&gt;However, something that is almost as good as code reviews are tech sites like &lt;a href="http://www.experts-exchange.com/"&gt;Experts-Exchange&lt;/a&gt;.   These sites will not find the flaws in your programming, but one of the benefits touted by code reviews is that they help you learn new and better ways of doing things.   These forums for problems and questions that people have do the same thing.  &lt;br /&gt;&lt;br /&gt;If you can't do code reviews, I suggest finding a site that deals with questions of the system that you work in and join, participate, ask questions, and watch what other experts post.   You may learn some junky way to solve problems, but one thing that seems to be universal in programming.  The people who are really good at it, like to help others.   That's why they write books, blog, and participate at these sites.   &lt;br /&gt;&lt;br /&gt;You may be thinking, but I can just follow blogs to see what's going on.  That's true, you can and should do that too.   But the forums that are open for anything are where you find people asking questions about how to do something that you never even though to attempt.   And while you may not know the answer, you'll likely be able to read the wisdom of someone else that already struggled through it.    Don't wait until you have a question that you can't answer, find out what questions others can't answer, and the answers that are given to them, become knowledge for you.   You won't even get to the point where you have to ask the question because you already know the answer.   And some of the oddball questions, may open your mind to providing an entirely different solution than you had ever considered before.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8899612707762181852?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8899612707762181852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8899612707762181852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8899612707762181852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8899612707762181852'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2009/01/almost-as-good-as-code-reviews.html' title='Almost as good as code reviews.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1687228218420613367</id><published>2008-12-04T23:15:00.000-06:00</published><updated>2008-12-04T23:16:01.204-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP Certified</title><content type='html'>After months of studying, I have finally taken the SCJP certification and passed.   My learning in the immediate future will be more for fun than for a certification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1687228218420613367?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1687228218420613367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1687228218420613367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1687228218420613367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1687228218420613367'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/12/scjp-certified.html' title='SCJP Certified'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6941288485271273440</id><published>2008-11-13T07:00:00.000-06:00</published><updated>2008-11-13T07:00:01.309-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>PRG pattern alternative</title><content type='html'>I'm working on a websphere portal application and in it I have a lot of operations.  Sometimes I post, and sometimes I use servlets.   But I don't do any gets.   &lt;br /&gt;&lt;br /&gt;A while ago I introduced a problem to the application.   Instead of just performing a normal search, I added a queue, and a get next feature.   In order to keep code to a minimum I used the same portlet and just changed the action to let my portlet know which action it was supposed to handle.   The end result is that both methods give me an account to show on the screen, the only difference was in how they retrieved that account.&lt;br /&gt;&lt;br /&gt;Things have been working great, until the page only have reloaded and a user hit F5.   Then instead of just forcing the page to reload with the information that it should have already loaded, it is doing another Get Next and the user is losing the current account.&lt;br /&gt;&lt;br /&gt;Some research on this problem led me to the PRG (Post/Redirect/Get) pattern.   &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=RedirectAfterPost"&gt;Redirect after Post&lt;/a&gt; is a great article on this solution.   However, it's not what I wanted to implement.   I didn't want to modify my process that much.  I like how my portlets are working without trying to get the redirect working (which I have read may be a problem).&lt;br /&gt;&lt;br /&gt;Instead I needed a way to know if the page was performing a new action, or if it was resubmitting the old one.&lt;br /&gt;&lt;br /&gt;I opted for telling my page what ID it should tell me when performing an action.  Initially this value is set to 0.    The first action runs and tells the page that it should next call with a 1.   If the page does not call with a 1 then instead of performing a real action the page will instead refresh the information on the screen without performing an action.   When F5 is pressed it resubmits all of the information that was submitted in the previous post.&lt;br /&gt;&lt;br /&gt;There are 2 keys to this. &lt;br /&gt;1. I have a hidden field in my form that holds the ID to send with the rest of the information for the post.&lt;br /&gt;&lt;br /&gt;2. I use the session to keep that same ID active in the session.  &lt;br /&gt;&lt;br /&gt;Trying to think about all aspects of this, I also tried to think of problems with this solution.&lt;br /&gt;1.  If the session times out the user will need to log back in, but the portal already enforces that behavior.&lt;br /&gt;2.  If someone were to manually massage that value would there be a problem?   Since I actually do nothing if the value is not what I'm expecting, then changing the data with a tool like firebug will only prevent the page from doing things, instead of allow it to do things.   Since there is no way to massage the data that is submitted by pressing F5, there is nothing that should be a problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6941288485271273440?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6941288485271273440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6941288485271273440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6941288485271273440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6941288485271273440'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/11/prg-pattern-alternative.html' title='PRG pattern alternative'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-4018977300485050956</id><published>2008-11-04T07:00:00.000-06:00</published><updated>2008-11-04T07:00:01.510-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting'/><title type='text'>Performance Reviews should be banished.</title><content type='html'>There's an interesting article at InfoQ stating that &lt;a href="http://www.infoq.com/news/2008/10/performance_review"&gt;Performance Reviews should be banished&lt;/a&gt;.  I just finished my own self-review last week, which is even more painful than a standard review.  Rather than just having my boss tell me how he thinks I'm doing, which is a monthly conversation anyway, I get to hear the summation of the year in review.  It shouldn't take as long as it does.   I also get to rate myself in all of the categories and defend why I think I rated myself awesome. &lt;br /&gt;&lt;br /&gt;I mean really, what person will rate themselves and not say I did awesome.  Even if I know there are bad things the result will still be "awesome, considering the situations".   I will always work hard, and put in hours at home learning new things and trying out new ideas.  I will always put in time trying to better myself, I will always do my best to get all of my work done as well as stop to help everyone that I can as often as I can.   That's awesome.&lt;br /&gt;&lt;br /&gt;Maybe my biased opinion needs some perspective.   Maybe this review offers the opportunity to hear an opinion that may not be just "awesome", but if it is, that would be awesome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-4018977300485050956?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/4018977300485050956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=4018977300485050956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4018977300485050956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4018977300485050956'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/11/performance-reviews-should-be-banished.html' title='Performance Reviews should be banished.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8503600825429659640</id><published>2008-11-03T22:59:00.003-06:00</published><updated>2008-11-03T23:01:11.808-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Turning Agile to 11</title><content type='html'>There's some very interesting topics covered in this 31 minute presentation on &lt;a href="http://www.infoq.com/presentations/Super-Agile-Craig-Smith-and-Paul-King"&gt;Turning Agile up to 11&lt;/a&gt;.   It was a presentation that got me thinking about some of the things that we are not doing on our projects currently, and how some of these additional techniques could be helpful. &lt;br /&gt;&lt;br /&gt;I am guessing that most Agile groups are not even working at 10, I know mine is not.  However, you should always strive for these kinds of improvements in your process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8503600825429659640?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8503600825429659640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8503600825429659640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8503600825429659640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8503600825429659640'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/11/turning-agile-to-11.html' title='Turning Agile to 11'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3364167620044294594</id><published>2008-10-31T12:00:00.000-05:00</published><updated>2008-10-31T12:04:44.531-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Ultra Edit Extras</title><content type='html'>Ultra Edit has put a lot of work into making &lt;a href="http://www.ultraedit.com/downloads/extras.html"&gt;Extras&lt;/a&gt; for their product available.  I've been a huge UE fan for a long time now, sorry emacs people I like UE. &lt;br /&gt;&lt;br /&gt;Finally they have word files for different languages available to download.  I was a little disappointed in March when I was looking for a word file for Ruby which would allow me to continue to use my favorite editor to start working with Ruby.   That is no longer an issue, they now have word files for additional languages that were not included in the original install.   There are also additional dictionaries, tag files, macro tutorials, and basic scripts that can be used to teach you how to use Ultra Edit even more efficiently.&lt;br /&gt;&lt;br /&gt;I have spent the past 2 years really getting familiar with all of the options of Ultra Edit.  As David Hunt says in The Pragmatic Programmer, you need to be intimately familiar with all of the capabilities of your text editor, no matter which one it is, in order to be an efficient developer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3364167620044294594?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3364167620044294594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3364167620044294594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3364167620044294594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3364167620044294594'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/ultra-edit-extras.html' title='Ultra Edit Extras'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8460899894514952691</id><published>2008-10-30T22:00:00.001-05:00</published><updated>2008-10-30T23:21:50.042-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>Log4J tips.</title><content type='html'>An additonal log4j tip that I found today.  %c is the class that is used to create the log4j class.   It can be useful, if it is the actual class that is creating it.  However, you probably do not need the entire class hierarchy.   %c{1} will only show the classname itself without the heirarchy.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;When you create your logger with&lt;br /&gt;static Logger logger = Logger.getLogger(CustomerBusiness.class);&lt;br /&gt;&lt;br /&gt;And CustomerBusiness is in package net.company.webservice.business&lt;br /&gt;Then %c will write out&lt;br /&gt;net.company.webservice.business.CustomerBusiness&lt;br /&gt;&lt;br /&gt;%c{1} will write out CustomerBusiness&lt;br /&gt;&lt;br /&gt;This may be considered small but the duplicated characters can add up to a lot.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The problem is even more pronounced if you have a separate log for a single purpose.    We log all of our performance log information into a separate log file.&lt;br /&gt;We do this by having a separate RollingFileAppender for performance logging and creating a 2nd Logger in the class with  &lt;br /&gt;private static Logger performancepaLogger=Logger.getLogger("net.comny.webservice.performancelogger");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As for the performance logger, I also think it's useful to format those in a standard way.  That way slow operations can be tracked easily.&lt;br /&gt;&lt;br /&gt;[DateTime] {ClassName}: {Function}: {Unique path} Call Time: {milliseconds}&lt;br /&gt;&lt;br /&gt;One shortcoming of this is that in order to make the logging call itself faster you have to code each call to log.info to pass through the values that are in {}.   &lt;br /&gt;&lt;br /&gt;The bonus of {Unique path} which in most of my applications would be an account number, is that I could see calls that look something like this.&lt;br /&gt;AccountDAO: saveAccount: 223 Call Time: 20&lt;br /&gt;AccountDAO: saveEmail: 223 Call Time: 25&lt;br /&gt;CallDAO: saveCallInfo: 223 Call Time: 120&lt;br /&gt;AccountBusiness: saveAccount: 223 Call Time: 200&lt;br /&gt;WebService: saveAccount: 223 Call Time: 500&lt;br /&gt;&lt;br /&gt;I can look at that and even with other records mixed in, I can see at the DAO level which calls are higher and causing the webservice call for a single record to be high.   If the same database level access class has high call times for all of the accounts then it will show where optimization needs to take place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8460899894514952691?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8460899894514952691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8460899894514952691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8460899894514952691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8460899894514952691'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/log4j-tips_30.html' title='Log4J tips.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-717383008425145227</id><published>2008-10-29T22:00:00.002-05:00</published><updated>2008-10-29T23:15:47.437-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Expectations</title><content type='html'>What do you expect of yourself, of your co-workers, of your boss?  &lt;br /&gt;&lt;br /&gt;I have come up with a list that has worked well for me for the past several years.&lt;br /&gt;&lt;br /&gt;Things I expect of myself and my co-workers:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Work hard to get the job completed in a timely manner.&lt;/li&gt;&lt;li&gt;Self improvement.  Continue learning and educating myself on things I am using and those that I will need to use.&lt;/li&gt;&lt;li&gt;Offer ideas to improve anything I can think of for either in the team or outside the team.&lt;/li&gt;&lt;li&gt;Learn from past mistakes&lt;/li&gt;&lt;li&gt;Communicate status, issues, and successes in a timely manner.&lt;br /&gt;  &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Things I expect of my boss:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Honest feedback and open communication.&lt;/li&gt;&lt;li&gt;Career development and guidance.&lt;/li&gt;&lt;li&gt;Balanced assignments.  I should always have work to do, but not be overloaded.&lt;/li&gt;&lt;li&gt;Support me. Stick up for me.&lt;/li&gt;&lt;li&gt;Offer opportunities for me to grow.&lt;/li&gt;&lt;li&gt;Be prepared.&lt;/li&gt;&lt;/ol&gt; You cannot control the things that you expect of your boss.   You can communicate those thoughts and let her know what you expect.&lt;span class="label-list"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-717383008425145227?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/717383008425145227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=717383008425145227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/717383008425145227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/717383008425145227'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/expectations.html' title='Expectations'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7045573015401423406</id><published>2008-10-24T18:00:00.000-05:00</published><updated>2008-10-24T18:00:00.925-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Mr. Fix It.</title><content type='html'>&lt;span style="font-family:Times New Roman;font-size:100%;"&gt;I feel like Mr. Fix It.   &lt;br /&gt;&lt;br /&gt;Instead of spending the time focused on what my goals were at the beginning of the day, I have spent much of the day hopping back and forth from one task to another in order to answer questions or solve problems.  These are things that need to be answered and taken care of, but on days like this I never feel as productive.   For me, oftentimes the opposite is true.   Instead of getting the one or two things done that I plan to do, I end up finishing 5 or 10 smaller things and making more people happy.   That's good customer service right?&lt;br /&gt;&lt;br /&gt;I am really good at making these switches and looking into disconnected things all day long when I start my day with that kind of mindset, but when I actually plan to finish those one or two big things that I have been working for several days on, I can leave work feeling like nothing at all was accomplished.  It's amazing how much different I feel about the same results based on my own mindset.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7045573015401423406?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7045573015401423406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7045573015401423406' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7045573015401423406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7045573015401423406'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/mr-fix-it.html' title='Mr. Fix It.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-4096571917002856388</id><published>2008-10-23T22:30:00.002-05:00</published><updated>2008-10-24T15:30:29.735-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>Logging tips</title><content type='html'>I have found more and more that I rely on logging data, and capabilities to help me diagnose a problem.   I'd rather have a ton of information to sift through and find the problem  than just an an error message.   Here are some tips to help you with what to log and when in order to find problems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Logging needs to be configurable.&lt;/span&gt;&lt;br /&gt;You must have the ability to change the level of logging being used easily in order to produce a lot of output when necessary, and minimal output the rest of the time.   You don't want your servers or desktops to run out of space because of your logs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Logs need to be disposable.&lt;/span&gt;&lt;br /&gt;Logs are good for a specific problem that is occurring now.   You do not need to keep logs from 3 weeks ago to find information.  Even if you do need to keep some logs for a longer period of time for reference, it is easier to manage them when they are in daily files.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Logging needs to exist in Code.&lt;/span&gt;&lt;br /&gt;Logging needs to be everywhere in code.  The more important a piece of code is, the more logging that it needs to have.   Log entry and exit points to functions, with some unique identifier, account or user, or account/user.    With the exit include the time that the function took to complete.  Log all errors.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Use Different levels of logging.&lt;/span&gt;&lt;br /&gt;Logging needs to be able to be turned on when it's needed, but turned down to almost nothing when it's not needed.    Use debug level for deep details of objects.  Use Info level for certain details at key points.  Use Warning for situations that may be indicative of a problem or boundary condition that could cause problems.  Use Error when errors occur that you do not handle.    Do not log as an error things that you handle and do not consider a true error.    You only want something showing up at the level of ERROR if it's really an ERROR that you need to possibly fix your code to handle.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Logging tips.&lt;/span&gt;&lt;br /&gt;With objects you can override the toString method and simplify your logging statements to get data.  Since multiple threads may be writing to the log at the same time, you want to write some unique piece of information to the log for each entry, so you can easily track what a single path is doing.   Even though I completely embrace logging, I know that too much of a good thing, can be bad.  Too much logging can slow a process down dramatically while it waits for file locks to release.   Take advantage of different logging levels, and possibly checking the logging level with if statements prior to using the log statement.    Using more efficient methods of logging, such as a message queue can insulate your code from some of the locking issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-4096571917002856388?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/4096571917002856388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=4096571917002856388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4096571917002856388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4096571917002856388'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/logging-tips.html' title='Logging tips'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2764391327402455786</id><published>2008-10-21T12:34:00.000-05:00</published><updated>2008-10-21T12:59:33.239-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>Log4J tips.</title><content type='html'>I've been in the Java world for just over a year now.   I've been mostly busy trying to learn all of the different technologies that are needed to get my job done.   Some of them have well documented places online to go and find information, others are harder to understand and require much more digging.   To make it easier on some other people, I'm trying to pass on some of the things that I've had to learn to get started.&lt;br /&gt;&lt;br /&gt;We use Log4J (log4j-1.2.8.jar) as the tool for our logging.   I don't know why we don't use built in java logging, I can't say if it's better or not, but all of the projects already were using Log4J.  I was going to have to learn it in order to maintain existing applications, I may as well use it as well.&lt;br /&gt;&lt;br /&gt;Log4J is the logging tool written by the Apache group.  The &lt;a href="http://logging.apache.org/log4j/1.2/manual.html"&gt;Log4J manual&lt;/a&gt; is pretty good, unfortunately I didn't find it until after I had stumbled my way through some problems.&lt;br /&gt;&lt;br /&gt;In our projects everything was using a static logger.    With my C background I had to get used to the fact that this actually meant only one logger per Class, rather than one per instance.&lt;br /&gt;static Logger logger = Logger.getLogger(CustomerBusiness.class);&lt;br /&gt;&lt;br /&gt;Next, the log4j.properties file is used to control everything.   It can be done via code, but it's better to keep it separate.&lt;br /&gt;&lt;br /&gt;Logging is inherited and all of the classes inherit from rootLogger.   &lt;br /&gt;log4j.rootLogger=DEBUG, CONSOLE&lt;br /&gt;&lt;br /&gt;The above setting sets the default level of logging to be for all messages of DEBUG and higher,&lt;br /&gt;with output going to the CONSOLE object.  The console configuration will be shown below.&lt;br /&gt;&lt;br /&gt;There were some times that I had one of my classes spitting out more logging than I needed at the time.   In order to limit one class's logging the level for that class can be changed with an additional line in the configuration.&lt;br /&gt;log4j.logger.net.sr.project.customerData=INFO,CONSOLE&lt;br /&gt;&lt;br /&gt;This will increase the level of logging for my customerData object to be Info and higher, which will ignore all of the logger.debug statements.   Also if there is a class under the path customerData, maybe there is a helper clas that is net.sr.project.customerData.datahelper, that too would get the Info level of logging.&lt;br /&gt;&lt;br /&gt;In order to configure the console appender in your log4j.properties file. &lt;br /&gt;log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender&lt;br /&gt;log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-5p %c - %m%n&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is a console appender because it user org.apache.log4j.ConsoleAppender. The name CONSOLE, both here and in the above configuration is arbitrary, it could just as easily be name FRED.  This CONSOLE object also configured the output and what it will look like.  You can read more about the &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html"&gt;Pattern Layout&lt;/a&gt; if you want. I pretty much just keep the same one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another good appender is the Rolling File.   This has the ability to limit the size of a file, and will create a new file daily.   Having a new file daily is a huge benefit, because old data can more easily be searched, zipped, archived, or deleted.   If you are going to write data to a file I definitely suggest using the rolling file.    Here is the rolling file configuration.&lt;br /&gt;&lt;br /&gt;log4j.appender.ROLLING_FILE=org.apache.log4j.DailyRollingFileAppender&lt;br /&gt;log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.ROLLING_FILE.layout.ContextPrinting=enabled&lt;br /&gt;log4j.appender.ROLLING_FILE.File=/opt/logs/myProjectt_log4j.log&lt;br /&gt;log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d{ISO8601} %-5p %c - %m%n&lt;br /&gt;log4j.appender.ROLLING_FILE.DatePattern='.'yyyy-MM-dd&lt;br /&gt;&lt;br /&gt;One note of warning.    Errors will be thrown from logging if there is an error.   Logging an object that is null with throw a null pointer exception, even if the logging level is set to higher.&lt;br /&gt;&lt;br /&gt;For example.&lt;br /&gt;Interger age = null;&lt;br /&gt;logger.debug(age);   // this will throw a null pointer exception.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2764391327402455786?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2764391327402455786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2764391327402455786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2764391327402455786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2764391327402455786'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/log4j-tips.html' title='Log4J tips.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-5709447310281771389</id><published>2008-10-17T21:00:00.000-05:00</published><updated>2008-10-17T21:23:37.695-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Yahoo UI 3.x</title><content type='html'>I watched the &lt;a href="http://video.yahoo.com/watch/3711767/10207432"&gt;video on Yahoo UI 3.x&lt;/a&gt;  It's amazing how much improvement they are able to keep making with these libraries.   They somehow find a way to offer more functionality and make the code smaller and faster.  &lt;br /&gt;&lt;br /&gt;I love that these great tools are being provided, but I wish more that some of the javascript lessons learned were being passed on, that way if I have any of my own code to implement I can follow the same good design and implementation that they have done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-5709447310281771389?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/5709447310281771389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=5709447310281771389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5709447310281771389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5709447310281771389'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/yahoo-ui-3x.html' title='Yahoo UI 3.x'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-140731209602909792</id><published>2008-10-08T21:12:00.000-05:00</published><updated>2008-10-17T21:17:49.454-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JMS Training: Day 3</title><content type='html'>The final day of training was very anti-climactic.   Originally scheduled until 5PM, class was over at 10:30 AM.   I asked a few questions of the teacher after the class was over and he uses Websphere MQ, but not Websphere Application Server.  &lt;br /&gt;&lt;br /&gt;The topics covered were MQ specific security and functions.   Eventually we may use MQ where I'm working, but at the moment we are planning to use JMS and the Message Queue provided by WAS.&lt;br /&gt;&lt;br /&gt;I headed back to the hotel with the hopes of changing my flight home from Thursday to Wednesday, but the additional costs of changing the ticket was too great.&lt;br /&gt;&lt;br /&gt;I spent the entire afternoon taking a practice exam for the SCJP 5 test that I have been studying for months for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-140731209602909792?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/140731209602909792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=140731209602909792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/140731209602909792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/140731209602909792'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/jms-training-day-3.html' title='JMS Training: Day 3'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-4255534472177219055</id><published>2008-10-07T21:25:00.000-05:00</published><updated>2008-10-07T21:27:14.758-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Review'/><title type='text'>Book Review: Foundations of Programming</title><content type='html'>&lt;a href="http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx"&gt;Foundations of Programming&lt;/a&gt; is a free eBook that discusses many best practices.  These are some of the same things that are talked about while building software developers into Craftsmen.   The book is for C#, and covers great topics including Unit Testing, Dependency Injection, Object Relational Mappers, and How and When to use Exceptions.  &lt;br /&gt;&lt;br /&gt;I definitely recommend taking the time to read the 79 page eBook.  There's only 72 pages of content (not counting the table of contents and the acknowledgments).  And any developer new or experienced will probably learn something new from reading through this book.  &lt;br /&gt;&lt;br /&gt;I also recommend following the blog posts that are on CodeBetter.com.  This book is written by Karl Seguin who is one of the bloggers there.   There's always good tips being posted on that site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-4255534472177219055?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/4255534472177219055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=4255534472177219055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4255534472177219055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4255534472177219055'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/book-review-foundations-of-programming.html' title='Book Review: Foundations of Programming'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7066304074895307123</id><published>2008-10-07T20:00:00.000-05:00</published><updated>2008-10-07T21:01:59.497-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JMS Training: Day 2</title><content type='html'>&lt;div&gt;Day 2 of training started bright and early at 8 AM. Everyone was in the class by 10 till, so we got started. Our instructor is a member of some magic group based in Hollywood, and he starts the morning off with a magic trick.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;At 10:30 we are most of the way through what is on the Agenda for us. We have one lecture and one exercise left for the day.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I have created a sender and receiver and run two separate programs to send and receive messages. These messages are very much like RPC calls with COM+ and C#, you know where it's going to, but you don't know what's on the other side answering the message and responding. Unlike COM+ you have to have a separate listener to hear the responses.  For what we are considering, we will be using a fire and forget methodology. A web service call with send a message and immediately return success trusting that the message processor will pick up the message and successfully save it to the database. Because there is no way to wait for a response Any business validation that will catch known errors should occur before sending the message to the queue, this is the only way to be able to inform the user that there is an error immediately.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;WebPage ---&gt; Ajax Call to Servlet ---&gt; WebService Call --&gt; Business Layer validate() &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;if successful --&gt; Send Message&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;always&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;--&gt; return success --&gt; Webservice return success --&gt; Ajax refresh the screen.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Then the listener will pick up the message&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;If the DB is available, write to the DB. Here's where the dangerous part is. Any failure to write to the DB will not be sent back to the user for a retry. It must retry itself or fail completely. We could write this information to an alternate queue, and write our own front end to listen to this error queue and allow modification to the data that is passed in for another attempt. This becomes ugly because we only want the data that was saved by the original user to be saved as it is with no modification. Thus a failure to save must only occur from the database being unavailable, and not from bad data, that is why the validation must be complete and pass before sending to the queue.&lt;br /&gt;&lt;br /&gt;We ended today's agenda and started on started on tomorrow's.   With only 3 sections left, the instructor expects us to be finished by lunch.    I look forward to being out of the classroom.  The content is good and the instructor is somewhat entertaining, but the chairs are terrible and my back is killing me.   With as much as training classes cost I would expect training facilities to have better chairs than most other places.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7066304074895307123?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7066304074895307123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7066304074895307123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7066304074895307123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7066304074895307123'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/jms-training-day-2.html' title='JMS Training: Day 2'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-4536909315541049089</id><published>2008-10-06T21:00:00.000-05:00</published><updated>2008-10-06T21:00:00.164-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JMS Training: Day 1</title><content type='html'>&lt;div&gt;I was the first to arrive this morning, despite not being able to find the building.   The facilities are in a strip mall, and off the street, but there is no sign facing the street.   &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;I noticed right away that there were 6 packets for students.   When the instructor Robin, an Australian gentleman showed up he handed out the sign in sheet, which only had 4 names on it.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Bored and sitting in front of a log in screen I started guessing passwords, 3rd try I was in.  I'm sitting at a Windows XP computer with a 3 GHz processor and 1 GB RAM, it's a VMWare session.   I see that Websphere MQ Explorer and Rational Application Developer are both installed.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;A quick perusal of the Agenda shows that today will be an introduction and mostly talk.   We have one exercise to perform and it's configuring the Message Queue.   The next two days will be much more in the way of JMS exercises.&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;All three of the other students in here are Websphere MQ Administrators and not programmers, they are just looking for an overview of it in order to be able to understand what the developers are trying to do against their system.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Apparently there is a bug in the GUI version of the software that comes with Websphere MQ 6.0, so we did all of our configuration from a command line tool.  There is no documentation on this tool included, so the instructor just told me what to type.   I have it running in class, but could not reproduce the steps if I needed to.  That's a bit of a drawback.  At least MQ 7.0 sounds like there are a lot of new features and bug fixes.   The biggest new feature is the native support of JMS which makes it 5+ times faster than MQ 6.0 with JMS clients.&lt;br /&gt;&lt;br /&gt;One of the other students said he wanted to be able to leave between 2 and 3 on Wednesday to catch his flight.   My flight is not until Thursday because the schedule stated that class would go until 5 on Wednesday.   We finished the agenda for today at about 2PM.  The instructor added 2 sections that he does when he's at other conferences talking about Websphere MQ.  It was good detailed information.  We finished the day by covering tomorrow's first section. &lt;br /&gt;&lt;br /&gt;We also decided to start at 8 AM the next two days instead of 9 AM.  If we go until 5 tomorrow I think we'll be done really early on Wednesday.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-4536909315541049089?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/4536909315541049089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=4536909315541049089' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4536909315541049089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4536909315541049089'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/jms-training-day-1.html' title='JMS Training: Day 1'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2819259290528661284</id><published>2008-10-06T09:00:00.000-05:00</published><updated>2008-10-06T09:00:01.240-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>How to encourage your company to build Software Craftsmen</title><content type='html'>I was watching this video about &lt;a href="http://www.infoq.com/presentations/Craftsmanship-Scott-Dillman"&gt;creating Craftsman developers&lt;/a&gt;, and it only briefly touches on how to get management buy in.&lt;br /&gt;&lt;br /&gt;It basically says that you have to convince them by showing them case studies and showing them the successes you are having.  However, it doesn't go into detail on what those are.&lt;br /&gt;&lt;br /&gt;I think that one good way is to try and show some skills that are lacking.  Start with a survey to find out what skills the developers have.    The goal needs to be getting more people with more of those skills.   If there is any skill that only one or two people have, this is a potential huge problem.   Having additional cross training and teaching meetings to teach more people these skills is a huge benefit for a company.&lt;br /&gt;&lt;br /&gt;Another good way to do it is to try and show some testing metrics.   Some companies may have automated UI test tools and have a way to show how many are passing, however many do not.   Many also do not have or use unit tests.  The lack of code based testing also means that there is a potential hole in applications.    If this is the case then the craftsman skill of unit testing and mocks is probably not prevalent and needs to be passed on, as well as measured in it's practice.   Measure the number of unit tests and code coverage. &lt;br /&gt;&lt;br /&gt;You can buy a good plant and put it in your garden, but if you don't continue to put time and resources into that garden, then it will become overrun with weeds and  your strong expensive plants will die.    Programmers are like that, only they will become stagnant, or move on to another place where they have the opportunity to continue to grow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2819259290528661284?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2819259290528661284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2819259290528661284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2819259290528661284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2819259290528661284'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/how-to-encourage-your-company-to-build.html' title='How to encourage your company to build Software Craftsmen'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2578009225789086744</id><published>2008-10-05T17:36:00.000-05:00</published><updated>2008-10-05T17:39:15.171-05:00</updated><title type='text'>Google Search Results could be better.</title><content type='html'>Google has spoiled me with GMail and Google Reader.   I'm used to using short-cut keys on the Google sites.  &lt;br /&gt;&lt;br /&gt;I miss these shortcuts on the search results.   I want to easily move to the next page or previous page of the results.   I want to be able to quickly go to one of the results, all without using my mouse.   Give me more of the keyboard shortcuts I love, please.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2578009225789086744?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2578009225789086744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2578009225789086744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2578009225789086744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2578009225789086744'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/10/google-search-results-could-be-better.html' title='Google Search Results could be better.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2302413391190514707</id><published>2008-09-24T11:17:00.000-05:00</published><updated>2008-09-24T11:55:48.928-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Investigating Remember the Milk</title><content type='html'>I'm not a big fan of constantly changing how I keep track of my to-do list.   I definitely prefer to keep track of it in a software application instead of paper. &lt;br /&gt;&lt;br /&gt;I'm not tied to the web over a desktop application, however, I do keep different lists of what I'm working on at home and work, that makes the web a more acceptable solution for me anymore.&lt;br /&gt;&lt;br /&gt;In the past I have done paper, which I was constantly rewriting.   I love the look and feel of it, as well as the constant reminder of what I have to do while rewriting the list, however, with a decent size list rewriting it just took too much time.  And I like order to my list enough that I could not just keep the list in a more disorganized state with items crossed off.  It always felt too cluttered for me.&lt;br /&gt;&lt;br /&gt;I've used Swift-To-Do List Lite.   I like the interface, ease of changing views, scheduling items, creating repeat items and checking things off as done.   I like that it's free.  I don't mind that it's a desktop application,  I've even blogged about how I liked using it in the past, and I still have it on my computer.  However, I long ago hit the limit of 25 tasks. I like it a lot, but not enough to buy it and go over that 25 item limit.  As of right now I still use this as my offline solution to quickly track something that I need to do.   If I'm not at an Internet connection but have my computer, I will add it here and transfer it to my online list later.&lt;br /&gt;&lt;br /&gt;I've been using Toodledo for about a year.   There are a lot of things I like here as well.   I like that I can make my list public.  There is a great Google Gadget for Toodledo, that allows my home page in the browser to show me my tasks as well as the news.   I'll save for later the argument about whether or not that's a good idea.  One of my favorite features of Toodledo is that it is printable into a booklet.   That allows quite a few tasks to be printed and easily carried in my pocket.    There are times that I'm away from a computer but have time to do something that's on the list.   When I knew these situations would occur I would print out the list.   It is rare that I needed to have my list handy when I away from my computer.    I still loved the feature.  It also integrates with Google Calendar (of which I am a huge fan) and I can export the data into different formats to use wherever I want.    I haven't gone through and used all of the additional integrations that exist, but the list is large and it's a very useful to-do list.&lt;br /&gt;&lt;br /&gt;For some reason Toodledo has been getting annoying.   I'm not sure why, maybe because I haven't been able to make public the list, or make public just a portion of the list.   I want more visibility from what's on my list available to my co-workers, but only my work list, and I want my wife to be able to see my home list.   And I have a list of things to learn, that I may want to share with specific friends.   I don't want to have to have multiple accounts set up to create a list for each thing and then share them.  I want to keep track of them all in one place, but share different lists.  &lt;br /&gt;&lt;br /&gt;Now I'm investigating Remember the Milk.   When I started looking at Toodledo previously I had also looked at Remember the Milk.   I still have some of the same complaints.   The site looks like it was made for kids; maybe it's just the picture of the cow.   I like the tabs on the site.   The additional information that can be tied to each task as well as a note for tasks.   I like that there are a lot of keyboard shortcuts.    I don't like that there was no input feature, so I had to copy and paste my to-do items into here.   I don't like that there is no export feature, so I cannot easily take my list and switch to a different system.    There are less additional features than Toodledo has, but there does appear to be the ability to share publicly individual lists.    I am still investigating and will post more if I find that it does support the features that I'm looking for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2302413391190514707?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2302413391190514707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2302413391190514707' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2302413391190514707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2302413391190514707'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/09/investigating-remember-milk.html' title='Investigating Remember the Milk'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2003465052315684821</id><published>2008-09-10T09:00:00.000-05:00</published><updated>2008-09-10T09:00:00.910-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>We suck less is not enough.</title><content type='html'>There's a great &lt;a href="http://www.infoq.com/presentations/We-Suck-Less-Douglas-Dymond"&gt;presentation about Agile&lt;/a&gt; and it's implementation not being intense enough.   This got me thinking about some things.&lt;br /&gt;&lt;br /&gt;Why are companies implementing Agile?&lt;br /&gt;What I can gather from reading is that companies implement agile in order to make the developers faster.   However, the implementation of agile doesn't make developer's faster, only more focused.   Since Unit Tests are used with Agile development it makes sure that changes are written in a way that doesn't break other parts of the application.  &lt;br /&gt;&lt;br /&gt;However, according to the presentation when used correctly Agile is meant to improve the efficiency of the entire system more than 5 times.      That means a lot.   To me that says that we aren't getting enough out of Agile.   We aren't using it to it's fullest potential.   And if we're not, why not?   Do we not have the right type of personalities in place to make this happen?   Do we not have enough people, maybe we are too small?    Do we include too many people in some meetings in order to just get people in the room?  &lt;br /&gt;&lt;br /&gt;I don't know the answers.  I think that at my company our agile process has some places that are heavy.   I think we do put too many people in some early design meetings.   I wonder if training on agile itself could help improve us.   Could I be a better part of the overall process if I understood something differently?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The most important thing I got from the presentation though, is that too many people are looking at agile as a way to suck less.  Sucking less is not enough.   We must strive to excel.  To reach far above and beyond what we had prior to Agile.   It's not okay to be good, good is the enemy of great because we can get stuck there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2003465052315684821?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2003465052315684821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2003465052315684821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2003465052315684821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2003465052315684821'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/09/we-suck-less-is-not-enough.html' title='We suck less is not enough.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6066640598932002108</id><published>2008-09-08T09:00:00.000-05:00</published><updated>2008-09-08T09:00:02.284-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>The beauty of Unit Tests</title><content type='html'>I love unit tests.   I've become a TDD guy and prefer to do my development that way.  I've learned to do that on the back end of projects where it's been easier.&lt;br /&gt;&lt;br /&gt;What I haven't gotten into yet is Front End Unit Testing.  It's something that I've started with.  I've started working with Watir and would like to use JSUnit to unit test more JavaScript, however at this point I'm just working with JUnit on the back end.&lt;br /&gt;&lt;br /&gt;The beauty of these unit tests though is that they make it easy to ensure that the entire system still works as expected.   At work we are upgrading the OS on our database server and we needed to verify that it would not cause any problems.  After the test server was set up it took only 10 minutes to test all of the database functionality.   There are many other applications that also use this server, most of which were written before we started using unit tests, and those applications will take a lot more time to test.   If we had unit tests in place for all of those applications, they could be fully tested in half of a day.&lt;br /&gt;&lt;br /&gt;Patches, OS system upgrades, and even new versions of software can all have unexpected effects on software.   Automated desktop testing (even of web applications) can be used to test upgrades of desktop software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6066640598932002108?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6066640598932002108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6066640598932002108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6066640598932002108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6066640598932002108'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/09/beauty-of-unit-tests.html' title='The beauty of Unit Tests'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-9077510948780694594</id><published>2008-09-02T08:54:00.000-05:00</published><updated>2008-09-02T09:08:46.004-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting'/><title type='text'>Annoying power saving mode on computer</title><content type='html'>I have a simple cheap Dell desktop.  I bought it from Walmart.   A $500 PC more than serves the needs that I have for my home computing, even with the application development that I do.&lt;br /&gt;&lt;br /&gt;One extremely annoying behavior that it has is the LED on the front.  When the computer is on, it is a cool, calming blue light.   However, to save power, I have the computer go into hibernate mode after 30 minutes.   If I'm not using it for that long then I want to save as much power as I can.   However, in sleep mode the blue LED become an annoying blink.&lt;br /&gt;&lt;br /&gt;The blinking is especially annoying at night while I'm trying to sleep and laying in bed in the dark.   Half my room is lit by this blue blinking.   Why is it that there's not a more subtle LED in there that uses even less power to be lit, but more dimly when it's sleeping.    Why does a sleeping computer have to be more annoying than an awake computer?&lt;br /&gt;&lt;br /&gt;In case anyone is wondering, I leave my computer on instead of turning it off at night time, because I will have thoughts or dreams that come to me and I want to capture them quickly.   A little jiggle of the mouse and I'm on my way typing.   Also I will try to get on the computer before I head out the door for work in the morning.   When I can, I only have a few minutes and can't spend them waiting for the computer to boot up.   I am very mindful of the energy I use in my house, but I also love the availability of the computer always being on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-9077510948780694594?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/9077510948780694594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=9077510948780694594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/9077510948780694594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/9077510948780694594'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/09/annoying-power-saving-mode-on-computer.html' title='Annoying power saving mode on computer'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7313927975169239708</id><published>2008-08-27T20:02:00.001-05:00</published><updated>2008-08-27T20:04:53.124-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>User defined tables as a parameter</title><content type='html'>Finally SQL Server 2008 offers user defined tables as a parameter.    I've been using Microsoft SQL server since version 6.5 and this has probably been the biggest annoyance.   There are so many times that I want to send a batch of records to be acted on, and I can't, I've come up with many different solutions, but none of them have ever let me do what I really wanted.&lt;br /&gt;&lt;br /&gt;Now with SQL Server 2008 I will finally be able to.  If I can just get us to upgrade to it at work. &lt;br /&gt;&lt;br /&gt;There's more &lt;a href="http://www.infoq.com/news/2008/08/table-valued-param"&gt;information at InfoQ &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7313927975169239708?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7313927975169239708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7313927975169239708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7313927975169239708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7313927975169239708'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/08/user-defined-tables-as-parameter.html' title='User defined tables as a parameter'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7959403438601784889</id><published>2008-07-29T09:03:00.000-05:00</published><updated>2008-07-29T09:13:05.199-05:00</updated><title type='text'>Where have I been?</title><content type='html'>It's been a busy time lately.  At work I've been consumed with updating RAD 7.   It seems that JSF applications did not work correctly after the upgrade from RAD6 to RAD7.  All I have to do is install these few fix packs.    Unfortunately, they didn't install correctly and I had to re-install RAD.   That has taken 4 days of installing, without being able to work on the code that's most important to this project.&lt;br /&gt;&lt;br /&gt;I've also been busy making changes to the Custom IE toolbar.   This is a fun task that lets me use C#.Net to make things happen.   I have to integrate with some COM components and with the web page that is being viewed.  The code is fun and challenging.   Since it's not solving the same problem as normal there has been a lot more outside the box type of thinking that I have had to do.  I started with the code from "&lt;a href="http://www.codeproject.com/KB/shell/dotnetbandobjects.aspx"&gt;Extending Explorer with Band Objects using .NET and Windows Forms&lt;/a&gt;" at Code Project. &lt;br /&gt;&lt;br /&gt;My home life has been busy and keeping me from playing online as much as I'd like.   I've made July a month of exercise that I have really enjoyed.  I'll be switching it up in August to focus more on tech endeavors.  It's time for me to start taking my practice tests and earn my Java Certification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7959403438601784889?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7959403438601784889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7959403438601784889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7959403438601784889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7959403438601784889'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/07/where-have-i-been.html' title='Where have I been?'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1566282855198621273</id><published>2008-07-15T21:30:00.001-05:00</published><updated>2008-07-15T22:44:12.361-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Ode to RAD 6</title><content type='html'>RAD 6, RAD 6.   I never liked you.&lt;br /&gt;RAD 6 RAD 6 You were slow and clunky,&lt;br /&gt;RAD 6 RAD 6  Your short cut keys were as hideous as emacs.&lt;br /&gt;RAD 6 RAD 6 Where have you gone, I miss you so.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I installed RAD 7 last week.  In general I like it.  It's got a few new features that I know of that are nice, but it has some &lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;HUGE&lt;/span&gt;&lt;/span&gt; annoyances.&lt;br /&gt;&lt;br /&gt;1. The folder layout changed in the package view.  It used to list one package at the deepest level that was common and then expand a tree view for the subpackages.  For example.  com.mytest.business would be the folder, then under it would be "utilities", "test"&lt;br /&gt;&lt;br /&gt;Now, I see com.mytest.business and com.mytest.business.utilities and com.mytest.business.test&lt;br /&gt;&lt;br /&gt;RAD 6 had a test server environment that ran locally, it was fast.  I loved it.  A restart took 4 minutes, and changes to JSPs, Javascript, and CSS were done instantly with just a refresh to the browser.    RAD 7 no longer has this test environment, instead I have to use a full server running locally.   This manages to somehow take up less hard drive space than RAD 6, but changes are much slower.  The server must republish everytime I make a change to those files, which takes 3 and 1/2 to 4 minutes (I've timed it).   I accidentally restarted the server today instead of publishing and it took nearly 13 minutes.    Developing in RAD 7 for the Portal, or any web page changes has become very tedious.   I hope IBM has remedies most of this with RAD 7.1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1566282855198621273?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1566282855198621273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1566282855198621273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1566282855198621273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1566282855198621273'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/07/ode-to-rad-6.html' title='Ode to RAD 6'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3740698652120876348</id><published>2008-07-08T22:05:00.000-05:00</published><updated>2008-07-08T22:17:49.036-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>A bad design with a webservice call.</title><content type='html'>We noticed at work the other day that a web service seemed to have a strangely high number of hits to it.   I started looking into it the logs and found that the same user would hit the web service over and over.  I could easily see that it was more than 40 times within the same second.   This was curious.  The developer who worked on this is not here any longer and nobody was sure why it would need so many hits.&lt;br /&gt;&lt;br /&gt;I was off, searching through code trying to find the place where the web service was being pounded and the reason for it.&lt;br /&gt;&lt;br /&gt;I found it.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;public static string GetInfo()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList u = new ArrayList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int x=1; x&amp;lt;100; x++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u = WebServiceCall();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(u ==null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;z=1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return u;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you are like me you looked at this code and went "Huh?"  &lt;br /&gt;&lt;br /&gt;Sadly though, there is no notation anywhere that states what the original problem was.  I doubt that this crazy loop was only put here for the heck of it, something strange was probably happening and this was only part of the debugging method used to find the issue, but it was never removed and it was not documented.   I am left with an application that hits the same web service 100 times and ignores the results of the first 99 attempts.  This causes tens of thousands of unnecessary hits to the web service daily.  &lt;br /&gt;&lt;br /&gt;I have two suggestions for you.  First, if you ever put something crazy like this into your code, add a comment explaining the craziness.   Second, if you are really ignoring the first 99 results, then most likely this is some kind of business decision, you are trying to wait a certain amount of time for something.   Put that business logic into the back end where it belongs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3740698652120876348?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3740698652120876348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3740698652120876348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3740698652120876348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3740698652120876348'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/07/bad-design-with-webservice-call.html' title='A bad design with a webservice call.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8489092887646952117</id><published>2008-06-30T09:00:00.000-05:00</published><updated>2008-06-30T09:00:02.808-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>My favorite benefit of Unit Testing</title><content type='html'>Test Driven Development has lots of benefits:  Better quality code, good code coverage, good design, and refactoring.&lt;br /&gt;&lt;br /&gt;Refactoring is my favorite.   I try to write my tests before I write my code, but sometimes, I get a little ahead of myself and jump right into code.  I know what it needs to do after all, and my mind just attacks the problem and puts all the code and if statements in place to handle it.   And then I realize, that I need to test my code, so I write my unit tests.   As soon as the unit test starts to be cumbersome to write, I know I have a problem.   I've written my code to be too complex.   The Unit test should be a simple thing to set up.   Now I get to refactor the code.  &lt;br /&gt;&lt;br /&gt;Test Driven development makes you think. It makes you think about what a function or object should do, and what it should not do.  And I take a lot of pride in refactoring.  Not just other programmers' code, but mine too.   Refactoring should always improve the code.   Make it more self documenting, more loosely coupled, more testable.   I love taking my own code, code that would have worked, and making it better.  Test Driven Development is the tool that helps me reach my goal of good code that's easy to understand.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8489092887646952117?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8489092887646952117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8489092887646952117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8489092887646952117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8489092887646952117'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/06/my-favorite-benefit-of-unit-testing.html' title='My favorite benefit of Unit Testing'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2421254798434737792</id><published>2008-06-24T09:00:00.000-05:00</published><updated>2008-06-23T23:22:20.424-05:00</updated><title type='text'>Thoughts on laptops in school</title><content type='html'>I've got a lot of thoughts around laptops in school.  I've not read of any school that's actually succeeded in making laptops in school work, however, I also think that laptops are a great way to introduce students to computers, the internet and many things that they need in the corporate world.  Not every job will need computers like that, but the computers could help them get into a more advanced position.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nytimes.com/2007/05/04/education/04laptop.html"&gt;The New York Times&lt;/a&gt; and &lt;a href="http://www.post-gazette.com/pg/06243/717868-96.stm"&gt;The Pittsburgh Post Gazette&lt;/a&gt; both have stories posted about schools that are canceling their laptop programs.  Apparently the students already know so much more about computers than the teachers that they spend the entire time chatting and doing things that they should not be doing. &lt;br /&gt;&lt;br /&gt;However, I think that there are a lot more possibilities with computers.   Topics that are not normally covered can be covered.  Less books need to be printed.  Students can and should participate in writing about school programs that are then made visible on the school website.  All of the sports can be fully covered, but so can other activities that never get anything more than a single picture in the yearbook.   Students should keep blogs about the things that they have learned. &lt;br /&gt;&lt;br /&gt;If you know of any successful laptop programs, let me know, I'm interested.  I want to see this succeed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2421254798434737792?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2421254798434737792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2421254798434737792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2421254798434737792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2421254798434737792'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/06/thoughts-on-laptops-in-school.html' title='Thoughts on laptops in school'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6047231205355749165</id><published>2008-06-14T09:00:00.000-05:00</published><updated>2008-06-14T09:23:01.793-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Don't use BeginTransactiion within a transaction.</title><content type='html'>Running Java code the other day I ran into a strange issue.  My mock unit tests all worked, so I deployed a change to test, but when I ran test, it didn't work.   The real thing acted differently than my mock did.&lt;br /&gt;&lt;br /&gt;It took me nearly two hours to track the problem down, and it was strange enough that I had to resort to stepping through Java code.  I prefer to find where things fail with the logging statements.&lt;br /&gt;&lt;br /&gt;My error was with this (psuedo-code):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;UpdateRecord(Record record, boolean updateRelated ) {&lt;br /&gt;&lt;br /&gt;   beginTransaction;&lt;br /&gt;   updateRecordInDB(record);&lt;br /&gt;   if( updateRelated ) {&lt;br /&gt;   Collection related = getRelated();&lt;br /&gt;      foreach(relatedRecord in related) {&lt;br /&gt;         UpdateRecord(relatedRecord, false);  // recursive call&lt;br /&gt;             }&lt;br /&gt;       }&lt;br /&gt;   endTransaction;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;When the beginTransaction was called within the recursive call, the Connection threw an error. &lt;br /&gt;&lt;br /&gt;The solution was to remove the recursion.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;UpdateRecord(Record record, boolean updateRelated ) {&lt;br /&gt;&lt;br /&gt;   beginTransaction;&lt;br /&gt;&lt;br /&gt;   insertRecordIntoDB(record);&lt;br /&gt;   if( updateRelated ) {&lt;br /&gt;   Collection related = getRelated();&lt;br /&gt;      foreach(relatedRecord in related) {&lt;br /&gt;         insertRecordIntoDB(record);&lt;br /&gt;             }&lt;br /&gt;       }&lt;br /&gt;   endTransaction;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;insertRecordIntoDB(record) {&lt;br /&gt;    // do some important stuff.&lt;br /&gt;   updateRecordInDB(record);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That refactor allowed me to not duplicate code, and let me only call beginTransaction once, so all related records were updated within the same transaction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6047231205355749165?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6047231205355749165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6047231205355749165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6047231205355749165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6047231205355749165'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/06/dont-use-begintransactiion-within.html' title='Don&apos;t use BeginTransactiion within a transaction.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-380079196179999718</id><published>2008-06-13T09:00:00.000-05:00</published><updated>2008-06-13T09:02:36.436-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting'/><title type='text'>Why I hate 3rd party closed source applications</title><content type='html'>I didn't always feel this way.  For years I have loved 3rd party tools, some kind of black box that I just plug into and trust.  I tell it what it needs and it does what it's supposed to.  When there's a problem I complain to support and they update their product.&lt;br /&gt;&lt;br /&gt;I liked this method.   For many years.  It's a simple method.  I put my trust in someone, and they provide service.   It's a proven method that works, kind of.&lt;br /&gt;&lt;br /&gt;The problem arises when the responsiveness of the third party is slow.   I find a bug that affects a major piece of functionality in my application, only in odd circumstances, but still, it happens.   There is no log, and no way for me to prove that the black box is where the problem is.  Unless I had source code.  Something that I could step into, modify to log, or even fix the problem.  It may not be a change that the provider decides to ever implement, but it could at least handle my environment the way I expect it to.&lt;br /&gt;&lt;br /&gt;I'm not sure if the change in my philosophy is because I've grown to be more advanced as a developer, or if the market and open source has changed the expectations.   I may not understand all of the source code for an application, but if I can step through it, I can usually figure out what the problem is and being able to fix something now instead of waiting weeks for a response from the vendor can be huge.&lt;br /&gt;&lt;br /&gt;Think about the software you use in your enterprise.  If you don't build it yourself, seriously consider open source, or at least contracts that let you view the source code.  Having the ability to fix those problems or find the actual problem sooner, even if you can't rebuild it, can help you work with the vendor to get a fix in place sooner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-380079196179999718?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/380079196179999718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=380079196179999718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/380079196179999718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/380079196179999718'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/06/why-i-hate-3rd-party-closed-source.html' title='Why I hate 3rd party closed source applications'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8918335793080979015</id><published>2008-06-03T09:00:00.000-05:00</published><updated>2008-06-03T09:00:01.844-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>Four benefits of Pair programming</title><content type='html'>Over the past year I have been able to practice pair programming as well as work on my own.   Between the two methods, I definitely prefer pair programming.  It has several benefits that I've been able to take advantage of, and that I think other developers will get a lot out of.   The hardest part about pair programming is having a good teamwork mindset. &lt;br /&gt;&lt;br /&gt;The four benefits are:&lt;br /&gt;&lt;br /&gt;1. Stay focused more.  I tend to get sidetracked when working, not just chasing down rabbit holes looking at pieces of code that I don't need to, but sometimes with things that are not even related to the current project. When I'm pairing, the other person won't let me get sidetracked in those situations.&lt;br /&gt; &lt;br /&gt;2. Better design.  Pair programming is the same as constant code review.  Even when I know the right thing to do, I don't always see that what I'm programming would benefit from approaching it a different way.  Having a second person sitting there giving opinions and even just asking questions, can cause me to think about the design of the code more and implement it better.&lt;br /&gt;&lt;br /&gt;3. Better Quality.  I won't say that there are no bugs.  Runtime logic bugs still get through.  However, combined with Unit testing there are fewer.   But the more important aspect for quality is that words are sometimes a poor way to convey a message.  The two of us may look at what needs to be done and understand it differently.  This difference causes more conversation and better understanding with the client.   It's not a chest beating for who was right, or more right, but an effort on the part of the team to make sure that the solution is right. &lt;br /&gt;&lt;br /&gt;4. Better/Faster Learning.  A huge benefit of pair programming is that a less experienced developer can pick up a lot of really good information.  A competent developer can pick up new techniques and new languages in less than half the time if he is paired with someone who is good.  This was a huge benefit for me.  I practically learned Java in a month pairing with a good programmer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8918335793080979015?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8918335793080979015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8918335793080979015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8918335793080979015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8918335793080979015'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/06/four-benefits-of-pair-programming.html' title='Four benefits of Pair programming'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1849207131920140485</id><published>2008-05-28T09:00:00.000-05:00</published><updated>2008-05-28T09:00:03.752-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Unit testing exceptions</title><content type='html'>When unit testing exceptions, be sure to test for the exceptions that you expect.  &lt;br /&gt;&lt;br /&gt;I spent nearly an hour rewriting tests to test for what they said they tested.&lt;br /&gt;&lt;br /&gt;Here's an example of a bad test.&lt;br /&gt;&lt;br /&gt;Exception ex;&lt;br /&gt;// configure mocks&lt;br /&gt;try {&lt;br /&gt;  // call test&lt;br /&gt;  fail();&lt;br /&gt;} catch(Exception e)  {&lt;br /&gt;  ex = e;&lt;br /&gt;}&lt;br /&gt;assertNotNull(ex);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Any and all errors that are thrown, including "the mocks are not configured properly" is considered a successful test pass, instead use.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Exception ex;&lt;br /&gt;// configure mocks&lt;br /&gt;try {&lt;br /&gt;  // call test&lt;br /&gt;  fail();&lt;br /&gt;} catch(Exception e)  {&lt;br /&gt;  ex = e;&lt;br /&gt;}&lt;br /&gt;assertEquals("the error message I expect.", ex.getMessage() );&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1849207131920140485?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1849207131920140485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1849207131920140485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1849207131920140485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1849207131920140485'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/unit-testing-exceptions.html' title='Unit testing exceptions'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-532376226625726826</id><published>2008-05-27T09:00:00.000-05:00</published><updated>2008-05-27T09:00:03.806-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><title type='text'>JRuby pains</title><content type='html'>I was dickering with JRuby for three days trying to get it to run, I kept getting all kinds of strange errors. &lt;br /&gt;&lt;br /&gt;I found out that calling JRuby is actually calling a batch file that deals with compiling things to run as java, so I turned echo on in it and the batch files that it calls.  I started tracing the route through looking for the problem.&lt;br /&gt;&lt;br /&gt;My environment variables Path, jruby_home, and Java_home were all 3 correct.   From a command prompt I could type "java-version" and get 1.6.0_05 and yet, it was giving me a strange error.   The only thing I found online for that error was that it was using the wrong version of the runtime, but the runtime and java were fine.   Or so I believed.&lt;br /&gt;&lt;br /&gt;I went to a different machine and tried installing the Bin version of JRuby1.1.1.   It worked.   I knew that nothing could be wrong, even inadvertently with the bin code on the web since it worked perfectly on the first attempt on another computer.&lt;br /&gt;&lt;br /&gt;Back to the first computer I went.  I don't know what brought it on, but for some reason I decided to check that the version of java in java_home matched the version in my path.   It didn't.   Java_home was using 1.4.2.  I updated the environment variable to point to the correct version and everything worked.&lt;br /&gt;&lt;br /&gt;If you are having strange errors and your computer has multiple versions of Java installed, you may want to verify that you have the right versions in your environment variables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-532376226625726826?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/532376226625726826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=532376226625726826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/532376226625726826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/532376226625726826'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/jruby-pains.html' title='JRuby pains'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-5692621302583999737</id><published>2008-05-26T08:54:00.000-05:00</published><updated>2008-05-26T08:54:00.433-05:00</updated><title type='text'>What programming languages should you learn?</title><content type='html'>&lt;i&gt;"a language that doesn't affect the way you think about programming is not worth knowing"&lt;/i&gt;.&lt;br /&gt;-- Alan Perlis&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-5692621302583999737?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/5692621302583999737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=5692621302583999737' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5692621302583999737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5692621302583999737'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/what-programming-languages-should-you.html' title='What programming languages should you learn?'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-5857332955965925992</id><published>2008-05-24T09:39:00.000-05:00</published><updated>2008-05-24T09:52:47.382-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Trying the Uniball pen.</title><content type='html'>I'm trying out a new pen.  I've never been real specific about what I write with.  I'm using the one with .7mm thickness.  Generally I prefer thinner lines, but this one seems to have very concise lines even at this thickness.&lt;br /&gt;&lt;br /&gt;The uniball pen is very light and has a similar feel to a pencil.  This may be a turn off for others, but for me, I love and prefer writing with pencil.  I like the feel of the pencil and the friction it has on the paper, generally I find a pen too smooth. &lt;br /&gt;&lt;br /&gt;There are a few downsides to the pencil.  It smudges and will continue to smudge even after weeks.  It's hard to read it in some lighting conditions, especially flourescent lighting.   Since I'm switching to CFLs even at home, it's becoming harder to read pencil.  That's why I'm looking for a pen that I am comfortable writing with.&lt;br /&gt;&lt;br /&gt;The Uniball pen is very light.  It's lighter than just about any other pen I've used, and lighter than most of the pencils I've used, even the mechanical ones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-5857332955965925992?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/5857332955965925992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=5857332955965925992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5857332955965925992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5857332955965925992'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/trying-uniball-pen.html' title='Trying the Uniball pen.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1738499806061809440</id><published>2008-05-23T17:00:00.000-05:00</published><updated>2008-05-23T17:00:02.703-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting'/><title type='text'>How to use new technology at work</title><content type='html'>Don't ask.&lt;br /&gt;&lt;br /&gt;That appears to be the answer that's most common.  Find technology that's free, so it doesn't cost the company money, bring it in house, set it up without the real powers that be knowing about it, and use it.   After it's proven useful, then present it.   I've been listening to the Ruby on Rails podcasts from 2006 (I'm just getting into them), and every one of them says that they got Ruby into the office by just doing it and not asking.  If they couldn't have flown under the radar they wouldn't have made it.&lt;br /&gt;&lt;br /&gt;I've heard it said that it's better to ask forgiveness than it is permission.  &lt;br /&gt;&lt;br /&gt;What all of this really says though, is that generally corporations are against helping themselves.  They go out of their way to prevent new technology and solutions that could help them advance.   Look around at your company, is it stuck in the status quo?  Does it still do what it did 3, 4, 5 years ago?   Even using the same technology to solve those problems?   You may be at a company that's in it's own way.   Think about that when you start looking for things to do to fill your free time, you may need to start looking at the next language.   Figure out what will work best for you, but don't let your skills get stale, just because you are at a company that still does what it used to do.&lt;br /&gt;&lt;br /&gt;And as you learn these new technologies, bring them in to work.  It's easier to ask forgiveness than permission, and your company probably needs a good internal push anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1738499806061809440?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1738499806061809440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1738499806061809440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1738499806061809440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1738499806061809440'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/how-to-use-new-technology-at-work.html' title='How to use new technology at work'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-4137721967974265141</id><published>2008-05-22T21:48:00.000-05:00</published><updated>2008-05-22T21:48:00.840-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Log4j tip</title><content type='html'>A few log4j tips from mistakes I've made, or things I've struggled with recently.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;When using logging to send emails, send to an email group, that way if members that receive the email change, the group can be updated without having to touch the program.&lt;/li&gt;&lt;li&gt;Be sure logging changes for live from test, you probably don't want to log debugging in live.  Do it manually, use Ant scripts, whatever, but be sure that logging is set for live when deploying to live.&lt;/li&gt;&lt;li&gt;When writing files to your local box (windows) where the server is running, have the log file path be c:\ Any more complicated of a path may not exist on another developers machine when they pull code out of CVS (or Subversion)&lt;/li&gt;&lt;li&gt;Name our log files with [ProjectName]_log4j.log  This should ensure that the file is unique.&lt;/li&gt;&lt;/ol&gt;Not sure if it's a must, but when I was making changes to log4j, they did not appear until I restarted the server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-4137721967974265141?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/4137721967974265141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=4137721967974265141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4137721967974265141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4137721967974265141'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/log4j-tip.html' title='Log4j tip'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6521285659253244880</id><published>2008-05-21T21:34:00.000-05:00</published><updated>2008-05-21T21:34:01.891-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Method naming conventions</title><content type='html'>This is just another rehash of what you've probably read many other places.  &lt;br /&gt;&lt;br /&gt;Start the method with a verb and end it with a noun.  You want to make the method name be like what it does.&lt;br /&gt;&lt;br /&gt;Bad method names.&lt;br /&gt;verify&lt;br /&gt;get&lt;br /&gt;&lt;br /&gt;Good method names&lt;br /&gt;verifyPhoneNumber&lt;br /&gt;getAccount&lt;br /&gt;&lt;br /&gt;I ran across a method today that threw me.  An object was declared off of my screen and set to&lt;br /&gt;employee = getEmployee()&lt;br /&gt;&lt;br /&gt;I was looking for a property of the employee object so I went digging for it, however, the object appeared to be a string.   I went looking and yep, it was.&lt;br /&gt;&lt;br /&gt;String employee; was declared off the screen above and the method returned the EmployeeName.  Inside the getEmployee method it actually retrieved an employee object then returned just the name.&lt;br /&gt;&lt;br /&gt;A few refactors later and everything was all better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6521285659253244880?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6521285659253244880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6521285659253244880' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6521285659253244880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6521285659253244880'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/method-naming-conventions.html' title='Method naming conventions'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-5166906505047565862</id><published>2008-05-19T23:16:00.000-05:00</published><updated>2008-05-19T23:18:13.403-05:00</updated><title type='text'>Funny Typo</title><content type='html'>I was typing an email today and typed "toolbra".   Ha, Toolbra.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-5166906505047565862?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/5166906505047565862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=5166906505047565862' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5166906505047565862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5166906505047565862'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/funny-typo.html' title='Funny Typo'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-4124049175590086396</id><published>2008-05-19T20:00:00.000-05:00</published><updated>2008-05-19T20:00:01.398-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>Are Team Agreements Useful?</title><content type='html'>Jim Brosseau has an article at InformIT titled "&lt;a href="http://www.informit.com/blogs/blog.aspx?b=82d27279-3eec-46e6-9448-fad4ddb8e1c1"&gt;Testing That Team Agreement&lt;/a&gt;" It goes into the difficulties of setting up a team agreement.&lt;br /&gt;&lt;br /&gt;I've read about team agreements:&lt;br /&gt;&lt;blockquote&gt;Each team is required to write up a team agreement form. The purpose of this agreement is to identify, agree upon, and formalize each team member’s individual responsibilities and accountabilities. The minimum length for this agreement is two pages.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I don't like team agreements, because I've never seen one that was anything other than, be nice to each other. How long does the meeting have to be and how many ways do we have to say it before everyone is on the same page with "Be nice to each other". Everyone gets a say, I won't interrupt, I won't personally attack someone, I won't call someone's idea stupid unless it is, I'll be happy, smile, and participate, I'll dance and laugh and sing, oh, and I'll do this all for half price during these meetings because we have a Team Agreement.&lt;br /&gt;&lt;br /&gt;Unless you are on a team that has some specific rules that need to be followed in order to further the project, where the rules are not so much team rules, but project management rules, then everything will continue to come down to Be Nice to each other.&lt;br /&gt;&lt;br /&gt;I have no use for an agreement that tells me what common sense already tells me, it just makes me want to call the organizer of such an agreement stupid, which would be against the agreement, if they weren't actually being stupid and wasting time.&lt;br /&gt;&lt;br /&gt;Here's my proposal. A team has expectations. This is put on the team by the business, it's not negotiable. "You are expected to work as a team, communicate with each other, help each other, stand up for each other, and get along amicably at work. You will communicate your status and let management know when things are behind and why." If you cannot do these things, then you will not be a part of this team. Your agreement is your acceptance of your paycheck. The point at which you no longer agree, you are free to stop accepting your paycheck.&lt;br /&gt;&lt;br /&gt;The team agreement now does not ever need to be modified, there is no need for a meeting about what it is, it's be nice to each other. Now please, don't waste any time on the agreement, and get down to accomplishing the goals before you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-4124049175590086396?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/4124049175590086396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=4124049175590086396' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4124049175590086396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4124049175590086396'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/are-team-agreements-useful.html' title='Are Team Agreements Useful?'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2068907449339802531</id><published>2008-05-16T22:31:00.000-05:00</published><updated>2008-05-19T22:48:06.029-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP Day 5 Training</title><content type='html'>The last day of training.  A day of goodbyes, and heading home.   I've been spoiled by making such good friends from other training classes, it's strange that this one will probably turn into just a class that I attended with some people.&lt;br /&gt;&lt;br /&gt;We continued with the Swing application.  However, since it's not supposed to be on the exam, I think we spent too much time on it.  We spent most of the morning finishing the front end of a chat application so we could learn networking and threading.   The networking discussion was very rudimentary.  We basically just typed what we needed to open the specific socket.   We had decent coverage of threads with how to work with shared data and synchronizing, but I think we could have done gotten more information about wait and yield.&lt;br /&gt;&lt;br /&gt;I would have preferred that the last day have started us with a project to load that had the GUI finished and we could have focused more on the threads and networking.   These were probably the worst examples of the weak.&lt;br /&gt;&lt;br /&gt;I learned more about Swing than I thought I probably ever would, and I find myself asking, what they were thinking with the different layout managers.   I've built many VB6 and C# applications that look really good without having any of those layout managers, or their problems.&lt;br /&gt;&lt;br /&gt;The most informative thing we learned on the last day is the state pattern.  I'm glad Martin also teaches the patterns class, he was able to incorporate a few patterns into the class.    Since a few of my classmates were novices I don't know that they got a lot from the design patterns, but it was useful to see them incorporated into the class.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2068907449339802531?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2068907449339802531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2068907449339802531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2068907449339802531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2068907449339802531'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/scjp-day-5-training.html' title='SCJP Day 5 Training'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3951953204452556742</id><published>2008-05-15T19:14:00.000-05:00</published><updated>2008-05-15T19:52:36.202-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP Training Day 4</title><content type='html'>Another day another day.&lt;br /&gt;&lt;br /&gt;Day 4 of training was new for me.  We covered additional File IO and Stream IO, we covered  the Scanner class.    The Scanner class was interesting, but probably not something I will use.  It does seem to have a good use as a quick tool for a delimited file when you need to deal with every field, however if you have a file with a lot of fields and you only need a few of them, reading the data as a row and parsing it will probably be easier.&lt;br /&gt;&lt;br /&gt;Next we went over some Swing.  GUIs are not on the certification any more, but we're writing a quick and dirty IM Client to set ourselves up for the networking code that we'll learn tomorrow.  Having come from VB and C# for my GUIs I'm surprised at the number of different layout managers that there are.  None of those are available in .Net and I haven't really seen the need for them yet.   So far, it just looks like creating a Swing application is more of a pain, and a lot more hassle than using .Net, other than the fact that it's more portable. &lt;br /&gt;&lt;br /&gt;We're ahead of schedule in class, so we've covered a little bit with patterns as well.  Today we talked about the Singleton Patter and the Observer pattern.&lt;br /&gt;&lt;br /&gt;Knowig the agenda for tomorrow and what I've learned this week, I'm disappointed.  If I had known better what the class was going to cover, I would have saved the money and just bought the book.   If you are good at picking up your information from books, then read the SCJP book instead of paying for the SUN certification, it covers everything in at least as much detail as the class will. &lt;br /&gt;&lt;br /&gt;There are 3 benefits of the class. &lt;br /&gt;1. It's training, getting away from work for a while every now and then is good, especially when you make new connections.&lt;br /&gt;2. Paying for the class comes with additional online courses that have more material in them, covers the cost of taking the exam, and has a practice exam. &lt;br /&gt;3.  It's given me something to blog about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3951953204452556742?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3951953204452556742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3951953204452556742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3951953204452556742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3951953204452556742'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/scjp-training-day-4.html' title='SCJP Training Day 4'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1978972101873105408</id><published>2008-05-14T21:50:00.000-05:00</published><updated>2008-05-14T22:03:53.522-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP Training Day 3</title><content type='html'>Another day of training.  By the end of the day we finally have gotten to topics that I do not do all the time already, so I am now starting to learn new things.   I wish I could get the past two days back from training, but without them I would not have made the new connections that I have.  &lt;br /&gt;&lt;br /&gt;It's interesting talking history with the teacher.  Being from England originally, he seems to be more of a history buff than many Americans.   I missed how the conversation started, but he was talking about Issac Newton Brown who was in charge of the USS Arkansas and faced insane odds in the Civil war, but won.  There was a quote.  The USS Arkansas was the only Rebel ship in the battle so he said, "Any where I shot I wasn't worried about hitting a friendly ship".  It's probably paraphrased, but it's a good outlook on overwhelming odds.&lt;br /&gt;&lt;br /&gt;I have stayed ahead on the labs, even now that I'm learning new things I'm a full lab ahead of the class.  It gives me time to work on more detailed things with the lab and play with things that are not specifically being mentioned.  &lt;br /&gt;&lt;br /&gt;Today we covered Interfaces, Abstract Classes, Creating and throwing our own exceptions, handling exceptions, the difference in Checked and unchecked exceptions, Collections, Maps, sets, the new Generics for collections, Serializable.  And some File IO coverage.&lt;br /&gt;&lt;br /&gt;While discussing the Generics, there was a small communication issue with the terminology, you have to type&lt;br /&gt;List&lt;string&gt; myList = new List&lt;string&gt;();&lt;br /&gt;&lt;br /&gt;This is generally spoken as "List Angle brackets String angle Bracket myList ..."  At least in all situations that I've been in previously.&lt;br /&gt;&lt;br /&gt;Professor Littler though said "List chevron..." and nobody else in class got it.   I knew what the Chevron was and it is the right term for the &lt;, thank you StarGate.  It was interesting enough that several other students went out and looked it up.  It's cool that this class is teaching more than the Java language.   US History, English, what's next?&lt;br /&gt;&lt;br /&gt;Lunch and dinner were both spent in some deep conversations with one of my classmates, not all of the conversation was code based, but it was all very interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1978972101873105408?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1978972101873105408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1978972101873105408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1978972101873105408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1978972101873105408'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/scjp-training-day-3.html' title='SCJP Training Day 3'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1470721330424928394</id><published>2008-05-13T20:50:00.000-05:00</published><updated>2008-05-13T21:45:31.770-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP Training day 2</title><content type='html'>Today was more of the same.  The class speed has started picking up.  We are going through things faster and covering more interesting topics.   Yesterday it felt like everyone was asleep compared to today.   The class was involved in a lot more side discussions, which add a lot to classes.&lt;br /&gt;&lt;br /&gt;Some of today's discussions were about the John Adams series on HBO.  Rugby.  Soccer.  How hard it is for a common man to succeed in England because of their aristocratic history.  Australia and Georgia as penal colonies. How some very famous people are not actually from the countries they are associated with such as Hitler, Churchill, Stalin, and Ben Franklin.&lt;br /&gt;&lt;br /&gt;The labs haven't been too hard, I've been able to fly through them.   I've been able to play on the internet during that time.  I finished the &lt;a href="http://tryruby.hobix.com/"&gt;Hands on Ruby&lt;/a&gt; tutorial.   It's been odd the number of things that don't work in Mozilla on the computer in the lab. &lt;br /&gt;&lt;br /&gt;I've made good use of my breaks and taken walks through the building and up and down the stairs instead of using the elevator. &lt;br /&gt;&lt;br /&gt;In class today we covered Arrays, Classes, inheritance (interfaces are tomorrow), static, final, imports, Static imports, abstract classes. &lt;br /&gt;&lt;br /&gt;I seem to be the only one in the room that's done anything in the way of Object Oriented programming, none of the others have used interfaces or inheritance at all.   It's been fun though because I've gotten the chance to explain the benefits of it.&lt;br /&gt;&lt;br /&gt;Clint, one of the other guys in the class was a roommate with a guy I work with.   He's a newbie to Java, but he's really curious, so he and I talk a lot during breaks and lab time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1470721330424928394?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1470721330424928394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1470721330424928394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1470721330424928394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1470721330424928394'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/scjp-training-day-2.html' title='SCJP Training day 2'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3693566070419266225</id><published>2008-05-12T22:21:00.000-05:00</published><updated>2008-05-12T22:28:16.665-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting'/><title type='text'>iTunes killed my internet connection</title><content type='html'>Tonight I had plans to be online, listen to podcasts, read a bunch of blog posts and web articles that I had been holding off from because of their size.   Everything was going well until about 8:30 when the network connection dropped.&lt;br /&gt;&lt;br /&gt;After 30 minutes of looking into all local settings and rebooting my laptop, I called the tech support for the hotel.   Apparently I had been blocked for "Excessive Bandwidth" usage.   The very strongly accented gentlemen told me I was watching a movie, I was not, I was writing a blog post.&lt;br /&gt;&lt;br /&gt;During the 20+ minute tech support call I realized that iTunes downloads podcasts automatically.   The &lt;a href="http://www.buildingwebapps.com/learningrails"&gt;Learning Rails&lt;/a&gt; podcasts have changed to video casts, which are much larger.  Lo and behold, they have a new screen cast that has not been downloaded. &lt;br /&gt;&lt;br /&gt;Before the connection came back online I changed my setting to not automatically download these, but it bothers me that I cannot download these even at some kind of throttled speed.   If I'm OK with downloading a large amount of data, can't they just let me?   I don't want to take down anyone else, I just want to be able to listen to the podcasts that are out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3693566070419266225?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3693566070419266225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3693566070419266225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3693566070419266225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3693566070419266225'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/itunes-killed-my-internet-connection.html' title='iTunes killed my internet connection'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2167036813091981401</id><published>2008-05-12T19:05:00.000-05:00</published><updated>2008-05-12T22:55:43.282-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SCJP  Training day 1</title><content type='html'>I was a little disappointed today in training.   Day 1 We started with Introductions and what everyone knows.  It appears that I'm the most experienced Java developer in the room.  Unfortunately that means the class will go slower than I expected.   I will learn some good features of Java and the agenda for Thursday and Friday look very promising, however I think I'll have to suffer through Tuesday and Wednesday to get there.&lt;br /&gt;&lt;br /&gt;Here's a few notes from my day of class.&lt;br /&gt;&lt;br /&gt;The teacher started the day with: "Code Monkeys is what this course is aimed at.  There's no analyses, no UML, and it's not for a beginner programmer."   I loved that he brought up code monkeys.   Of course listening to his talk on the process and who this class is for, it sounded like the class was designed for a very large organization that had code monkeys.   I'm not one of them.  I fill the role of every layer that he talked about.&lt;br /&gt;&lt;br /&gt;The teacher is SCJP certified, but not up to date.  He worked for Sun for years.   He's from England, but is now a US citizen.  He still has the English accent.   I haven't had any trouble understanding him, but he has some turns of the phrase that are very English.  Instead of long underwear he called them wooly drawers (while discussing the use of &amp;amp;&amp;amp;) he talked about getting a 99 from an ice cream truck (apparently some kind of ice cream cone with a candy bar in it).  &lt;br /&gt;&lt;br /&gt;I ended up with 7 pages of notes from class today, but almost none of the notes were about the things being taught they were random thoughts and observations about the other people in the room.&lt;br /&gt;&lt;br /&gt;The slow start to the class was at least interrupted by window cleaners dangling from ropes and pounding away on the windows.   But by 10 AM they were gone.&lt;br /&gt;&lt;br /&gt;The class is taught completely on Sun hardware.  It's a Sun desktop with a Sun branded keyboard, mouse, and 17" CRT monitor.   I miss my LCD monitor.   I don't like the keyboard.   The control key is only on the left, and I use my right hand more often than my left when pressing control, even if I'm not supposed to. &lt;br /&gt;&lt;br /&gt;We are using NetBeans to write the Java code.  And using the Common Desktop Environment (CDE).   I have never seen either of these before so I had to play around with both of them for a bit to get started this morning.   I like the 4 desktops in the CDE, it reminds me of what I played with on Linux machines in the past.   Although finding applications seems to be impossible.  To run NetBeans I expected to find an icon in some place for it, but the teacher had us type NetBeans at a command prompt to open it.   Closing the command prompt also killed NetBeans, so I'm forced to leave open a terminal window that I'm not using for anything else.&lt;br /&gt;&lt;br /&gt;The labs are ok.  They have each had 3 levels,  Level 1 is for the advanced developer and gives a description of what you need to do to accomplish the lab, level 3 is every character you need to type,  Level 2 is in the middle.   I have been successful accomplishing all the labs with level 1 so far.&lt;br /&gt;&lt;br /&gt;I'm constantly amazed at the number of programing examples that use the number 42.   Does everyone who writes a programming book or training think that they have some kind of inside joke with this?   Hasn't everyone already read "The Hithchiker's Guide to the Galaxy"?   If you haven't you should, at least the first book, I have never laughed out loud more when reading a book.&lt;br /&gt;&lt;br /&gt;Not that I need a moleskin, but with the amount of notes that I took today, and the fact that the wire binding in the center of the book is annoying me, I'm considering looking into it.   I have to find a Barnes &amp;amp; Noble or a Borders so I can check them out.   The hardest part about getting it will be bringing it to work and defending having it after having given my boss such a hard time about carrying his diary (moleskin) with him constantly.   At least my boss knows we were just kidding with him and giving him a hard time, I never thought he was carrying a diary.&lt;br /&gt;&lt;br /&gt;Martin (the teacher) said that we will be writing tests for the code that we are working on.  So far the tests have just been the "main" function running and writing output to the console.  The correct output is in the lab book and I have to visually compare.  I would expect that we get into using asserts, which are built into Java now, or we would include JUnit and start using it as our test framework, but for now, it's a very poor test system and nothing at all like XP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2167036813091981401?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2167036813091981401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2167036813091981401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2167036813091981401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2167036813091981401'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/scjp-training-day-1.html' title='SCJP  Training day 1'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6916323957718641630</id><published>2008-05-08T16:01:00.000-05:00</published><updated>2008-05-08T21:52:43.451-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>One record on two lines.</title><content type='html'>A real-life work problem cropped up the other day.  One that needed a quick hack solution to fix the problem.  We had a fixed length file, but all the records were broken between two lines.&lt;br /&gt;&lt;br /&gt;The file load was going to be done with an SSIS package in SQL Server, but it doesn't nicely handle two line records.   We had to combine the two rows into one.&lt;br /&gt;&lt;br /&gt;One of the developers did this quickly in VB.Net 2005 because that's what he knows, but it got me thinking.  How else could I solve this?  What other language do I already know that I could use to fix this problem?&lt;br /&gt;&lt;br /&gt;Ruby, Perl, Java, VB6, Can I do it with a macro in Ultra Edit?&lt;br /&gt;&lt;br /&gt;Here's several solutions to the same problem.  Read 2 lines, write 1, you can also think about it as, remove every other newline character.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;VB.Net 2005&lt;/span&gt;&lt;br /&gt;&lt;div class="code"&gt;Imports System.IO&lt;br /&gt;&lt;br /&gt;Public Class Form1&lt;br /&gt; Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click&lt;br /&gt;   Dim rdr As New StreamReader("C:\readfile.txt")&lt;br /&gt;   Dim wtr As New StreamWriter("C:\writefile.txt")&lt;br /&gt;   Dim IStr2 As String&lt;br /&gt;   Dim Istr3 As String&lt;br /&gt;&lt;br /&gt;   IStr1 = rdr.ReadLine&lt;br /&gt;&lt;br /&gt;   Do While Not IStr1 Is Nothing&lt;br /&gt;     IStr2 = rdr.ReadLine&lt;br /&gt;     Istr3 = String.Concat(IStr1, IStr2)&lt;br /&gt;     Istr3.Replace(Chr(10), "")&lt;br /&gt;     Istr3.Replace(Chr(13), "")&lt;br /&gt;     wtr.Write(Istr3)&lt;br /&gt;     IStr1 = rdr.ReadLine&lt;br /&gt;   Loop&lt;br /&gt;&lt;br /&gt;   rdr.Close()&lt;br /&gt;   wtr.Close()&lt;br /&gt; End Sub&lt;br /&gt;End Class&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This works, other than the initial trouble of having to tell .NET that I actually wanted the program to have access to the file.  That was a problem that it took me about 30 minutes to overcome.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Ruby&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="code"&gt;counter = 1&lt;br /&gt;outfile = File.open('c:\writefile.txt', 'w')&lt;br /&gt;open('c:\readfile.txt') do |readfile|&lt;br /&gt;readfile.each do |line|&lt;br /&gt;  outfile.write line.chomp&lt;br /&gt;  # only add the newline for every other line,  Don't add it on the last line in the file.&lt;br /&gt;  outfile.write "\n" if( counter % 2 == 0 &amp;amp;&amp;amp; line != line.chomp)&lt;br /&gt;  counter += 1&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;outfile.close&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I spent about 15 minutes writing the Ruby code for this, mostly because I felt like there should be a cleaner way to solve the problem.   I had been using a fairly ugly check to either write the entire line or write the line chomped (without the newline).  I decided to always write the line chomped and add my own newline when it was needed.  It's the same number of lines with less checks and it looks cleaner.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Perl Version 5.0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="code"&gt;open(INPUTFILE, "c:\\readfile.txt") || die "system can't open file for reading";&lt;br /&gt;open(OUPUTFILE, "&gt;c:\\outfile.txt") || die "system can't open file for writing";&lt;br /&gt;&lt;br /&gt;my $count = 1;&lt;br /&gt;while(&lt;inputfile&gt;) { # reads a line into the default variable $_&lt;br /&gt; if( $count % 2 ==1 ) {&lt;br /&gt;     chomp $_;  # only chomp the odd number lines&lt;br /&gt; }&lt;br /&gt; print OUPUTFILE;   # Writes the value from $_ to the OUTPUTFILE&lt;br /&gt; $count++;&lt;br /&gt;}&lt;br /&gt;close(INPUTFILE);&lt;br /&gt;close(OUPUTFILE);&lt;br /&gt;&lt;/inputfile&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I don't need enough hard core Perl functionality to stay up to date on the most recent version.  However, I like to tweak files occasionally in Perl, just to try and keep it fresh enough in my mind that I could use it for something if I had to.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ultra Edit.&lt;br /&gt;Open the file.&lt;br /&gt;Put the cursor in the first row.&lt;br /&gt;Start Recording a macro.   Perform the actions.&lt;br /&gt;{end} {del} {down arrow}&lt;br /&gt;Stop recording the macro&lt;br /&gt;&lt;br /&gt;Play the macro repeating until end of file.&lt;br /&gt;&lt;br /&gt;I can perform this operation with the macro faster in Ultra Edit than I could write even the simple programs that were written above.   It's not always the best solution, but it helps to know your tools.  Sometimes, knowing the strengths of your own tools can save you the hassle of writing something.  For a one time operation this is acceptable, it's the things that need repeated that this doesn't work well for.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class converter {&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;     PrintStream p = new PrintStream( new FileOutputStream("myfile.txt") );&lt;br /&gt;&lt;br /&gt;     FileInputStream fstream = new FileInputStream("c:\\readfile.txt");&lt;br /&gt;     BufferedReader d = new BufferedReader(new InputStreamReader(fstream));&lt;br /&gt;    &lt;br /&gt;     String s = null;&lt;br /&gt;     long l = 1;&lt;br /&gt;     while ( (s = d.readLine()) != null ) {&lt;br /&gt;       if( l % 2 == 1 &amp;amp;&amp;amp; l!= 1)&lt;br /&gt;         p.print("\n");&lt;br /&gt;       p.print( s.replace('\n', ' ') );&lt;br /&gt;       l++;&lt;br /&gt;     }&lt;br /&gt;    &lt;br /&gt;     d.close();&lt;br /&gt;     p.close();&lt;br /&gt;   }&lt;br /&gt;   catch (Exception e)&lt;br /&gt;   {&lt;br /&gt;     System.err.println ("Error writing to file");&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Java method is a little longer, but works just as well.&lt;br /&gt;&lt;br /&gt;This was a fun exercise.  I love solving a problem and actually thinking about the problem.  Different languages have different strengths that they bring to the table.  In this instance Perl and Ruby are the easiest to write the code for.  Java was probably the most difficult code to write because files are buried under more classes than in the other languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6916323957718641630?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6916323957718641630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6916323957718641630' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6916323957718641630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6916323957718641630'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/one-record-on-two-lines.html' title='One record on two lines.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3020893430323704756</id><published>2008-05-08T01:25:00.000-05:00</published><updated>2008-05-08T01:25:00.949-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Slick Run Wins out over Launchy</title><content type='html'>I've read about &lt;a href="http://www.launchy.net/"&gt;Launchy&lt;/a&gt; several times in the past.   Eveyrtime I've seen it I've thought, "why would I change, it doesn't do anything that &lt;a href="http://www.bayden.com/SlickRun/"&gt;slickrun&lt;/a&gt; does already".   I had the "If it ain't broke, don't fix it" attitude.&lt;br /&gt;&lt;br /&gt;However, as I have been setting up my tools on a new computer, I decided to give Launchy a try.  Why?  Because SlickRun only works when configured.   It will run any and all of the programs that I want it to, when I configure a MagicWord for that program.&lt;br /&gt;&lt;br /&gt;After the install the visual footprint of Launchy is a lot bigger than slick run, however, when typing a word, it gives me hints for what it thinks.   I like that.  It also hides completely, not even taking up space in my taskbar.   I have more than enough things that take up task bar space and having one less is nice.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've now been using it for a few days, and trying to stress both slickrun at work and launchy at home.    Here's my thoughts on each.&lt;br /&gt;&lt;br /&gt;SlickRun:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The floating command in the bottom corner of my window all the time is nice.  It doesn't take up any space on my taskbar.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The date-time is visible whenever it does not have focus, which lets me remove the windows clock from the taskbar and keep a time visible always. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;I can have multiple shortcuts for the same thing.  I use edit and ue both to open Ultra Edit.  Depending on which one I was thinking of at the time, they both work.&lt;/li&gt;&lt;li&gt;Commands that would work at a command prompt work in Slick run for example "javac c:\test\test.java" will compile the test.java file that folder.&lt;/li&gt;&lt;li&gt;Typing a folder name opens the folder "c:\rubycode" opens my rubycode folder.&lt;/li&gt;&lt;li&gt;A magic word can be for a program, a folder, or a website. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;A magic word can chain other magic words together.   I use one called morning, that I run first thing each morning, it opens outlook, instant messenger, a few things that I need to monitor daily at work and firefox.  All that opens with me only having to type mor, because at that point the word is unique.&lt;/li&gt;&lt;li&gt;Typing 'hide' will minimize the floating command to the taskbar.  I would prefer hiding it completely in those instances.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Launchy:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;alt+enter shortcut to show application is great, I love that it's completely hidden and doesn't take up any space in the taskbar.&lt;/li&gt;&lt;li&gt;I would rather create a keyword in the application than have to create a shortcut with the keyword that I want.   I don't want extra shortcuts running around anywhere on my computer, that's just more files I don't want to deal with.&lt;/li&gt;&lt;li&gt;I can potentially use batch files, but I like the chaining effect in SlickRun&lt;/li&gt;&lt;li&gt;The visual appeal of Launchy is great.&lt;/li&gt;&lt;li&gt;Web bookmarks are automatically indexed so whatever you have named them you can use to open those web pages.  This is only useful to a limited number of bookmarks because I use Del.icio.us for my bookmarks.&lt;/li&gt;&lt;li&gt;A calculator plugin is included by default.  sometimes I need to do a quick number check when figuring out payments or balancing something, I can type the numbers directly into Launchy and see the total.  This is not an issue for me though because I have the calculator in the Google sidebar and calculator is a MagicWord in launchy so it is only a few more characters to get the same functionality.&lt;/li&gt;&lt;/ul&gt;I will leave Launchy at home for a while longer, and at home it may not be an issue, but on my work computer, where I need more exact control of things and I'm more of a power user of the tool, I will keep Slick Run, it serves my needs better, faster, and easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3020893430323704756?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3020893430323704756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3020893430323704756' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3020893430323704756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3020893430323704756'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/slick-run-wins-out-over-launchy.html' title='Slick Run Wins out over Launchy'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8652482321686664873</id><published>2008-05-05T19:55:00.000-05:00</published><updated>2008-05-05T20:25:44.554-05:00</updated><title type='text'>A stack - a visual representation</title><content type='html'>As I rolled up the unrolled toilet paper roll in the bathroom, thanks to my 2 year old, I thought, this is a lot like a stack; the first piece of toilet paper on in the center is the last piece off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8652482321686664873?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8652482321686664873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8652482321686664873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8652482321686664873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8652482321686664873'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/05/stack-visual-representation.html' title='A stack - a visual representation'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2993246366776637095</id><published>2008-04-28T21:27:00.000-05:00</published><updated>2008-04-28T21:40:59.897-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Ruby, don't take your love to town.</title><content type='html'>I'm on the road to learning the ruby language.   I've been reading several different resources on the basics, and I'm starting to get a grasp on how the syntax is working.   There are a lot of things that make this a bit difficult for me to learn, but I like the way it looks.   Once I have a good grasp on it, I think I'll really like it a lot, I just have to keep looking for places where Ruby is the answer, instead of making Ruby the answer even when it's not.&lt;br /&gt;&lt;br /&gt;I've been readying &lt;a href="http://poignantguide.net/ruby/index.html"&gt;Why's (Poignant) Guide to Ruby&lt;/a&gt;, which could be called Why's acid trip to understanding ruby.   It's the best metaphors and explanations about the syntax that I've found, but it's also got crazy bizarre things in there that I think, what was he smoking?&lt;br /&gt;&lt;br /&gt;I've also started looking at &lt;a href="http://www.whytheluckystiff.net/ruby/pickaxe/"&gt;Programming Ruby&lt;/a&gt;, which is known as the pickaxe book.  I've been looking at this one, because it's installed with the one-click installer for Ruby, so it's already on my computer, but you can also read it online. &lt;br /&gt;&lt;br /&gt;There's also a neat &lt;a href="http://tryruby.hobix.com/"&gt;interactive ruby tutorial&lt;/a&gt; that makes you type the code and read about why at the same time, there is some of the same bizarre things in this as the Poignant guide above because it is also written by Why the Lucky stiff.&lt;br /&gt;&lt;br /&gt;So far I'm just learning to do the basics, and I haven't created anything new or solved any fun problems, but I'm enjoying learning the new language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2993246366776637095?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2993246366776637095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2993246366776637095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2993246366776637095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2993246366776637095'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/04/ruby-dont-take-your-love-to-town.html' title='Ruby, don&apos;t take your love to town.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8699321863752636281</id><published>2008-04-14T12:28:00.000-05:00</published><updated>2008-04-14T12:30:15.922-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>It's good to have someone you can trust</title><content type='html'>Sometimes as developers we lose sight of what is right in front of us.   A quick change to a piece of code and WHAM, something breaks. &lt;br /&gt;&lt;br /&gt;It's times like this that it's good to have someone we trust.  We can ask that person to look at our change and help us find the fix, which is often just something extremely stupid that we did.  &lt;br /&gt;&lt;br /&gt;Too often when we've done something stupid, we look right at the mistake and see it for what it was supposed to do, not what it is doing.  A 2nd person can usually find this bug within a few seconds.   &lt;br /&gt;&lt;br /&gt;This is one of the biggest benefits for paired programming.  In those cases there is a lot less chasing your own tail around, because the feedback is immediate.  That's why paired programming teams have higher quality and stay focused better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8699321863752636281?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8699321863752636281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8699321863752636281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8699321863752636281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8699321863752636281'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/04/its-good-to-have-someone-you-can-trust.html' title='It&apos;s good to have someone you can trust'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8831242837836268065</id><published>2008-04-03T19:49:00.000-05:00</published><updated>2008-04-03T17:50:09.740-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>The practice of boring</title><content type='html'>Software Development is boring.   I'm a software engineer, Software development is my tool.  Software development is the practice of boring.&lt;br /&gt;&lt;br /&gt;The practice of boring is doing the same things over and over and over.    That's what software development is.   I am constantly connecting to a data store, pulling back data, displaying it in an application.  Something can then happen to the data and it will be saved back to the database.   I have just described practically every piece of software ever.    Essentially Blogger is the same thing.  &lt;br /&gt;&lt;br /&gt;Blogs are saved somewhere, they are then displayed for editing by the author or viewing by anyone else.  &lt;br /&gt;&lt;br /&gt;Amazon is that way.   A list of things for sale, their reviews, their price are all saved somewhere and displayed when you log in.  Even your preferences based on a history of your purchases from Amazon are stored and pulled to display suggestions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Online newspapers display their stories into their web page layout. &lt;br /&gt;&lt;br /&gt;Software developers write the software to get data and display it, sometimes with editing.  Software development is the practice of boring.&lt;br /&gt;&lt;br /&gt;It's a good thing I'm not a software developer.  I would go completely bonkers with a redundant mundane job like that.   I'm a  problem solver.  My job is not to just write software,  I need to be able to understand a specific problem, decide if there is an existing solution that can be re-used or if a new one has to be developed.  I need to understand what needs to be tracked to make the project a success and to make the work done on it legal.   I need to understand laws and how they relate to the potential solution I develop.   I need to stay aware of different development methodologies because one of the new ones may be a faster way to provide my solution.  &lt;br /&gt;&lt;br /&gt;I need to be great at the practice of boring, in order to really focus my ability and skills into problem solving.   The better I am at the boring task of writing software, the more prepared I am to write the software needed to solve that next problem.   I embrace the repetitive task of getting data from somewhere and displaying it, because all of the in-between steps where the process and business rules lie are what makes each application unique.&lt;br /&gt;&lt;br /&gt;There is a lot of tools, tutorials, books, and training available to improve your software development skills, the only way to get better at solving problems is to solve more of them.  Experience is the key.   Be the best developer you can be, learn to code the highest quality code the fastest, in order to get on to that next problem.   Keep your job interesting, with the practice of boring.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8831242837836268065?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8831242837836268065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8831242837836268065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8831242837836268065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8831242837836268065'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/04/practice-of-boring.html' title='The practice of boring'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8523187102206767835</id><published>2008-03-27T21:29:00.000-05:00</published><updated>2008-04-02T22:39:48.035-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Would you follow me on twitter?</title><content type='html'>The past month I've started asking myself if anyone would follow me on twitter, and who would I follow on twitter.   Not surprisingly I began asking, why anyone would ever use twitter.&lt;br /&gt;&lt;br /&gt;I know of a few people that use twitter, and I hear about it a lot in the podcasts that I listen to&lt;br /&gt;however, I don't understand the true purpose of it.&lt;br /&gt;&lt;br /&gt;Twitter's site asks, "What are you doing?"  So from that I take it to mean that the purpose is to tell the world constantly what I'm doing. &lt;br /&gt;&lt;br /&gt;Since the majority of my daily activities are boring enough that I wouldn't want to make someone follow me around, I don't think that most things are worth mentioning.   Heck, my job is sitting at a computer. From the outside looking in, I'm pretty boring.   I even find it hard sometimes when my kids ask what I did today, and my answer is, "I read 200 pages of documentation trying to find how to do something that we haven't done before".  Or, "I made a change to the program that I'm working on to allow someone to edit the phone number in the middle without the cursor being reset to the end after every keystroke".  To which they seem to always look at me dumbfounded.  So instead I try to say things like, "I made some else's job easier today".&lt;br /&gt;&lt;br /&gt;Even my home activities are not the most exciting.   Things like "Doing dishes", "Eating a great dinner my wife cooked", "Playing catch with the kids".  These aren't things that I do that would be interesting to people.&lt;br /&gt;&lt;br /&gt;I've heard of, and seen some people use twitter solely as a marketing tool for their blog.  I guess this is possible, but most likely, if I'm going to care enough to follow someone on twitter, I'm also following their blog in an RSS Reader, so I don't want them to post that they have a new blog to read, and I don't want to do that myself.&lt;br /&gt;&lt;br /&gt;I have seen a great use for something like twitter within a company or team, in order to keep everyone informed on the current status of what each member in the group is doing.  However these statuses are not useful to the world at large, and are possibly proprietary enough in nature that they need to be housed completely in house at the company.&lt;br /&gt;&lt;br /&gt;Since I began my twittering experiment a few days ago, I now have a good reason for the service.  There are some people out there that I admire.  I am amazed at the way they think, and the things they think about.  These are people that I look up to and aspire to be more like.  It's possible that through twitter I can get a little more of a glimpse into the things that these people do.  Maybe the reason they think a certain way is influenced by things that they read, and something like that could be shared on twitter.  That extra glimpse into what helps to open their mind to creativity, could provide me a way to become more open to creativity too.&lt;br /&gt;&lt;br /&gt;So why would I post anything about myself on twitter?  I've already explained that I see myself as boring.  But that doesn't really mean I am boring.  And it doesn't mean that others see me as boring.   Maybe instead, by my posting on twitter, someone will be inspired or influenced by something that I do or say.  The only way to know for sure is to keep tweeting and see how it goes.&lt;br /&gt;&lt;br /&gt;That begs the question, would you follow me on twitter?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8523187102206767835?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8523187102206767835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8523187102206767835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8523187102206767835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8523187102206767835'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/03/would-you-follow-me-on-twitter.html' title='Would you follow me on twitter?'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8125601351748201463</id><published>2008-03-13T20:29:00.001-05:00</published><updated>2008-10-31T11:57:59.376-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Using Ultra Edit for Ruby</title><content type='html'>Configure Ultra Edit for Ruby Syntax highlighting.&lt;br /&gt;First open Ultra Edit. Open the View Menu.  Open the View As (Highlighting File Type) and see what the next empty language number is.&lt;br /&gt;&lt;br /&gt;Then Open C:\Program Files\IDM Computer Solutions\UltraEdit-32\wordfile.txt.&lt;br /&gt;&lt;br /&gt;Move to the bottom of this file and paste the following code.  Change the L12 to L## to the next Language number in your Ultra Edit menu.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;/L12"Ruby" Line Comment Num = 2#  Block Comment On = =begin Block Comment Off = =end Escape Char = \ File Extensions = RB RBW&lt;br /&gt;/Indent Strings = "do" "begin" "{" "|"&lt;br /&gt;/Unident Strings = "}" "end"&lt;br /&gt;/Delimiters =     []{}()&lt;&gt;="'.,+&lt;br /&gt;/C1"Keywords"&lt;br /&gt;__FILE__ __LINE__&lt;br /&gt;BEGIN&lt;br /&gt;END&lt;br /&gt;alias and&lt;br /&gt;begin break&lt;br /&gt;case class&lt;br /&gt;def defined? do&lt;br /&gt;else elsif end ensure&lt;br /&gt;false for&lt;br /&gt;if in&lt;br /&gt;module&lt;br /&gt;next nil not&lt;br /&gt;or&lt;br /&gt;redo rescue retry return&lt;br /&gt;self super&lt;br /&gt;then true&lt;br /&gt;undef unless until&lt;br /&gt;when while&lt;br /&gt;yield&lt;br /&gt;/C2"Object, Module, Class, Kernel"&lt;br /&gt;__id__ __send__&lt;br /&gt;ancestors alias_method append_features attr attr_accessor attr_reader attr_writer abort at_exit autoload&lt;br /&gt;binding block_given?&lt;br /&gt;class_eval class_variables clone const_defined? const_get const_set constants callcc caller catch chomp chomp! chop chop!&lt;br /&gt;display dup&lt;br /&gt;extend_object eval exec exit exit! eql? equal? extend&lt;br /&gt;fail fork format freeze frozen?&lt;br /&gt;gets global_variables gsub gsub!&lt;br /&gt;hash&lt;br /&gt;included_modules instance_methods include iterator? id inspect instance_eval instance_of? instance_variables is_a? inherited&lt;br /&gt;kind_of?&lt;br /&gt;lambda load local_variables loop&lt;br /&gt;method_defined? module_eval method_added module_function method method_missing methods&lt;br /&gt;name nesting new nil?&lt;br /&gt;open&lt;br /&gt;private protected public private_class_method private_instance_methods protected_instance_methods public_class_method public_instance_methods p print printf proc putc puts private_methods protected_methods public_methods&lt;br /&gt;remove_const remove_method raise rand readline readlines require respond_to?&lt;br /&gt;scan select set_trace_func singleton_method_added sleep split sprintf srand sub sub! syscall system send singleton_methods superclass&lt;br /&gt;test throw trace_var trap taint tainted? to_a to_s type&lt;br /&gt;undef_method untrace_var untaint&lt;br /&gt;/C3"Instance Variable"&lt;br /&gt;** @a @b @c @d @e @f @g @h @i @j @k @l @m @n @o @p @q @r @s @t @u @v @w @x @y @z&lt;br /&gt;/C4"Class Variable"&lt;br /&gt;** @@a @@b @@c @@d @@e @@f @@g @@h @@i @@j @@k @@l @@m @@n @@o @@p @@q @@r @@s @@t @@u @@v @@w @@x @@y @@z&lt;br /&gt;/C5"Globals"&lt;br /&gt;** $&lt;br /&gt;/C6 "Symbols"&lt;br /&gt;** :&lt;br /&gt;/C7"Constants"&lt;br /&gt;** A B C D E F G H I J K L M N O P Q R S T U V W X Y Z&lt;br /&gt;/C8"Operators"&lt;br /&gt;+ +=&lt;br /&gt;- -=&lt;br /&gt;% %=&lt;br /&gt;/ /=&lt;br /&gt;** **=&lt;br /&gt;&amp;amp; &amp;amp;=&lt;br /&gt;| |=&lt;br /&gt;^ ^=&lt;br /&gt;&gt; &gt;&gt; &gt;&gt;=&lt;br /&gt;&lt; &lt;&lt; &lt;&lt;= = == ===  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This configuration was originally pulled from &lt;a href="http://www.ocssolutions.com/support/ruby/config-ue-for-rails.php"&gt;a website about supoort&lt;/a&gt;.  But seeing how I couldn't actually find anywhere on their website that linked to the file, I decided to just include it here.  I thank them greatly for a good layout to work with Ultra Edit.&lt;br /&gt;&lt;br /&gt;I've been wanting to learn Ruby for some time, and finally found what looks like a good beginners guide to ruby.    Here's a link to &lt;a href="http://www.sapphiresteel.com/The-Little-Book-Of-Ruby"&gt;The Little Book of Ruby&lt;/a&gt;.  I've only made it through chapter 1 so far, but it looks like a good place to start.&lt;br /&gt;&lt;br /&gt;****  Updated 10/31/2008 ****&lt;br /&gt;IDM now has word files for Ultra Edit on their site.  Their version of the Ruby language is possibly more complete than the one I have included.   You may want to check it out at http://www.ultraedit.com/downloads/extras.html#wordfiles&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8125601351748201463?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8125601351748201463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8125601351748201463' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8125601351748201463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8125601351748201463'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/03/using-ultra-edit-for-ruby.html' title='Using Ultra Edit for Ruby'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6609911054935005318</id><published>2008-03-09T22:05:00.000-05:00</published><updated>2008-03-09T22:17:15.894-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>A wiki for a knowledge base.</title><content type='html'>In my continuing series on tools and processes that we looked at and used to solve problems at work, I'll discuss the knowledge base next.&lt;br /&gt;&lt;br /&gt;Part of the problem we had, was the ability to support an application, when the primary developer of that application was on vacation, or worse, had quit.  Each application had only a few who knew it, but that knowledge had continually left with them.&lt;br /&gt;&lt;br /&gt;We wanted a knowledge base, so when problems occurred we could capture:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What Happened (What is the symptom)&lt;/li&gt;&lt;li&gt;What is the underlying problem, can we fix this later.&lt;/li&gt;&lt;li&gt;How do we fix it now.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Without company support for this decision, we started investigating open source solutions to the problem.  We installed and tested a few knowledge base systems, but they were cumbersome to use at best.  We had just installed &lt;a href="http://www.mediawiki.org/wiki/MediaWiki"&gt;MediaWiki&lt;/a&gt;.  It didn't really have a purpose or design in mind, it was just there.   I took the opportunity to play with it and started documenting support options on the wiki. &lt;br /&gt;&lt;br /&gt;It was apparent pretty quickly, that the ease of editing, searching, and cross linking made this a great place for a knowledge base.  While some of the knowledge base systems seemed to support a better interface for finding a related problem, grouping pages logically, and using the search feature of a wiki made more sense.&lt;br /&gt;&lt;br /&gt;Since then, we use the wiki to document all of our knowledge base items, more and more of our applications, and we're even using it to manage some of our projects.  We aren't the first either, I've read that Thoughtworks uses wikis to manage their projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6609911054935005318?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6609911054935005318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6609911054935005318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6609911054935005318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6609911054935005318'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/03/wiki-for-knowledge-base.html' title='A wiki for a knowledge base.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2252025947407859629</id><published>2008-02-27T16:49:00.001-06:00</published><updated>2008-02-27T16:51:29.447-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processes'/><title type='text'>Training</title><content type='html'>Let me start with, I love my company, and am very happy where I'm at.  I wasn't always that way.  At one point in time there were major problems there.  And many of those problems started with training. &lt;br /&gt;&lt;br /&gt;Training was considered an "after you need it" item at the time.  If we purchased a new technology, or already decided that we were going to do something different, then and only then would a few select individuals get to go to training.  In the department of about 30 developers, there were maybe 5 that were getting to attend training or a conference every year.  It was always same people, and everyone else was left out.  Those few were then expected to return to work and pass on their newly acquired knowledge to the rest of us.&lt;br /&gt;&lt;br /&gt;The list of things wrong here is long.  The rest of us felt left out, mad, heck - flat out pissed off.  We didn't understand why we were never allowed to go to training.   We didn't understand why training was only after the fact.   IT is a fast paced world, and you have to be ahead of the curve on training or you fall too far behind.&lt;br /&gt;&lt;br /&gt;We built business cases for why training was good.  Found studies on the internet to support our reasoning, and submitted it.  Only to find out that no, we weren't getting more training.&lt;br /&gt;&lt;br /&gt;Then there was a changing of the guard.   A new boss came in.  He walked into a company with a lot of people complaining about a lot of things.  One thing he really supported though was training.&lt;br /&gt;&lt;br /&gt;Since that time the training budget has gone up a lot, training is available to everyone now, and we get to choose what to go to, not go to something after the fact. &lt;br /&gt;&lt;br /&gt;Training has been a huge moral booster the past 2 years, and it's helped improve skills.  Being able to go away to training and learn something, then come back and apply it is exhilarating, and exciting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2252025947407859629?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2252025947407859629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2252025947407859629' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2252025947407859629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2252025947407859629'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/02/training.html' title='Training'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8571214116787487866</id><published>2008-02-27T11:44:00.000-06:00</published><updated>2008-02-27T16:22:39.731-06:00</updated><title type='text'>Coming soon a series on tools and processes.</title><content type='html'>Several years ago a group of developers at work got together and came up with some ideas of things that could make the developers in our department more productive and the process better.&lt;br /&gt;&lt;br /&gt;We had a list, which I can no longer find, but I remember several items.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A code library&lt;/li&gt;&lt;li&gt;A forum&lt;/li&gt;&lt;li&gt;A knowledge base&lt;/li&gt;&lt;li&gt;Business Analysts&lt;/li&gt;&lt;li&gt;Code Reviews&lt;/li&gt;&lt;li&gt;Cross Training&lt;/li&gt;&lt;li&gt;Training&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Over time we implemented all of these, and have stopped some of them for one reason or another.  Over the next several posts I will address the reason we wanted these, along with why they did, or didn't work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8571214116787487866?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8571214116787487866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8571214116787487866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8571214116787487866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8571214116787487866'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/02/coming-soon-series-on-tools-and.html' title='Coming soon a series on tools and processes.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1527456510976222356</id><published>2008-02-18T21:26:00.000-06:00</published><updated>2008-02-18T22:13:56.776-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Testing on an island</title><content type='html'>I read Derek Whittaker's post the &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2008/02/18/sound-of-one-man-testing.aspx"&gt;Sound of One Man Testing&lt;/a&gt;, and it got me thinking to the first to adopt people.  The ones that read incessantly and find the hints of good ideas and do what they can to introduce new concepts into their work.    These people are the ones that figure things out, and solve the hardest problems, they go the extra mile all the time. &lt;br /&gt;&lt;br /&gt;I got to thinking about unit testing at my own work.   About 3 years ago I had just heard the concept of test driven development.   The few paragraphs I read about it sounded interesting, but I couldn't quite get my head around it.  I didn't understand why I'd write a test for every level of code, when an integration test would take care of all of it.   This just didn't make sense to me.  I like to pride myself on being one of those early adopters.  I'm not on the bleeding edge, but I do what I can to read about things and stay up to date at least on the concepts for things.   Test Driven Development is a huge concept, with great benefits and I couldn't quite get it.   It took me a reading a couple of books and writing a project with test driven development before I started to get it.   Yes, after a fully TDD project I only started to get it.  Even at that point I had done things wrong.  Mocks were still a mystery and I hadn't found any good tutorials.  For the first time I felt like I needed my hand held as I walked through something new.  It was scary.&lt;br /&gt;&lt;br /&gt;When it comes to work I tend to be fearless and take on any challenge given to me.   But this was different.  So for those early adopters that are out there trying to be the person testing on an island and starting it in your company.   Remember, even for some of those who tend to lead, it can be hard.  If you work in a place where you do have some small 1 man projects I recommend using one or two of those as proof of concepts for TDD before even attempting to insert it into a larger project.   Talk to your co-workers about TDD.  Send them blogs, magazine articles, books, anything to make TDD a topic of conversation.  And then, offer to hold their hand.  Show them with in-house training, led by you.    Teach them about mocks and dependency injection and why you have to use them with the design in order for the unit tests to be black box.  Explain black box and talk about all of these concepts, which are very likely new concepts to a team that is not already doing Test Driven Development.&lt;br /&gt;&lt;br /&gt;Finally, start adding tests to a large project that you are working on.   Offer to help your co-workers build their tests. &lt;br /&gt;&lt;br /&gt;I've been reading about TDD for 3 years now.   Currently I'm working in Java and I'm comfortable from the bottom layer all the way through the web service layer in writing tests, but I still don't know how to test the GUI.    Even after 3 years there is still a lot of room to grow in my Test Driven development.   And if you are thinking of starting Test Driven Development, don't look at this and think that it's too hard.  It's not, and the quality that you gain in the layers that are tested is great.   The current project I'm working on is closing in on 1,000 unit tests.   I love being able to run them and know that the refactoring that I had just done didn't break any code that someone else was relying on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1527456510976222356?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1527456510976222356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1527456510976222356' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1527456510976222356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1527456510976222356'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/02/testing-on-island.html' title='Testing on an island'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7499477875659729661</id><published>2008-02-06T12:33:00.000-06:00</published><updated>2008-02-06T12:39:56.812-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting CSS'/><title type='text'>CSS... what a pain.</title><content type='html'>When I first learned about CSS, the only reason given to me for it was formatting.  I didn't get it.  Tables already did that.   But CSS is so much more.   Tables keep everything in place with relation to each other, but CSS can be floating, and layered, and so much more.&lt;br /&gt;&lt;br /&gt;However, now that I'm starting to dig into CSS and actually try setting up a page using it, it's a real pain.  Things appear different in IE than they do in Firefox, and different again in Safari.   Steve Jobs has done a good enough job of bringing MAC into the fold that Safari cannot be ignored.  &lt;br /&gt;&lt;br /&gt;It's odd how sometimes the open source solutions are a bigger pain than the proprietary ones.   A standards community says how the CSS should act, but each company or group implements it differently, and the people who use it are stuck having to put in hacks to get around the companies differences, or else they just design for one browser and add a note to the screen stating it works better in a different browser.&lt;br /&gt;&lt;br /&gt;I don't want to determine for a user which browser they should use.  I don't want a page that I design to only work in one browser, but I also hate hacks.  I don't want them to make the code look ugly.  It's too bad the people making the browsers can't just get along enough to follow the standards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7499477875659729661?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7499477875659729661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7499477875659729661' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7499477875659729661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7499477875659729661'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/02/css-what-pain.html' title='CSS... what a pain.'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-5965378144927802428</id><published>2008-01-31T12:07:00.000-06:00</published><updated>2008-01-31T12:56:34.736-06:00</updated><title type='text'>Am I INSANELY Useful?</title><content type='html'>Lifehack.org had a great post on &lt;a href="http://www.lifehack.org/articles/communication/how-to-make-yourself-insanely-useful.html"&gt;How to Make Yourself INSANELY Useful&lt;/a&gt;.  The 13 tips are great.  But what do YOU do with those tips?  Do you read them and toss them away?   Do you evaluate yourself against them?   Do you agree/disagree and move on?  Do you make action lists to improve?&lt;br /&gt;&lt;br /&gt;Me, when I read lists like this, I like to evaluate myself and see if there is anything I should do to improve myself.   Of course, I have to decide if I agree or disagree with each item, because if I don't agree with what is being suggested, I can't try to do it.    This offers me an opportunity to evaluate why I have my beliefs though.   Think about that for yourself.  Do you have your beliefs because of tradition, religion, or experience?   I'm not questioning any of your beliefs, and I don't even care if you change them, but every now and then you should inspect them closely to be sure you understand them.&lt;br /&gt;&lt;br /&gt;Here's me evaluating myself on the 13 tips.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Share what you know:   I love to share what I know.  I blog, and commit application specific knowledge that I have to a wiki at work.  I agree that useful people share what they know.  Secrets make one less useful, and more annoying when a problem arises, because nobody else can fix it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Be confident in yourself:  I agree, useful people must be able to exude confidence, or I won't want to follow them, in any capacity.  However, be wary of crossing the line to cocky.  I've been accused myself of being cocky when I only ever thought I was confident.   I have overcome some major personality perception issues to fit into the confident, but not cocky category, finally.&lt;/li&gt;&lt;li&gt;Solve the current problem:  I try hard not to figure out why the problem occurred, and to focus on the issue at hand, but I admit that I jump to judgment quickly in cases.  Action: Be more conscious about judgment of situations.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Give Willingly:  I agree, people who are open to helping me, no matter what they have going on are the people that I go back to frequently.   I want to be that guy myself, so I already do what I can to happily help anytime someone needs it.&lt;/li&gt;&lt;li&gt;Satisfy your own curiosity: I'm up in the air on this.  I believe that to be a useful person you have to know a lot of things, and it helps to be a naturally curious person.  However, satisfying almost no curiosity won't help make you more useful.  So be more curious, and constantly strive to satisfy that curiosity.   Another way to state it is, constantly learn. Which I do.&lt;/li&gt;&lt;li&gt;Listen to others:  I do a much better job of this than in the past, however, listening is a skill that I still could practice more on.   I have a natural impatience, that tends to come out as sometimes partially ignoring what others are saying when they talk.   It's never that I look down on the people, my mind just wanders.   Action: Meditate more to practice being in the present.&lt;/li&gt;&lt;li&gt;Don't take over:  I completely agree again.   Plus this is another thing that I have struggled with in the past.   I have been focusing in the past 2 years a lot more on teaching than doing, and I have done well, but still have a long way to go.  Action: Continue working on teaching.&lt;/li&gt;&lt;li&gt;Know when to stop:  I agree.  Knowing when to stop combines Don't Take Over, with Focus on the immediate problem.   Once I have helped solve the immediate problem I stand back and ask if there is anything else they want to know or have help with.   I don't want to just walk away, but I do a good job at stopping so the other person can get back to practicing and learning to improve themselves.&lt;/li&gt;&lt;li&gt;Teach, don't tell:  This again is very similar to don't take over.   See above for my thoughts on it.&lt;/li&gt;&lt;li&gt;Be sensitive to people’s feelings and shortcomings:  You may think with my tendency to be impatient I would have a huge problem here.  I don't however, and I think it's due to being on the wrong side of most comments growing up.  I'm very sensitive to other's insecurities and fears.   I do my best to not only be sensitive to them, but to build them up and focus on their strengths.   Everyone has strengths, and even if I am strong in the same area, that doesn't mean I won't do what I can to reinforce their ego by playing to their strengths.&lt;/li&gt;&lt;li&gt;Ask for help:  See my answer to 10, they are so closely related, it's not worth listing again.&lt;/li&gt;&lt;li&gt;Model best practices:  I completely agree, and have had many conversations with friends about leading by example.  I even use this when I'm explaining to my older kids why they have to act better than their younger siblings.&lt;/li&gt;&lt;li&gt;Be reliable:  Too many times I've had someone in my life that would make empty promises.   At one time I got really bent out of shape over this.  Now I know who not to trust.   Promises from some people mean nothing.   I don't want to be one of those kinds of people.   If I say I can help, I help, I do everything I can to be available and follow through on what I agreed to. &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-5965378144927802428?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/5965378144927802428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=5965378144927802428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5965378144927802428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5965378144927802428'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/01/am-i-insanely-useful.html' title='Am I INSANELY Useful?'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-8945530967228225956</id><published>2008-01-29T21:36:00.001-06:00</published><updated>2008-01-29T21:36:52.788-06:00</updated><title type='text'>Interesting quotes</title><content type='html'>You look at MySpace which is this wide open array of every flavor of ugly.&lt;br /&gt;- Ze Frank&lt;br /&gt;&lt;br /&gt;In MySpace there is no button that says make my page uglier&lt;br /&gt;you gotta go to ancilary website search around for something that's about as ugly as you want.&lt;br /&gt;that matches your level of ugliness&lt;br /&gt;- Ze Frank&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-8945530967228225956?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/8945530967228225956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=8945530967228225956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8945530967228225956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/8945530967228225956'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/01/interesting-quotes.html' title='Interesting quotes'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3114651200658139514</id><published>2008-01-29T13:34:00.000-06:00</published><updated>2008-01-29T13:42:56.263-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Accessing the GAC on another computer</title><content type='html'>Recently I was involved in building a new server that needed the same components as an existing server.  Unfortunately not all of the correct versions of the components that were in the GAC were in Sourcesafe, or even on the installation server. &lt;br /&gt;&lt;br /&gt;I knew that through the command line I could go into the folders in the GAC on the server and copy the actual DLLs out to a common folder then move them to the other computer and add them all to the GAC.  This was a painfully slow process, and after about 15 minutes and only having gotten 3 of the files that I needed, I was getting frustrated.   This shouldn't be so hard.   I was using the command line for this because using the path \\servername\windows\assembly opened up my local GAC. &lt;br /&gt;&lt;br /&gt;Suddenly I had a crazy idea.  What if windows only opens up the local one because it recognizes the path.   I mapped a network drive to my server and mapped it directly to \\servername\windows\assembly\gac.    I opened my new G drive and I had access to the GAC.  The folder structure is still just as complex, but it was just a quick drag and drop to get the files I needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3114651200658139514?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3114651200658139514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3114651200658139514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3114651200658139514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3114651200658139514'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/01/accessing-gac-on-another-computer.html' title='Accessing the GAC on another computer'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7465078084145488325</id><published>2008-01-15T16:22:00.000-06:00</published><updated>2008-01-15T16:23:12.033-06:00</updated><title type='text'>Apple Announcement</title><content type='html'>Apple announced today that it has developed a breast implant that can store and play music. The i-Tit will cost $499 or $599 depending on cup size. This has been hailed as a major breakthrough because women are always complaining about men staring at their breasts and not listening to them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7465078084145488325?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7465078084145488325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7465078084145488325' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7465078084145488325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7465078084145488325'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2008/01/apple-announcement.html' title='Apple Announcement'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-5682158627206564012</id><published>2007-12-31T22:54:00.000-06:00</published><updated>2007-12-31T23:11:49.168-06:00</updated><title type='text'>How I sped myself up in 07</title><content type='html'>I love reading life hacker and other tips to improve myself.  I am always looking for another tip that I can add to my arsenal to make something that I do faster, easier, or not necessary.   In 2007 I have fully migrated myself to GMail.  There are some good pluses, and some things that I don't like.  I have read a lot about the different plug-ins for GMail and GTD but I have found them all to be slow, so I have kind of build my own GMail GTD folder system, without the plugins.  As long as I'm consistent it's fine.  I also use Google Calendar and share some calendars with others to prevent duplicate entries.   I have fully implemented GTD into my life, and do pretty well with it.  I still have more trouble at home than at work, because I have a harder time controlling the inbox items from my wife, but for the most part I am doing well with keeping myself organized and actually getting things done, which is the purpose.&lt;br /&gt;&lt;br /&gt;One of the biggest things I have done though is to migrate almost completely away from windows desktop icons, or even quick launch icons, into slickrun.   With a quick CTRL+M and a single work I can launch any of the applications that I use.  I also have several folder shortcuts setup here.   This makes it very fast for me to open new programs.  Windows is nice for some things, but it really sucks at launching new applications.  Just clicking on the start menu can cause my computer to freeze for 10-15 seconds, which when I'm trying to work seems like even longer.   I like the command line because it's fast and I have a good memory so I don't have any problem remembering the launch keywords, especially since I chose them.  More importantly though MagicWords are auto-complete so as soon as the word is unique I can hit enter and get moving on what I want to.    Windows does excel in things like multi-selecting items in a folder view, and selecting an odd set of files such as those that CTRL+mouse clicking selects.  Another thing that windows is awesome at is the drag and drop of data from one application to another and having them both understand how to interpret that data.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Looking ahead to 2008, I'm thinking of adding scripting languages like Ruby.  There are so many new possibilities out there and I am excited to jump in and learn something new that can help me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-5682158627206564012?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/5682158627206564012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=5682158627206564012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5682158627206564012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5682158627206564012'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/12/how-i-sped-myself-up-in-07.html' title='How I sped myself up in 07'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-9014372548433592440</id><published>2007-12-17T12:48:00.000-06:00</published><updated>2007-12-17T13:28:02.577-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Is it a Story Card or is it a Bug?</title><content type='html'>I continue to participate in many discussions about whether a change is a bug to an existing card or if it should be tracked as a new card.   Now that the third major release of our project there are some things that have come back to cause trouble.&lt;br /&gt;&lt;br /&gt;In my opinion it gets to testing.  If the change violates an acceptance test, then it's a bug.  If the change is new functionality or a situation that had not been thought of, then a new acceptance test needs to be created.   This can either be added to an existing story or a new story can be created for it.&lt;br /&gt;&lt;br /&gt;The problem that we have faced is that new situations that aren't even hinted to in a story are discovered later, they happen to be not a big change, so they get put into the system as a bug.  No acceptance test is created for them, and they are fixed.   Weeks later, during testing, we get a question, "Is this supposed to work like this?"  Yes, it is because of a bug that was entered.    That's the problem.  There is no tracked acceptance test anywhere that indicates the correct behavior of the system now.   A new tester would be at a complete loss if he had to walk into this project, and the tester that has been with us since the beginning will forget things about the way the system works.  Too many situations that require an acceptance test have not been documented, causing the same questions to be raised over and over again.&lt;br /&gt;&lt;br /&gt;It seems almost as if this situation has created an us vs. them mentality between the developers and the tester.   A bug by the tester means a failure to program the story correctly, while a new card is an admission of failure to correctly identify requirements by our tester.   Both situations are true though, no matter the method used to capture the data.  I push for cards not because I think the problem is not mine, but because it more accurately represents the testing status and reason for changes in the application.  When a new tester walks into the project he should be able to look at the acceptance tests for all cards and perform a full regression test of the system.  There should be no need to go through the hundreds of bugs and identify which of those actually caused a change to accepted behavior.  &lt;br /&gt;&lt;br /&gt;After a while, the application working the way it's supposed to is not going to be enough.  If it is no longer properly documented why it's working that way, then maintenance of the application from both a development and testing aspect become a major problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-9014372548433592440?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/9014372548433592440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=9014372548433592440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/9014372548433592440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/9014372548433592440'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/12/is-it-story-card-or-is-it-bug.html' title='Is it a Story Card or is it a Bug?'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3838729156921269321</id><published>2007-09-11T20:53:00.000-05:00</published><updated>2007-09-11T21:02:27.934-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Off by one</title><content type='html'>I hate being off by one.  It happens a lot with loops and I had it happen again today.&lt;br /&gt;&lt;br /&gt;I had&lt;br /&gt;&lt;br /&gt;for(int i=0; i &amp;lt; payments.length-1; i++)&lt;br /&gt;&lt;br /&gt;length is not zero based so I need to loop from 0 to length not inclusive.  However I was one short.&lt;br /&gt;&lt;br /&gt;The fix was simple.&lt;br /&gt;&lt;br /&gt;for(int i=0; i &amp;lt; payments.length; i++)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-3838729156921269321?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3838729156921269321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3838729156921269321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3838729156921269321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3838729156921269321'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/09/off-by-one.html' title='Off by one'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-932906446497128258</id><published>2007-08-28T10:26:00.000-05:00</published><updated>2007-08-28T10:44:42.423-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Learning the hard way</title><content type='html'>Sometimes learning a simple well known lesson has to happen the hard way.  That happened to me last week.  My project (the one I'm part of a team for) was just about done and ready to deploy when an odd error that's never occurred before popped up.  A user couldn't save a payment for the total amount due.  That's a big deal.&lt;br /&gt;&lt;br /&gt;I started looking into the issue and found that it was a pretty standard issue with using a double in Java to hold monetary values.  So I thought, a quick find and replace would take care of it, but it didn't.&lt;br /&gt;&lt;br /&gt;BigDecimal is an object and needs to be treated like an object.  It also does not have the + operator implemented, or the comparison operators.  So it was a lot more than just replacing all instances of Double with BigDecimal.  To further compound the problem I was using double in many places and I had to convert all of those to BigDecimal as well.  Finally the constructor for BigDecimal can take a double and all of my unit tests were written as&lt;br /&gt;BigDecimal test = new BigDecimal(11.11); &lt;br /&gt;&lt;br /&gt;However Java treats that as a double before putting it into the BigDecimal and that was causing the exact same floating point errors I had before.  I had to change every one of my tests to use the String Constructor of&lt;br /&gt;BigDecimal test = new BigDecimal("11.11"); &lt;br /&gt;&lt;br /&gt;All in all I modified about a thousand lines of code over two days because I didn't know ahead of time that I should have been using BigDecimal for money.  This is a lesson I've learned and won't forget for the next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-932906446497128258?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/932906446497128258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=932906446497128258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/932906446497128258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/932906446497128258'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/08/learning-hard-way.html' title='Learning the hard way'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-3303807643782614041</id><published>2007-06-20T12:59:00.001-05:00</published><updated>2007-06-20T12:59:53.274-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Venting'/><title type='text'>Are Microsoft users dumb?</title><content type='html'>&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;color:#448844;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;One of the emails I get from Microsoft had this in it.&lt;/span&gt;&lt;b&gt;&lt;br /&gt;Featured                      tip for Windows XP &lt;/b&gt;&lt;/span&gt;                       &lt;p&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;&lt;span&gt;Set                        your desktop PC background to a solid color&lt;/span&gt;&lt;br /&gt;                    &lt;span&gt;Tired of making decisions? If you're not interested in choosing a background picture that "reflects" you, don't put yourself through it--just pick a color for your background. Colors are easy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;                       &lt;table border="0" cellpadding="0" cellspacing="5" width="210"&gt;                        &lt;tbody&gt;&lt;tr align="left" valign="top"&gt;                          &lt;td width="20"&gt;&lt;span&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;1.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;                         &lt;td&gt;&lt;span&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;Right-click                            the desktop and click &lt;b&gt;Properties&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;                       &lt;/tr&gt;                       &lt;tr align="left" valign="top"&gt;                          &lt;td width="20"&gt;&lt;span&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;2.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;                         &lt;td&gt;&lt;span&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;Click                            the &lt;b&gt;Desktop&lt;/b&gt; tab in the dialog box and click &lt;b&gt;None&lt;/b&gt;                            for your background.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;                       &lt;/tr&gt;                       &lt;tr align="left" valign="top"&gt;                          &lt;td width="20"&gt;&lt;span&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;3.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;                         &lt;td&gt;&lt;span&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;Pick                            a color from the &lt;b&gt;Color&lt;/b&gt; button to the right and                            click &lt;b&gt;OK&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;                       &lt;/tr&gt;                     &lt;/tbody&gt; &lt;/table&gt;                       &lt;p&gt;&lt;span&gt;&lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;Featured                        tip is courtesy of the book &lt;a href="http://go.microsoft.com/?linkid=6993072" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;Windows                        XP Killer Tips&lt;/a&gt; by Kleber Stephenson.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;                      &lt;span style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:85%;"&gt;&lt;img src="http://www.microsoft.com/windowsxp/images/newsletters/shim_liteblue.gif" height="1" width="210" /&gt;&lt;br /&gt;&lt;br /&gt;Do they  really think that their users are so dumb or indecisive that they can't decide on a background picture that reflects who they are?   Granted I don't use a background picture all the time, but it has nothing to do with me being indecisive, it has to do with the fact that the desktop icons are easier to find with nothing in their way.  This has become less of an issue now that I use the quick launch bar, the Desktop sidebar, and slickrun.  But still, a better suggestion would have been to make it easier to find your icons use a plain background, rather than insulting the largest base of computer users.  What idiot editor let this out?&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/33118148-3303807643782614041?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/3303807643782614041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=3303807643782614041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3303807643782614041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/3303807643782614041'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/06/are-microsoft-users-dumb.html' title='Are Microsoft users dumb?'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6261869500984942369</id><published>2007-06-01T13:57:00.000-05:00</published><updated>2007-06-01T14:01:02.693-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Strange Agile link</title><content type='html'>I'm almost finished reading "Practices of an Agile Developer".  I flipped ahead to the Appendix to checkout the links section and there is a strange link to the "&lt;a href="http://www.worldwar1.com/sfsomme.htm"&gt;Tragedy on the Somme: A Second Balaclava&lt;/a&gt;".  I don't know what this has to do with Agile, or how it made it through editing.  Maybe it is like an easter egg in software, only hidden within the Appendix.    Maybe one of the authors thought it would be funny to list it as an important resource.&lt;br /&gt;&lt;br /&gt;Anyway, if you are interested in the battle, I hope you read it, if you are interested in Agile though, I hope you go to sites that are more informative on that topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6261869500984942369?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6261869500984942369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6261869500984942369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6261869500984942369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6261869500984942369'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/06/strange-agile-link.html' title='Strange Agile link'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-2512721622887737915</id><published>2007-05-15T13:29:00.001-05:00</published><updated>2007-05-15T13:29:58.008-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Yahoo UI Menu issue</title><content type='html'>I've been playing with the Yahoo UI Menu for the past 3 days.  My objective is to have a main menu item created that when clicked will call an Ajax method that builds the first layer of menu items.  This works and builds the menu, but they are not clickable.  If I get a solution, it will definitely be worth posting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-2512721622887737915?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/2512721622887737915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=2512721622887737915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2512721622887737915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/2512721622887737915'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/05/yahoo-ui-menu-issue.html' title='Yahoo UI Menu issue'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1549521410577083258</id><published>2007-05-14T21:55:00.000-05:00</published><updated>2007-05-14T22:02:19.693-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Yahoo UI</title><content type='html'>I've been using the &lt;a href="http://developer.yahoo.com/yui/"&gt;Yahoo UI&lt;/a&gt; in my latest application.  This is a really cool tool.  Including it is easy, and using it is just about as easy.  Yahoo has done a really bang-up job of creating a tool with good examples.  There have been some quirks with getting it to work in Portal, and I wish there were a few more examples of how to do some things with the controls, but in general they are great.   Using the Yahoo UI has given the application a consistent feel for not a lot of cost.&lt;br /&gt;&lt;br /&gt;I know, it sounds like a plug for Yahoo UI, but this really just the praise that I have for the tool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1549521410577083258?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1549521410577083258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1549521410577083258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1549521410577083258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1549521410577083258'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/05/yahoo-ui.html' title='Yahoo UI'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-7860260094115139321</id><published>2007-05-02T13:04:00.000-05:00</published><updated>2007-05-02T13:13:22.676-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Agile is like driving</title><content type='html'>As I ran to the store at lunch today, it occured to me that iterative development is a lot like driving.&lt;br /&gt;&lt;br /&gt;When I first get into the car it's pointed in the direction that I want to go, but there are lots of variables that make that change.  I know what my destination is, but people can be walking, there are other cars on the road, some streets can even be under construction.  The constant adjustments that are made to drive safely are the iterations.  The closer together these iterations are with driving the better.   Waiting 5 minutes to open your eyes and check for any changes will probably cause an accident.  &lt;br /&gt;&lt;br /&gt;Iterations within project development are the same, they need to be small enough that you can prevent accidents before they occur.  In my current project we are using 1 week iterations.  I have only used 2 week iterations in the past and I was skeptical.  However, now that I'm doing it, I like the one week iteration.   We have daily feedback on our status, weekly feedback on the development that was expected, and we can adjust our schedule according to changes and unforeseen issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-7860260094115139321?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/7860260094115139321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=7860260094115139321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7860260094115139321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/7860260094115139321'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/05/agile-is-like-driving.html' title='Agile is like driving'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-247706863172641408</id><published>2007-04-23T22:06:00.000-05:00</published><updated>2007-04-23T22:23:40.735-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java difficulty</title><content type='html'>I think I know why I have been having a hard time learning Java.  Every other time I've tried learning a new language I've had a ton of ideas come flying into my head of neat programs to write using the new language.  I learn most of the things that I need to know figuring out how to implement my little pet projects.  Java however has been a different beast.  I use it because that's what I need to use at work, but for my own personal use, I haven't found a single project to try writing in Java.&lt;br /&gt;&lt;br /&gt;I think my next big leap in Java knowledge will happen when I finally come up with a project to write for fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-247706863172641408?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/247706863172641408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=247706863172641408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/247706863172641408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/247706863172641408'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/04/java-difficulty.html' title='Java difficulty'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-4277110972266743944</id><published>2007-04-19T22:50:00.000-05:00</published><updated>2007-04-19T22:57:54.648-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java plus</title><content type='html'>I have been busy the past few weeks working on a new project at work.  It's kept me away from posting very much because the stress of this project has carried over into my home life.&lt;br /&gt;&lt;br /&gt;However, I have been using some new technologies for me, and I will try to post some of the things that I've learned in the near future. &lt;br /&gt;&lt;br /&gt;Things that I've used in the past week are:&lt;br /&gt;1. OJB&lt;br /&gt;2. Java Web Services&lt;br /&gt;3. Websphere Portlet&lt;br /&gt;4. Some kind of mock object to help test the classes.&lt;br /&gt;5. A tag library in the portlet.&lt;br /&gt;&lt;br /&gt;Most of these I don't even understand what it is that I'm doing yet, I'm still just copying the same kind of things that I see being done in other places, but I'm getting closer to understanding when it is that I need to do one of those things, which is a big step in understanding how to use them.  I still have a ton to learn, but there is more coming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-4277110972266743944?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/4277110972266743944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=4277110972266743944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4277110972266743944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/4277110972266743944'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/04/java-plus.html' title='Java plus'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-1333800862557869867</id><published>2007-04-05T09:15:00.000-05:00</published><updated>2007-04-05T09:29:01.440-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>A c# coding annoyance</title><content type='html'>One thing that's been annoying me a lot recently is the block comment for c#.   Sure it's nice and easy to highlight everything and use the shortcut ctrl+k, ctrl+c, but then the whack whack is put all the way on the left.  If a curly brace changes after that then the autoformatting tabs it over to put the whacks in the position within the block of code.&lt;br /&gt;&lt;br /&gt;For example&lt;br /&gt;&lt;br /&gt;public void DoSometing()&lt;br /&gt;{&lt;br /&gt;   if( test() )&lt;br /&gt;   {&lt;br /&gt;       if(true)&lt;br /&gt;       {&lt;br /&gt;          ...Code goes here.&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When commented out it looks like this.&lt;br /&gt;public void DoSometing()&lt;br /&gt;{&lt;br /&gt;   if( test() )&lt;br /&gt;   {&lt;br /&gt;//        if(true)&lt;br /&gt;//        {&lt;br /&gt;//           ...Code goes here.&lt;br /&gt;//        }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After adding some code it looks like this.&lt;br /&gt;public void DoSometing()&lt;br /&gt;{&lt;br /&gt;   if( test() )&lt;br /&gt;    {&lt;br /&gt;       //        if(true)&lt;br /&gt;       //        {&lt;br /&gt;       //           ...Code goes here.&lt;br /&gt;       //        }&lt;br /&gt;    }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;       ... addidional code goes here.&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This becomes annoying because the code that is commented gets pushed further to the right.  I would much rather that the autoformatter leave left justified comments left justified.  It doesn't have to be smart about where the spacing falls into line.  If the block is uncommented, then the code can be repositioned to fit correctly.  Any comment that is not completely left justified could be formatted, but it doesn't have to format the left justified comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-1333800862557869867?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/1333800862557869867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=1333800862557869867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1333800862557869867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/1333800862557869867'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/04/c-coding-annoyance.html' title='A c# coding annoyance'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-6849311992708341682</id><published>2007-03-01T12:43:00.000-06:00</published><updated>2007-03-01T13:21:57.592-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Streaming Files</title><content type='html'>I recently was working on a project where I wanted to have the desktop open a file that was on the server.  However, the desktop user does not have access to the server directly.  In order to do this I had to stream the file to the browser.&lt;br /&gt;&lt;br /&gt;First I had to create a servlet&lt;br /&gt;public class DocumentViewer extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {&lt;br /&gt;&lt;br /&gt;Then I have to implement the method doGet to handle the http processing.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {&lt;br /&gt;&lt;br /&gt;//             &lt;br /&gt;  DocumentFileTO documentFile=fileDao.getDocumentFile(id);&lt;br /&gt;  resp.setContentType(javax.activation.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(documentFile.getName()));&lt;br /&gt;  resp.setHeader("Content-Disposition","attachment;filename="+documentFile.getName());&lt;br /&gt;  InputStream fileStream=documentFile.getFileContents();&lt;br /&gt;  BufferedOutputStream outBuffer=new BufferedOutputStream(resp.getOutputStream());&lt;br /&gt;&lt;br /&gt;  int c=0;&lt;br /&gt;  while(-1!=(c=fileStream.read())){&lt;br /&gt;    outBuffer.write(c);&lt;br /&gt;  }&lt;br /&gt;  outBuffer.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are a few more methods that were very key in this.&lt;br /&gt;documentFile.getFileContents()&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public InputStream getFileContents(){&lt;br /&gt;  byte[] _fileContents;&lt;br /&gt;  try {&lt;br /&gt;    File file=new File(this.getPath());  // Path has already been set.&lt;br /&gt;    FileInputStream fileStream=new FileInputStream(file);&lt;br /&gt;    ByteArrayOutputStream byteOut=new ByteArrayOutputStream();&lt;br /&gt;    int c=0;&lt;br /&gt;    while(-1!=(c=fileStream.read())){&lt;br /&gt;      byteOut.write(c);&lt;br /&gt;    }&lt;br /&gt;    _fileContents=byteOut.toByteArray();&lt;br /&gt;    return new ByteArrayInputStream(_fileContents);&lt;br /&gt;  } catch (Throwable e) {&lt;br /&gt;    throw new RuntimeException("Unable to open file " + this.getName() + ": " + e.getMessage(),e);  // Name has already been set.&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Finally, there were two very important things that I had to learn.&lt;br /&gt;resp.setContentType needs to hold the MIME-Type information for the browser to understand what it is getting.  I found that there is a built-in Java library that will provide this information.javax.activation.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType()&lt;br /&gt;It takes a filename with extension as the parameter.  The function just strips the extension and finds known MIME information for that extension.  If you are using a custom extension you will need to add your own records to the FileMap, which is possible.  I did not test how extensive the known filet ypes are because I only needed it for a total of 5 or 6 very common types, and they worked.&lt;br /&gt;&lt;br /&gt;And resp.setHeader had to have attachment; in the call. Without attachment the file was trying to open in the browser, which for me was opening everything in QuickTime.  Having attachment in the call set the file to open on the desktop using the users default application for the file type.&lt;br /&gt;&lt;br /&gt;I learned a lot on this project.  Streaming in Java, using a servlet to handle a request instead of a JSP page (this was new to me), and a little about the header information for streaming files.  However, once it's done the code to perform this feature doesn't look nearly as impressive as the amount of time it took me to research the functionality to make it all work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-6849311992708341682?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/6849311992708341682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=6849311992708341682' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6849311992708341682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/6849311992708341682'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/03/streaming-files.html' title='Streaming Files'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-9171055989917514360</id><published>2007-02-26T23:28:00.000-06:00</published><updated>2007-02-26T23:34:55.658-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>log4j and Websphere Portal</title><content type='html'>After 3 weeks of my programs not working I was pointed in the right direction by a co-worker.  it turns out that for log4j to work properly on my local server, I needed to have the class loader set to PARENT_LAST.  I had seen something about this online once, but didn't know what it was talking about.&lt;br /&gt;&lt;br /&gt;In my server settings there is a place that adentifies the class loaders for the EAR and WAR files that are in it.  These need to be set to PARENT_LAST in order for log4j to work properly. &lt;br /&gt;&lt;br /&gt;If using a websphere application (non-portal), this configuration is in the web.xml file.  Still everything has to be set to PARENT_LAST in order for it to work.&lt;br /&gt;&lt;br /&gt;Apparently having it set to PARENT_FIRST is useful in a live environment because the admin can change the logging setting without redeploying and get additional information from the application, it goes to some general log and not the log that log4j specifies in the properties file, but it's still useful to be able to make that change without redeploying. &lt;br /&gt;&lt;br /&gt;Redeploying web apps in order to change a configuration is another annoyance of Java I have learned about.  Since an exe is not deployed, but instead a war file (a zip file by another name). I figured we could just modify the contents.  But a web server loads the war file into memory one time, and it stays there until the server restarts or that component is shut down or redeployed.  In order to make a change the application needs to be redeployed basically.  Thus any changes to the WAR file would be useless.  I am a bit confused as to the benefit of having so many properties files and xml files on something that cannot be easily changed at runtime however, when the end result is the same as having all of the values hard coded.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-9171055989917514360?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/9171055989917514360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=9171055989917514360' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/9171055989917514360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/9171055989917514360'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/02/log4j-and-websphere-portal.html' title='log4j and Websphere Portal'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33118148.post-5410501352440661942</id><published>2007-02-15T20:50:00.000-06:00</published><updated>2007-02-15T20:54:25.913-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# internal Setter</title><content type='html'>I just read a &lt;a href="http://devlicio.us/blogs/billy_mccafferty/archive/2007/02/15/varying-a-property-s-get-set-accessibility.aspx"&gt;great blog&lt;/a&gt; about having different access modifiers for the get and set methods of a variable.&lt;br /&gt;&lt;br /&gt;In order to have different levels you just add the access modifier to the set method.&lt;br /&gt;&lt;br /&gt;public string Description {&lt;br /&gt;    get { return description; }&lt;br /&gt;    internal set { description = value; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is awesome.  I've had many times when I wanted to restrict the setter to my local class, so there is a controlled validation before setting, but not allow any external class to set the value directly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33118148-5410501352440661942?l=geek.amindstretched.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geek.amindstretched.com/feeds/5410501352440661942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33118148&amp;postID=5410501352440661942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5410501352440661942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33118148/posts/default/5410501352440661942'/><link rel='alternate' type='text/html' href='http://geek.amindstretched.com/2007/02/c-internal-setter.html' title='C# internal Setter'/><author><name>Steven Rigney</name><uri>http://www.blogger.com/profile/14175444989891279162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-nF45NO3Iaq4/TXeXErcWcbI/AAAAAAAAAt0/Xb4naJmSpis/s220/stevenrigney%2540gmail.com_f987490b.jpg'/></author><thr:total>0</thr:total></entry></feed>
