<?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-9881483</id><updated>2012-01-24T23:16:24.138-06:00</updated><category term='Python'/><category term='HP'/><category term='software process'/><category term='Sony'/><category term='CIS690'/><category term='sockets'/><category term='Java'/><category term='UPCRC'/><category term='NVidia'/><category term='C#'/><category term='tcp/ip'/><category term='Parallel'/><category term='git'/><category term='code smell'/><category term='clean code'/><category term='CTS'/><category term='Eclipse'/><category term='ATI'/><category term='CUDA'/><category term='ITS'/><category term='pattern'/><category term='design'/><category term='team'/><category term='developer'/><category term='productivity'/><category term='OpenCL'/><category term='data'/><title type='text'>K0EMT's: Random Access Bear</title><subtitle type='html'>Thoughts on software development and technology.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>88</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9881483.post-5438463019065117731</id><published>2011-12-09T16:18:00.005-06:00</published><updated>2011-12-09T16:26:47.383-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='clean code'/><title type='text'>Vorpal Code</title><content type='html'>Elegant code sings&amp;mdash;&lt;br/&gt;
like a mastered katana!&lt;br/&gt;
Beautiful conduct.&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-5438463019065117731?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/5438463019065117731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2011/12/vorpal-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5438463019065117731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5438463019065117731'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2011/12/vorpal-code.html' title='Vorpal Code'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-6582963494253321840</id><published>2011-12-03T16:33:00.001-06:00</published><updated>2011-12-03T16:33:08.487-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Git Reference</title><content type='html'>&lt;div style="line-height: normal; background-color: transparent"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: " id="internal-source-marker_0.2880342863500118"&gt;&lt;strong&gt;&lt;font style="font-size: 11.3pt"&gt;Git community book online: &lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;font style="font-size: 11.3pt"&gt;&lt;a href="http://book.git-scm.com/index.html"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#000099" face="Consolas"&gt;&lt;u&gt;http://book.git-scm.com/index.html&lt;/u&gt;&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font face="Arial"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;creating:&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;init, branch&lt;/strong&gt;&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;adding and removing files::&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;add, rm&lt;/strong&gt;&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;seeing activity:&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;log, status&lt;/strong&gt;&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;basic repository operations are: &lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;push,&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt; &lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;pull, commit, checkout, clone, fetch, merge&lt;/strong&gt;&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;undoing changes: &lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;reset, checkout, revert&lt;/strong&gt;&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;see files in the repo:&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;ls-files&lt;/strong&gt;&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;finding stuff:&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;grep&lt;/strong&gt;&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;labeling:&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;tag&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;Some git cheat sheets:&lt;/strong&gt;&lt;/span&gt;      &lt;br /&gt;&lt;a href="http://help.github.com/git-cheat-sheets/"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#000099" face="Arial"&gt;&lt;u&gt;http://help.github.com/git-cheat-sheets/&lt;/u&gt;&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;a href="http://cheat.errtheblog.com/s/git"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#000099" face="Arial"&gt;&lt;u&gt;http://cheat.errtheblog.com/s/git&lt;/u&gt;&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;How do I see the differences between file versions?&lt;/strong&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;git diff &amp;lt;commit hash&amp;gt; &amp;lt;filename&amp;gt;&lt;/font&gt;        &lt;br class="kix-line-break" /&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;How do I go back a to version x?&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font face="Arial"&gt;Then to revert a specific file to that commit use the reset command:&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;git reset &amp;lt;commit hash&amp;gt; &amp;lt;filename&amp;gt;&lt;/font&gt;        &lt;br class="kix-line-break" /&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font face="Arial"&gt;You may need to use the &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;--hard&lt;/font&gt;&lt;/span&gt;&lt;font face="Arial"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt; option if you have local modifications.&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;A good workflow for managaging waypoints is to use tags to cleanly mark points in your timeline. I can't quite understand your last sentence but what you may want is diverge a branch from a previous point in time. To do this, use the handy checkout command:&lt;/span&gt;&lt;/font&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;git checkout &amp;lt;commit hash&amp;gt;         &lt;br class="kix-line-break" /&gt;git checkout -b &amp;lt;new branch name&amp;gt;&lt;/font&gt;        &lt;br class="kix-line-break" /&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font face="Arial"&gt;You can then rebase that against your mainline when you are ready to merge those changes:&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;git checkout &amp;lt;my branch&amp;gt;         &lt;br class="kix-line-break" /&gt;git rebase master          &lt;br class="kix-line-break" /&gt;git checkout master          &lt;br class="kix-line-break" /&gt;git merge &amp;lt;my branch&amp;gt;&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;How do I find/look at a files history (log)?&lt;/strong&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;git log &amp;lt;filename&amp;gt;&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;a href="http://book.git-scm.com/3_reviewing_history_-_git_log.html"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#000099" face="Arial"&gt;&lt;u&gt;http://book.git-scm.com/3_reviewing_history_-_git_log.html&lt;/u&gt;&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font face="Arial"&gt;Using --stat with log will show what files changed and by how much.&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;git log --stat&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font face="Arial"&gt;There is also a --pretty option that provides several nicer ways of presenting the results&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font face="Consolas"&gt;&lt;font style="background-color: #efefef"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;git log --pretty=oneline&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;          &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;git log --pretty=short&lt;/span&gt;          &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;git log --pretty=&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#333333"&gt;format:'%h was %an, %ar, message: %s'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#333333" face="Arial"&gt;You can also use 'medium', 'full', 'fuller', 'email' or 'raw'. If those formats aren't exactly what you need, you can also create your own format with the '--pretty=format' option (see the &lt;/font&gt;&lt;/span&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-log.html"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#6e212e" face="Arial"&gt;&lt;u&gt;git log&lt;/u&gt;&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#333333" face="Arial"&gt; docs for all the formatting options).&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;strong&gt;How do I roll back/throw away current changes?&lt;/strong&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;Use &lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;em&gt;checkout&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt; if you haven’t committed yet.&lt;/span&gt;      &lt;br /&gt;&lt;font face="Consolas"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #efefef" color="#333333"&gt;$ git checkout -- hello.rb           &lt;br class="kix-line-break" /&gt;$ git checkout HEAD hello.rb&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;        &lt;br /&gt;&lt;/font&gt;&lt;a href="http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font color="#000099" face="Consolas"&gt;&lt;u&gt;http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html&lt;/u&gt;&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;Use &lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;em&gt;revert &lt;/em&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;to fix committed mistakes.&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font face="Arial"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;You have to be careful when you say &amp;quot;rollback&amp;quot;. If you used to have one version of a file in commit $A, and then later made two changes in two separate commits $B and $C (so what you are seeing is the third iteration of the file), and if you say &amp;quot;I want to roll back to the first one&amp;quot;, do you really mean it?&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;If you want to get rid of the changes both the second and the third iteration, it is very simple:&lt;/span&gt;&lt;/font&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;$ git checkout $A file&lt;/font&gt;        &lt;br class="kix-line-break" /&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font face="Arial"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;and then you commit the result. The command asks &amp;quot;I want to check out the file from the state recorded by the commit $A&amp;quot;.&lt;/span&gt;        &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;On the other hand, what you meant is to get rid of the change the second iteration (i.e. commit $B) brought in, while keeping what commit $C did to the file, you would want to revert $B&lt;/span&gt;&lt;/font&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="background-color: #eeeeee" face="Consolas"&gt;$ git revert $B&lt;/font&gt;        &lt;br class="kix-line-break" /&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font face="Arial"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;Note that whoever created commit $B may not have been very disciplined and may have committed totally unrelated change in the same commit, and this revert may touch files other than &lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;em&gt;file&lt;/em&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt; you see offending changes, so you may want to check the result carefully after doing so.&lt;/span&gt;&lt;/font&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;Disclaimer: I created the layout of this document, along with the questions I wanted answered for myself.&amp;#160; The answers are gleaned and &lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;em&gt;lightly &lt;/em&gt;&lt;/span&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;edited from results I found during the research process.&amp;#160; Quite a few answers were found on &lt;/span&gt;&lt;/font&gt;&lt;a href="http://stackoverflow.com/"&gt;&lt;span style="font-family: ; white-space: pre-wrap; color: ; vertical-align: baseline; text-decoration: "&gt;&lt;font style="font-size: 11.3pt" color="#000099"&gt;&lt;u&gt;stackoverflow.com&lt;/u&gt;&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-6582963494253321840?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/6582963494253321840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2011/12/git-reference.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6582963494253321840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6582963494253321840'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2011/12/git-reference.html' title='Git Reference'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-3795016190324935951</id><published>2011-10-20T00:47:00.002-05:00</published><updated>2011-11-04T18:45:48.508-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='clean code'/><category scheme='http://www.blogger.com/atom/ns#' term='software process'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python Coding Standard, Metrics and Test Coverage</title><content type='html'>&lt;h2&gt;Motivation&lt;/h2&gt;  &lt;p&gt;My motivation in seeking a coding standard, static code metrics analyzer and test coverage tool is multifaceted.&amp;#160; I want to know that my Python code is formatted in a way that is accepted by the community.&amp;#160; I want to be able to quickly check the cyclomatic complexity of code.&amp;#160; It is my intent to test drive my code.&amp;#160; Therefore, I wanted a tool which could show me and others the level of code coverage and any areas that need to be brought under test.&lt;/p&gt;  &lt;p align="left"&gt;Note that the preferred download for all three of these tools is a .tar.gz format file.&amp;#160; On a Windows system you’ll need a tool like &lt;a href="http://www.7-zip.org/"&gt;7-zip&lt;/a&gt;.&amp;#160; All of this guidance is intended for use with Python 2.7 and PyCharm 1.5.4.&amp;#160; You need to add &lt;font face="Consolas"&gt;C:\Python27\&lt;/font&gt; to your &lt;font face="Consolas"&gt;PATH&lt;/font&gt; environment variable in order to successfully install these tools.&lt;/p&gt;  &lt;h2&gt;PEP8&lt;/h2&gt;  &lt;p&gt;PEP8 is a tool that provides guidance that you are following proper Python coding formatting.&amp;#160; Download from here: &lt;a href="http://pypi.python.org/pypi/pep8"&gt;http://pypi.python.org/pypi/pep8&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Extract the PEP8 folder.&amp;#160; Using a command prompt change to the extracted PEP8 folder directory.&amp;#160; Run: &lt;font face="Consolas"&gt;python setup.py install &lt;/font&gt;There should now be a &lt;font face="Consolas"&gt;pep8.exe&lt;/font&gt; and &lt;font face="Consolas"&gt;pep8-script.py&lt;/font&gt; in your python installations scripts directory.&amp;#160; You can now delete the extracted PEP8 folder.&lt;/p&gt;  &lt;h2&gt;PEP8 with PyCharm&lt;/h2&gt;  &lt;p&gt;From &lt;a href="http://www.in-nomine.org/2010/12/14/pycharm-and-external-lint-tools/"&gt;http://www.in-nomine.org/2010/12/14/pycharm-and-external-lint-tools/&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;PyCharm already has a number of features present in various tools to lint/check your source code with, but offers a way to hook up external tools. Under File &amp;gt; Settings is a section called IDE Settings. One of the headings here is called External Tools. Select this heading and then press the Add... button on the right hand pane to configure a new external tool.&lt;/p&gt;    &lt;p&gt;In the Edit Tool window that now appeared fill in a name, e.g. PEP8 and a group name Lint and add a description. Next point the Program to the location of the pep8.exe executable, e.g. C:\Python27\Scripts\pep8.exe. ForParameters you need to use $FilePath$ and Working directory should be same as the Python scripts directory. Once done, you can close it by pressing the OK button.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now add a filter to the external tool to get click-and-go-to behavior&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-xecPoCgT2Lc/Tp-10nIgnfI/AAAAAAAAAUw/w-V0FvwG82M/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-uCM-qT29NZ0/Tp-11VG3qTI/AAAAAAAAAU4/kBkV0NE6s20/image_thumb%25255B3%25255D.png?imgmax=800" width="510" height="301" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;See &lt;a href="http://www.jetbrains.com/pycharm/webhelp/add-filter-dialog.html"&gt;http://www.jetbrains.com/pycharm/webhelp/add-filter-dialog.html&lt;/a&gt; for how to add filters.&lt;/p&gt;  &lt;p&gt;use this for the spec: &lt;font face="Consolas"&gt;$FILE_PATH$:$LINE$:$COLUMN$:.*&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-pdRnvVVbw_o/Tp-12DjtqpI/AAAAAAAAAVA/0p9LH7kWXI8/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-vCXqminm548/Tp-12briqVI/AAAAAAAAAVI/Mb9apMCMMZY/image_thumb%25255B1%25255D.png?imgmax=800" width="327" height="231" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Select a file either in the navigator or editor panes.&lt;/p&gt;  &lt;p&gt;Then from menu can go to Tools &amp;gt; Lint &amp;gt; PEP8&lt;/p&gt;  &lt;p&gt;You'll also have links you can click on for the PEP8 output.&lt;/p&gt;  &lt;p&gt;Following my initial installation notes on a second machine I was getting a urllib.parse error from PEP8.exe, &amp;quot;no module named parse&amp;quot; Seemed like this problem is related to distribute. Pulled down the latest from &lt;a href="http://pypi.python.org/pypi/distribute"&gt;http://pypi.python.org/pypi/distribute&lt;/a&gt; Nope, wouldn't install. Looking like issue with C:\python27\lib\urllib2.py.&amp;#160; Web pointed me to reinstall setuptools &lt;a href="http://pypi.python.org/pypi/setuptools"&gt;http://pypi.python.org/pypi/setuptools&lt;/a&gt;&amp;#160; Installed that… tried to install distribute again… still no go… X|&amp;#160; Ended up doing a &lt;font face="Consolas"&gt;python setup.py install&lt;/font&gt; to get distribute installed.&amp;#160; Now, PEP8 works!&lt;/p&gt;  &lt;h2&gt;PyMetrics&lt;/h2&gt;  &lt;p&gt;PyMetrics is a tool for doing static code analysis.&amp;#160; Download it here: &lt;a href="https://github.com/ipmb/PyMetrics/downloads"&gt;https://github.com/ipmb/PyMetrics/downloads&lt;/a&gt; There is a tar.gz on SourceForge. However, the pymetrics runner does not have the .py extension which causes problems with extraction on a Windows System.&lt;/p&gt;  &lt;p&gt;Extract your downloaded file.&amp;#160; Change to that directory and run &lt;font face="Consolas"&gt;python setup.py install&amp;#160; &lt;/font&gt;You can now delete the extracted folder.&amp;#160; Now if you look in your Python scripts directory you'll find a pymetrics.py&lt;/p&gt;  &lt;p&gt;Set up as an external tool in PyCharm as with PEP8.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-iKAXD5Y8a7Y/Tp-12-7D5OI/AAAAAAAAAVQ/H9o46_fMJNg/s1600-h/image%25255B11%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-PqoLTO5B3Ik/Tp-13WbxdxI/AAAAAAAAAVY/pHpBtSjObvs/image_thumb%25255B5%25255D.png?imgmax=800" width="508" height="298" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The &lt;font face="Consolas"&gt;--nosql&lt;/font&gt; and &lt;font face="Consolas"&gt;--nocsv&lt;/font&gt; options tell the tool to not generate associated SQL insert code and suppresses the generation of a related CSV file.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Sample output from DarkMatterLogger.py&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;An earlier version of the DarkMatterLogger.py that was analyzed can be found here: &lt;a title="https://gist.github.com/1218497" href="https://gist.github.com/1218497"&gt;https://gist.github.com/1218497&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;C:\Python27\python.exe C:\Python27\Scripts\pymetrics C:\macts\source\spikes\DarkMatterLogger.py     &lt;br /&gt;=== File: C:\macts\source\spikes\DarkMatterLogger.py ===      &lt;br /&gt;Module C:\macts\source\spikes\DarkMatterLogger.py is missing a module doc string. Detected at line 1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Basic Metrics for module C:\macts\source\spikes\DarkMatterLogger.py     &lt;br /&gt;--------------------------------------------------------------&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4&amp;#160;&amp;#160;&amp;#160; maxBlockDepth     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 12&amp;#160;&amp;#160;&amp;#160; numBlocks      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3726&amp;#160;&amp;#160;&amp;#160; numCharacters      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2&amp;#160;&amp;#160;&amp;#160; numClasses      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 15&amp;#160;&amp;#160;&amp;#160; numComments      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5&amp;#160;&amp;#160;&amp;#160; numFunctions      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 24&amp;#160;&amp;#160;&amp;#160; numKeywords      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 104&amp;#160;&amp;#160;&amp;#160; numLines      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 668&amp;#160;&amp;#160;&amp;#160; numTokens&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 14.42 %Comments&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Functions DocString present(+) or missing(-)     &lt;br /&gt;--------------------------------------------&lt;/font&gt;&lt;font face="Courier New"&gt;- DarkMatterLogger.__init__     &lt;br /&gt;- DarkMatterLogger.sendMessage      &lt;br /&gt;- DarkMatterViewer.__init__      &lt;br /&gt;- DarkMatterViewer.__init__.msg_consumer      &lt;br /&gt;- main&lt;/font&gt;    &lt;br /&gt;&lt;font face="Courier New"&gt;Classes DocString present(+) or missing(-)     &lt;br /&gt;------------------------------------------&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;- DarkMatterLogger     &lt;br /&gt;- DarkMatterViewer&lt;/font&gt;    &lt;br /&gt;&lt;font face="Courier New"&gt;McCabe Complexity Metric for file C:\macts\source\spikes\DarkMatterLogger.py     &lt;br /&gt;--------------------------------------------------------------&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160; DarkMatterLogger.__init__     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160; DarkMatterLogger.sendMessage      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160; DarkMatterViewer.__init__      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2&amp;#160;&amp;#160;&amp;#160; DarkMatterViewer.__init__.msg_consumer      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160; __main__      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4&amp;#160;&amp;#160;&amp;#160; main&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;COCOMO 2's SLOC Metric for C:\macts\source\spikes\DarkMatterLogger.py     &lt;br /&gt;--------------------------------------------------------------&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 55&amp;#160;&amp;#160;&amp;#160; C:\macts\source\spikes\DarkMatterLogger.py     &lt;br /&gt;*** Processed 1 module in run ***&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Process finished with exit code 0&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;Coverage.py&lt;/h2&gt;  &lt;p&gt;Coverage.py is a tool for doing code coverage analysis.&amp;#160; Download it here: &lt;a href="http://pypi.python.org/pypi/coverage"&gt;http://pypi.python.org/pypi/coverage&lt;/a&gt;&amp;#160; If you have a 64bit installation you’ll want to make sure you use the .tar.gz and not succumb to using a prepackaged exe.&lt;/p&gt;  &lt;p&gt;Downloaded the coverage-3.5.1.tar.gz version.&amp;#160; Extract folder from gzipped tar file.&amp;#160; Chang to directory of download and: &lt;font face="Consolas"&gt;python setup.py install&amp;#160; &lt;/font&gt;Now if look in &lt;font face="Consolas"&gt;c:\python27\lib\site-packages&lt;/font&gt; will see &lt;font face="Consolas"&gt;coverage-3.5.1-py2.7.egg&lt;/font&gt; Look in the scripts dir and a &lt;font face="Consolas"&gt;coverage.exe&lt;/font&gt; and &lt;font face="Consolas"&gt;coverage-script.py &lt;/font&gt;will be seen.&lt;/p&gt;  &lt;p&gt;Gather metrics on your code with: &lt;font face="Consolas"&gt;coverage run class.py&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Then get the report with: &lt;font face="Consolas"&gt;coverage report -m&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The -m says show the line #s of statements that were not executed.&amp;#160; Use &lt;font face="Consolas"&gt;coverage erase&lt;/font&gt; to get rid of previously run data.&amp;#160; During my experimenting every run would get rid of previous data.&amp;#160; &lt;/p&gt;  &lt;p&gt;Set up as an external tool in PyCharm like other tools.&amp;#160; Except had to do one for the run and another for the report.&amp;#160; Others are integrating into their environment using nose.&lt;/p&gt;  &lt;p&gt;Name: &lt;strong&gt;Coverage&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;For program: &lt;font face="Consolas"&gt;C:\Python27\Scripts\coverage.exe&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;For parameters:&lt;font face="Consolas"&gt; run $FileName$&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Working directory: &lt;font face="Consolas"&gt;$FileDir$&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Name:&lt;strong&gt; Coverage Report&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;For program: &lt;font face="Consolas"&gt;C:\Python27\Scripts\coverage.exe&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;For parameters: &lt;font face="Consolas"&gt;report -m&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Working directory: &lt;font face="Consolas"&gt;$FileDir$&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Coverage Sample Output&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;C:\Python27\Scripts\coverage.exe run C:\macts\source\spikes\ArgumentsTests.py     &lt;br /&gt;...........      &lt;br /&gt;----------------------------------------------------------------------      &lt;br /&gt;Ran 11 tests in 0.004s&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;OK&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Process finished with exit code 0&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Coverage Report Sample Output&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;C:\Python27\Scripts\coverage.exe report -m     &lt;br /&gt;Name&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stmts&amp;#160;&amp;#160; Miss&amp;#160; Cover&amp;#160;&amp;#160; Missing      &lt;br /&gt;----------------------------------------------      &lt;br /&gt;arguments&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 33&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 100%&amp;#160;&amp;#160; &lt;br /&gt;argumentstests&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 45&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 100%&amp;#160;&amp;#160; &lt;br /&gt;----------------------------------------------      &lt;br /&gt;TOTAL&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 78&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; 100%&amp;#160;&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;Process finished with exit code 0&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;By integrating these three tools into your development process you’ll increase the community acceptance of the code you produce as well as increase the quality of the code you produce.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-3795016190324935951?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/3795016190324935951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2011/10/python-coding-standard-metrics-and-test.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3795016190324935951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3795016190324935951'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2011/10/python-coding-standard-metrics-and-test.html' title='Python Coding Standard, Metrics and Test Coverage'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-uCM-qT29NZ0/Tp-11VG3qTI/AAAAAAAAAU4/kBkV0NE6s20/s72-c/image_thumb%25255B3%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-7948513620817038953</id><published>2011-07-11T06:06:00.005-05:00</published><updated>2011-08-02T23:05:29.116-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Getting the Enron mail database into MongoDB</title><content type='html'>&lt;h2&gt;Background&lt;/h2&gt;  &lt;p&gt;In order to get some experience working with Python and MongoDB I decided I would like to find a data source with a lot of free form text.  This would give me experience in pulling the data into MongoDB and at a future date I’ll have a ready data source for use with learning &lt;a href="http://www.nltk.org/"&gt;NLTK&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Finding a large dataset that met my needs turned out to be harder than expected.  I came across &lt;a href="http://www.hilarymason.com/"&gt;Hilary Mason&lt;/a&gt;’s &lt;a href="https://bitly.com/bundles/hmason/1"&gt;link page of research-quality data sets&lt;/a&gt; and found the &lt;a href="http://www.cs.cmu.edu/~enron/"&gt;Enron email dataset&lt;/a&gt;.  This data set contains over 500K emails.  The emails are in individual files stored in a directory structure.  To me, the first step in being able to use the data is to get it into a database where I could query it.&lt;/p&gt;  &lt;h2&gt;The environment&lt;/h2&gt;  &lt;p&gt;The code was developed on  an Intel Core-I7 machine with 6G of RAM and a 5400RPM hard disk.  This code is I/O intensive and could have benefitted from a faster hard disk or an SSD.  The host OS was &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 11.04 64bit.  The tools used were &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; 2.7 with &lt;a href="http://pypi.python.org/pypi/pymongo/"&gt;pymongo&lt;/a&gt; and &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;.&lt;/p&gt; 

&lt;h2&gt;The code&lt;/h2&gt;
&lt;script src="https://gist.github.com/1120767.js?file=Enron_to_Mongo.py"&gt;&lt;/script&gt;

&lt;h2&gt;How to query&lt;/h2&gt;&lt;p&gt;You can use the mongo shell to do some queries once you have loaded the data.&lt;/p&gt;  &lt;p&gt;“use the enron_mail” database and you can do the following:&lt;/p&gt;  &lt;p&gt;&lt;span&gt;db.messages.find({ contents : /query text/i }).limit(1).skip(0);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Besides &lt;span&gt;content&lt;/span&gt;, the document structure also includes: &lt;span&gt;mailbox&lt;/span&gt;, &lt;span&gt;subFolder&lt;/span&gt; and &lt;span&gt;filename&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;Here are some additional links with material on the shell and how to query:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell"&gt;http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell&lt;/a&gt; &lt;a href="http://www.mongodb.org/display/DOCS/Tutorial"&gt;http://www.mongodb.org/display/DOCS/Tutorial&lt;/a&gt; &lt;a href="http://www.mongodb.org/display/DOCS/Querying"&gt;http://www.mongodb.org/display/DOCS/Querying&lt;/a&gt; 
&lt;a href="http://www.mongodb.org/display/DOCS/Advanced+Queries"&gt;http://www.mongodb.org/display/DOCS/Advanced+Queries&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Analysis&lt;/h2&gt;  &lt;p&gt;Important things to note about the code:&lt;/p&gt;  &lt;li&gt;change the &lt;span&gt;MAIL_DIR_PATH&lt;/span&gt; variable to match your installation.&lt;/li&gt;  &lt;li&gt;getFileContents decodes the text as being in cp1252 character set&lt;/li&gt;  &lt;li&gt;saveToDatabase encodes the text in utf-8 for mongo compatibility&lt;/li&gt;  &lt;li&gt;The &lt;span&gt;os.walk&lt;/span&gt; method is key to the simplicity of this code&lt;/li&gt;  &lt;p&gt;Here are some references on unicode:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://docs.python.org/howto/unicode.html"&gt;http://docs.python.org/howto/unicode.html&lt;/a&gt; 
&lt;a href="http://stackoverflow.com/questions/4685568/importing-file-with-unknown-encoding-from-python-into-mongodb"&gt;http://stackoverflow.com/questions/4685568/importing-file-with-unknown-encoding-from-python-into-mongodb&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The full run took ~21 minutes after an initial run that probably had a bunch of files in cache.  The run maxed out a single core of the CPU. The process was i/o bound with the hard drive. The full 6G of RAM was in use on the machine&lt;/p&gt;  &lt;p&gt;My query of MonogoDB says I have 517,424 emails in the document store.  It shouldn’t be too difficult to modify the code to work with your database of choice.&lt;/p&gt;  &lt;p&gt;I hope you find this code useful and that it enables you to do some analysis with this dataset.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-7948513620817038953?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/7948513620817038953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2011/07/getting-enron-mail-database-into.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/7948513620817038953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/7948513620817038953'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2011/07/getting-enron-mail-database-into.html' title='Getting the Enron mail database into MongoDB'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-4922706917659791178</id><published>2010-12-30T08:35:00.001-06:00</published><updated>2010-12-30T08:35:03.234-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title type='text'>Work when others are not</title><content type='html'>&lt;p&gt;I read &lt;a href="http://timemanagementninja.com/2010/12/work-when-others-are-not/"&gt;an interesting blog post from the Time Management Ninja&lt;/a&gt; where he talks about getting things done at the office during the last week of the year.&lt;/p&gt;  &lt;p&gt;However, it wasn’t quite what I expected when I had seen the title (same as this blog post).&amp;#160; For me, working when others are not is typically about quiet time at home or on the road working on personal or academic pursuits.&amp;#160; To get this quiet time I typically “work when others are not” by getting up earlier than the rest of the house or staying up later.&lt;/p&gt;  &lt;p&gt;While you can stay up later to work on things, I have found that past a certain time it just doesn’t matter.&amp;#160; The mind fogs and the body starts forcing shutdown routines to run!&lt;/p&gt;  &lt;p&gt;The approach that requires more discipline but I find is ultimately the better choice is to go to bed earlier and get up earlier.&amp;#160; You awake refreshed, with clear head and a quiet house.&amp;#160; Here are some tips to help you get that time in the morning:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Figure out how many hours of sleep you need and how many hours you want for yourself before you have to leave for work or school in the morning.&amp;#160; Set your go to bed time accordingly.&lt;/li&gt;    &lt;li&gt;Set an alarmed reminder for 30 minutes before your go to bed time.&amp;#160; Start your shutdown routine.&lt;/li&gt;    &lt;li&gt;Use the alarm on your phone as your alarm clock and have it set to the minimum volume necessary.&amp;#160; Set it up to not beep through the night for email or social network alerts.&lt;/li&gt;    &lt;li&gt;Shower the night before (but not at the last minute which wakes you back up)&lt;/li&gt;    &lt;li&gt;Lay out your clothes the night before.&amp;#160; You may need to get dressed in the bathroom or other location so you don’t wake up others in the house.&lt;/li&gt;    &lt;li&gt;Have your workspace ready to go.&amp;#160; Leave yourself a note of what you are going to work on.&amp;#160; Have a bottle of water and perhaps a light snack there too.&lt;/li&gt;    &lt;li&gt;Pack your lunch the night before.&lt;/li&gt;    &lt;li&gt;If you are going to check email or your favorite sites, set a timer so you don’t blow all your quiet time on that.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I hope you find this information useful and are able to enjoy a more calm morning and enjoy some more sunrises!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-4922706917659791178?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/4922706917659791178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/12/work-when-others-are-not.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4922706917659791178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4922706917659791178'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/12/work-when-others-are-not.html' title='Work when others are not'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-1115749196262994447</id><published>2010-11-07T16:13:00.001-06:00</published><updated>2010-11-07T16:13:14.237-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='sockets'/><category scheme='http://www.blogger.com/atom/ns#' term='ITS'/><category scheme='http://www.blogger.com/atom/ns#' term='tcp/ip'/><category scheme='http://www.blogger.com/atom/ns#' term='CIS690'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel'/><category scheme='http://www.blogger.com/atom/ns#' term='CTS'/><title type='text'>Traffic Flow Simulator</title><content type='html'>&lt;h2&gt;Overview demo&lt;/h2&gt;  &lt;p&gt;This video is a demonstration of simulating traffic flow within and between intersections/local networks using a tcp/ip server and multiple clients. The clients have factories that either create cars or receive them from the server. The client then simulates the traffic flow until the cars arrive at a &amp;quot;sink&amp;quot; or graph exit. The sink may be a normal sink or a network sink. For a normal sink, the vehicles are simply removed from the graph. If it is a network sink the car data is sent on to the server.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=f1qgI55ULIY"&gt;http://www.youtube.com/watch?v=f1qgI55ULIY&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;RNS Basics&lt;/h2&gt;  &lt;p&gt;Helpers includes a few utility or helper classes. For instance an easy way to get the local machine name and a StopWatch class.&lt;/p&gt;  &lt;p&gt;Demos are examples that demonstrate the basic serial and threaded worlds as well as the distributed clients. The Repeater class in the distributed package has a main() which works as the server.&lt;/p&gt;  &lt;p&gt;The Render package has a text render which is used to output information about the network structure and the location of vehicles on the network.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=1ndETp0ALHA"&gt;http://www.youtube.com/watch?v=1ndETp0ALHA&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;RNS Basics Part 2&lt;/h2&gt;  &lt;p&gt;In this video I will review, links, connectors, vehicle factories and Cars.&lt;/p&gt;  &lt;p&gt;Links can be thought of as stretches of road. There was some initial code put in place for using coordinates to describe the link geometry. Links are the logical area where you will find cars. Sinks and factories are also special types of links. Sinks destroy cars and factories create them.&lt;/p&gt;  &lt;p&gt;Connectors can be thought of as intersections. They have entry and exit links. Imagine that you are driving in your car approaching an intersection. You are on an entry link to that connector. When you pass through the intersection to a connecting you road, you have driven onto an exit link.&lt;/p&gt;  &lt;p&gt;A Vehicle Factory is used to bring cars onto the local graph.&lt;/p&gt;  &lt;p&gt;Cars carry a globally unique identifier.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=mlTNdqSToTo"&gt;http://www.youtube.com/watch?v=mlTNdqSToTo&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;The World&lt;/h2&gt;  &lt;p&gt;The World Factory is used to create worlds. It can create serial or threaded worlds. It can be used to create several different road structures.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=jmsyjkdxIVg"&gt;http://www.youtube.com/watch?v=jmsyjkdxIVg&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;The Server&lt;/h2&gt;  &lt;p&gt;The Repeater accepts client connections. It repeats the data from them to all other connected nodes along with the identity of the originating node. If it detects that a node has dropped it removes it from it's client list.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=ktHGs-DpgeA"&gt;http://www.youtube.com/watch?v=ktHGs-DpgeA&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Basics of a client node&lt;/h2&gt;  &lt;p&gt;A Distributed Client uses the DistributedWorldFactory to create an instance of a DistributedWorld. The DistributedWorld is very similar to the normal distributed world. However, it includes distributed links and the distributed vehicle factory. The world handles the connection with the server. When processing vehicles that are in sinks as part of the update method, outgoing vehicle is sent to the repeater/server if is a distributed link (sink). The world also receives the incoming repeated car data from the repeater. The world passes the data on to all listening factories. The distributed factory determines if it needs the information. If it does, it places it in an incoming queue. Then when the world asks for a shipment from the factory, the factory sends the information about the cars that are in the queue. Even while the world is adding new information to the queue!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=Cc1nYuTujZY"&gt;http://www.youtube.com/watch?v=Cc1nYuTujZY&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Network and Node configurations&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_EdDlpJZIv_Q/TNckdrFsJiI/AAAAAAAAAP4/PqHDyDFuDXM/s1600-h/clip_image001%5B42%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Distributed Road Network System" border="0" alt="Network and Node configuration diagram" src="http://lh3.ggpht.com/_EdDlpJZIv_Q/TNckeTSuLOI/AAAAAAAAAP8/VGCK2JtIbOc/clip_image001_thumb%5B39%5D.png?imgmax=800" width="504" height="250" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Node A configuration&lt;/h5&gt;  &lt;p&gt;This node starts with a normal factory. It is connected to a link which is in turn connected to a network sink. The network sink relays information to the repeater.&lt;/p&gt;  &lt;h5&gt;Node B configuration&lt;/h5&gt;  &lt;p&gt;This node has a distributed factory which is listening for car data that originates from Node A. It is connected to a link which is in turn connected to a network sink. The network sink relays information to the repeater.&lt;/p&gt;  &lt;h5&gt;Node C configuration&lt;/h5&gt;  &lt;p&gt;This node has a distributed factory which is listening for car data that originates from Node B. It is connected to a link which is in turn connected to a normal sink. The normal sink simply removes the cars from the local graph.&lt;/p&gt;  &lt;h2&gt;Files&lt;/h2&gt;  &lt;p&gt;You can get a JAR with the code here &lt;a href="http://dbbear.com/TrafficFlowSimulator.jar"&gt;http://dbbear.com/TrafficFlowSimulator.jar&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Sample output, which corresponds to the video run can be obtained here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://dbbear.com/tfs_repeater.txt"&gt;http://dbbear.com/tfs_repeater.txt&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://dbbear.com/tfs_nodeA.txt"&gt;http://dbbear.com/tfs_nodeA.txt&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://dbbear.com/tfs_nodeB.txt"&gt;http://dbbear.com/tfs_nodeB.txt&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://dbbear.com/tfs_nodeC.txt"&gt;http://dbbear.com/tfs_nodeC.txt&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Conclusions&lt;/h2&gt;  &lt;p&gt;A developer using this code structure will need to be careful to not have multiple distributed factories that pull from the same network sink. If this were to happen we'd have cloned cars in the overall network.&lt;/p&gt;  &lt;p&gt;Association of vehicles with graph objects seems awkward. In a system that is highly focused on traffic a system that uses GIS type concepts would likely be better.&lt;/p&gt;  &lt;p&gt;While this code may not be ideal for true traffic simulation because of the way vehicles are associated with individual graph elements, it does a good job of demonstrating threading and client-server based communication.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-1115749196262994447?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/1115749196262994447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/11/traffic-flow-simulator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/1115749196262994447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/1115749196262994447'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/11/traffic-flow-simulator.html' title='Traffic Flow Simulator'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_EdDlpJZIv_Q/TNckeTSuLOI/AAAAAAAAAP8/VGCK2JtIbOc/s72-c/clip_image001_thumb%5B39%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-9037105747142804645</id><published>2010-10-03T00:59:00.001-05:00</published><updated>2010-10-03T01:22:10.114-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='CIS690'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel'/><title type='text'>Transforming from serial to threaded</title><content type='html'>&lt;h2&gt;Background&lt;/h2&gt;  &lt;p&gt;As part of an experimenting project I am transforming code that I initially wrote for simulating traffic on a road network into a threaded version.&lt;/p&gt;  &lt;h2&gt;Initial Threading&lt;/h2&gt;  &lt;p&gt;Initial threading of the removing of cars in sinks (road network exits) yielded a longer run time for the threaded version. Most likely the issue is the limited number of vehicles and only two sinks.&lt;/p&gt;  &lt;p&gt;With this aspect of the project I worked with java.util.concurrent Executors and pooled task execution using maximum/free pool size, a fixed pool size and a pool handled by a single thread.&lt;/p&gt;  &lt;p&gt;Using implements Runnable simulation runs: 5 Simulated run time: 600 seconds&lt;/p&gt;  &lt;div style="direction: ltr"&gt;   &lt;table style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; border-collapse: collapse; direction: ltr; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid" border="1" cellspacing="0" cellpadding="0" valign="top"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.562in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.29&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.222&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.202&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.205&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.2&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.824in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 1.866&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 1.275&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 1.202&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 1.273&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 1.122&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;Changed up some data structures ConcurrentHashMap and tweaked the code in terms of variable scope.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Using fixed thread pool size of 2 Following result:&lt;/p&gt;  &lt;div style="direction: ltr"&gt;   &lt;table style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; border-collapse: collapse; direction: ltr; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid" border="1" cellspacing="0" cellpadding="0" valign="top"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.545in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.276&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.199&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.16&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.161&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.162&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.854in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 1.335&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 0.914&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 0.846&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 0.837&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 0.876&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;&lt;/p&gt;  &lt;p&gt;A thread pool size = 2 performs about the same or slightly better than a threadpool size = 1&lt;/p&gt;  &lt;p&gt;A thread pool size of &amp;gt; 2 yields worse results than equal to 2.&amp;#160; &lt;/p&gt;  &lt;p&gt;So overall, this result is somewhat disappointing.&amp;#160; After some discussion with my advising professor I set about profiling the code.&lt;/p&gt;  &lt;h2&gt;Setup Profiling&lt;/h2&gt;  &lt;p&gt;After some initial research, I decided to give the TPTP project a try.&amp;#160; Primarily since it is part of the overall Eclipse program and installs into the environment.&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="516"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="145"&gt;TPTP Page&lt;/td&gt;        &lt;td valign="top" width="369"&gt;         &lt;p style="margin: 0in; font-family: consolas; font-size: 11pt"&gt;&lt;a href="http://www.eclipse.org/tptp/index.php"&gt;http://www.eclipse.org/tptp/index.php&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="145"&gt;How to install from within Eclipse&lt;/td&gt;        &lt;td valign="top" width="369"&gt;         &lt;p style="margin: 0in; font-size: 11pt"&gt;&lt;a href="http://wiki.eclipse.org/Install_TPTP_with_Update_Manager"&gt;&lt;span style="font-family: consolas"&gt;http://wiki.eclipse.org/Install_TPTP_with_Update_Manager&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: georgia"&gt; &lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="145"&gt;How to setup your project&lt;/td&gt;        &lt;td valign="top" width="369"&gt;         &lt;p style="margin: 0in; font-family: consolas; font-size: 11pt"&gt;&lt;a href="http://www.eclipse.org/tptp/monitoring/documents/tutorials/tptp_btm_setup_4.3.html"&gt;http://www.eclipse.org/tptp/monitoring/documents/tutorials/tptp_btm_setup_4.3.html&lt;/a&gt; &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div style="direction: ltr"&gt;&amp;#160;&lt;/div&gt;  &lt;div style="direction: ltr"&gt;After doing the install, I was able to open Eclipse to my project and choose Profile As.&amp;#160; This in turn put me into the profile creator, where I chose to profile the threading.&amp;#160; I was also prompted to switch to the profiling perspective.&amp;#160; Click the checkbox to not be prompted every time to switch perspectives.&lt;/div&gt;  &lt;p&gt;If there is a lot of information for the profiler to process it will consume quite a bit of CPU and leave Eclipse unresponsive while it is processing.&amp;#160; For my project five simulation runs for 60 seconds would leave you with an unresponsive environment and the need to kill the application.&amp;#160; Understand, that since this project is an exercise in threading that there are many threads and pools.&amp;#160; A single 60 second simulation run yields 2400 pools with several threads each.&lt;/p&gt;  &lt;h2&gt;Profiling&lt;/h2&gt;  &lt;p&gt;The initial thread statistics, blocked time/count and deadlocked time/count show the trouble spots.&lt;a href="http://lh5.ggpht.com/_EdDlpJZIv_Q/TKgbsPS8fnI/AAAAAAAAAOM/dmxxkKkpueM/s1600-h/clip_image001%5B26%5D.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://lh4.ggpht.com/_EdDlpJZIv_Q/TKgbsgJJl0I/AAAAAAAAAOQ/8KpVjF5tqps/clip_image001_thumb%5B21%5D.png?imgmax=800" width="519" height="43" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Under Monitor statistics, you can drill down further.&amp;#160; Now I have a really good idea of what code needs further inspection.&lt;a href="http://lh6.ggpht.com/_EdDlpJZIv_Q/TKgbtHMtqrI/AAAAAAAAAOc/17JjWT1o6RU/s1600-h/clip_image002%5B19%5D.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/_EdDlpJZIv_Q/TKgbtgqIRwI/AAAAAAAAAOg/iXthiKroNac/clip_image002_thumb%5B14%5D.png?imgmax=800" width="519" height="269" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Switch to Threads Visualizer&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_EdDlpJZIv_Q/TKgbtxpW8yI/AAAAAAAAAOo/1ZDX6cNS3j8/s1600-h/clip_image003%5B6%5D.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://lh5.ggpht.com/_EdDlpJZIv_Q/TKgbudyvwJI/AAAAAAAAAO0/nWnm9Zo0zZg/clip_image003_thumb%5B3%5D.png?imgmax=800" width="519" height="183" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The blue line corresponds to time in the application.&amp;#160; I had to zoom the time scale to make the trouble area visible.&lt;/p&gt;  &lt;p&gt;Red indicates deadlocked, yellow indicates blocked.&amp;#160; By looking at the call stack we can determine the problem area.&lt;/p&gt;  &lt;p&gt;Run times for this sample: Simulating 60 seconds Threaded time: 0.048 Serial time: 0.0030&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I wanted to try out CyclicBarriers and explicit use of Threads with .start() and .join()&amp;#160; to see if there were any significant differences from the pooled task approach.&amp;#160; The biggest issue for me with both of these approaches is that you need to keep explicit track of either the number of threads or keep a reference to the thread so you can issue the join().&amp;#160; I did notice that the Thread approach seemed to leave Threads running.&amp;#160; Wondering if I needed another join().&lt;/p&gt;  &lt;p&gt;Ultimately I settled on a hybrid of serial code and java.util.concurrent Executors.&amp;#160; Timing numerous runs also indicated that at least for my application Executors where going to be the right approach.&amp;#160; Especially since the type and size of the thread pool is configurable.&lt;/p&gt;  &lt;h2&gt;Post Profile&lt;/h2&gt;  &lt;p&gt;After copious time spent using the profiler to analyze and adjust the threaded code I now have the following results:&lt;/p&gt;  &lt;div style="direction: ltr"&gt;   &lt;table style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; border-collapse: collapse; direction: ltr; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid" border="1" cellspacing="0" cellpadding="0" valign="top"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.564in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.23&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.143&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.114&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.099&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 0.11&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.859in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 1.383&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 0.889&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 0.843&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 0.831&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 0.785&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;Note that the serial times have dropped.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;This is a byproduct of a shared base class that was tweaked along the way.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;In order to fairly evaluate serial versus threaded code it is important that the serial code be optimized.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: georgia"&gt;The threaded times are about the same as before.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;However, the big difference is that the profiler is now indicating no deadlocks and minimal blocking.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;To achieve this I changed some data types and adjusted the thread pools used by each method.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;Now three of the five methods are using &lt;/span&gt;&lt;span style="font-family: consolas"&gt;newCachedThreadPool&lt;/span&gt;&lt;span style="font-family: georgia"&gt; which creates as many threads as needed/possible.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas"&gt;removeVehiclesInSinks&lt;/span&gt;&lt;span style="font-family: georgia"&gt;() is now use a &lt;/span&gt;&lt;span style="font-family: consolas"&gt;newSingleThreadExecutor&lt;/span&gt;&lt;span style="font-family: georgia"&gt; and I switched to &lt;/span&gt;&lt;span style="font-family: consolas"&gt;serialUpdateFactories&lt;/span&gt;&lt;span style="font-family: georgia"&gt; because I was running into blocking/deadlock problems.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Nice visual of thread pool execution:&lt;/p&gt;  &lt;p style="margin: 0in"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://lh4.ggpht.com/_EdDlpJZIv_Q/TKgbu5Bos8I/AAAAAAAAAO8/Uiy5qzmwHJs/clip_image001%5B15%5D%5B1%5D.png?imgmax=800" width="423" height="159" /&gt;&lt;/p&gt;  &lt;p&gt;Note the lag between the creation of thread pools versus execution times:&lt;/p&gt;  &lt;p style="margin: 0in"&gt;&lt;a href="http://lh5.ggpht.com/_EdDlpJZIv_Q/TKgbvGK4V3I/AAAAAAAAAPI/qnEj8w0MqDU/s1600-h/clip_image002%5B12%5D%5B2%5D.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/_EdDlpJZIv_Q/TKgbvllAseI/AAAAAAAAAPU/cPLCdVO6ykc/clip_image002%5B12%5D_thumb%5B1%5D.png?imgmax=800" width="519" height="94" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Busy&lt;/h2&gt;  &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;&lt;/p&gt;  &lt;p&gt;I still wasn’t happy with the serial code being faster than the threaded code.&amp;#160; However, no I knew from looking at the profiled code that threading overhead was significant for the “toy” problem.&amp;#160; So, I thought, what if the methods took longer to run?&amp;#160; In a prior exploration with &lt;a href="http://soloso.blogspot.com/2010/06/task-parallel-computing.html"&gt;C# Task parallel computing&lt;/a&gt; I had created a “busy” method.&amp;#160; To accomplish the same sort of effect &lt;span style="font-family: georgia"&gt;I added in a &lt;/span&gt;&lt;span style="font-family: consolas"&gt;Thread.sleep(1)&lt;/span&gt;&lt;span style="font-family: georgia"&gt; to the &lt;/span&gt;&lt;span style="font-family: consolas"&gt;VehicleLocationCollection::update().&amp;#160; &lt;/span&gt;That's a sleep 1ms in an often used method.&lt;/p&gt; Here's the result:  &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Simulation runs: 5 Simulated run time: 60&lt;/p&gt;  &lt;div style="direction: ltr"&gt;   &lt;table style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; border-collapse: collapse; direction: ltr; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid" border="1" cellspacing="0" cellpadding="0" valign="top"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.551in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 4.811&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 4.818&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 4.818&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 4.796&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 4.807&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.841in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 2.625&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 2.518&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 2.523&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 2.49&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 2.509&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Simulation runs: 5 Simulated run time: 600&lt;/p&gt;  &lt;div style="direction: ltr"&gt;   &lt;table style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; border-collapse: collapse; direction: ltr; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid" border="1" cellspacing="0" cellpadding="0" valign="top"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.643in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 58.564&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 59.062&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 58.865&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 59.021&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Serial time: 59.399&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-bottom: #a3a3a3 1pt solid; border-left: #a3a3a3 1pt solid; padding-bottom: 4pt; padding-left: 4pt; width: 1.954in; padding-right: 4pt; vertical-align: top; border-top: #a3a3a3 1pt solid; border-right: #a3a3a3 1pt solid; padding-top: 4pt"&gt;           &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 30.445&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 30.108&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 30.084&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 31.013&lt;/p&gt;            &lt;p style="margin: 0in; font-family: georgia; font-size: 12pt"&gt;Threaded time: 37.486&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;I'm glad I thought to make one of the more often used methods more intensive.&lt;span style="mso-spacerun: yes"&gt;&amp;#160; &lt;/span&gt;To me, this shows that there is indeed an improvement over the serial version when the application crosses a threshold of compute intensity/time versus threading overhead.&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;When comparing serial versus parallel code they should both be optimized.&amp;#160; I started with a working serial implementation and transformed it into a threaded version.&amp;#160; Both versions inherit from a common base class.&amp;#160; Unit tests help verify expected behavior.&amp;#160; When transforming to threaded code I found myself using a top down approach.&amp;#160; Methods which iterate over a collection are an easy target for extracting the interior loop body into a method to run as a task.&amp;#160; Transformation of related data structures to thread safe data types is essential.&amp;#160; Try to minimize or eliminate the need for locking/synchronized code.&amp;#160; Too much locking and you just created threaded code which runs in a sequential manner at best.&lt;/p&gt;  &lt;p&gt;The TPTP project profiling tool is very useful for profiling threaded applications.&amp;#160; You can quickly identify code that is deadlocked, blocked or waiting.&amp;#160; Your efforts can then be focused appropriately.&lt;/p&gt;  &lt;p&gt;Threading is only beneficial once you have enough work to pay the overhead penalty.&amp;#160; Sometimes you are better off using the serial implementation.&amp;#160; ForkJoinTasks take that approach, they fork the problem until it is small enough to process efficiently in a serial way.&amp;#160; The Executors class gives the developer a lot of flexibility in fine tuning the type of thread pool: unlimited, fixed or single.&lt;/p&gt;  &lt;p&gt;Good luck in your threading endeavors!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-9037105747142804645?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/9037105747142804645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/10/transforming-from-serial-to-threaded.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/9037105747142804645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/9037105747142804645'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/10/transforming-from-serial-to-threaded.html' title='Transforming from serial to threaded'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_EdDlpJZIv_Q/TKgbsgJJl0I/AAAAAAAAAOQ/8KpVjF5tqps/s72-c/clip_image001_thumb%5B21%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-8380526313001178351</id><published>2010-09-29T01:44:00.001-05:00</published><updated>2010-09-29T01:44:50.920-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title type='text'>The Big Yes, Focus and Squirrels</title><content type='html'>&lt;p&gt;Lately, the notions of &amp;quot;having a bigger yes that permits you to say to no to other things&amp;quot; and &amp;quot;focused intensity&amp;quot; have been on my mind.&lt;/p&gt;  &lt;h2&gt;The Bigger Yes&lt;/h2&gt;  &lt;p&gt;The basic idea here is that you have some compelling big thing that you are saying yes to in your life.&amp;#160; This permits you to say no to other things.&amp;#160; An example would be that students will choose to say no to some activities because they are saying yes to their education.&lt;/p&gt;  &lt;h2&gt;Focused Intensity&lt;/h2&gt;  &lt;p&gt;There is the notion of living a life in balance.&amp;#160; There is another of focused intensity.&amp;#160; Mastery and the exceptional are more often associated with focused intensity than balance in all things.&lt;/p&gt;  &lt;p&gt;I was doing some research on focused intensity and came across this blog post:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mistakemaker.com/2009/11/23/momentum-lessons-from-a-spray-bottle-and-a-4-year-old/"&gt;http://mistakemaker.com/2009/11/23/momentum-lessons-from-a-spray-bottle-and-a-4-year-old/&lt;/a&gt;&amp;#160; With an interesting formula/idea from Dave Ramsey.&amp;#160; And in a round about way led me here: &lt;a href="http://lci.typepad.com/leaders_resourcing_leader/2010/01/my-entry-2.html"&gt;http://lci.typepad.com/leaders_resourcing_leader/2010/01/my-entry-2.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I took/thought about the formula in the first and noted that dividing by time (over time) was totally incorrect.&amp;#160; The last post is better.&amp;#160; However, it still seemed a bit off to me.&amp;#160; So, I revised the equation as a summation and added a target set of goals for focused intensity.&amp;#160; I don't think the result is momentum.&amp;#160; To me the result would be the achievement of a goal.&amp;#160; &lt;/p&gt;  &lt;h2&gt;The Squirrel Diverter&lt;/h2&gt;  &lt;p&gt;Once upon a time I read about an idea to create a specific to you web page and set that as your start page.&amp;#160; The basic notion is to&amp;#160; redirect yourself away from the squirrel that had grabbed your attention.&amp;#160; Here is Merlin Mann's page: &lt;a href="http://www.merlinmann.com/rightnow/"&gt;http://www.merlinmann.com/rightnow/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;With out too much effort you can create your own default web page.&amp;#160; If you host it on your website and use Chrome with Google Sync it can be your default page everywhere!&amp;#160; Or simply save it as an HTML file on your machine and default to it.&lt;/p&gt;  &lt;h2&gt;The Result&lt;/h2&gt;  &lt;p&gt;So, thinking about the focused intensity formula, my big yes and the squirrel diverter, I created my own default page.&amp;#160; I used html so that I could list the most important goals and easily update them.&amp;#160; The end result can be seen here: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://dbbear.com/focus.html"&gt;http://dbbear.com/focus.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I would encourage you to think about your big YES and create your own focus intensifying start page.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-8380526313001178351?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/8380526313001178351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/09/big-yes-focus-and-squirrels.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8380526313001178351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8380526313001178351'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/09/big-yes-focus-and-squirrels.html' title='The Big Yes, Focus and Squirrels'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-4906645418082099586</id><published>2010-08-04T12:03:00.001-05:00</published><updated>2010-08-04T12:03:19.412-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCL'/><category scheme='http://www.blogger.com/atom/ns#' term='UPCRC'/><category scheme='http://www.blogger.com/atom/ns#' term='CIS690'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel'/><title type='text'>UPCRC Multi-core programming school @ UIUC</title><content type='html'>&lt;p&gt;One line summary: The UPCRC multi-core programming school was very intense in a good way.&lt;/p&gt;  &lt;h2&gt;The Material&lt;/h2&gt;  &lt;p&gt;We eased into things with a basic intro to parallel computing Monday afternoon. Tuesday-Thursday were all very fast paced. We had lecture from 0845-Noon and then again from 1PM to 2PM. At 2PM they would do an overview and introduction of practical labs that corresponded to the days lecture materials.&lt;/p&gt;  &lt;p&gt;There were always more labs to choose from than you could complete in a day. So, it was up to the student to pick the labs which they thought would be most beneficial to them. We had lab time between 2:30PM and 5:30PM. During this lab time the lecturers from the day were available. We had a forced :) supper break from 5:30PM-6:15PM. The lab and lecture area were locked up during this time. The lab reopened at 6:15PM and closed at 10:00PM. During this time frame knowledgeable GTA/GRAs were available to answer questions.&lt;/p&gt;  &lt;p&gt;I was already somewhat familiar with Java explicit threading so there weren't any surprises there.&lt;/p&gt;  &lt;p&gt;OpenMP was probably the easiest to work with and use. It uses pragmas with C++. Visual Studio 2010 has out of the box support for OpenMP.&lt;/p&gt;  &lt;p&gt;Intel TBB took some work, but it is more powerful/flexible than OpenMP.&lt;/p&gt;  &lt;p&gt;.Net Parallel LINQ (PLINQ) and the Task Parallel Library (TPL) were interesting. It was interesting to work to apply lessons from here in a previous .Net project that does everything in a serial way. It reminded me that we need to make special considerations when ordering is important. Also, you really need to know and understand lambda expressions.&lt;/p&gt;  &lt;p&gt;The OpenCL material was by far the hardest. It was difficult in terms of the steps to set up the code and in debugging/figuring out what was going wrong. I was able to complete a Matrix Multiply lab. However, it took about 5 hours. From what I gather only one or two other people completed that lab.&lt;/p&gt;  &lt;p&gt;We had a two hour lecture on Thursday regarding vectorizing code. It was very intense and very interesting. I feel like the professor probably covered two weeks of graduate material in those two hours! It was helpful to learn about dependences and how loops could be unrolled or how loops could be changed to allow the compiler to do more optimizing. I need to review the slides and notes from this lecture.&amp;#160; As I recall we covered 48 slides in each of the one hour sessions.&lt;/p&gt;  &lt;p&gt;My overall impression is that it is much easier to work with multi-core CPUs than GPUs. The other I noted that there seems to be more focus/maturity in C/C++ support. I'm sure that will change as the SDKs mature.&lt;/p&gt;  &lt;p&gt;We wrapped up Friday with a look at an Intel analysis tool and overview of what had been covered and what had not been covered. &lt;/p&gt;  &lt;h2&gt;Blue Waters&lt;/h2&gt;  &lt;p&gt;Friday before lunch we toured the future home of the IBM Blue Waters/NCSA facility. It is simply huge. They had what appeared to be many servers in place, but they were actually the power distribution centers! The first floor of the building is all mechanical infrastructure. The building is also set up to be secure facility with swipe cards, PIN entry, retinal scanning and even a &amp;quot;bell&amp;quot; that you are locked in and weighed in.&lt;/p&gt;  &lt;h2&gt;Summer School Environment&lt;/h2&gt;  &lt;p&gt;The building facilities, labs, lecture room (power on top of the table at all spots), meals and snacks were all excellent.&amp;#160; The building architecture itself was interesting.&amp;#160; There were many areas inside and outside of the building where you could sit and work.&amp;#160; They also had areas on every floor with seating and whiteboards.&lt;/p&gt;  &lt;h2&gt;People&lt;/h2&gt;  &lt;p&gt;Instructors were enthusiastic about the material and were open to questions. It was great that they helped in the labs and were available for questions that were related to the material yet unrelated to the labs. If you had a question about how something they covered might relate to your research they were interested in talking with you and discussing it.&lt;/p&gt;  &lt;p&gt;Assistants were knowledgeable and helpful with the lab environment and the labs too.&lt;/p&gt;  &lt;p&gt;Staff kept everything running smooth and on time.&amp;#160; They also managed to arrange for good meals and snacks.&lt;/p&gt;  &lt;p&gt;The school was also an awesome opportunity to talk with other students from around the world that are interested in this aspect of programming. It was neat to hear the varied application areas that were being considered.&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;Overall, a great experience.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.upcrc.illinois.edu/summer/2010/program.html"&gt;http://www.upcrc.illinois.edu/summer/2010/program.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Something I may consider for next year is another school that they offer:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.vscse.org/summerschool/2010/manycore.html"&gt;http://www.vscse.org/summerschool/2010/manycore.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-4906645418082099586?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/4906645418082099586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/08/upcrc-multi-core-programming-school.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4906645418082099586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4906645418082099586'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/08/upcrc-multi-core-programming-school.html' title='UPCRC Multi-core programming school @ UIUC'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-1555327832388208987</id><published>2010-07-12T01:25:00.002-05:00</published><updated>2010-11-01T18:42:19.845-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='CIS690'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel'/><title type='text'>Data Parallel Computing</title><content type='html'>&lt;p&gt;Data Decomposition Parallel computing works by using a shared data object with multiple “processors” working on it. &lt;a href="http://lh5.ggpht.com/_EdDlpJZIv_Q/TDq1NeddBUI/AAAAAAAAALQ/e1K6_5xTmTs/s1600-h/image%5B12%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://lh6.ggpht.com/_EdDlpJZIv_Q/TDq1NzgkT4I/AAAAAAAAALU/n4ltCSGBwXc/image_thumb%5B6%5D.png?imgmax=800" width="157" height="188" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;the toy problem&lt;/h2&gt;  &lt;p&gt;To learn more about Data Decomposition type parallel computing I created a toy application. This entailed creating a demo application that utilized a basic stopwatch instrument, a serial computing class and a parallel computing class.&amp;#160; The application will perform row or column based operations on an 8K by 8K array.&lt;/p&gt;  &lt;p&gt;Since I needed to time runs I created a basic stopwatch class. This class provides for starting the stop watch, checking elapsed time and stopping it.&lt;/p&gt;  &lt;h2&gt;the serial code&lt;/h2&gt;  &lt;p&gt;I created a serial computing class that initializes an 8K by 8K array of integers and has methods for computing across rows and computing down columns. I created these two methods so that I could see potential differences in working with the array via row or column.&lt;/p&gt;  &lt;p&gt;The serial class is used as the baseline which the parallel class is compared against. &lt;/p&gt;  &lt;p&gt;I wanted to make sure that the results from the serial and parallel calculations were the same. Therefore, I added methods to the serial class that can be used to check that the parallel results match.&lt;/p&gt;  &lt;h2&gt;the parallel code&lt;/h2&gt;  &lt;p&gt;Because the implementation language was Java, the parallel code class extends the Thread class. The Thread class works by using a run() method that takes no arguments. To cope with this, I use a private constructor to determine which method to run. The parallel methods create a new instance which takes arguments for if the row or column method should be called and the start and end value of the domain. These arguments set internal variables which are then used within the run() method.&lt;/p&gt;  &lt;p&gt;Psuedo-code for the parallel computation:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p style="margin: 0in; font-family: consolas; font-size: 11pt"&gt;computeRowsDomainLimited(int startRow, int endRow)&lt;/p&gt;  &lt;p style="margin: 0in; font-family: consolas; font-size: 11pt"&gt;{&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;Partsize = size / # threads&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;Remainder = size % # threads&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;For o = 0 to &amp;lt; # threads&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;{&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.75in; font-family: consolas; font-size: 11pt"&gt;Start = o * size&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.75in; font-family: consolas; font-size: 11pt"&gt;End = start + partSize&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.75in; font-family: consolas; font-size: 11pt"&gt;computeRowsDomain(start,end)&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;}&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;computeRowsDomain(end, end+remainder)&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;Set up threads with the above&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;Then run them&lt;/p&gt;  &lt;p style="margin: 0in 0in 0in 0.375in; font-family: consolas; font-size: 11pt"&gt;Then join/wait for all to finish&lt;/p&gt;  &lt;p style="margin: 0in; font-family: consolas; font-size: 11pt"&gt;}&lt;/p&gt;  &lt;h2&gt;Results&lt;/h2&gt;  &lt;p&gt;The development machine was a powered by an Intel I7-720 with 6Gig of RAM.&amp;#160; The baseline serial methods and the parallel methods of varying partition/thread size were each run 10 times.&amp;#160; The best run time is used in the calculations.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_EdDlpJZIv_Q/TDq1OG8YLJI/AAAAAAAAALY/S1gkEhkkcHg/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_EdDlpJZIv_Q/TDq1O3b0VKI/AAAAAAAAALc/wljGmLtutnM/image_thumb%5B3%5D.png?imgmax=800" width="414" height="229" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_EdDlpJZIv_Q/TDq1Pe8OTBI/AAAAAAAAALg/JVB-yKZZQuY/s1600-h/image%5B8%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_EdDlpJZIv_Q/TDq1PrKeCaI/AAAAAAAAALk/3b2Wvk6DFfM/image_thumb%5B4%5D.png?imgmax=800" width="414" height="229" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The code seems to scale well and perform well for the row based computation up to 8 processing threads. Then it seems to drop off a bit and then gradually taper off in performance. I think this corresponds to the machine having 8 logical cores. After 8 the overhead of the additional threads is greater than any potential benefit.&lt;/p&gt;  &lt;p&gt;However, the performance the columns seems to peak out around 4 or 5 threads. This could be because of the CPU having 4 real cores with Hyper-Threading. Or it may be that the overhead of accessing non-continuous memory is the determining factor.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;Source Code&lt;/h2&gt;  &lt;p&gt;Source code for the demo application that utilizes the stopwatch class and both the serial and parallel computing classes can be found here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dbBear.com/DataDecomposition.zip"&gt;http://www.dbBear.com/DataDecomposition.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In the future I will implement the same computations using OpenCL.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-1555327832388208987?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/1555327832388208987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/07/data-parallel-computing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/1555327832388208987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/1555327832388208987'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/07/data-parallel-computing.html' title='Data Parallel Computing'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_EdDlpJZIv_Q/TDq1NzgkT4I/AAAAAAAAALU/n4ltCSGBwXc/s72-c/image_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-8319748448983301987</id><published>2010-07-07T19:02:00.001-05:00</published><updated>2010-07-07T19:02:37.991-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code smell'/><category scheme='http://www.blogger.com/atom/ns#' term='pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Shim it!</title><content type='html'>&lt;p&gt;The lock on my front door was tough to turn.&amp;#160; I was afraid to turn the key too hard for fear of snapping it off.&amp;#160; I figured out that if I lifted the handle up that allowed the bolt to properly seat.&amp;#160; I noticed where the bolt was rubbing against the striker plate and the cut out in the door frame.&amp;#160; I bored out the opening in the wood slightly.&amp;#160; Minimal improvement, but still not satisfactory.&amp;#160; I tried moving the striker plate.&amp;#160; I didn’t want to force it too much since the screw holes would have to be filled and re-drilled for any major adjustment.&amp;#160; I even tried moving the locking mechanism to alter the angle of entry into the striker plate.&amp;#160; I did notice that the whole door seemed like it was a bit out of square with the frame.&lt;/p&gt;  &lt;p&gt;Then it occurred to me to place a shim under one of the hinges on the door to adjust the whole door.&amp;#160; This worked!&amp;#160; The whole door is now square in the frame and it has a better seal with the gasket.&amp;#160; No daylight.&lt;/p&gt;  &lt;h2&gt;Software&lt;/h2&gt;  &lt;p&gt;Have you been tweaking, altering and adjusting parts of your system when a shim could be place in the right place and make the whole system work properly?&amp;#160; Perhaps, a strategically used &lt;a href="http://dofactory.com/Patterns/PatternAdapter.aspx"&gt;adapter pattern&lt;/a&gt; would make the whole application easier to code?&amp;#160; Maybe some small tweak in the UI could lead to a more enjoyable experience through out the whole system?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-8319748448983301987?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/8319748448983301987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/07/shim-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8319748448983301987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8319748448983301987'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/07/shim-it.html' title='Shim it!'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-4190402833795184206</id><published>2010-07-07T18:48:00.001-05:00</published><updated>2010-07-07T18:48:29.686-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clean code'/><category scheme='http://www.blogger.com/atom/ns#' term='software process'/><category scheme='http://www.blogger.com/atom/ns#' term='code smell'/><title type='text'>Hot on the edges, raw in the middle</title><content type='html'>&lt;p&gt;Use the microwave at 100% to cook or reheat and you can end up with something that is hot on the edges or the outside, yet raw in the middle.&lt;/p&gt;  &lt;p&gt;However, if you utilize the manual settings, like 60% power level with more time you will find that the food is more evenly cooked.&amp;#160; Or better yet, consult the manual and use the correct settings for the food type and quantity.&lt;/p&gt;  &lt;p&gt;In the software development processes, breathing time/thinking time is good.&lt;/p&gt;  &lt;p&gt;100% full bore gets you done.&amp;#160; However, when you have time to think about the system you may experience remorse.&amp;#160; To extend the microwave analogy--perhaps,&amp;#160; you have a nice shiny UI but rotten messy code under the hood.&amp;#160; With an appropriate “cooking temperature” you’d have both a nice UI and good code under the hood.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-4190402833795184206?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/4190402833795184206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/07/hot-on-edges-raw-in-middle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4190402833795184206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4190402833795184206'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/07/hot-on-edges-raw-in-middle.html' title='Hot on the edges, raw in the middle'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-2603048917549069260</id><published>2010-06-24T23:15:00.001-05:00</published><updated>2010-11-06T11:28:52.706-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CIS690'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel'/><title type='text'>Task Parallel Computing</title><content type='html'>&lt;p&gt;There are two primary parallel computing techniques: task parallel and data parallel.&amp;#160; Some key aspects to consider if tasks can be run in parallel:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Are there dependencies between tasks? &lt;/li&gt;    &lt;li&gt;Does the result of the operations change if you change the execution order? &lt;/li&gt;    &lt;li&gt;Will there be contention for data or some other resource? &lt;/li&gt;    &lt;li&gt;Will we get a return on investment for the overhead of configuring and running in parallel? &lt;/li&gt;    &lt;li&gt;Do we have a significant number of tasks to run?&amp;#160; We should have more tasks to run than we have cores. &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Batch processing&lt;/h2&gt;  &lt;p&gt;I created a BatchProcessor solution with a console application called BPRun.&amp;#160; This project runs a setup portion, the parallel tasks and then the teardown jobs.&amp;#160;&amp;#160; The tasks to run are specified in corresponding configuration files.&amp;#160; I use code similar to this in production for batch processing ~20 DOS .bat jobs.&amp;#160; Being able to have jobs run in a parallel fashion has resulted in a significant time savings.&lt;/p&gt;  &lt;h2&gt;Setup and Teardown&lt;/h2&gt;  &lt;p&gt;The setup and teardown portions of the application are run in a serial fashion.&amp;#160; The items in the configuration files are executed one after another.&amp;#160; Comments may be placed in the file with // prefixing.&lt;/p&gt;  &lt;h2&gt;Task Parallel&lt;/h2&gt;  &lt;p&gt;The task parallel section executes the items in the corresponding configuration file.&amp;#160; As a task finishes the scheduler picks up and runs the next job on that process.&amp;#160; The code that does this is in a corresponding Processor class.&lt;/p&gt;  &lt;h2&gt;Tasks with dependencies&lt;/h2&gt;  &lt;p&gt;What if you have a task that has a dependency?&amp;#160; You can chain them.&amp;#160; That is, have the first process or task call the second or dependent task upon completion.&amp;#160; For instance, you may have a job that does some data prep and then chain it to call a task that does analysis.&lt;/p&gt;  &lt;h2&gt;Keeping Busy &lt;/h2&gt;  &lt;p&gt;On *nix systems we have the sleep command which we can use to pause for the given # of seconds.&amp;#160; However, this doesn’t place any load on the machine.&amp;#160; I wanted the machine to have a load placed on it by the tasks so that we could see that it is really taxing the machine.&amp;#160; To that end I created a small console application called Busy.&amp;#160; This takes the number of seconds to be busy as a parameter.&lt;/p&gt;  &lt;h2&gt;Download&lt;/h2&gt;  &lt;p&gt;You can get the source code for the Batch Processor and the Busy application here: &lt;a href="http://www.dbbear.com/BatchProcessor.zip"&gt;http://www.dbbear.com/BatchProcessor.zip&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Video&lt;/h2&gt;  &lt;p&gt;See a video tour of the code for Busy and the Batch Processor along with demos of the applications here: &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:7fe799e6-fc88-47a1-ac25-f3d27092b81c" class="wlWriterEditableSmartContent"&gt;&lt;div id="ba9d720b-ef26-44db-ad4a-653a1691e825" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=C2coWmRaMFM" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_EdDlpJZIv_Q/TNWCQyApKdI/AAAAAAAAAPw/WHWlRH0m95c/videoa7f15d1986af%5B4%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('ba9d720b-ef26-44db-ad4a-653a1691e825'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/C2coWmRaMFM?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/C2coWmRaMFM?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&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/9881483-2603048917549069260?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/2603048917549069260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/06/task-parallel-computing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2603048917549069260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2603048917549069260'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/06/task-parallel-computing.html' title='Task Parallel Computing'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_EdDlpJZIv_Q/TNWCQyApKdI/AAAAAAAAAPw/WHWlRH0m95c/s72-c/videoa7f15d1986af%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-726993454657303526</id><published>2010-06-22T18:42:00.001-05:00</published><updated>2010-06-22T18:42:15.045-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title type='text'>Programmer Productivity Tools</title><content type='html'>&lt;p&gt;I’ve been reading &lt;a href="http://twitter.com/neal4d"&gt;Neal Ford&lt;/a&gt;’s &lt;em&gt;The Productive Programmer&lt;/em&gt;.&amp;#160; It’s a good read so far.&amp;#160; I’ve picked up a few tools that have already been helping.&amp;#160; &lt;a href="http://oreil.ly/dAd3WX"&gt;Pick up the book&lt;/a&gt; for the details on the reasoning behind having/using these utilities.&lt;/p&gt;  &lt;p&gt;Virtual Desktop Manager &lt;a href="http://virtuawin.sourceforge.net/"&gt;VirtuaWin&lt;/a&gt; this lets you have multiple virtual desktops.&amp;#160; I’m using one for communication apps, one for development, one for research and one for miscellaneous stuff.&lt;/p&gt;  &lt;p&gt;Clipboard Manager Tool &lt;a href="http://ditto-cp.sourceforge.net/index.php"&gt;Ditto&lt;/a&gt;.&amp;#160; So far, I’m not very fond of the UI but I like the way it works.&amp;#160; Let’s you work with a clip board stack across all of your apps.&amp;#160; I used it to clip all of the URLs for this article and then paste them in appropriately.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=0f6a9526-97aa-4b6f-9b24-95b193c158d4"&gt;Clipboard Manager&lt;/a&gt; that is a Windows Gadget.&amp;#160; Lots of background choices.&amp;#160; It’s a Windows Gadget so it’s always visible.&amp;#160; However, I’m not liking the way it works.&amp;#160; I’ll probably drop it.&amp;#160; Just thought I’d give it a whirl and thought gadget lovers might go for it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt; for bash, *nix-ish utilities, vim, Emacs, wget, curl, etc.&amp;#160; Keep around the downloaded executable.&amp;#160; It’s really a loader and not an installer per se.&amp;#160; You’ll also have a download folder that accompanies the loader.&amp;#160; So, you may want to pre-plan where you’re going to keep that before you run the loader.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-726993454657303526?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/726993454657303526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/06/programmer-productivity-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/726993454657303526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/726993454657303526'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/06/programmer-productivity-tools.html' title='Programmer Productivity Tools'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-2206024516518575262</id><published>2010-06-15T20:15:00.001-05:00</published><updated>2010-06-23T12:51:18.075-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clean code'/><category scheme='http://www.blogger.com/atom/ns#' term='software process'/><category scheme='http://www.blogger.com/atom/ns#' term='code smell'/><title type='text'>Clean code motivates</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_EdDlpJZIv_Q/TBhH36YC8zI/AAAAAAAAALI/Ky9lPgqJjKk/s1600-h/sweaty_hat%5B7%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="sweaty_hat" border="0" alt="sweaty_hat" align="right" src="http://lh5.ggpht.com/_EdDlpJZIv_Q/TBhH4dD3z4I/AAAAAAAAALM/ALWzZBNN7sM/sweaty_hat_thumb%5B5%5D.jpg?imgmax=800" width="259" height="157" /&gt;&lt;/a&gt; I’m still dripping as I’m writing this.&amp;#160; (Okay, maybe not now, but when I did the voice memo recording I was!)&amp;#160; I’m just feeling very inspired and want to get this down in bits.&lt;/p&gt;  &lt;p&gt;A lot of people talk about code smell, what it is, how to detect it and anti-patterns.&amp;#160; However, the thing that struck me today was this:&amp;#160; I was out mowing the yard.&amp;#160; The temperature was like a billion degrees, it was humid and I was mowing uphill no matter which way I turned!&amp;#160; So basically, it was hard work.&amp;#160; The thing that struck me was that I hit a section of air that smelled like a fragrant fabric softener.&amp;#160; It really perked me up.&amp;#160; I felt rejuvenated and mowed with more gusto.&amp;#160; I looked forward to returning to the portion of the yard that had the scent in the air.&lt;/p&gt;  &lt;h2&gt;The crossover&lt;/h2&gt;  &lt;p&gt;That got me thinking about code smell.&amp;#160; Besides code taking us more time to work through because of quality issues, there is also the issue that it &lt;em&gt;smells!&amp;#160; &lt;/em&gt;It is &lt;em&gt;repulsive&lt;/em&gt;, it is &lt;em&gt;repugnant&lt;/em&gt;, it is &lt;em&gt;de&lt;/em&gt;-motivating!&amp;#160; Who wants to go work on the smelly code?&amp;#160; No one wants to do it.&amp;#160; It is like being told to retrieve a book that is in a library that is located in the middle of a landfill.&amp;#160; No one wants to do that.&amp;#160; I think there is a psychological aspect of smelly code that should be considered.&amp;#160; That is, people want to stay away from stinky code.&lt;/p&gt;  &lt;p&gt;On the flip side, are you excited when you get to go work in &lt;em&gt;clean&lt;/em&gt; code?&amp;#160; Code that is &lt;em&gt;well factored&lt;/em&gt;, code that &lt;em&gt;uses patterns&lt;/em&gt;, code that you can &lt;em&gt;understand&lt;/em&gt;, code that is a &lt;em&gt;joy&lt;/em&gt; to work with.&amp;#160; I know that I can honestly say that if I have an application to work on and I know that it exhibits the qualities above, has a good &lt;em&gt;design&lt;/em&gt; and has a reasonable amount of &lt;em&gt;documentation&lt;/em&gt; I get excited about working on it.&lt;/p&gt;  &lt;p&gt;Also, when I’m working in clean code I don’t want to be the one that &lt;em&gt;dirties&lt;/em&gt; it up—regardless of who wrote it.&lt;/p&gt;  &lt;p&gt;In conclusion, I would counsel that messy code besides having quality issues is also de-motivating.&amp;#160; Clean code, &lt;em&gt;good&lt;/em&gt; &lt;em&gt;smelling&lt;/em&gt; code is a joy to work with.&amp;#160; Strive for clean code.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-2206024516518575262?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/2206024516518575262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/06/clean-code-motivates.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2206024516518575262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2206024516518575262'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/06/clean-code-motivates.html' title='Clean code motivates'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_EdDlpJZIv_Q/TBhH4dD3z4I/AAAAAAAAALM/ALWzZBNN7sM/s72-c/sweaty_hat_thumb%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-3132402633580412742</id><published>2010-06-15T14:25:00.001-05:00</published><updated>2010-06-15T14:25:50.355-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CUDA'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCL'/><category scheme='http://www.blogger.com/atom/ns#' term='NVidia'/><category scheme='http://www.blogger.com/atom/ns#' term='HP'/><category scheme='http://www.blogger.com/atom/ns#' term='CIS690'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel'/><category scheme='http://www.blogger.com/atom/ns#' term='Sony'/><category scheme='http://www.blogger.com/atom/ns#' term='ATI'/><title type='text'>Selecting a machine for OpenCL / GPGPU use</title><content type='html'>&lt;p&gt;What is GPGPU computing?&amp;#160; GPGPU stands for General Purpose computing on Graphics Processor Units.&amp;#160; The basic idea is that we use the graphics card to do some computing.&amp;#160; Today most computers have 2 cores and some as many as 6.&amp;#160; With hyper-threading we may see what appears to be double that many processors.&amp;#160; However, a video card such as the NVidia 480 has “cores” or processors.&lt;/p&gt;  &lt;h2&gt;Portable or Desktop?&lt;/h2&gt;  &lt;p&gt;If you choose a portable machine you will be able to take the unit with you for presentations, research or on the go development.&amp;#160; However, you will typically sacrifice in the power or number of cores that the video card has available.&amp;#160; For instance a laptop with a GT330M has 48 cores.&amp;#160; A desktop with a GT330 has 96-112 cores.&lt;/p&gt;  &lt;p&gt;You’ll also likely have a much harder time finding a suitable laptop.&amp;#160; When choosing a desktop, go for a mini-tower case or one that can be purchased with the appropriate video card.&amp;#160; Current video cards often take additional power from the power supply and require additional ventilation.&amp;#160; For instance, you could purchase an HP HPE-380T with an NVidia GTX260 with 1.8G of DDR3 RAM and 192 cores!&lt;/p&gt;  &lt;h2&gt;ATI or NVidia?&lt;/h2&gt;  &lt;p&gt;NVidia is known for its CUDA entry.&amp;#160; ATI has ATI Stream computing.&amp;#160; Both companies now have drivers for OpenCL.&amp;#160; I chose to go with NVidia because I was able to find my resources for their products.&amp;#160; ATI Stream is fairly new. &lt;/p&gt;  &lt;p&gt;Whichever you choose, you will need to know what type of computing/gaming you plan to do and if there is existing support for that.&amp;#160; Also, you will need to make sure to check the manufacturers pages to see if the video card you have selected is supported for GPGPU use.&lt;/p&gt;  &lt;h2&gt;Cores, speed&lt;/h2&gt;  &lt;p&gt;In general, the more cores or shaders the better.&amp;#160; Also pay attention to how fast they are running.&lt;/p&gt;  &lt;h2&gt;Memory&lt;/h2&gt;  &lt;p&gt;What type of memory? In general you want to stay away from shared memory.&amp;#160; This makes use of the slower system memory and steals resources from the PC.&amp;#160; Look for DDR3 or DDR5 memory.&amp;#160; Sometimes they are prefixed with a G like GDDR3.&amp;#160; In general DDR5 is faster.&lt;/p&gt;  &lt;p&gt;How much memory?&amp;#160; After consulting with a professor with experience in the field he suggested 512M minimum.&amp;#160; If you can get more that is preferred.&amp;#160; &lt;/p&gt;  &lt;h2&gt;Sony CW, F and Z series&lt;/h2&gt;  &lt;p&gt;Because I wanted to be portable and have the minimum 512M with an NVidia card, I considered the Sony CW, F and Z series computers.&lt;/p&gt;  &lt;p&gt;However, these machines are new enough that the released video drivers do NOT support OpenCL.&amp;#160; I did find that there is a way to modify the released NVidia drivers to work on them.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://forum.notebookreview.com/sony/472664-vaio-f-nvidia-drivers-update-197-16-gt-330m-10de-0a29.html"&gt;http://forum.notebookreview.com/sony/472664-vaio-f-nvidia-drivers-update-197-16-gt-330m-10de-0a29.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After using the information above, I was able to run the Particles demo from here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/p/nativelibs4java/wiki/OpenCL"&gt;http://code.google.com/p/nativelibs4java/wiki/OpenCL&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;However, the hardware identification and mandelbrot set generator on that site don't work.&lt;/p&gt;  &lt;p&gt;I also downloaded and tested a CUDA based mandelbrot application that was listed on the NVidia featured applications site.&amp;#160; It ran nicely.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-3132402633580412742?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/3132402633580412742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/06/selecting-machine-for-opencl-gpgpu-use.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3132402633580412742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3132402633580412742'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/06/selecting-machine-for-opencl-gpgpu-use.html' title='Selecting a machine for OpenCL / GPGPU use'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-2935220083386046198</id><published>2010-06-08T23:46:00.001-05:00</published><updated>2010-06-08T23:46:48.484-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ITS'/><category scheme='http://www.blogger.com/atom/ns#' term='Parallel'/><category scheme='http://www.blogger.com/atom/ns#' term='CTS'/><title type='text'>Prelude: CTS, ITS &amp; Parallel Computing</title><content type='html'>&lt;p&gt;This summer I will start a journey into Computational Transportation Science (CTS), Intelligent Transportation Systems (ITS) blended with parallel, distributed and agent computing.&lt;/p&gt;  &lt;p&gt;I will specifically be exploring OpenGL and OpenCL.&amp;#160; One of my major objectives is to explore the use of the Graphics Processing Unit (GPU) in “general purpose” computing (GPGPU).&amp;#160; Specifically, I will be utilizing the NVidia GT330M GPU.&lt;/p&gt;  &lt;p&gt;Along the way I’ll also likely explore other environments such as JOMP, JPPF and MapReduce.&amp;#160; I’m also planning to use Neo4j for persistence.&lt;/p&gt;  &lt;p&gt;It is my intent to model some non-signal controlled intersections this summer.&amp;#160; Long term I will explore coordinated signal controlled intersections.&lt;/p&gt;  &lt;p&gt;As part of this exploration I will also seek input and insight from those in the industry and in academia so that I can avoid reinventing the wheel and stand on their shoulders.&lt;/p&gt;  &lt;p&gt;Forthcoming posts will include specifics about hardware selection, and software installation.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-2935220083386046198?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/2935220083386046198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/06/prelude-cts-its-parallel-computing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2935220083386046198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2935220083386046198'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/06/prelude-cts-its-parallel-computing.html' title='Prelude: CTS, ITS &amp;amp; Parallel Computing'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-5767423187737900116</id><published>2010-05-31T23:20:00.001-05:00</published><updated>2010-05-31T23:20:17.273-05:00</updated><title type='text'>Outlook Tips</title><content type='html'>&lt;p&gt;Here are some Outlook tips and tricks that I find very useful.&lt;/p&gt;  &lt;h2&gt;Hide/Show Buttons&lt;/h2&gt;  &lt;p&gt;Hide buttons if you want more vertical navbar space.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_EdDlpJZIv_Q/TASKdOwFCxI/AAAAAAAAAKo/vXQ5EPa1pLE/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_EdDlpJZIv_Q/TASKdzQmNuI/AAAAAAAAAKs/d-IbMoTcsGI/image_thumb.png?imgmax=800" width="244" height="114" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Customize the Quick Access Bar&lt;/h2&gt;  &lt;p&gt;I have mine optimized for TabletPC use.&amp;#160; I can do a send-receive, undo, delete,&amp;#160; show/hide navbar and show/hide reading pane.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_EdDlpJZIv_Q/TASKeKBmxUI/AAAAAAAAAKw/9AliNRwNZKE/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_EdDlpJZIv_Q/TASKeoqtzVI/AAAAAAAAAK0/H5syTRdhIAk/image_thumb%5B3%5D.png?imgmax=800" width="209" height="49" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Additional Windows&lt;/h2&gt;  &lt;p&gt;Right click on a button and choose Open in New Window to open an additional window with that item type.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_EdDlpJZIv_Q/TASKe9w6vbI/AAAAAAAAAK4/Nvq3-YRJm48/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_EdDlpJZIv_Q/TASKfYQW4yI/AAAAAAAAAK8/G7O8VoStXw4/image_thumb%5B1%5D.png?imgmax=800" width="244" height="56" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Schedule an item with drag and drop&lt;/h2&gt;  &lt;p&gt;Drag and drop an email or to do item onto the calendar in the to-do bar or the calendar that is showing in another window to schedule a new calendar item.&amp;#160; If you do this with an email it will drop the email message into the memo portion of the calendar event.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_EdDlpJZIv_Q/TASKfkDTmeI/AAAAAAAAALA/wqwM41u9M3w/s1600-h/image%5B8%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_EdDlpJZIv_Q/TASKgIa4CrI/AAAAAAAAALE/CbsUg9j7-gQ/image_thumb%5B2%5D.png?imgmax=800" width="222" height="168" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Dropping on a date/time on a full calendar the event will default to that date/time.&amp;#160; Using the to-do calendar you will need to specify the time.&amp;#160; You can also customize your to-do bar to show more months, filter what appointments are displayed and choose to the task list by right clicking on it.&lt;/p&gt;  &lt;h2&gt;Keyboard Shortcuts&lt;/h2&gt;  &lt;p&gt;Write a new email with &amp;lt;CTRL&amp;gt;+&amp;lt;SHIFT&amp;gt;+M&lt;/p&gt;  &lt;p&gt;When viewing an email &amp;lt;CTRL&amp;gt;+R to reply to the selected email.&lt;/p&gt;  &lt;p&gt;&amp;lt;F9&amp;gt; do send-receive.&lt;/p&gt;  &lt;p&gt;Here are a couple of articles with many more keyboard shortcuts:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.groovypost.com/howto/microsoft/outlook-2010-keyboard-shortcut-keys/"&gt;http://www.groovypost.com/howto/microsoft/outlook-2010-keyboard-shortcut-keys/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gadgetinspiration.com/blog/outlook-2010-keyboard-shortcuts"&gt;http://gadgetinspiration.com/blog/outlook-2010-keyboard-shortcuts&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Your Turn!&lt;/h2&gt;  &lt;p&gt;What are your favorite, but maybe obscure power user tips/tricks?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-5767423187737900116?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/5767423187737900116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/05/outlook-tips.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5767423187737900116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5767423187737900116'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/05/outlook-tips.html' title='Outlook Tips'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_EdDlpJZIv_Q/TASKdzQmNuI/AAAAAAAAAKs/d-IbMoTcsGI/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-5225831435207053661</id><published>2010-02-01T10:54:00.004-06:00</published><updated>2010-08-05T10:21:49.291-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team'/><title type='text'>The "I" in Team</title><content type='html'>&lt;p&gt;We often hear the expression, "There is no I in team!" Let's take another look  at that. Where are the I's in team? To me, the first thing I think of is the  individuals that make up the team. Some “I's” that are associated with the  individual are individuality, initiative, imagination, insight and intrinsic  motivation.&lt;/p&gt;
&lt;p&gt;I know some of you are going to find this hard to believe,  but individuals don't always agree on everything all the time! Individuality and  respectfully differing opinions should be welcomed on the team. It makes us stop  and think about why we should take one approach and not another. We have some  creative people on our teams, so we shouldn't be surprised that there will be  multiple (noncompatible) solutions offered. Perhaps we can splice and merge  together from the solutions offered to create an even better solution!&lt;/p&gt;
&lt;p&gt;It  will help in these times of differing opinion to consider that the other person,  like us, is working toward the same common goal. A shared vision for a common  good has been embraced by the team. It is important that there be open,  respectful communication within the team since there will be people with  differing personalities and skill sets. In a team setting like this, we come to  expect that individuals who are subject matter experts will work with other  members to achieve the common goal and to mentor and help them grow as well. The  individual is truly valuable in what they bring to the overall health of the  team.&lt;/p&gt;
&lt;p&gt;Our team members show initiative! If they spot or think of a  potential problem, they will bring it to the manager’s attention and most likely  already have thought of a solution. Individuals bring value to the team when  they've exercised initiative to find a better way of completing a common task  and share it with the team. For instance, if a team member demonstrates to the  team a refactoring feature, or does something with an advanced language feature,  the whole team benefits.&lt;/p&gt;
&lt;p&gt;One of the most valued aspects of the individual  is his or her imagination. Software development is a creative endeavor,  especially UI design. The UI designer must think about how a user will interact  with the software, keeping in mind principles such as "least surprise" and  "expected default" and presenting a visually pleasing interface. The business  layer developer must think about how the classes will work with each other and  consider where inheritance and polymorphism make sense.  The difficult part  for managers is knowing when and how to interject their own individual view on  the solution.&lt;/p&gt;
&lt;p&gt;Our team members bring valuable insight into our business  processes. It is especially true that, in information technology, our  development teams gain a deeper insight and understanding of the business  practices the longer they have been with the organization. Oftentimes this  insight can answer the question, "Why?" Be sure to create an environment that  fosters true teamwork, pairing and cross training among all people on the  team.&lt;/p&gt;
&lt;p&gt;This individual we have been discussing is also likely  intrinsically motivated to achieve his or her job goals and to continue  professional development, while being a professional and doing high-quality  work. Software standards and processes can be mandated and taught. However,  until they become an intrinsic part of the individual’s personal software  process, the team will not see the benefit.&lt;/p&gt;
&lt;p&gt;A team is not merely the sum  of the individuals that make up the team. I believe when you look at truly  productive teams, you will find an environment of communication and shared  vision working toward a goal of common good.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-5225831435207053661?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/5225831435207053661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2010/02/i-in-team.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5225831435207053661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5225831435207053661'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2010/02/i-in-team.html' title='The &quot;I&quot; in Team'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-6692699061146308898</id><published>2009-10-12T18:56:00.001-05:00</published><updated>2009-10-12T18:56:10.075-05:00</updated><title type='text'>Authentic Dialogue</title><content type='html'>&lt;p&gt;When I am talking with someone and I don’t understand or know the term/idea they are using, I say so!&amp;#160; Yes, there is some feeling of vulnerability.&amp;#160; However, the honest communication will lead to a more authentic relationship which hopefully translates into a more productive and enriching exchange.&lt;/p&gt;  &lt;p&gt;Living in “the fake” will wear you out.&amp;#160; If you don’t know or understand, say so!&lt;/p&gt;  &lt;p&gt;-- &lt;em&gt;the truth will set you free!&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-6692699061146308898?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/6692699061146308898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2009/10/authentic-dialogue.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6692699061146308898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6692699061146308898'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2009/10/authentic-dialogue.html' title='Authentic Dialogue'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-6079603541382141581</id><published>2009-10-04T12:58:00.001-05:00</published><updated>2009-10-04T12:58:10.765-05:00</updated><title type='text'>Gut Alignment</title><content type='html'>&lt;p&gt;Ok, so back to this coffee pot.&amp;#160; It is just too nice to give up on it.&amp;#160; So after another read of the manual and not learning anything from that, I looked at the coffee pot.&amp;#160; I tried to leave my preconceived notions of how it should work behind.&lt;/p&gt;  &lt;p&gt;After some study of how I thought the filter should go in and how it sort of worked, I tried something different.&amp;#160; I noticed a “trough” of sorts at the bottom of the basket.&amp;#160; This time, I rotated the filter 90°.&amp;#160; That made all the difference in the world.&amp;#160; The filter now fits snugly into the basket and all is right with the world.&lt;/p&gt;  &lt;p&gt;So, when I let the coffee pot reveal itself to me I gained insight and now there is a symbiotic relationship!&lt;/p&gt;  &lt;p&gt;In our relationships and work environments it is important to try and understand the motivations of our employees, employers and customers.&lt;/p&gt;  &lt;p&gt;For instance, reflect on what is important in life to you, your values.&amp;#160; Then consider the goals of your employer.&amp;#160; If there isn’t some alignment it is likely that you won’t be happy there.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-6079603541382141581?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/6079603541382141581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2009/10/gut-alignment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6079603541382141581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6079603541382141581'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2009/10/gut-alignment.html' title='Gut Alignment'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-4401051926784088955</id><published>2009-09-18T01:27:00.007-05:00</published><updated>2010-08-05T10:21:57.554-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team'/><title type='text'>Bad coffee pot! X^(</title><content type='html'>&lt;p&gt;I know, I know! Back to the coffee pot.
We were trying to make adjustments to the process and having trouble.
The management (my wife) noticed the problems I was experiencing.
Most noticeable were the backed up coffee and grinds overflowing onto the counter.&lt;/p&gt;

&lt;p&gt;So, we were losing time, precious resources (beans), creating a mess and had nothing to show for it.  Management said, enough!&lt;/p&gt;

&lt;p&gt;The coffee pot was removed and we went in search of a replacement.  We ended up with a high quality (and high initial expense) specialized single cup brewer.  This works out really well since I am the only coffee drinker in the house.&lt;/p&gt;

&lt;p&gt;I've gotta say, after the team metaphor with &lt;a href="http://soloso.blogspot.com/2009/08/new-team-new-rules.html"&gt;the last post&lt;/a&gt;, my team was really dismayed to hear that the coffee pot got swapped out!  The moral of this post is therefore left as an exercise to the reader.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-4401051926784088955?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/4401051926784088955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2009/09/bad-coffee-pot-x.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4401051926784088955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4401051926784088955'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2009/09/bad-coffee-pot-x.html' title='Bad coffee pot! X^('/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-9037344133431051534</id><published>2009-08-12T13:21:00.002-05:00</published><updated>2010-08-05T10:21:29.880-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team'/><title type='text'>New Team, New Rules</title><content type='html'>&lt;p&gt;I have had my old coffee pot for years.&amp;#160; It uses a basket filter.&amp;#160; I grind my coffee beans right before brewing.&amp;#160; Over time I had figured out the proper amount of beans and the correct granularity of the grind.&amp;#160; The result was great coffee every time! :)&lt;/p&gt;  &lt;p&gt;My wife recently got me a new coffee pot.&amp;#160; It is much nicer with features like a clock, timer and higher capacity pot.&amp;#160; The new machine uses #4 filters instead of the basket style filters.&lt;/p&gt;  &lt;p&gt;So, I followed the instructions for doing the initial “cleaning” runs.&amp;#160; I went to make my first full pot of coffee and I used the amount of coffee and the granularity that I have been used to using.&amp;#160; Then I heard the sound of coffee on burner.&amp;#160; What?&amp;#160; The grounds had gotten up and around the filter and clogged the dispensing hole.&amp;#160; :(&amp;#160; I chalked it up to the shorter filter.&lt;/p&gt;  &lt;p&gt;Tried another full pot on another day with a new improved bigger filter.&amp;#160; Similar result, grounds in my coffee.&amp;#160; No bueno!&lt;/p&gt;  &lt;p&gt;Then it occurred to me, I was grinding finer than “drip” granularity and this was causing the problem.&amp;#160; Maybe the cone style basket doesn’t need as many grounds either.&amp;#160; I guess I’ll have to check the manual!&lt;/p&gt;  &lt;p&gt;As always, I’m thinking of how do these lessons translate to software development?&amp;#160; To me, I pull away that we can’t use the same procedures we’ve always used when we have a new environment.&amp;#160; In this case the environment consisted of the coffee maker, water, filter, beans and grinder.&amp;#160; (Let’s not consider condiments!)&amp;#160; Change any of these critical components and you can’t expect the same results.&lt;/p&gt;  &lt;p&gt;So, if your team changes, your management changes, the tools you use change, etcetera, expect that your process must change as well.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-9037344133431051534?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/9037344133431051534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2009/08/new-team-new-rules.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/9037344133431051534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/9037344133431051534'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2009/08/new-team-new-rules.html' title='New Team, New Rules'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-7722860436674400381</id><published>2009-01-26T23:42:00.001-06:00</published><updated>2009-01-26T23:42:23.804-06:00</updated><title type='text'>Transference of process or technique</title><content type='html'>&lt;p&gt;You know how you're always hearing about work-life balance.&amp;#160; It &lt;em&gt;really&lt;/em&gt; is a good idea.&amp;#160; You can pull from experiences in &amp;quot;outside&amp;quot; activities to enhance your software development skills/process.&lt;/p&gt;  &lt;h2&gt;What?&lt;/h2&gt;  &lt;p&gt;When you participate in other activities like camping, hiking, bicycling, toastmasters, painting, etc you learn new techniques.&amp;#160; You gain insight into that activity that you can likely bring to your software development practice.&lt;/p&gt;  &lt;h2&gt;Give me an example&lt;/h2&gt;  &lt;p&gt;For instance, you're into bicycling.&amp;#160; You've picked up different bicycles for different types of terrain/activities.&amp;#160; You've added various accessories to your bike to make the experience more enjoyable.&amp;#160; You carry a back up tube and air pump for emergencies.&amp;#160; Water and a power bar and gel are along for the ride as well.&amp;#160; You've come to realize that you can go farther and faster over more difficult terrain when you're riding with a buddy.&amp;#160; After training for a while you are stronger and have better riding technique, know the bike better and how to adjust gears for the terrain.&lt;/p&gt;  &lt;p&gt;Reflecting on the above you ask yourself:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Do I have or use different tools for different projects? &lt;/li&gt;    &lt;li&gt;What accessories can I add to my development environment to make the process more enjoyable? &lt;/li&gt;    &lt;li&gt;Where's my development safety net? &lt;/li&gt;    &lt;li&gt;What do I do to keep going while I'm developing? &lt;/li&gt;    &lt;li&gt;How can a buddy help me go further and faster creating software? &lt;/li&gt;    &lt;li&gt;Am I better developer now-- that is, do I have better technique now? Do I know my tools better? &lt;/li&gt;    &lt;li&gt;What would it mean for me to &amp;quot;shift gears for the terrain&amp;quot; in terms of software? &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;In summary, that work-life balance/outside activities can make you a better developer.&lt;/p&gt;  &lt;p&gt;I encourage you to evaluate your experiences from other activities and bring that knowledge to your software development craft.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-7722860436674400381?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/7722860436674400381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2009/01/transference-of-process-or-technique.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/7722860436674400381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/7722860436674400381'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2009/01/transference-of-process-or-technique.html' title='Transference of process or technique'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-8500403941603725053</id><published>2009-01-08T23:14:00.001-06:00</published><updated>2009-01-08T23:14:48.087-06:00</updated><title type='text'>Vista Gadget for following the Missouri House</title><content type='html'>&lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="253"&gt;Over the holiday break I updated my &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=5104c7eb-871c-40c7-be6a-2128677282f4&amp;amp;bt=1&amp;amp;pl=1"&gt;Missouri House Vista Gadget&lt;/a&gt; for the 2009 Legislative session.&amp;#160; This gadget has links for frequently accessed pages on the &lt;a href="http://house.mo.gov/"&gt;Missouri House web site&lt;/a&gt;.&amp;#160; &lt;br /&gt;          &lt;br /&gt;          &lt;p&gt;This session there are also three new custom Google search tools added as well.&amp;#160; The &lt;a href="http://www.google.com/cse?cx=009888864800404803939%3Azli3ln7_yra&amp;amp;ie=UTF-8&amp;amp;q=&amp;amp;sa=Search"&gt;Legislative Search&lt;/a&gt; indexes the combined sites of the &lt;a href="http://www.house.mo.gov/"&gt;Missouri House&lt;/a&gt;, the &lt;a href="http://moga.mo.gov/"&gt;Missouri General Assembly&lt;/a&gt; and the &lt;a href="http://www.senate.mo.gov"&gt;Missouri Senate&lt;/a&gt;.&amp;#160; The &lt;a href="http://www.google.com/cse?cx=009888864800404803939%3Akex9__bcocm&amp;amp;ie=UTF-8&amp;amp;q=&amp;amp;sa=Search"&gt;RSMO search&lt;/a&gt; indexes the Revised Statutes of Missouri.&amp;#160; The &lt;a href="http://www.google.com/cse?cx=009888864800404803939%3Aneoyohkm7gm&amp;amp;ie=UTF-8&amp;amp;q=&amp;amp;sa=Search"&gt;Constitution search&lt;/a&gt; works through the Missouri State Constitution and the Preamble.&lt;/p&gt;          &lt;p&gt;Please use the &lt;a href="http://boards.live.com/Windows%20Live%20Gallery%20Forumboards/thread.aspx?threadID=448183"&gt;gadget forum&lt;/a&gt; or &lt;a href="http://twitter.com/k0emt/"&gt;Twitter&lt;/a&gt; to let me know how the gadget works for you!&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="146"&gt;&lt;a href="http://lh5.ggpht.com/_EdDlpJZIv_Q/SWbdQ9lfmDI/AAAAAAAAAC4/EB8iBG688YI/image%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/_EdDlpJZIv_Q/SWbdRhMS2gI/AAAAAAAAAC8/Ejh00i4DvNs/image_thumb.png" width="134" height="244" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-8500403941603725053?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/8500403941603725053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2009/01/vista-gadget-for-following-missouri.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8500403941603725053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8500403941603725053'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2009/01/vista-gadget-for-following-missouri.html' title='Vista Gadget for following the Missouri House'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_EdDlpJZIv_Q/SWbdRhMS2gI/AAAAAAAAAC8/Ejh00i4DvNs/s72-c/image_thumb.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-6990091501594014957</id><published>2008-12-04T23:46:00.001-06:00</published><updated>2008-12-04T23:46:59.165-06:00</updated><title type='text'>We've come a long way, baby! (TabletPC's)</title><content type='html'>&lt;p&gt;This post is in response to a &lt;a href="http://ednortonengineeringsociety.blogspot.com/2008/12/dont-touch-me.html"&gt;blog post&lt;/a&gt; by &lt;a href="http://twitter.com/dullroar"&gt;Jim Lehmer&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Why/how do I use my &lt;a href="http://forum.notebookreview.com/showthread.php?p=1464228"&gt;Gateway M-285 Convertible&lt;/a&gt;?&lt;/p&gt;  &lt;p&gt;I use the tablet in slate mode when reading or annotating PDF's, going through email, going through RSS feeds with Google Reader.&amp;#160; Having a Tablet PC comes in handy with drawing applications.&lt;/p&gt;  &lt;p&gt;With &lt;a href="http://www.pdfannotator.com"&gt;PDF Annotator&lt;/a&gt; you can mark up and annotate a PDF.&lt;/p&gt;  &lt;p&gt;I use the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1250"&gt;Grab and Drag add-on&lt;/a&gt; to FireFox so that I can use my stylus for sliding the page I'm viewing up and down.&amp;#160; Using Google Reader in &amp;quot;expanded view&amp;quot; mode with the slate configuration you can quickly and easily go through lots of feeds while sitting on the couch.&lt;/p&gt;  &lt;p&gt;With Tablet Extensions for Outlook (TEO) you can use the stylus to easily create and send emails and appointments, etc in slate mode.&lt;/p&gt;  &lt;p&gt;As far as keeping the screen clean, it really hasn't been an issue for me.&amp;#160; When I notice that it's getting a bit too smudged up, I'll pull out the cleaning cloth (magic 3M fabric) that's included with most (all?) Tablet's.&amp;#160; Or I'll just use some screen wipes.&lt;/p&gt;  &lt;p&gt;Sure, I'll agree, that the current generation of machines still is lacking in the pen on paper feel.&amp;#160; However, I'm sure we'll get there.&amp;#160; Years ago I used a special stylus from Cross on my PDA and it had a great feel.&amp;#160; It was a bit unsettling how it &lt;em&gt;wasn't&lt;/em&gt; smooth.&amp;#160; At least today's styli like those in the M285 aren't itty-bitty toothpicks anymore.&amp;#160; Some devices even have an electronic &amp;quot;&lt;a href="http://content.etilize.com/Thumbnail/1010600274.jpg"&gt;eraser&lt;/a&gt;&amp;quot; at the other end of the stylus, like on the &lt;a href="http://www.notebookreview.com/default.asp?newsID=3021&amp;amp;review=Gateway+M255"&gt;M255&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;When you are meeting with a client, or you're in a setting where you're taking notes, slate mode with handwritten notes is the way to go.&amp;#160; Other people aren't distracted by the keys clicking and you've removed the physical barrier that the screen creates.&amp;#160; The technology blends into the background, letting you focus on what you're &lt;em&gt;really&lt;/em&gt; trying to do.&lt;/p&gt;  &lt;p&gt;Many people are much faster typing than hand writing.&amp;#160; So why do they take notes on paper in meetings?&amp;#160; Because it's more natural?&amp;#160; It doesn't get in the way?&amp;#160; It's less constraining?&lt;/p&gt;  &lt;p&gt;Enter the killer app for the TabletPC - &lt;a href="http://office.microsoft.com/en-us/onenote/default.aspx"&gt;OneNote&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you take your notes with OneNote you can easily add in more space to the page - even in the middle!&amp;#160; Not something you can do with pen and ink.&amp;#160; Keep the pen toolbar handy and you can easily change between pen types, colors, and widths.&amp;#160; Or pick up a highlighter.&lt;/p&gt;  &lt;p&gt;With OneNote you &lt;strong&gt;&lt;em&gt;can&lt;/em&gt; &lt;/strong&gt;do handwriting recognition &amp;amp; &lt;strong&gt;search.&amp;#160; &lt;/strong&gt;OneNote will do conversion from handwriting to text.&amp;#160; Yes, it's not 100% perfect.&amp;#160; You can correct it, but &lt;strong&gt;I've found it's best just to leave it in handwriting&lt;/strong&gt;.&amp;#160; Why do you &lt;em&gt;need&lt;/em&gt; it in text?&amp;#160; Odds are you don't.&amp;#160; So, after a meeting I'll often email notes out to participants in handwriting.&lt;/p&gt;  &lt;p&gt;OneNote also offers voice recording &amp;amp; &lt;strong&gt;search&lt;/strong&gt; within the audio.&amp;#160; Although, the practical aspects are such that I don't use this capability.&lt;/p&gt;  &lt;p&gt;A feature I do use is &lt;strong&gt;image search&lt;/strong&gt;.&amp;#160; You can snap a picture of a white board or scan a document in and &lt;em&gt;you can search the text within the image&lt;/em&gt;!&lt;/p&gt;  &lt;p&gt;One Note offers some integration with IE and OutLook.&amp;#160; Send documents from IE to OneNote.&amp;#160; Create OutLook tasks from within IE.&lt;/p&gt;  &lt;p&gt;I'm just going to gloss over this, but OneNote notebooks are shareable via network drive, USB Flash Drive or SharePoint.&lt;/p&gt;  &lt;p&gt;So, use OneNote just like all of those paper notebooks and notepads you have laying around and get everything in one place that's searchable, shareable and malleable.&lt;/p&gt;  &lt;p&gt;There are other features of the application I haven't touched on that make OneNote just as home on a traditional laptop or desktop computer.&amp;#160; You owe it to yourself to check it out!&lt;/p&gt;  &lt;h2&gt;Prior blog posts that mention TabletPC's &amp;amp; OneNote:&lt;/h2&gt;  &lt;p&gt;&lt;a title="How our Dev team uses OneNote" href="http://soloso.blogspot.com/2008/09/how-our-dev-team-uses-onenote.html"&gt;How our Dev team uses OneNote&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Tablet PC Head to Head" href="http://soloso.blogspot.com/2007/11/tablet-pc-head-to-head.html"&gt;Tablet PC Head to Head&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Developer Tool- Digital Camera" href="http://soloso.blogspot.com/2007/05/developer-tool-digital-camera.html"&gt;Developer Tool- Digital Camera&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-6990091501594014957?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/6990091501594014957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/12/we-come-long-way-baby-tabletpc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6990091501594014957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6990091501594014957'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/12/we-come-long-way-baby-tabletpc.html' title='We&amp;#39;ve come a long way, baby! (TabletPC&amp;#39;s)'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-8340167007258002485</id><published>2008-11-19T11:11:00.001-06:00</published><updated>2008-11-19T18:26:57.530-06:00</updated><title type='text'>Who maintains the burn chart?</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;a href="http://twitter.com/jamescarr"&gt;jamescarr&lt;/a&gt;&lt;/strong&gt; asks random agile question: who should maintain/update the burn-down, customers or developers?&lt;/p&gt;  &lt;p&gt;In an ideal world, the developers mark completed and the customers mark accepted/rejected.&lt;/p&gt;  &lt;p&gt;This information is then reflected on a stacked burn-down/up chart like in &lt;a href="http://projectcards.com/"&gt;projectcards&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Of course in (my) reality we schedule our iteration and often end up with &lt;a href="http://en.wikipedia.org/wiki/First_Things_First_(book)"&gt;quadrant I&lt;/a&gt; stuff that gets thrown into the mix along the way.&amp;#160; So what you see down below is iteration story churn.&amp;#160; We're a small team with many projects going at once.&lt;/p&gt;  &lt;p&gt;Often the PM serves as the customer proxy and updates the status of tasks reflected in the burn-up/down charts.&amp;#160; It is important to note that the PM &lt;em&gt;really does&lt;/em&gt; check the product and verify acceptance with the customer.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_EdDlpJZIv_Q/SSRIzxkdTkI/AAAAAAAAABo/OgOfvt_SI2w/clip_image002%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="clip_image002" src="http://lh6.ggpht.com/_EdDlpJZIv_Q/SSRIzxTWPNI/AAAAAAAAABs/sE-erqXbP6o/clip_image002_thumb%5B2%5D.jpg" width="401" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-8340167007258002485?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/8340167007258002485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/11/who-maintains-burn-chart.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8340167007258002485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8340167007258002485'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/11/who-maintains-burn-chart.html' title='Who maintains the burn chart?'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_EdDlpJZIv_Q/SSRIzxTWPNI/AAAAAAAAABs/sE-erqXbP6o/s72-c/clip_image002_thumb%5B2%5D.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-3685133024061284164</id><published>2008-10-22T23:53:00.001-05:00</published><updated>2008-10-22T23:53:09.540-05:00</updated><title type='text'>The browsers in my life</title><content type='html'>&lt;p&gt;In the post I'm going to cover which browsers I'm currently using and why.&amp;#160; I do try and check out a variety of browsers so I can I see what features are out there and how our users may be viewing our sites.&lt;/p&gt;  &lt;h2&gt;Chrome&lt;/h2&gt;  &lt;p&gt;I like the process separation.&amp;#160; This is especially nice when you have a lot of tabs open like when you're surfing eBay.&amp;#160; The clean UI and speed of this browser are also very nice.&amp;#160; I really like the &amp;quot;new tab&amp;quot; feature that picks up on your frequented sites.&amp;#160; On the downside are no extensions/add-on's.&lt;/p&gt;  &lt;h2&gt;Safari&lt;/h2&gt;  &lt;p&gt;I really liked this browser when it came out.&amp;#160; Again the speed and clean UI were very appealing.&amp;#160; On the downside, no extensions and really super annoying Apple updater that wants to give you iTunes and QuickTime and Open Office!&amp;#160; Hey, I'm a fan of open source, but you can't just install stuff on peoples machines!&lt;/p&gt;  &lt;h2&gt;Internet Explorer&lt;/h2&gt;  &lt;p&gt;Using IE7 and IE8 beta 2.&amp;#160; Need to make sure our sites work with the browser most of our visitors use.&amp;#160; On the plus side I can wedge in the Google toolbar.&amp;#160; IE8 seems to be nicer.&amp;#160; It's a recent install for me, so I can't really say a lot about it.&lt;/p&gt;  &lt;h2&gt;Mobile Internet Explorer&lt;/h2&gt;  &lt;p&gt;I do check our PDA page with the IE browser on my Windows Mobile 6.1 smart phone.&amp;#160; I also check the couple of pages that link off of that.&lt;/p&gt;  &lt;h2&gt;Flock&lt;/h2&gt;  &lt;p&gt;This is an interesting browser in that it tries to integrate social networking, email and blogging into the browser.&amp;#160; The end result is a funky, distracting, somewhat awkward and cluttered interface.&amp;#160;&amp;#160; On the plus side you can use Firefox extensions with it.&amp;#160; This browser just didn't &amp;quot;work&amp;quot; for me.&amp;#160; The UI seemed confusing, forced and cluttered.&lt;/p&gt;  &lt;h2&gt;Firefox&lt;/h2&gt;  &lt;p&gt;Firefox is my browser of choice for most of my surfing needs.&amp;#160; Why?&amp;#160; Extensions and the user UI customizations that are possible.&amp;#160; I'm using the Google toolbar add-in.&amp;#160; I've installed the &amp;quot;better&amp;quot; gMail and Reader extensions.&amp;#160; I've found add-on's that change the appearance to something I like a bit better and the tabs look more like Chrome.&amp;#160; There are also add-in's and options that make life easier for a web developer.&lt;/p&gt;  &lt;p&gt;I would really like to see the individual process and &amp;quot;new tab&amp;quot; feature of Chrome brought into Firefox.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-3685133024061284164?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/3685133024061284164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/10/browsers-in-my-life.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3685133024061284164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3685133024061284164'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/10/browsers-in-my-life.html' title='The browsers in my life'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-2840273824669815164</id><published>2008-09-29T23:46:00.001-05:00</published><updated>2008-09-29T23:46:34.347-05:00</updated><title type='text'>How our Dev team uses OneNote</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;I like the &lt;a href="http://office.microsoft.com/en-us/onenote/default.aspx"&gt;OneNote 2007&lt;/a&gt; product.&amp;#160; I use it for both personal, academic and business uses.&amp;#160; Today I'm going to share with you how my team uses it to support our development process.&lt;/p&gt;  &lt;h2&gt;OneNote Basics&lt;/h2&gt;  &lt;p&gt;OneNote is the electronic equivalent of a notebook binder which can contain multiple sections and numerous pages per section.&amp;#160; ON2007 adds the major feature of being able to have multiple notebooks.&amp;#160; Notebooks can be shared on a network drive or via a SharePoint Server (they can also be stored locally or on a flash drive).&amp;#160; ON has on-line/off-line capability with notebook synchronization.&amp;#160; While ON has some features that are best used with a TabletPC - such as being able to write or draw on the page, a TabletPC is &lt;em&gt;not&lt;/em&gt; required.&lt;/p&gt;  &lt;p&gt;OneNote also has a great search capability which includes grabbing text out of images and searching in audio files too!&lt;/p&gt;  &lt;h2&gt;Operations Manual&lt;/h2&gt;  &lt;p&gt;We have put together an &amp;#8220;operations manual&amp;#8221; in OneNote.&amp;#160; The idea is to document routine and some times not so common tasks.&amp;#160; We originally started off with a single section in a notebook with lots of pages and now we have a &amp;#8220;section group.&amp;#8221;&amp;#160; So my suggestion here is start off small and let your sections reveal themselves.&lt;/p&gt;  &lt;p&gt;For example, we now have tabs (sections) for:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Original information we haven&amp;#8217;t moved anywhere else yet--a catch all.&lt;/li&gt;    &lt;li&gt;Daily tasks&lt;/li&gt;    &lt;li&gt;Nightly tasks&lt;/li&gt;    &lt;li&gt;End of session&lt;/li&gt;    &lt;li&gt;Server specific stuff&lt;/li&gt;    &lt;li&gt;A section that is a data dictionary&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Each section can have from a few to many pages under it.&lt;/p&gt;  &lt;h4&gt;Where does the Operations Manual content come from?&lt;/h4&gt;  &lt;p&gt;Basically, if we come across a task that we don&amp;#8217;t know how to do, we ask the person that is the expert to document the task.&lt;/p&gt;  &lt;p&gt;Then someone else runs through it with the expert &amp;#8211; making additional notes or changes.&lt;/p&gt;  &lt;p&gt;Now, we have at least two people that have run through it plus it is documented by the expert with &amp;#8220;newbie&amp;#8221; notes.&lt;/p&gt;  &lt;p&gt;To me, one of the biggest advantages of using ON is that you can focus on what's important--the content.&amp;#160; When deal with a word processor to document processors we quickly get bogged down in the proper formatting of the document and in making the tool happy.&amp;#160; Did I mention that it's really easy to search all of the pages in ON too?&amp;#160; With multiple word processor documents, you'd need a desk top search of some sort and have to deal with more pessimistic file locking when editing them.&lt;/p&gt;  &lt;h2&gt;Project Documentation&lt;/h2&gt;  &lt;p&gt;We also use ON for capturing project information &amp;#8211; meeting notes, tasks, pictures, diagrams, etc.&amp;#160; ON has OutLook integration so at the end of a meeting you can quickly email the notes that were taken to all of the meeting attendees.&amp;#160; You can set task flags on items as well.&amp;#160; I have found that even handwritten minutes can quickly be mailed out to everyone and that they are acceptable.&amp;#160; ON does have a feature to convert handwriting to text.&amp;#160; However, it is not 100% accurate.&amp;#160; If you intend to email out plain text you are almost better off taking notes via keyboard.&lt;/p&gt;  &lt;p&gt;In an &lt;a href="http://soloso.blogspot.com/2007/05/developer-tool-digital-camera.html"&gt;earlier post&lt;/a&gt; I talked about taking pictures of whiteboard diagrams and dropping them in OneNote.&amp;#160; ON also has the ability to capture from TWAIN devices such as a scanner.&amp;#160; So if you have printed source material w/out a digital version, scan it in.&lt;/p&gt;  &lt;p&gt;OneNote also includes a screen clipping feature like SnagIt! So you can easily put screen captures in with the project information.&amp;#160; There are also send to ON tools for OutLook and IE.&amp;#160; If you want to preserve formatting you can print to ON.&amp;#160; So, if there is an email that has particularly relevant information you can send or print it in with those project materials.&lt;/p&gt;  &lt;p&gt;That just made me think about another nice feature.&amp;#160; Say, you do have a nice PDF document you got from a vendor.&amp;#160; You can drag-drop that PDF onto a project page, choose to insert the file and now it's part of the ON document!&amp;#160; So, you can keep notes, pictures, sound files and other files all together in the same notebook.&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;OneNote 2007 has many more features than I have mentioned.&lt;/p&gt;  &lt;p&gt;I find OneNote 2007 to be an affordable and indispensable tool that supports our operations and development roles.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-2840273824669815164?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/2840273824669815164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/09/how-our-dev-team-uses-onenote.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2840273824669815164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2840273824669815164'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/09/how-our-dev-team-uses-onenote.html' title='How our Dev team uses OneNote'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-1118971400732442981</id><published>2008-08-21T17:02:00.001-05:00</published><updated>2008-08-21T17:02:37.840-05:00</updated><title type='text'>Team member opening</title><content type='html'>&lt;p&gt;We currently have an opening for a full-time entry-level member on our team.&amp;#160; We are also considering applicants for an intern program.&lt;/p&gt;  &lt;p&gt;If you are interested in being a team member in an environment that uses agile techniques such as pair programming, test driven development and iterative cycles please &lt;a href="http://www.house.mo.gov/billtracking/info/jobs.aspx"&gt;review the job description and submit an application&lt;/a&gt;.&amp;#160; &lt;em&gt;Be sure to mention in your cover letter that you found out about the job here!&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-1118971400732442981?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/1118971400732442981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/08/team-member-opening.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/1118971400732442981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/1118971400732442981'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/08/team-member-opening.html' title='Team member opening'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-3518626142725548301</id><published>2008-07-21T23:44:00.001-05:00</published><updated>2008-07-21T23:44:31.417-05:00</updated><title type='text'>Software Rot</title><content type='html'>&lt;p&gt;I have an apple sitting on my desk right now.&amp;#160; As I was looking at it, wondering if I'm going to eat it before it rots I couldn't help but think of that time lapse photography where you see fruit decaying.&lt;/p&gt;  &lt;p&gt;You've probably heard about bit rot.&amp;#160; So, I was thinking how does this apply to software?&amp;#160; What can we do to preserve the fruit.&amp;#160; I didn't like the notion, that no matter what you do, the apple is going to rot.&amp;#160; Then I thought, hey maybe software is more like a new car.&amp;#160; If we take care of the car, keeping it clean and maintaining it we're going to have a useful automobile for many miles.&amp;#160; We may eventually choose to replace it because of upkeep costs or changes in style... people are fickle aren't they?&lt;/p&gt;  &lt;p&gt;Now, the car that doesn't get the maintenance... it rusts, it fails, it falls apart...and it's like the &amp;quot;broken window&amp;quot; idea... as it decays we want to take even less care of it.&amp;#160; We want it to fail so we can replace it with something new.&amp;#160; Or because it is in such poor shape, when the mirror busts off we just slap on another that doesn't really match.&amp;#160; But, we don't care because everything is in such a poor state anyway. &lt;/p&gt;  &lt;p&gt;Or maybe the car was put away in the garage because the original owner is gone...and it doesn't age gracefully.&lt;/p&gt;  &lt;p&gt;These are things that happen to software.&amp;#160; What can we do?&amp;#160; Take care of our software.&amp;#160; As we learn new concepts keep our systems polished.&amp;#160; Revisit the application with code reviews, this also helps out the new people on the team.&amp;#160; Then you don't have to worry about not having available the one person that knows the code.&amp;#160; If the system was developed with n-tier design then maybe a new paint job (GUI) is in order?&amp;#160; I am sure you can think of other things you can do to keep your systems from rotting.&lt;/p&gt;  &lt;p&gt;So, keep your systems clean, polished and maintained!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-3518626142725548301?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/3518626142725548301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/07/software-rot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3518626142725548301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3518626142725548301'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/07/software-rot.html' title='Software Rot'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-4708434267692702913</id><published>2008-07-01T09:50:00.001-05:00</published><updated>2008-07-01T09:50:14.960-05:00</updated><title type='text'>XOBNI out again</title><content type='html'>&lt;p&gt;Well with the latest push update of Xobni that included LinkedIn integration, which I liked, my Outlook decided to start crashing when you looked at it funny.&lt;/p&gt;  &lt;p&gt;I noticed that when you tried to resize the Xobni toolbar it would crash.&amp;#160; Also, when trying to move a group of tasks from the past to today it would crash.&lt;/p&gt;  &lt;p&gt;After uninstalling Xobni, Outlook complained that the plug-in wasn't available and proceeded.&amp;#160; I think I got one more crash out of it.&amp;#160; I've rebooted since then and now all is well.&lt;/p&gt;  &lt;p&gt;I'll keep an eye on the progress Xobni makes towards release and may eventually reinstall.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-4708434267692702913?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/4708434267692702913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/07/xobni-out-again.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4708434267692702913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4708434267692702913'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/07/xobni-out-again.html' title='XOBNI out again'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-2803651259673964362</id><published>2008-06-06T11:21:00.001-05:00</published><updated>2008-06-06T11:28:50.733-05:00</updated><title type='text'>Windows Mobile 6.1 Upgrade Experience Report</title><content type='html'>&lt;p&gt;There is a &lt;a href="http://direct.motorola.com/hellomoto/NSS/update_my_software.asp"&gt;new WM6.1 release out for the Motorola Q9c&lt;/a&gt; sold through Sprint.&amp;#160; After &lt;a href="http://www.wmexperts.com/articles/sprint_motorola_q9c_gets_windo.html"&gt;reading a bit about it&lt;/a&gt; I decided I wanted to do this upgrade.&amp;#160; This is my experience report from upgrading my device.&lt;/p&gt;  &lt;p&gt;I started off by going to the &lt;a href="http://direct.motorola.com/hellomoto/NSS/update_my_software.asp"&gt;Motorola website&lt;/a&gt; and downloading the upgrade tool.&amp;#160; This is about 18M.&amp;#160; I thought sweet, this is going to be easy.&amp;#160; I was wrong.&amp;#160; The upgrade tool is merely a downloader type tool.&amp;#160; The first part of the install this tool verify's the device and then it proceeded to download the update--about an hour on DSL.&amp;#160; &lt;/p&gt;  &lt;p&gt;You are also told to make sure you have the device backed up as it is wiped as part of the install.&amp;#160; However, they give you an option to keep personal information.&amp;#160; I did this.&lt;/p&gt;  &lt;p&gt;When doing the update you'll see a black and white DOS like screen on the device.&amp;#160; I did end up with an error in the install process.&amp;#160; The software on the PC detected the condition.&amp;#160; I had to power cycle the Q9c by removing the battery.&amp;#160; The process picked back up where it was when I plugged it back in.&lt;/p&gt;  &lt;p&gt;Around this time the device reboots and you'll see a graphical Windows Mobile 6.1 screen.&amp;#160; Status on the PC indicates around 34% complete.&amp;#160; &lt;/p&gt;  &lt;p&gt;Soon thereafter a manual reboot is requested by the software.&amp;#160; During reboot I see the Sprint screen.&amp;#160; When I reconnected the device nothing happened.&amp;#160; I power-cycled it again while it was plugged in and this time it was detected.&amp;#160; ActiveSync was seeing the device with a &lt;em&gt;guest&lt;/em&gt; partnership.&amp;#160; The software continued loading the device and then went to load my personal settings.&lt;/p&gt;  &lt;p&gt;Next, it looked like partnerships were removed and the device rebooted.&amp;#160; It might take a couple of seconds before the auto-reboot.&amp;#160; Don't panic.&amp;#160; After it rebooted is when it recreated the partnerships.&amp;#160; If you end up with an ActiveSync screen that is showing a guest partnership, reboot the device.&lt;/p&gt;  &lt;h2&gt;Bad Stuff&lt;/h2&gt;  &lt;p&gt;While my settings were retained and information that was on my SD card was left alone, I did have to re-install all of my applications.&amp;#160; I also had to reinstall the GPS application.&amp;#160; &lt;/p&gt;  &lt;h2&gt;Partnerships &amp;amp; Blue Tooth&lt;/h2&gt;  &lt;p&gt;Even though my Exchange partnership was showing up, it wasn't working properly.&amp;#160; I ended up removing and recreating it.&lt;/p&gt;  &lt;p&gt;I also ended up with a second partnership on my personal Outlook account on my home PC.&amp;#160; I removed the original partnership and renamed the newly created partnership.&amp;#160; I started getting some synch errors on the PC, so I backed off what was being synched and added them back on one at a time.&amp;#160; That seems to have taken care of the synch problem.&lt;/p&gt;  &lt;p&gt;All BlueTooth settings were lost.&amp;#160; I need to recreate those pairings.&lt;/p&gt;  &lt;h2&gt;Cool Stuff&lt;/h2&gt;  &lt;p&gt;I now have my Yahoo! small business email accounts set up and working.&amp;#160; They use SSL connections so I wasn't able to configure the email client to work with them previously.&lt;/p&gt;  &lt;p&gt;A feature I really like is that I can now lock and auto-lock my device with a PIN or password!&amp;#160; They still haven't updated the software to display owner information when the device is locked.&lt;/p&gt;  &lt;p&gt;Other cool new features include a &amp;quot;slider&amp;quot; home screen, zoom feature in the web browser and the threaded text messaging.&amp;#160; Microsoft got it right when they made it very easy to see a text &amp;quot;conversation&amp;quot; and respond without having to create and address a new text message.&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;Overall, a worthwhile upgrade.&lt;/p&gt;  &lt;p&gt;You need to plan &lt;em&gt;several&lt;/em&gt; hours for this upgrade and for reinstalling applications--oh yeah and for playing with, I mean learning more about it.&amp;#160; It is not for the faint of heart.&amp;#160; You need to be at your PC that you normally sync with--you'll be using ActiveSync.&amp;#160; If you're using a laptop, make sure you're plugged in!&amp;#160; Losing power or Internet during the process and you could have a bricked device.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-2803651259673964362?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/2803651259673964362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/06/windows-mobile-61-upgrade-experience.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2803651259673964362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/2803651259673964362'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/06/windows-mobile-61-upgrade-experience.html' title='Windows Mobile 6.1 Upgrade Experience Report'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-8082915388918217251</id><published>2008-06-04T15:17:00.001-05:00</published><updated>2008-06-04T15:17:19.585-05:00</updated><title type='text'>ProjectCards Evaluation and Installation</title><content type='html'>&lt;p&gt;I'm looking at &lt;a href="http://www.projectcards.com"&gt;ProjectCards&lt;/a&gt; as a tool to augment my current project management process that uses &lt;a href="http://office.microsoft.com/en-us/onenote/"&gt;OneNote&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;What do I hope to gain from using ProjectCards?&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I would like to have a management and user friendly dashboard for reviewing project/release/iteration/task status.&amp;#160; &lt;/li&gt;    &lt;li&gt;Be able to determine how much time there is in unscheduled stories.&amp;#160;&amp;#160; &lt;em&gt;This can be accomplished by creating an &amp;quot;unscheduled&amp;quot; iteration and moving all unscheduled items into it.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Be able to easily review and work with unscheduled stories -- release planning?&amp;#160;&amp;#160; &lt;em&gt;There are numerous filters and planning group options available.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Be able to link to detailed information in OneNote.&amp;#160; &lt;em&gt;Using the custom fields URL type I can link to OneNote or a HelpDesk ticket.&amp;#160; However, with anything other than a standard web URL you end up with a funky empty &amp;quot;error&amp;quot; browser on your screen.&amp;#160; The ProjectCards staff said they would change this in the future so it will let the OS handle the URL.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Be able to determine overall project time &lt;/li&gt;    &lt;li&gt;Be able to set up multiple users with various access rights.&amp;#160; &lt;em&gt;Besides being able to easily set up and manage users, there are a handful of default roles built-in to the system which seem to do the job nicely.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Be able to identify in what release a feature was added/enhanced or changed &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;How will OneNote continue to be a part of the process?&lt;/p&gt;  &lt;p&gt;Detail information - notes, pictures, technical data, etc for the stories will reside in OneNote.&lt;/p&gt;  &lt;h2&gt;Installation&lt;/h2&gt;  &lt;p&gt;The installation instructions were a little confusing for the windows server since it talked about needing TomCat.&amp;#160; It ended up being a very simple install.&amp;#160; No configuration was needed.&lt;/p&gt;  &lt;p&gt;Hm. &lt;em&gt;How do I specify where the repository is located?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;I later discovered how to configure the project data directory in the following post: &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.projectcards.com/forums/viewtopic.php?t=850"&gt;http://www.projectcards.com/forums/viewtopic.php?t=850&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;I pointed out to the ProjectCards guys this oversight in the manual and they agreed that it was a pretty big omission and belonged in the next manual.&amp;#160; On the down side it seems that the install directory for the web reports is fixed, UNLESS you use another different web server.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The first time I used the client to connect to the server I took their advice and changed the admin password.&amp;#160; It then promptly gave me a &amp;quot;corrupt license key&amp;quot; error.&amp;#160; I quit and logged back in with the new password--everything went through OK.&lt;/p&gt;  &lt;h2&gt;Evaluation&lt;/h2&gt;  &lt;p&gt;So, now I can take a look at the product and the manual to determine if it will meet our requirements outlined above.&lt;/p&gt;  &lt;p&gt;Sketch out the project using &amp;quot;themes&amp;quot; and putting cards under them.&amp;#160; For example, the Search feature theme may have search by name, search by room number and search by parking spot under it.&lt;/p&gt;  &lt;p&gt;You have to go into each individual story to set it's time and status.&amp;#160; It'd be nice to be able to do this from the dashboard grid.&lt;/p&gt;  &lt;p&gt;Use drag and drop to schedule a task in an iteration.&lt;/p&gt;  &lt;p&gt;Filtering in the theme view allows you to quickly see unscheduled stories.&lt;/p&gt;  &lt;p&gt;I'm finding it annoying that a single account can only be logged in from one location.&amp;#160; So, when I'm working at the desktop pc and then I go over to the TabletPC to do something, I'm logged off of the desktop and any &lt;em&gt;unsaved changes are lost&lt;/em&gt;!&lt;/p&gt;  &lt;p&gt;I can link to a OneNote section using a custom field of the URL type.&amp;#160; However, it thinks it's a bad link format.&amp;#160; Also, it tries to open it in a ProjectCards wrapped web browser.&amp;#160; So, you end up with an empty blank browser and the correct OneNote document open.&amp;#160; Maybe, &amp;quot;dumbing&amp;quot; down this feature may be appropriate.&amp;#160; &lt;em&gt;ProjectCards guys indicate that they will do this in a future release.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Manage users can be used to create users that are used through out the ProjectCards application--that is they are good for all projects.&amp;#160; You can use Manage Project Access to set a users access level in the project--that is you can set what role they have in &lt;em&gt;this&lt;/em&gt; project.&amp;#160; You can create custom project roles.&amp;#160; Unfortunately, they are only good for that project.&lt;/p&gt;  &lt;p&gt;If you have a single team that is working on multiple projects (a program in PM parlance), then you'll want to check out the &amp;quot;planning groups&amp;quot; feature.&amp;#160; This same feature also works well for multiple teams working on a single project.&amp;#160; &lt;em&gt;Tip: once you have one item of the planning group type on the release plan, drag and drop other items under the planning group and they will have their planning group automatically assigned.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I'm still warming up to how the iterations work.&amp;#160; Basically, you set your start day and then specify how long each iteration is in length.&amp;#160; So, you don't have the flexibility to say nothings going to happen this couple of days so we don't want to start the iteration until the 1st of the month.&lt;/p&gt;  &lt;h2&gt;Support&lt;/h2&gt;  &lt;p&gt;I've emailed with the developers on a number of occasions and they have either provided an answer to my query, engaged in a dialogue to better understand what I was trying to do and added items to their feature requests.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-8082915388918217251?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/8082915388918217251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/06/projectcards-evaluation-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8082915388918217251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8082915388918217251'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/06/projectcards-evaluation-and.html' title='ProjectCards Evaluation and Installation'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-6169332514285235278</id><published>2008-05-28T08:21:00.001-05:00</published><updated>2008-05-28T08:21:17.492-05:00</updated><title type='text'>Transferring large files from Mac to Windows</title><content type='html'>&lt;p&gt;As it turns out, one of the last big bastions of incompatibility is the file system.&amp;#160; Windows machines can't do anything with the Mac's Hierarchical File System (&lt;a href="http://en.wikipedia.org/wiki/Hierarchical_File_System"&gt;HFS&lt;/a&gt;).&amp;#160; However, Mac's can read Microsoft's &lt;a href="http://en.wikipedia.org/wiki/Ntfs"&gt;NTFS&lt;/a&gt; format.&amp;#160; But they can't write to the &lt;a href="http://en.wikipedia.org/wiki/Ntfs"&gt;NTFS&lt;/a&gt; disk.&amp;#160; &lt;/p&gt;  &lt;p&gt;Both platforms do support the &lt;a href="http://en.wikipedia.org/wiki/File_Allocation_Table"&gt;FAT32&lt;/a&gt; file system.&amp;#160; However, when you are dealing with large files, for example home digital video, FAT32 is lacking.&amp;#160; FAT32 supports a maximum file size of 4Gig.&amp;#160; So that hour video you made that is 11Gig ends up getting truncated.&amp;#160; So, how do we get the files from the Mac to the PC?&lt;/p&gt;  &lt;p&gt;I tried FTP - way to too slow and timed out eventually.&amp;#160; Also, tried sharing the PC disk and making an SMB connection from the Mac to the PC.&amp;#160; However, it looks like there is the same 4Gig file size limit in the SMB software.&lt;/p&gt;  &lt;p&gt;What I ended up doing was putting the video files on a Mac formatted portable drive.&amp;#160; I then took the portable drive to the PC and used a piece of free software called &lt;a href="http://hem.bredband.net/catacombae/hfsx.html"&gt;HFSExplorer&lt;/a&gt;.&amp;#160; With this software I was able to open the Mac volume and &amp;quot;extract&amp;quot; the files to a local NTFS drive.&amp;#160; It worked great!&amp;#160; I started it running before going to bed (45Gig to run through).&amp;#160; Although after only a couple minutes it had already &amp;quot;extracted&amp;quot; over&amp;#160; a gig.&amp;#160; Much faster than any of the other methods I had tried.&lt;/p&gt;  &lt;p&gt;I used HFSExplorer on a Windows XP machine.&amp;#160; However, it is written in Java so it should be useful on other platforms as well.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-6169332514285235278?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/6169332514285235278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/05/transferring-large-files-from-mac-to.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6169332514285235278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6169332514285235278'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/05/transferring-large-files-from-mac-to.html' title='Transferring large files from Mac to Windows'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-5989586905985200197</id><published>2008-05-07T14:48:00.002-05:00</published><updated>2008-05-21T01:07:16.041-05:00</updated><title type='text'>Xobni</title><content type='html'>&lt;p&gt;&lt;a href="http://www.xobni.com/"&gt;Xobni&lt;/a&gt; looks like a nice Outlook add-in.  However, within a couple of hours of installing I was getting familiar with &lt;a href="http://support.microsoft.com/kb/287497"&gt;scanpst.exe&lt;/a&gt; .  Coincidence?&lt;/p&gt;&lt;p&gt;I removed Xobni and no corrupt pst's since.&lt;/p&gt;&lt;p&gt;2008.05.14 UPDATE:&lt;/p&gt;&lt;p&gt;I determined that it was possible that I had an undetected corrupt ost file before the Xobni install.  I'm giving it a whirl again.&lt;/p&gt;&lt;p&gt;2008.05.21 UPDATE:&lt;/p&gt;&lt;p&gt;So far, so good.  No additional Outlook corruptions.  The feature I like the most about Xobni is the quick access to the phone # for the sender and the list of files you've exchanged with them (and can click on to open).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-5989586905985200197?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/5989586905985200197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/05/xobni.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5989586905985200197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5989586905985200197'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/05/xobni.html' title='Xobni'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-8212474704481516317</id><published>2008-04-07T14:23:00.001-05:00</published><updated>2008-04-07T14:26:12.206-05:00</updated><title type='text'>New Language Features in C# 3.0</title><content type='html'>&lt;h1&gt;&lt;/h1&gt;  &lt;h2&gt;Overview&lt;/h2&gt;  &lt;p&gt;C# 3.0 adds several new language features.&amp;#160; In this article I will review Auto Implemented Properties, Object Initializers, Collection Initializers, Local Variable Type Inference, Language Integrated Query (LINQ) and Anonymous Types.&amp;#160; &lt;/p&gt;  &lt;p&gt;I picked up this material from an &lt;a href="http://mschnlnine.vo.llnwd.net/d1/ch9/vs2008/02%20-%20whats%20new%20in%20c%20sharp.wmv"&gt;excellent video&lt;/a&gt; by Luke Hoban.&lt;/p&gt;  &lt;h2&gt;Auto Implemented Properties&lt;/h2&gt;  &lt;p&gt; public string CustomerID { get; set; }&lt;/p&gt;  &lt;p&gt;The private variable is no longer necessary.&lt;/p&gt;  &lt;h2&gt;Object Initializers&lt;/h2&gt;  &lt;p&gt; Customer cust1 = new Customer()&lt;/p&gt;  &lt;p&gt;{ CustomerID = &amp;quot;ALKI&amp;quot;, ContactName = &amp;quot;Marcel&amp;quot; };&lt;/p&gt;  &lt;p&gt;Even if a method doesn't have an overload which lets you fill in some properties right away, you can use the Object Initializer to accomplish the same thing.&lt;/p&gt;  &lt;h2&gt;Collection Initializer&lt;/h2&gt;  &lt;p&gt; new List&amp;lt;Customer&amp;gt;() { cust1 };&lt;/p&gt;  &lt;p&gt;As above but for collections.&lt;/p&gt;  &lt;h2&gt;Local Variable Type Inference&lt;/h2&gt;  &lt;p&gt; var customers = new List&amp;lt;Customer&amp;gt;();&lt;/p&gt;  &lt;p&gt;How sweet is this?!&amp;#160; But, only for local types.&amp;#160; You won't be doing this with class level variables.&lt;/p&gt;  &lt;h2&gt;Language Integrated Query (LINQ)&lt;/h2&gt;  &lt;p&gt;Enumerable.Where(customers, c=&amp;gt;c.city == &amp;quot;London&amp;quot;);&lt;/p&gt;  &lt;p&gt;customers.Where(c=&amp;gt;c.city == &amp;quot;London&amp;quot;);&lt;/p&gt;  &lt;p&gt; var query = from c in customers&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;where c.City == &amp;quot;London&amp;quot;&lt;/p&gt;    &lt;p&gt;Select c;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Where is an extension method &lt;/p&gt;  &lt;p&gt;LINQ uses Lambda expressions.&amp;#160; Here c=&amp;gt; c.city == &amp;quot;London&amp;quot; is the Lambda expression.&amp;#160; The =&amp;gt; is read &amp;quot;goes to.&amp;quot;&lt;/p&gt;  &lt;p&gt;LINQ can be used to query against XML, objects or SQL.&lt;/p&gt;  &lt;h2&gt;Anonymous Type&lt;/h2&gt;  &lt;p&gt;The neat thing about anonymous types is that you can create a type on the fly with no name/type, hence anonymous.&amp;#160; This new type can have a different number of properties than the query source.&amp;#160; For example, say you're doing a query on the customer object, the query result can be set up to only contain the customer ID and name.&lt;/p&gt;  &lt;p&gt;Var query ...&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;select new &lt;/p&gt;    &lt;p&gt;{&amp;#160; CustomerID = c.CustomerID,&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; ContactName = c.ContactName };&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;// the property names above are optional, if not specified the property name of source object is used.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-8212474704481516317?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/8212474704481516317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/04/new-language-features-in-c-30.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8212474704481516317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/8212474704481516317'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/04/new-language-features-in-c-30.html' title='New Language Features in C# 3.0'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-771152316172252869</id><published>2008-02-12T00:19:00.002-06:00</published><updated>2008-05-21T01:04:36.545-05:00</updated><title type='text'>Sprint Motorola Q9c vs. BlackBerry 8830</title><content type='html'>&lt;p&gt;This year at Christmas it was time for new phones. My wife was leaning towards the Motorola Q9c because of it's media features. I picked up a Black Berry 8830. I wanted to give the dark side a try after having had some exposure to their emulators and development toolkits. I liked the idea of being able to develop for the 8830 with Java or .Net.&lt;/p&gt;&lt;p&gt;I liked the keyboard and auto-completion features of the 8830. I also liked the way the text messages were threaded. The little bit that I was able to test the GPS and web features of the 8830 seemed nice. I was NEVER able to test out it's email capabilities. The only time I could get web based features to work was when I was on the EVDO network. The web features simply wouldn't work on the 1X network. After hours of tech support time it was determined that it "should" work, but it was likely a problem since they are in the process of upgrading the local area to EVDO. This upgrade "should" be complete within the next couple of months. So, I ended up switching to the Q9c.&lt;/p&gt;&lt;p&gt;The Q9c was $50 less than the 8830. It also includes pocket versions of office applications. That would have cost another $100 on the Black Berry. The Q9c also includes a capability to make voice memos. I would have had to purchase a $30 utility for the 8830. I had numerous sync problems with the 8830 and had to wipe out directories on the PC in order to solve them. I can't imagine what a non-technical person would do! The Q9c syncs up with my PC AND my work Exchange account! I set it up myself. With the 8830, I'd have to contact the Black Berry administrator, secure licensing and be subject to all of the RIM outages!&lt;/p&gt;&lt;p&gt;Another nicety of the Q9c is the megapixel camera which the 8830 doesn't have. Also, the Q9c has a honkin' battery which can last for days! Now, I do miss the trackball and GUI of the 8830. I liked that I could go to one place for all of the settings and they were all there in a long list. I didn't have to drill down and navigate through a tree to find the right setting. Also, I like that I could easily change the fonts on the 8830. It had a very nice screen and good feel to it. The Q9c has a rubbery feel which makes you worry less about it sliding around.&lt;/p&gt;&lt;p&gt;The stock 8830 case was blech. The Q9c didn't come with a case. Both have blue tooth, GPS and standard mini-B USB power/sync connectors and 2.5mm head phone jack.&lt;/p&gt;&lt;p&gt;I was thrilled that the 8830 had a password management program built in. However, our security guy advised me that it's not secure. Also, I wasn't able to locate a corresponding desktop application.&lt;/p&gt;&lt;p&gt;I liked that the 8830 did display owner information when the screen is locked. My old Palm OS PDA's would do that as well. I haven't seen the Q9c do that. You've got to dig to find owner information. As I recall, the 8830 also had a better integrated "today" screen.&lt;/p&gt;&lt;p&gt;The Q9c &lt;s&gt;misses&lt;/s&gt; &lt;i&gt;hits&lt;/i&gt; in that I &lt;i&gt;can&lt;/i&gt;&lt;s&gt;'t&lt;/s&gt; browse the file structure of the internal storage via file explore in ActiveSync. It does support mini-SDHC cards though!&lt;/p&gt;&lt;p&gt;I miss the blinking LED of the 8830 that would let me know when I had a text, or missed a call, etc. You've got to wake up the Q9c so that you can see the screen to look for the icons that indicate missed calls, etc.&lt;/p&gt;&lt;p&gt;Overall, I miss some aspects of the 8830. However, the Q9c is doing a great job of meeting my needs. &lt;a href="http://www.sbsh.net/products/papyrus/"&gt;Papyrus&lt;/a&gt; and &lt;a href="http://www.iliumsoft.com/site/ew/ewallet.php"&gt;eWallet&lt;/a&gt; are essential add-on's. Oh yeah, the Q9c WORKS on the 1X and EVDO network. That right there was the biggest factor for me.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-771152316172252869?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/771152316172252869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2008/02/sprint-motorola-q9c-vs-blackberry-8830.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/771152316172252869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/771152316172252869'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2008/02/sprint-motorola-q9c-vs-blackberry-8830.html' title='Sprint Motorola Q9c vs. BlackBerry 8830'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-9153850678066175095</id><published>2007-11-29T08:29:00.001-06:00</published><updated>2007-11-29T08:53:51.006-06:00</updated><title type='text'>Tablet PC Head to Head</title><content type='html'>&lt;p&gt;I typically use a Gateway M-285 Tablet PC.&amp;nbsp; However, this week it's in the shop and I've got a loaner E-155 Tablet PC.&amp;nbsp; Let me start off by saying that this is really an apple and oranges comparison.&amp;nbsp; About the only way's that they are similar is that they are both Tablet PC's from Gateway running Vista.&amp;nbsp; That's about where the similarity ends.&lt;/p&gt; &lt;p&gt;I found the E-155 reasonable for running applications but it was definitely slow compared to the M-285.&amp;nbsp; The difference was very noticeable when running Visual Studio.&amp;nbsp; The E-155 has a 1.2Gig processor with a gig of RAM.&amp;nbsp; The M-285 has a 2.0Gig (as best I can recall) processor with 2 gigs of RAM.&amp;nbsp; Both are Duo processors.&lt;/p&gt; &lt;p&gt;The E-155 has a WACOM screen which is active/passive.&amp;nbsp; What I mean is I can hover the stylus over the screen with out touching and it displays the pointer.&amp;nbsp; However, I can also just use my finger to push buttons as well.&amp;nbsp; The M-285 has an active only screen, which means you have to use the special stylus.&amp;nbsp; I must say, after experiencing the WACOM screen I do prefer the feel of it over the M-285's very slick glossy screen.&amp;nbsp; The WACOM screen seems to have sort of a matte finish which I like.&amp;nbsp; The E-155 screen is 12" which seems a little small, but the display is very crisp.&amp;nbsp; The M-285 14" is an outstanding display, although over time it seems to have gotten a little bit dimmer.&lt;/p&gt; &lt;p&gt;I typically use my tablet along with a docking station and external monitor.&amp;nbsp; Here the E-155 really falls down.&amp;nbsp; The video coming out of the external port is downright blurry.&amp;nbsp; I'm sure this is due to the fact that it's using an integrated video adapter with shared memory.&amp;nbsp; The M-285 I use has been upgraded to a video adapter that has dedicated memory and it was worth it.&amp;nbsp; The M-285 external video is very nice, I&amp;nbsp;typically run an external monitor at 1280x1024 with it.&amp;nbsp; &lt;/p&gt; &lt;p&gt;A nice feature of these tablets is that they share the same docking station.&amp;nbsp; So the video comparison was with the same docking station and monitor.&amp;nbsp; I did also try plugging directly into the E-155's external video adapter and it was still just as bad.&lt;/p&gt; &lt;p&gt;The E-155 has the M-285 beat in the portability department.&amp;nbsp; I also like that the way the fan vent is arranged it is on the "top" side when in my typical tablet orientation.&amp;nbsp; The E-155 case is rubberized in the palm rest area which feels down right weird.&amp;nbsp; The E-155 is much lighter than the M-285.&amp;nbsp; A large part of the weight of my 285 is due to the 12-cell battery that I went with.&amp;nbsp; I typically get 4-5 hours of use out of it.&amp;nbsp; The E-155 gave me several hours of use on it's standard battery.&amp;nbsp; I started off in High Performance mode and dropped to Balanced before needing another battery.&amp;nbsp; Another thing I really liked about the 155 is it's built in fingerprint reader.&amp;nbsp; This made it very nice to be able to quickly unlock the machine.&amp;nbsp; It's something I'll look for on my next tablet.&lt;/p&gt; &lt;p&gt;Sound quality is good from both of the tablet's.&amp;nbsp; Better than many other laptops out there.&amp;nbsp; I haven't had much luck trying to record from the M-285's built in microphone.&amp;nbsp; I have not tried the E-155's dual mic's.&lt;/p&gt; &lt;p&gt;Overall, I very much like both tablet's.&amp;nbsp; The E-155 is a nice device for running Outlook and OneNote and doing general computing tasks.&amp;nbsp; It can be pressed into development service but it won't like it... neither will you!&amp;nbsp; The 155 is so slim and light weight you won't hesitate to grab it before&amp;nbsp;leaving the office.&amp;nbsp; The M-285's weight help's keep up your arm strength.&amp;nbsp; But it won't balk at doing whatever you ask of it.&amp;nbsp; It is not unusual for me to have&amp;nbsp;the 285&amp;nbsp;running Visual Studio, NUnit,&amp;nbsp;SQL Server, IIS, Outlook and OneNote simultaneously.&amp;nbsp; If I could keep both machines, I could see some benefit in that.&amp;nbsp; I'd get rid of the PDA and use the 155 primarily for Outlook, OneNote,&amp;nbsp;running a few client side tools&amp;nbsp;and as an eReader.&amp;nbsp; If I could have only one machine, it would likely be the 285 with dock.&amp;nbsp; Gateway has the 295 out now.&amp;nbsp; The 295 it seems to me is a slightly upgraded 285 with the WACOM screen.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-9153850678066175095?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/9153850678066175095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2007/11/tablet-pc-head-to-head.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/9153850678066175095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/9153850678066175095'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2007/11/tablet-pc-head-to-head.html' title='Tablet PC Head to Head'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-3282859847107412829</id><published>2007-11-05T23:41:00.000-06:00</published><updated>2007-11-05T23:53:30.701-06:00</updated><title type='text'>Doing TDD without a Test Runner</title><content type='html'>&lt;p&gt;What can be done in VBA/VB6 and other environments is the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create a code module that will serve as your test fixture.&lt;/li&gt;&lt;li&gt;Write individual methods to do your tests in this code module.&lt;/li&gt;&lt;li&gt;Have a "master" method that calls all of the individual tests.&lt;/li&gt;&lt;li&gt;The individual tests give you feed back ala debug.print with test name and"PASS" or "FAIL" also return a boolean to the master method. &lt;/li&gt;&lt;li&gt;The master method can return FAIL if it picked up a false from any of the test methods that were called. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now you can use the immediate/debug window to call your individual test methods or your master test method.  I found this approach very helpful when working with a legacy Access 97 application.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-3282859847107412829?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/3282859847107412829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2007/11/doing-tdd-without-test-runner.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3282859847107412829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/3282859847107412829'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2007/11/doing-tdd-without-test-runner.html' title='Doing TDD without a Test Runner'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-4900578028489833812</id><published>2007-10-31T17:05:00.001-05:00</published><updated>2007-11-05T23:41:14.072-06:00</updated><title type='text'>Outline for introducing TDD</title><content type='html'>&lt;p&gt;This outline is meant to serve as a guide for a developer that is experienced with Visual Studio, C# and NUnit to use in introducing Test Driven Development (TDD) to others.  You, the trainer, will want discuss the why and how behind the tasks.&lt;/p&gt;&lt;p&gt;This guide was put together in the context of VS2005 &amp;amp; NUnit. &lt;p&gt;&lt;a href="http://nunit.org/"&gt;http://nunit.org/&lt;/a&gt; &lt;p&gt;You may opt to have developers work in pairs for this training. &lt;h2&gt;Learning the basics&lt;/h2&gt;&lt;p&gt;Start off by discussing why tests are set up in a different project. &lt;p&gt;Create new projects Polynomial &amp;amp; PolynomialTests &lt;p&gt;Delete class1.cs under both of them &lt;p&gt;Include a reference to the project under test &lt;p&gt;Include a reference to the test framework &lt;p&gt;Create test fixture BasicPolynomialTests (class) &lt;blockquote&gt;&lt;p&gt;We will be implementing a compute method which returns the result of f(x) = x^2 + 5x + 6 &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;the using statements that are needed by the test framework &lt;blockquote&gt;&lt;p&gt;using NUnit.Framework; &lt;p&gt;using NUnit.Framework.Constraints; &lt;p&gt;using NUnit.Framework.SyntaxHelpers;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Don't forget to make the test fixture public &lt;p&gt;Reviewed that there are reflection tags for the test fixture, fixture setup/teardown, test setup/teardown and the test itself &lt;p&gt;When and when not to use the different setup's/teardowns &lt;p&gt;We talked about setting up test classes based on what kind of set up they need &lt;p&gt;Talked about arrange-act-assert (See William Wake) &lt;a href="http://weblogs.java.net/blog/wwake/archive/2003/12/"&gt;http://weblogs.java.net/blog/wwake/archive/2003/12/&lt;/a&gt; &lt;p&gt;It can take a little bit to show/explain "this method doesn't exist yet, we're writing the way we want it to work" &lt;blockquote&gt;&lt;p&gt;With a nice IDE the method stub is generated for you (they really liked that) .&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Create BasicPolynomial class, make it public - watch for namespace conflict &lt;blockquote&gt;&lt;p&gt;review the red-green-refactor sequence&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;make sure everything compiles now and you have a red bar in the test runner &lt;p&gt;implement the code that computes f(x) &lt;p&gt;compile and check out the green bar&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;Now refactor f(x) - it can be refactored to (x+2)(x+3)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Show them were they can find reference material on both the "classic" and new "constraints" assert methods &lt;p&gt;    (we used the new NUnit constraints syntax) &lt;p&gt;&lt;a href="http://nunit.org/index.php?p=assertions&amp;amp;r=2.4.3"&gt;http://nunit.org/index.php?p=assertions&amp;amp;r=2.4.3&lt;/a&gt; &lt;p&gt;Discuss how unit tests can be used to verify expected behavior &lt;p&gt;    I think a string replace does this, is my expectation correct? &lt;p&gt;Talk about how we can do TDD in environments that don't directly have a testing framework - i.e. &lt;p&gt;Access &lt;h2&gt;A little thinking for the trainees&lt;/h2&gt;&lt;p&gt;Now the user wants to be able to solve all problems of the form Ax ^ 2 + Bx + C &lt;p&gt;Create a GeneralPolynomialTests fixture &lt;p&gt;Create a new GeneralPolynomial class &lt;p&gt;Need a constructor that takes (A,B,C) &lt;h2&gt;Test classes with different set up revisited&lt;/h2&gt;&lt;p&gt;Add an empty constructor() that defaults to 2,3,5 &lt;p&gt;Don't forget your test first! (in a new class) &lt;p&gt;Refactor: the empty constructor can be implemented in a number of ways &lt;ul&gt;&lt;li&gt;Setting initial values on declaration of private variables (yuck) &lt;li&gt;Setting the private values in the new empty constructor &lt;li&gt;Constructor chaining GeneralPolynomial():this(2,3,5)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.c-sharpcorner.com/UploadFile/rajeshvs/ConsNDestructorsInCS11122005010300AM/ConsNDestructorsInCS.aspx"&gt;http://www.c-sharpcorner.com/UploadFile/rajeshvs/ConsNDestructorsInCS11122005010300AM/ConsNDestructorsInCS.aspx&lt;/a&gt; &lt;p&gt;Move the new test class to it's own file &lt;h2&gt;Summary&lt;/h2&gt;&lt;p&gt;As you can see, when it's listed out, that's a lot of material for a new comer to digest for a fairly simple example. &lt;p&gt;I worked through the above in about an 1 hour and 45 minutes with a team.&lt;/p&gt;&lt;p&gt;After you've gone through this guide, ask if there are any questions.  Let them know you are available to help. &lt;p&gt;Pick up a slew of books on TDD/xUnit topics and add them to the corporate library.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-4900578028489833812?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/4900578028489833812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2007/10/outline-for-introducing-tdd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4900578028489833812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/4900578028489833812'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2007/10/outline-for-introducing-tdd.html' title='Outline for introducing TDD'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-6053598752940410518</id><published>2007-09-21T10:14:00.001-05:00</published><updated>2007-09-24T18:27:34.833-05:00</updated><title type='text'>OO Confidence Course</title><content type='html'>&lt;p&gt;Right now some of my team is in Object-Orienteed Analysis and Design training.&amp;nbsp; They appreciate that they are learning the concepts.&amp;nbsp; However, the instructor has not presented them with code in any language.&amp;nbsp; Therefore, we are going to do an "OO Confidence Course."&amp;nbsp; The idea is that we will briefly discuss the foundations of OO, look at the language specific implementation and then work through implementing the concepts in code.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.harding.edu/fmccown/vbnet_csharp_comparison.html"&gt;This VB.Net and C# comparison guide&lt;/a&gt;&amp;nbsp;from &lt;a href="http://www.harding.edu/fmccown/"&gt;Frank McCown&lt;/a&gt;&amp;nbsp;will provided to serve as a handy reference to language specific constructs.&lt;/p&gt; &lt;p&gt;If you are working to learn OO on your own or want an additional book to read on the topic that includes code, I can recommend &lt;a href="http://headfirstlabs.com/books/hfooad/"&gt;Head First Object Oriented Analysis and Design.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After an initial session with this course, it's likely that someone new to OO would likely take around&amp;nbsp;4 hours to complete this confidence course.&amp;nbsp; I think an experienced developer could rapidly complete this course.&lt;/p&gt; &lt;p&gt;At a later date, in the course of professional duties, would be a good time to look at defining properties in an interface,&amp;nbsp;&lt;a href="http://ootips.org/crc-cards.html"&gt;CRC cards&lt;/a&gt; and &lt;a href="http://www.extremeprogramming.org/rules/unittests.html"&gt;unit tests&lt;/a&gt;.&amp;nbsp; The purpose of this exercise is to build OO confidence, so we're working hard to avoid "scope creep."&amp;nbsp; Also, because this is an exercise we ended up having an abstract Person and Concrete Person classes.&amp;nbsp; We needed to create the concrete class that others inherit from so we can show off the inheritance polymorphism in the demo section.&amp;nbsp; It's also significant to note that when demonstrating the interface polymorphism that the student class does not inherit from another class.&lt;/p&gt; &lt;p&gt;Here is the "OO Confidence Course"&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;&amp;nbsp;OO Confidence Course&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;For Group Discussion&lt;/b&gt;  &lt;ul&gt; &lt;li&gt;What is polymorphism?  &lt;li&gt;How does inheritance work?  &lt;li&gt;Why do we use encapsulation?  &lt;li&gt;Language specific discussion  &lt;li&gt;C# this/subclass, base/superclass &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;b&gt;Abstract Person class&lt;/b&gt;  &lt;p&gt;This class should have properties/accessors/mutators for:  &lt;ul&gt; &lt;li&gt;Age  &lt;li&gt;Gender  &lt;li&gt;Name &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Override ToString method to display name and age  &lt;p&gt;Create an abstract method ContactPhoneNumber that returns a string  &lt;p&gt;&lt;strong&gt;Concrete Person class&lt;/strong&gt;  &lt;p&gt;Inherits from Person  &lt;p&gt;Implements the abstract method ContactPhoneNumber&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return "123-555-1212" for the phone number &lt;/p&gt; &lt;p&gt;&lt;b&gt;Employee&lt;/b&gt;  &lt;p&gt;Diagram and create an employee class that inherits from ConcretePerson  &lt;p&gt;This class should have properties/accessors/mutators for:  &lt;ul&gt; &lt;li&gt;ID #  &lt;li&gt;Job Title &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The constructor should give the person a default ID of -1 and a blank title, age, gender and name  &lt;p&gt;Overload the constructor to accept an ID#, Title and Name  &lt;p&gt;Override the ToString method of employee to display the data in all of the fields  &lt;p&gt;Create a method that calls the base/superclass toString()&amp;nbsp; - call it superToString  &lt;p&gt;Implement the abstract method ContactPhoneNumber &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return "987-444-3535" for the phone number&lt;/p&gt; &lt;p&gt;&lt;b&gt;Create an Interface called IStatusInfo&lt;/b&gt;  &lt;p&gt;The interface definition should require a method isEmployable that returns a boolean  &lt;p&gt;&lt;b&gt;Citizen&lt;/b&gt;  &lt;p&gt;This class inherits from person  &lt;p&gt;Implements the IStatusInfo interface (return true) &lt;p&gt;&lt;b&gt;Student&lt;/b&gt;  &lt;p&gt;This class has a single property of name  &lt;p&gt;Implements the IStatusInfo Interface&amp;nbsp; (return false) &lt;p&gt;&lt;b&gt;Demo Program - Console application&lt;/b&gt;  &lt;p&gt;Create an array/arraylist of ConcretePerson objects  &lt;p&gt;Populate the arraylist with data  &lt;ul&gt; &lt;li&gt;3 employee objects  &lt;li&gt;2 Citizen objects &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Loop through all of your person objects  &lt;ul&gt; &lt;li&gt;print the base/superclass toString (does this work?)  &lt;li&gt;print the this/subclass toString  &lt;li&gt;Print the ContactPhoneNumber &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;For one employee object  &lt;ul&gt; &lt;li&gt;print the base/superclass toString (does this work?)  &lt;li&gt;print the this/subclass toString &lt;li&gt;print the string returned by superToString&amp;nbsp;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Create 4 IStatusInfo objects  &lt;ul&gt; &lt;li&gt;Set them equal to the 2 citizens you created earlier + 2 students &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Loop through all of the IStatusInfo objects  &lt;ul&gt; &lt;li&gt;Print the result of the call to isEmployable&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/9881483-6053598752940410518?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/6053598752940410518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2007/09/oo-confidence-course.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6053598752940410518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/6053598752940410518'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2007/09/oo-confidence-course.html' title='OO Confidence Course'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-7044782107553653749</id><published>2007-07-02T12:24:00.001-05:00</published><updated>2007-07-02T12:44:02.631-05:00</updated><title type='text'>Distributed Version Control System</title><content type='html'>&lt;p&gt;After watching this &lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8"&gt;Google Talk by Linus Torvalds&lt;/a&gt; I'm really wanting to give a distributed version control system a try.&amp;nbsp; I'd like to give git a go, but from what I've read it looks to be a pain under Windows.&amp;nbsp; First blush looks like &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt; may be a candidate.&amp;nbsp; I thought it interesting that Mercurial needs an external merge tool like &lt;a href="http://tortoisesvn.tigris.org/TortoiseMerge.html"&gt;TortoiseMerge&lt;/a&gt; to do the actual merging.&lt;/p&gt; &lt;p&gt;After doing a little more reading, I'm probably going to give &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt; a try.&amp;nbsp; A big reason is it's explicit support of Windows.&lt;/p&gt; &lt;p&gt;Kyle Cordes has a &lt;a href="http://kylecordes.com/2007/05/17/linux-git-distributed/"&gt;good write up&lt;/a&gt; about this topic on his &lt;a href="http://kylecordes.com/"&gt;blog&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-7044782107553653749?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/7044782107553653749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2007/07/distributed-version-control-system.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/7044782107553653749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/7044782107553653749'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2007/07/distributed-version-control-system.html' title='Distributed Version Control System'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-7331999845456934345</id><published>2007-06-08T11:42:00.001-05:00</published><updated>2007-06-13T12:20:33.538-05:00</updated><title type='text'>Need a source code control solution?</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;If you are looking for a source control solution...
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;You should definately check out and read up on Subversion (SVN), TortoiseSVN and Ankh.
&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Subversion is the version control system. It can run under a windows service, file system type repository or under Apache.
&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;We have it running with Apache on a port other than 80. TortoiseSVN is for windows shell integration. Ankh is for Visual Studio IDE integration. There are articles out there that talk about how to use SVN with SQL server.
&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;span style=""&gt;SVN uses a different process than VSS. It doesn't really do locking. It's more of an optimistic merging/updating process when needed. The documentation covers in depth how the tool/process works &lt;/span&gt;&lt;a href="http://svnbook.red-bean.com/"&gt;&lt;span style=""&gt;http://svnbook.red-bean.com/&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;We are successfully, using these products at work. They are far superior to VSS.
&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;At home, I use Ankh and TortoiseSVN with an external USB drive for the file repository.
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://subversion.tigris.org/"&gt;&lt;span style="font-family:Arial;"&gt;http://subversion.tigris.org/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Times New Roman;"&gt;
&lt;/span&gt;&lt;a href="http://tortoisesvn.tigris.org/"&gt;&lt;span style="font-family:Arial;"&gt;http://tortoisesvn.tigris.org/&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;
&lt;/span&gt;&lt;a href="http://ankhsvn.tigris.org/"&gt;&lt;span style="font-family:Arial;"&gt;http://ankhsvn.tigris.org/&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=""&gt;Bryan
&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-7331999845456934345?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/7331999845456934345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2007/06/need-source-code-control-solution.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/7331999845456934345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/7331999845456934345'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2007/06/need-source-code-control-solution.html' title='Need a source code control solution?'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-1101933769296678149</id><published>2007-05-26T23:51:00.000-05:00</published><updated>2007-05-27T00:23:55.725-05:00</updated><title type='text'>Developer Tool: Digital Camera</title><content type='html'>&lt;p&gt;I have found having a digital camera to be an indespensable and freeing tool.
One of the ways I have used the camera is to take a picture of design work done on a whiteboard. We then stick it in OneNote notebook which is shared out for the team.&lt;/p&gt;

&lt;p&gt;Taking a picture keeps the process simple. You are constrained if you want to change the design, but it's easy to just do a new drawing on the white board, working off of the existing digital version. I have found this process to be more lightweight and creative than huddling around a monitor and trying to do something with Visio.&lt;/p&gt;

&lt;p&gt;And with the resolution of today's camera's, I've been able to pictures of print outs or blue prints at a high enough resolution that they are legible when viewed on the computer.&lt;/p&gt;

&lt;p&gt;The other day when we were having difficulty describing a prolbem to a component vendor's tech support, we used the camera to shoot a short ~1 minute video that showed the problem. We uploaded the video to a website where the tech guys could view it and we had our answer the next day. It was way quicker and easier than trying to put together a sample project with a readme to illustrate (if it behave the same for them!) the problem.&lt;/p&gt;

&lt;p&gt;To make the process painless, it's important to have a media reader attached or built in to your computer for pulling the images off of the SD, XD card whatever. I have found it's simpler to just work with the media rather than mess with hooking up the camera to USB and going through it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-1101933769296678149?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/1101933769296678149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2007/05/developer-tool-digital-camera.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/1101933769296678149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/1101933769296678149'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2007/05/developer-tool-digital-camera.html' title='Developer Tool: Digital Camera'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-5090532662066059515</id><published>2007-03-22T00:28:00.000-05:00</published><updated>2007-03-22T00:33:58.135-05:00</updated><title type='text'>Vista Sidebar Gadget</title><content type='html'>I put together a little Vista Sidebar Gadget. Using the information found &lt;a href="http://gallery.live.com/devcenter.aspx"&gt;here&lt;/a&gt; and more specifically &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sidebar/sidebar/overviews/gdo.asp"&gt;here&lt;/a&gt;, it wasn't difficult to do.

&lt;a href="http://gallery.live.com/LiveItemDetail.aspx?li=5104c7eb-871c-40c7-be6a-2128677282f4"&gt;The gadget&lt;/a&gt; I created is useful for those that follow the Legislative process of the Missouri House of Representatives.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-5090532662066059515?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://gallery.live.com/LiveItemDetail.aspx?li=5104c7eb-871c-40c7-be6a-2128677282f4' title='Vista Sidebar Gadget'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/5090532662066059515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2007/03/vista-sidebar-gadget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5090532662066059515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/5090532662066059515'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2007/03/vista-sidebar-gadget.html' title='Vista Sidebar Gadget'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-116690140567998989</id><published>2006-12-23T13:16:00.000-06:00</published><updated>2006-12-23T13:21:31.140-06:00</updated><title type='text'>EarthLink Non-Existent DNS redirection</title><content type='html'>&lt;p class="mobile-post"&gt;EarthLink,&lt;/p&gt;&lt;p class="mobile-post"&gt;Your spreading of your new program finally hit the DNS servers that I use on
my EarthLink DSL.
And at first blush it had all the appearances of browser hi-jacking.&lt;/p&gt;&lt;p class="mobile-post"&gt;So no matter how you paint it, you may not be technically "browser
hi-jacking" but you accomplished the same thing.&lt;/p&gt;&lt;p class="mobile-post"&gt;&lt;a href="http://blogs.earthlink.net/2006/08/handling_dead_domains_1.php"&gt;http://blogs.earthlink.net/2006/08/handling_dead_domains_1.php&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;Your blog claims you are doing this to enhance user experience.
That's BS and you know it.  The real motivation is ad/click revenue.&lt;/p&gt;&lt;p class="mobile-post"&gt;This feature is no different than when someone hacks a DNS server and
repoints a domain.&lt;/p&gt;&lt;p class="mobile-post"&gt;The only acceptable course of action for EarthLink is to disable this
"service" and issue an apology to users.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-116690140567998989?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/116690140567998989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/12/earthlink-non-existent-dns-redirection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/116690140567998989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/116690140567998989'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/12/earthlink-non-existent-dns-redirection.html' title='EarthLink Non-Existent DNS redirection'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-116637601147284505</id><published>2006-12-17T11:05:00.000-06:00</published><updated>2007-05-26T23:50:34.229-05:00</updated><title type='text'>Are you getting a "removed by HIPS FW" ?</title><content type='html'>&lt;p&gt;Are you not seeing things you normally would when you surf the web?
When you view the html for the page do you see a comment that content was "removed by HIPS FW" ?&lt;/p&gt;
&lt;p&gt;
The answer is that CA's Firewall product is blocking them. It is configured out of the box to block banner ads. Well, sometimes what it identifies as a banner ad isn't. For instance this one: &lt;a href="http://banners.wunderground.com/banner/bigwx_both_cond/language/www/US/MO/Sedalia.gif"&gt;http://banners.wunderground.com/banner/bigwx_both_cond/language/www/US/MO/Sedalia.gif&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
To solve this problem, go to CA's Personal Firewall settings. Go to the Privacy group, then configure the Ad/Pop-Up blocker to not block banners.
&lt;/p&gt;&lt;p&gt;
&lt;a href="http://photos1.blogger.com/x/blogger/3989/739/1600/540003/ca_bannersettings.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="CA settings pages that need to be updated" src="http://photos1.blogger.com/x/blogger/3989/739/400/671157/ca_bannersettings.jpg" border="0" /&gt;&lt;/a&gt; As another person pointed out, you may also need to check out the Cookie Control advanced settings.  I found that in order to get some sites to work properly, I had to allow the private header information to go out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-116637601147284505?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/116637601147284505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/12/are-you-getting-removed-by-hips-fw.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/116637601147284505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/116637601147284505'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/12/are-you-getting-removed-by-hips-fw.html' title='Are you getting a &quot;removed by HIPS FW&quot; ?'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-116365529984584148</id><published>2006-11-15T23:22:00.000-06:00</published><updated>2006-11-15T23:34:59.856-06:00</updated><title type='text'>Extreme Programming: Science or Philosophy?</title><content type='html'>&lt;p&gt;I am going to build this posting in an iterative fashion.  So, don't be surprised if you see it show up again in your feed reader.
&lt;/p&gt;

&lt;p&gt;What makes something &lt;i&gt;scientific&lt;/i&gt;?  Provides a way that the hypothesis can be proven false.
&lt;/p&gt;

&lt;p&gt;Philosophy requires a paradigm shift.  Until you are &amp;quot;enlightened&amp;quot; you just won't get it. You can't prove it wrong.
&lt;/p&gt;

&lt;p&gt;Kent's background and viewpoint.&lt;/p&gt;


&lt;p&gt;Ron's background and viewpoint
&lt;/p&gt;

&lt;p&gt;My experience in spreading the word about XP practices has been primarily one of elightenment.  There is a lightbulb that just clicks on when the other party &amp;quot;get's it&amp;quot;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-116365529984584148?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/116365529984584148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/11/extreme-programming-science-or.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/116365529984584148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/116365529984584148'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/11/extreme-programming-science-or.html' title='Extreme Programming: Science or Philosophy?'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-116018961224985070</id><published>2006-10-06T21:47:00.000-05:00</published><updated>2006-10-06T21:53:32.320-05:00</updated><title type='text'>Customer Proxy</title><content type='html'>When you don't have the customer handy, a good person to represent the customer is the trainer.  In my experience, the organizations trainer has been in touch with the needs and practices of the workers.  I've repeatedly heard and experienced that the training room is a place where the workers open up with ideas, thoughts and concerns about the software or processes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-116018961224985070?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/116018961224985070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/10/customer-proxy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/116018961224985070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/116018961224985070'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/10/customer-proxy.html' title='Customer Proxy'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-115412501827322909</id><published>2006-07-28T17:12:00.000-05:00</published><updated>2006-07-28T17:19:01.016-05:00</updated><title type='text'>Reflector for disassembly</title><content type='html'>&lt;p&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;This&lt;/a&gt; is a great free tool that let's you analyze, and decompile .Net assemblies in your choice of IL, VB or C#.&lt;/p&gt;

&lt;p&gt;There are a number of &lt;a href="http://www.aisto.com/Incoming/Reflector/AddIns/"&gt;plug-ins&lt;/a&gt; available too. Use Reflector in conjunction with the &lt;a href="http://www.denisbauer.com/NETTools/FileDisassembler.aspx"&gt;File Disassembler&lt;/a&gt; plug-in for recreating lost source code.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-115412501827322909?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.aisto.com/roeder/dotnet/' title='Reflector for disassembly'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/115412501827322909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/07/reflector-for-disassembly.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/115412501827322909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/115412501827322909'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/07/reflector-for-disassembly.html' title='Reflector for disassembly'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-114654355537739980</id><published>2006-05-01T23:09:00.002-05:00</published><updated>2010-08-05T10:20:03.587-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team'/><title type='text'>What does TEAM mean to you?</title><content type='html'>&lt;p&gt;Some people use the word team to say that they work with other people together. For instance in the traditional big shop, the Architect works with the developers and testers. Everyone has their pigeon holed tasks.&lt;/p&gt;  &lt;p&gt;In our small team, team means that anyone is capable of doing the job. While I may be responsible for overall direction as team lead, anyone can do all of the tasks. From working to manage the work, the needed documentation/status reports, business analysis, development and testing. This arrangement has been very beneficial for us in terms of integrating new people and coping while people are out a week at a time.&lt;/p&gt;  &lt;p&gt;Another very important aspect of the team is communication, understanding and a shared vision accomplished by implementing tasks which complete goals.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-114654355537739980?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/114654355537739980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/05/what-does-team-mean-to-you.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114654355537739980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114654355537739980'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/05/what-does-team-mean-to-you.html' title='What does TEAM mean to you?'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-114536403236187650</id><published>2006-04-18T07:34:00.000-05:00</published><updated>2006-04-18T07:40:49.873-05:00</updated><title type='text'>XP Code Review</title><content type='html'>&lt;p&gt;If it's good to do a code review, do it more frequently.  This is one of the things that happens when you do pair programming.  The code is continuously being reviewed by the pair.  However, when you a have a very small team you probably won't have much "promiscuous pairing" going on.  Then you can do a daily team code review.  It won't take much time because you're only going over today's work not a whole release.  Be sure to leave enough time to refactor too!&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-114536403236187650?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/114536403236187650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/04/xp-code-review.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114536403236187650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114536403236187650'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/04/xp-code-review.html' title='XP Code Review'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-114536341950327820</id><published>2006-04-18T07:28:00.000-05:00</published><updated>2006-04-18T07:33:00.616-05:00</updated><title type='text'>Spammer's domain name masquerading</title><content type='html'>&lt;p&gt;It looks like my domain name has been picked up by some spammer's.&lt;/p&gt;

&lt;p&gt;My domain name starts with an "early" letter and is nice and short, so it probably caught their attention.&lt;/p&gt;

&lt;p&gt;Now, what's happening is that they are forging mail from my domain and submitting it through SMTP servers that aren't doing authentication.  So now, I'm getting all sorts of bounced messages.&lt;/p&gt;

&lt;p&gt;Seems to me that a couple of things could be done to help alleviate this sort of spamming:
&lt;ul&gt;
&lt;li&gt;All SMTP servers should require authentication
&lt;/li&gt;&lt;li&gt;All SMTP servers should only take mail for their domains
&lt;/li&gt;&lt;li&gt;Spam scanners should block messages that weren't submitted through a  SMTP server that matches up with the domain name
&lt;/li&gt;&lt;li&gt;Spam scanners should &lt;span style="font-style: italic;"&gt;NOT&lt;/span&gt; return undeliverable messages, it just chews up more bandwidth.
&lt;/ul&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-114536341950327820?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/114536341950327820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/04/spammers-domain-name-masquerading.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114536341950327820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114536341950327820'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/04/spammers-domain-name-masquerading.html' title='Spammer&apos;s domain name masquerading'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-114444923038282407</id><published>2006-04-07T17:27:00.000-05:00</published><updated>2006-04-07T17:33:50.396-05:00</updated><title type='text'>Huddle 'round the projector</title><content type='html'>&lt;p&gt;When it comes to doing a code review or project review, nothing beats huddling around the projector! Even with multiple monitors you can't get more than a couple people crowding in to see the material. Since we have a big white board we can just wipe it clean and connect a projector up to one of the computers video lines. Instant big screen code review in the development area! There's still enough open whiteboard to jot notes or mark up what's being displayed. Now if I could just get the big dogs to spring for a smart board!&lt;/p&gt;
&lt;p&gt;I think it'd be awesome to pair (or mob program) using a dual or triple projector set up on a wall!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-114444923038282407?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/114444923038282407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/04/huddle-round-projector.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114444923038282407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114444923038282407'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/04/huddle-round-projector.html' title='Huddle &apos;round the projector'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-114369202831047905</id><published>2006-03-29T22:03:00.000-06:00</published><updated>2006-03-29T22:21:03.876-06:00</updated><title type='text'>Interfaces are cool</title><content type='html'>&lt;p&gt;I'm talking about OO interfaces.  They came in handy recently when I was working on some code (Java) that launched a web browser as the result of a message that was received.  In my test I was primarily concerned with the message I would receive back from that code.  &lt;/p&gt;

&lt;p&gt;So, the answer for me, was to extract the interface that I needed for the call to the web browser.  Then I created a "mock" web browser that didn't do anything.  So, when my tests are run the functional code around the call to the web browser is exercised and I don't have a bunch of open web browsers on my system.&lt;/p&gt;

&lt;p&gt;You can do something similar if you are wanting to do some processing on the content received from a web page.  Actually going out to the internet and pulling information is an expensive operation.  Instead you can create a "mock" web browser class that has hard coded the expected web responses.&lt;/p&gt;

&lt;p&gt;I've also been working on some C# code that involves communication between applications.  By using an interface specification for the communications layer I can swap out the communications layer at will.  For testing I'm using a mock object that implements the interface.  Now I'm able to experiment with a variety of technologies for implementing the communications layer and I can choose the one that works best.  Or I'll be able to choose the one that works best &lt;i&gt;for a given situation&lt;/i&gt;.  Definately cool stuff.&lt;/p&gt;

&lt;p&gt;In summary, interfaces are a useful tool to keep in your bag of TDD tools.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-114369202831047905?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/114369202831047905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/03/interfaces-are-cool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114369202831047905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114369202831047905'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/03/interfaces-are-cool.html' title='Interfaces are cool'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-114058576060004393</id><published>2006-02-21T23:11:00.000-06:00</published><updated>2006-02-21T23:37:34.210-06:00</updated><title type='text'>Crystal Reports and TDD</title><content type='html'>&lt;p&gt;It is my experience that doing TDD (test driven development) could help avoid some pain with Crystal Reports.  Suppose that you have a column of floating point numbers that go out to 6 places.  You want to display those numbers to the user rounded to 2 places.  Then you are going to display the sum of the numbers displayed.  This is where the fun comes in.  It was our experience that the sum being displayed is the sum of the unrounded numbers that was then rounded to 2 places.  This is entirely different than rounding first and then summing.&lt;/p&gt;

&lt;p&gt;So what is the answer?  The answer is in &lt;a href="http://www.amazon.com/gp/product/0201708426/qid=1140585122/sr=2-1/ref=pd_bbs_b_2_1/104-1586808-3572728?s=books&amp;v=glance&amp;n=283155"&gt;the pink book&lt;/a&gt;.  TDD of the presentation layer is tough.  Keep the presentation layer thin.  TDD the business logic that puts together the numbers that will be displayed, include the rounding and summing.  Pass a dataset or multiple datasets with the data to your Crystal Report.  Now your presentation layer is thin and doesn't have to know anything about where the data came from.  (No redirecting of databases at run time!)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-114058576060004393?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/114058576060004393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/02/crystal-reports-and-tdd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114058576060004393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/114058576060004393'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/02/crystal-reports-and-tdd.html' title='Crystal Reports and TDD'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-113839122535837631</id><published>2006-01-27T13:47:00.000-06:00</published><updated>2006-01-27T13:48:14.673-06:00</updated><title type='text'>My XP Team's progress</title><content type='html'>&lt;p&gt;A recent topic of discussion in the &lt;a href="http://groups.yahoo.com/group/xpbookdiscussiongroup/"&gt;XP2E yahoo group&lt;/a&gt; got me thinking a little bit about the progress our team has made in adopting XP, some of the issues we're encountering and where we're going.&lt;/p&gt;

&lt;p&gt;We've read the XP2E book as a team and are following on with the XP Installed book.
The XP2E book helped us with a lot of the theory and we started down the road together.
With the Installed book we're picking up some more "how to do it" material.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We've physically opened up our area and are enjoying the improved communication.&lt;/li&gt;
&lt;li&gt;We're pairing up most of the time.  We notice when we don't (more errors and slower).&lt;/li&gt;
&lt;li&gt;We're holding each other accountable to standards.&lt;/li&gt;
&lt;li&gt;We are still building our TDD, program by intention skills.&lt;/li&gt;
&lt;li&gt;We are getting a lot more user involvement, but not co-located.&lt;/li&gt;
&lt;li&gt;We are having few (near zero) minor defects found in production.&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;
&lt;li&gt;We're still getting a handle on stories and points.&lt;/li&gt;
&lt;li&gt;We're working out issues with testing and data bound controls.&lt;/li&gt;
&lt;li&gt;We're having problems with integration - we need to install a CI server.&lt;/li&gt;
&lt;li&gt;We're looking to swap out VSS for SubVersion.&lt;/li&gt;
&lt;li&gt;We are going to work on picking up design patterns soon.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And as always, how do I test this object that is generated by the ORM tool and expects to see a database on the back end?&lt;/p&gt;

&lt;p&gt;This week we moved 3 releases (different projects) to production.  All of them sailed through testing with no defects.  We have 1 more system pending release and 2 more in testing.  Overall, a pretty good feeling.&lt;/p&gt;

&lt;p&gt;The weekly planning and keeping focus on those goals is an extremely important thing for our team.  The morning stand up helps us to keep our focus.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-113839122535837631?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/113839122535837631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2006/01/my-xp-teams-progress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113839122535837631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113839122535837631'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2006/01/my-xp-teams-progress.html' title='My XP Team&apos;s progress'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-113587278290232460</id><published>2005-12-29T10:13:00.000-06:00</published><updated>2005-12-29T10:18:25.683-06:00</updated><title type='text'>NUnit - ExpectedException with Custom Exception</title><content type='html'>&lt;p&gt;While the NUnit docs give a good example of how to test for system exception types, it leaves you hanging on how to capture the custom exceptions that you are throwing. For instance, you might do something like:&lt;/p&gt;
&lt;pre&gt;throw new Exception("SSN should be formatted 123456789");&lt;/pre&gt;
&lt;p&gt;How do you set up your test attributes for this exception?&lt;/p&gt;
&lt;p&gt;In VB:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;Test(), ExpectedException(GetType(Exception), "SSN should be formatted 123456789")&amp;gt;
        Public Sub ValidateSSNFormat()
        ' code that will cause the routine to throw the expected exception
&lt;/pre&gt;
&lt;p&gt;In C#:&lt;/p&gt;
&lt;pre&gt;
[Test]
[ExpectedException(typeof(Exception),"SSN should be formatted 123456789")]
public void ValidateSSNFormat()
// code that will cause the routine to throw the expected exception
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-113587278290232460?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.nunit.org/docs/2.2.5/exception.html' title='NUnit - ExpectedException with Custom Exception'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/113587278290232460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/12/nunit-expectedexception-with-custom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113587278290232460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113587278290232460'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/12/nunit-expectedexception-with-custom.html' title='NUnit - ExpectedException with Custom Exception'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-113548324032265479</id><published>2005-12-24T22:00:00.000-06:00</published><updated>2005-12-24T22:00:40.343-06:00</updated><title type='text'>DIY PVC Flute</title><content type='html'>Have you been thinking about learning to play flute but the cost of purchasing a flute has been holding you back.  Well if you're a do-it-yourselfer check out Mark Shep's &lt;a href="http://www.markshep.com/flute/"&gt;website&lt;/a&gt; and book.  Following Mark's instructions I was able to build a PVC flute in no time at all.  I've been having some fun playing with it.  Next week I'll build one from CPVC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-113548324032265479?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.markshep.com/flute/Pipe.html' title='DIY PVC Flute'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/113548324032265479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/12/diy-pvc-flute.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113548324032265479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113548324032265479'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/12/diy-pvc-flute.html' title='DIY PVC Flute'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-113453796304946191</id><published>2005-12-13T23:26:00.000-06:00</published><updated>2005-12-13T23:26:03.066-06:00</updated><title type='text'>RSS Bandit</title><content type='html'>Well, after the issues I had with NewsGator I explored some other news aggregators.

I used Attensa for a while now and have been fairly happy with it.  However, it is tied to a single machine.  Then a recent update broke it and after several attempts at figuring it out and getting it going again, it was just easiest to drop it.

I tried the NewsMonster aggregator that works (s'posedly) with FireFox but no go.  It wouldn't install and work correctly.

I did check out some of the RSS readers on www.codeproject.com but had some issues with one that appealed to me.

So, now I'm using RSS Bandit.  Having it &lt;em&gt;not&lt;/em&gt; tied in to Outlook has actually been a good thing.  It has a handy configurable synch feature.  I used it to save settings/state to a flash drive.  Then when I got home, I installed RSS Bandit on the home machine and downloaded from the flash drive.  RSS Bandit went out to the web and pulled the content.  I was good to go.  Ironically, I should be able to synch with NewsGator OnLine too.  Since I've already paid for that, I might give it a go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-113453796304946191?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.rssbandit.org/' title='RSS Bandit'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/113453796304946191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/12/rss-bandit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113453796304946191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113453796304946191'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/12/rss-bandit.html' title='RSS Bandit'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-113173466399908940</id><published>2005-11-11T12:36:00.000-06:00</published><updated>2005-11-14T22:57:51.106-06:00</updated><title type='text'>MS Word 2000 and Visual Studio 2003 Interop</title><content type='html'>&lt;p&gt;The other day a friend of mine was asking me about reading content from a Word document.  To me, this was an interesting question.  I'd previously been exposed to Excel Interop and was somewhat intrigued by his problem.

&lt;p&gt;After a quick search of the web I came across numerous solutions on how to &lt;em&gt;write&lt;/em&gt; to a Word document but nothing on &lt;em&gt;reading&lt;/em&gt; from one.

&lt;p&gt;So, I put together a small VS2003 solution in VB with some &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt; 2.2.2 tests as a "spike" solution.  I am making available the solution at &lt;a href="http://www.dbbear.com/WordInterop.zip"&gt;http://www.dbbear.com/WordInterop.zip&lt;/a&gt; for a limited time? (maybe) I hope that other's might find the simple class and unit tests handy.

&lt;p&gt;Note: updated based on feedback.  Better clean up with finally block.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-113173466399908940?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.dbbear.com/WordInterop.zip' title='MS Word 2000 and Visual Studio 2003 Interop'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/113173466399908940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/11/ms-word-2000-and-visual-studio-2003.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113173466399908940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113173466399908940'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/11/ms-word-2000-and-visual-studio-2003.html' title='MS Word 2000 and Visual Studio 2003 Interop'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-113139977767503938</id><published>2005-11-07T15:40:00.000-06:00</published><updated>2005-11-16T21:36:03.340-06:00</updated><title type='text'>NewsGator sucks</title><content type='html'>Right now I am harboring a lot of ill will towards the Newsgator folks.

I was one of those that bought the Outlook version early on. You know the one that you'll never have to update again?

Well, it didn't take 'em long to figure out that wasn't going to work so they switched their business model to where the Outlook version is part of the business package. But hey, we'll give the existing users a "free" upgrade to the 2.5 version and 2 years of service. After that though you have to pay every year.

In a bit of a revolt? many people were sounding off with, whatever, I'll just keeping using this version with out all of the other new features. I simply don't need them. That's the camp I fall in to. Well the folks at NewsGator put their thinking camps on and figured out that they could &lt;strong&gt;turn off service to 2.0 clients&lt;/strong&gt;.


&lt;blockquote&gt;The online synchronization support for NewsGator Outlook edition 2.0 will be switched off on Tuesday, November 8, at approximately 5pm MST.

&lt;p&gt;If you are using Outlook edition 2.0 in synchronized mode, you will need to upgrade to Outlook edition 2.5, which has greatly enhanced synchronization capabilities.

&lt;p&gt;Existing 2.0 customers can get a free upgrade to 2.5, along with a free
2-year premium NewsGator Online subscription, by following these instructions. &lt;/blockquote&gt;
&lt;br&gt;
But, hey, what am I complaining about, they gave me a whole 34 or so hours notice from the date/time on the email to turning the service off.

To frustrate me even further &lt;strong&gt;the install process nuked all of my default folder settings&lt;/strong&gt; for the feeds I'm subscribed too. Nice huh?

&lt;strong&gt;Then, they proceeded to download the ENTIRE CONTENTS of ALL the feeds&lt;/strong&gt;. Only about 800 items to wade through. GRRRRR.

And guess what else, &lt;strong&gt;they didn't fix the post to Blogger bug&lt;/strong&gt;. I'll have to reinstall that.

IS THIS THE FUTURE OF WEB SERVICES? You thought Microsoft had a monopoly with Office, etc. At least they can't turn off your Office 97 installation.

&lt;p&gt;I'll definitely be looking around for a different service.

&lt;p&gt;Update: &lt;strong&gt;Now neither of my Outlook Edition machines are synching&lt;/strong&gt;.  Lovely.

&lt;p&gt;Update 2: After having the synch fail, &lt;strong&gt;ALL of my specified folder settings have been lost AGAIN.&lt;/strong&gt;

&lt;p&gt;Update 3: After 3 days, I got an email back from NG tech support.  They pointed me to &amp;quot;Greg's&amp;quot; blog where he says it's just the synching which will quit working.  One of the main reasons people bought the lifetime Outlook version.

&lt;p&gt;My favorite part of the response: &amp;quot;If you still have 2.5 installed can you describe the problems which you have?&amp;quot;  I thought I had outlined them pretty well here.  But as of this moment, I don't have NewsGator installed.

&lt;p&gt;NewsGator really screwed up on this whole deal.  They should have just sucked it up and let the 2.0 folks continue on with what they have.  And then try and entice them to switch to one of the newer plans with better features and service.  Depending on what we see in OutLook 12 or Windows Vista RSS, the need for NewsGator Outlook edition will be obviated.  The NG WebEdition and Synch Service is where they will be making money down the road.  That's why they had to figure out a way to pull the plug on the existing lifetimers.  It all smacks of the PayPal &amp;quot;free now and free forever&amp;quot;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-113139977767503938?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/113139977767503938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/11/newsgator-sucks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113139977767503938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/113139977767503938'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/11/newsgator-sucks.html' title='NewsGator sucks'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-112969851875679878</id><published>2005-10-19T00:08:00.000-05:00</published><updated>2005-10-20T12:37:04.016-05:00</updated><title type='text'>Extreme Programming in St Louis, MO</title><content type='html'>We had a meeting Monday night and did some testing of "untestable" code.
&lt;a href="http://www.agileprogrammer.com/oneagilecoder/"&gt;Brian Button&lt;/a&gt; briefed us with a simple problem he'd run into and presented us with a sample project to tackle.
The problem was not so overwhelming that you got lost in what it was that was trying to be accomplished by the code, but you could focus on the testing part.
(It was a simple problem dealing with putting together a string based on the AppDomainName.)

&lt;p&gt;We broke up in to small groups. Mixing up some with people we don't usually work with. (Which I really liked.)

&lt;p&gt;The first thing we had to do was put together a VS2003 C# project. The VS2005 solution format isn't compatible with VS2003.

&lt;p&gt;Brian had already briefed us that two of the tests weren't passing and it was obvious that this should be the case. However, the fun part was that two of the test may or may not pass depending on the test runner you ran them with. Initially, &lt;a href="http://www.nunit.org"&gt;NUnit&lt;/a&gt; was passing two of the test and &lt;a href="http://adapdev.com/zanebug/index.aspx"&gt;ZaneBug&lt;/a&gt; was failing all of the tests! It turns out that NUnit creates an AppDomain with a much longer name than does ZaneBug. I liked being able to switch between the two different test runners and see how things were behaving.&lt;/p&gt;

&lt;ul&gt;&lt;strong&gt;The interesting things for me out of the evening:&lt;/strong&gt;
&lt;li&gt;My team got to see TDD on "untestable" code.
&lt;li&gt;We got to practice mob/pair programming.
&lt;li&gt;We got to interact with other people that are doing/working towards XP.
&lt;li&gt;The different groups came up with 3 or 4 other solutions than what Brian had coded.
&lt;li&gt;Although we didn't go this route, I saw where an interface would have been handy in creating a mock object.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;strong&gt;Things to keep the same in the future:&lt;/strong&gt;
&lt;li&gt;Mixing up the groups with people that don't usually work together.
&lt;li&gt;Simple problems that let you focus on the TDD as opposed to the algorithm, etc.
&lt;li&gt;Open networked environment
&lt;li&gt;Brief presentation to entire group
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;&lt;strong&gt;Things I'd do different:&lt;/strong&gt;
&lt;li&gt;Let someone else drive?
&lt;li&gt;Have beginning/starting point code available printed.
&lt;li&gt;Give TDD guidance up front or at the end, but not during session. (Only answer the business rules questions.)
Maybe preferably at the end? I'm pretty sure we would have implemented things differently if we didn't know how Brian had implemented it.
Although, we did discuss the various alternatives and their pros-cons and opted for the route he went. Partly for the sake of time, too. But once you had an inkling of how it was solved it seemed a bit like being told the ending to the movie.
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Overall, I enjoyed the meeting and I look forward to future meetings and "hands on" nights.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-112969851875679878?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.XPSTL.org/' title='Extreme Programming in St Louis, MO'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/112969851875679878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/10/extreme-programming-in-st-louis-mo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112969851875679878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112969851875679878'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/10/extreme-programming-in-st-louis-mo.html' title='Extreme Programming in St Louis, MO'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-112727726223691819</id><published>2005-09-20T23:34:00.000-05:00</published><updated>2005-09-20T23:34:22.240-05:00</updated><title type='text'>Recent Command Post Deployments</title><content type='html'>I was Incident Command at our local "Ham and Turkey Festival" this past weekend.
Luckily only a few minor incidents.  We had our EMA command post set up and had multiple Law, multiple Fire,  EMS and 911 in the structure.  Good activity for all involved.  I won't say exercise or training, because it was the real deal.  We had real issues with the real people responding.  As part of it, we were testing all features of the new command post and working with a prototype CAD software I'm developing.  Numerous tours were given and feedback was gathered for review.  153 hours were logged for the event.
 
Last night we had our first rapid deployment.  We hadn't fully rehab'ed from the weekends activity, but we had worked out some kinks Saturday at the Ham and Turkey Festival.  We responded with the Command Post to an overturned propane tanker.  Ironically? while enroute, another ham from the neighboring county gave us a holler on our local UHF repeater to ask about our status.  He was out with the HazMat Comm team from that area, which serves a wide area including our county.  Luckily we didn't need that resource. It was estimated that 80 gallons of diesel and 8900 gallons of propane were onboard the truck.  We set up on the road blocked highway in the cold zone.  The incident commander took up residence at the command post and we established communications with the Law, Fire and EMS units on scene via mutual aid channels.  The central dispatch center was able to clearly copy our traffic on one of the mutual aid frequencies.  This freed up two of the county wide repeaters for other use.  (Did I mention we also had another active incident in the same area a result of an earlier tornado warning?)  We had numerous entities involved and multiple locations.  Approximately 70 hours were logged during the time the command post was on scene.  It was a somewhat extended deployment but overall very successful and rewarding.
 &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-112727726223691819?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/112727726223691819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/09/recent-command-post-deployments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112727726223691819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112727726223691819'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/09/recent-command-post-deployments.html' title='Recent Command Post Deployments'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-112688218790032301</id><published>2005-09-16T09:49:00.000-05:00</published><updated>2005-09-16T09:49:47.913-05:00</updated><title type='text'>Katrina window open and closed.</title><content type='html'>Well, I came close to deploying to Katrina several times.  Actually had the green light once and was then disregarded.  The last round I was scheduled for a third rotation with a comm team and the second team was released, mission complete.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-112688218790032301?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/112688218790032301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/09/katrina-window-open-and-closed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112688218790032301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112688218790032301'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/09/katrina-window-open-and-closed.html' title='Katrina window open and closed.'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-112537399231607314</id><published>2005-08-29T22:53:00.000-05:00</published><updated>2005-08-29T22:57:40.176-05:00</updated><title type='text'>Long Weekend</title><content type='html'>&lt;p&gt;Complete Universal kits are never complete nor universal when you are 30 minutes from the hardware store.

&lt;p&gt;A loose (inaccessible) battery cable is all it takes to make all your gauges wacko and finally leave you stuck on the side of the road.

&lt;p&gt;No one stops for a big biker guy on the side of the road.  Unless you've just about got the bike strapped down in your buddy's cattle trailer.  &lt;em&gt;Then&lt;/em&gt; the police stop to check things out.

&lt;p&gt;The indicated gasket that you picked up before the bike died doesn't fit.

&lt;p&gt;Finally, universal air conditioner install kits are not designed for the metal frame and concrete sash of a dorm room.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-112537399231607314?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/112537399231607314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/08/long-weekend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112537399231607314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112537399231607314'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/08/long-weekend.html' title='Long Weekend'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-112252787989968043</id><published>2005-07-28T00:15:00.000-05:00</published><updated>2005-07-28T00:17:59.900-05:00</updated><title type='text'>Do you have ICE in your mobile?</title><content type='html'>Putting ICE along with a name and telephone number will enable the emergency services to contact your family in the event of an emergency.

I highly encourage everyone to put &lt;a href="http://www.icecontact.com/"&gt;ICE&lt;/a&gt; in their mobile phone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-112252787989968043?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.icecontact.com/' title='Do you have ICE in your mobile?'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/112252787989968043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/07/do-you-have-ice-in-your-mobile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112252787989968043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112252787989968043'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/07/do-you-have-ice-in-your-mobile.html' title='Do you have ICE in your mobile?'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-112252194920597050</id><published>2005-07-27T22:37:00.000-05:00</published><updated>2005-07-27T22:39:09.210-05:00</updated><title type='text'>Radar Widget for Konfabulator</title><content type='html'>&lt;a href="http://www.dbbear.com/k0emt/projsoft/radarwidget.html"&gt;Here &lt;/a&gt;is a link to the Radar Widget I hacked up.  Fun stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-112252194920597050?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.dbbear.com/k0emt/projsoft/radarwidget.html' title='Radar Widget for Konfabulator'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/112252194920597050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/07/radar-widget-for-konfabulator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112252194920597050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112252194920597050'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/07/radar-widget-for-konfabulator.html' title='Radar Widget for Konfabulator'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-112249435870734948</id><published>2005-07-27T14:59:00.000-05:00</published><updated>2005-07-27T14:59:18.723-05:00</updated><title type='text'>Konfabulator</title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;I recently heard of Konfabulator&amp;nbsp;&lt;a href="http://www.konfabulator.com"&gt;www.konfabulator.com&lt;/a&gt; when reading that Yahoo had bought them and they're going to be renamed Yahoo! Widgets&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Konfabulator implements a&amp;nbsp;pretty slick concept of "widgets" that are what you want them to be.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Combining the use of&amp;nbsp;XML and JavaScript for implementing widgets definitely speeds up development.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Messing around with a widget I downloaded last night proved to be highly addictive.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;They have a lot of widgets in the widget gallery.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;I intend to release the updated Radar widget that I worked on last night.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Check 'em out, you'll like 'em.&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-112249435870734948?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/112249435870734948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/07/konfabulator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112249435870734948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112249435870734948'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/07/konfabulator.html' title='Konfabulator'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-112179515101257746</id><published>2005-07-19T12:44:00.000-05:00</published><updated>2005-07-19T12:45:51.026-05:00</updated><title type='text'>I am Kung Fu Master</title><content type='html'>&lt;TABLE BORDER=0&gt;&lt;TR&gt;&lt;TD&gt;
&lt;A HREF="http://quiz.ravenblack.net/videogame.pl"&gt;&lt;IMG BORDER=0 ALIGN="LEFT" WIDTH=150 HEIGHT=80 SRC="http://quiz.ravenblack.net/videogame/15.png" ALT="What Video Game Character Are You? I am Kung Fu Master." /&gt;&lt;/A&gt;I am &lt;B&gt;Kung Fu Master&lt;/B&gt;.&lt;BR /&gt;&lt;BR /&gt;
I like to be in control of myself. I dislike crowds, especially crowds containing people trying to kill me. Even though I always win, I prefer to avoid fights if possible. &lt;A HREF="http://quiz.ravenblack.net/videogame.pl"&gt;What Video Game Character Are You?&lt;/A&gt;
&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-112179515101257746?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/112179515101257746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/07/i-am-kung-fu-master.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112179515101257746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/112179515101257746'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/07/i-am-kung-fu-master.html' title='I am Kung Fu Master'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-111989443967322984</id><published>2005-06-27T12:47:00.000-05:00</published><updated>2005-06-27T12:47:19.703-05:00</updated><title type='text'>Willing to go?</title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;The other day I was out fishing.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; I was trying out some new tackle I'd received for father's day.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; I had made a couple of casts when one hit.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; I could tell that it was a good size fish by the way it was fighting and it was pulling line back out too.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; I was playing it and hoping that it would show itself. Then it did one of those flying through the air like a ballerina moves.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; It was beautiful.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; We continued our struggle.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; I was giving it slack when it needed it and reeling in when it tired.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; Then, it decided to bolt for the open water.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; This would typically have not been a problem.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; I would usually let it run and give it the slack it needed.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; But this time, I felt I couldn't.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; If I would have given it the slack to run it have taken the line under a low foot bridge (that I couldn't pass under) and I would have had a heck of a time playing it then.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; So, I grimaced and tried to bring it in the last couple of feet.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; Then with the extra tension on the line the fish did a&amp;nbsp;180 degree turn and freed it self.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; Retrieving the expelled lure intact was my only consolation.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; Nothing else was biting that day.&lt;/font&gt;&lt;/p&gt; &lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;font face="Arial"&gt;There is a lesson here and it has been sticking with me so I feel compelled to put it in bits.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; In contract work we are always out fishing for clients.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; Sometimes we get a bite, a requirements gathering meeting and a request for quote.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; As we're getting into the details of the requirements and design we see the prize.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; The big bass in mid-air.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; As we continue working on the quote, we have to struggle with do we want to go where it's taking us?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; Are we willing to stretch and work under the foot bridge?&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt; Or are we going to pull too hard and lose the client?&lt;/font&gt;&lt;/p&gt; &lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&lt;font face="Arial"&gt;What areas of our life do we need to evaluate our willingness to go where we're being pulled?&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-111989443967322984?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/111989443967322984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/06/willing-to-go.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111989443967322984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111989443967322984'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/06/willing-to-go.html' title='Willing to go?'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-111903141682061363</id><published>2005-06-17T13:03:00.000-05:00</published><updated>2005-06-17T13:03:36.836-05:00</updated><title type='text'>The fish aren't biting.</title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;Well, last night the fish weren't biting at all.&amp;nbsp; It's been over a year since I've gone fishing and not caught at least one or two fish.&amp;nbsp; I was fishing in a new area for me at an odd time.&amp;nbsp; I tried several different lures and varied the presentation.&amp;nbsp; No go.&amp;nbsp; Last Sunday, I pulled a 16" 2lb bass from the same waters.&amp;nbsp; So what was different?&amp;nbsp; Different time of day, different temperatures and slightly different lures.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;&lt;strong&gt;Reflection&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;What can I learn from this?&amp;nbsp; That even though yesterday we used a technique and it paid off big doing the same thing today may not have the same return on investment.&amp;nbsp; We need to be constantly changing, improving adapting.&amp;nbsp; (Different lures and presentations.)&amp;nbsp; And even then we still may not see the return we want.&amp;nbsp; However, giving up isn't an option.&amp;nbsp; If anything the lack of result kept me out longer than I had intended.&amp;nbsp; Maybe the lesson there was cut your losses and get on to something more productive.&amp;nbsp; I keep thinking if I had gone back to a more familiar location I would have at least caught &lt;em&gt;something&lt;/em&gt;.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Kind of like Extreme Programming versus Waterfall.&amp;nbsp; Even if you don't get to the target you had hoped you at least have some deliverable for the effort that was put in.&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-111903141682061363?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/111903141682061363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/06/fish-arent-biting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111903141682061363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111903141682061363'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/06/fish-arent-biting.html' title='The fish aren&apos;t biting.'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-111699623073819635</id><published>2005-05-24T23:22:00.000-05:00</published><updated>2005-05-24T23:46:55.426-05:00</updated><title type='text'>Life lessons from fishing</title><content type='html'>&lt;strong&gt;Goals&lt;/strong&gt;
Say you start the outing with the goal of bringing in a big bass.
This could be like the life goal of landing your dream job with better salary.

&lt;strong&gt;Changing the lure&lt;/strong&gt;
You get to fishing the lake and you're not having any luck bringing in the fish of your dreams.  This is like trying to get that dream job.  So, you have a couple of options; &lt;em&gt;change your location&lt;/em&gt;, &lt;em&gt;change your goal&lt;/em&gt; and &lt;em&gt;self improvement&lt;/em&gt;.

&lt;strong&gt;Changing your location&lt;/strong&gt;
This is pretty self explanatory.  If you're fishing the bank, keep moving around.  If you can get out on the water.  If that's not working change lakes!  Life story, work the job, angle for promotions.  Move to another department or division for promotion or change jobs to get that raise.

&lt;strong&gt;Changing the goal&lt;/strong&gt;
Maybe you are satisfied to not get the big bass.  You've resigned yourself that they just aren't biting right now.  Change your goal to fishing for panfish.  Land one and be happy.  This is like a soft job market.  It's going to be tough to increase the income level for now so change the goal to be do the one thing I need to do that will best increase my marketability when the market firms up.

&lt;strong&gt;Self-Education&lt;/strong&gt;
Read and study up on knots, lures, equipment and techniques.  Practice before you get to the water.  Life story, while you're away from work learn new skills that improve your marketability and potential wage earning capability.  Maybe these new skills will give you the edge in landing that big bass (job).

&lt;strong&gt;Networking&lt;/strong&gt;
Talk to other fisherman.  Learn from them.  They know the lay of the land.  They have a feel for what lures work, the times of day and the hazards.  In life your network can help you improve your work skills, tell you how to get through the red tape and warn you about the politics of the situation.  And they can help you land that big bass.

&lt;strong&gt;Success&lt;/strong&gt;
When it's all done, you can rest satisified.  You did the best you could.  You landed three bass and two crappie.  None of them the dream bass you're after but you've learned, built relationships and had fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-111699623073819635?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/111699623073819635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/05/life-lessons-from-fishing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111699623073819635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111699623073819635'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/05/life-lessons-from-fishing.html' title='Life lessons from fishing'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-111673356777894583</id><published>2005-05-21T22:29:00.000-05:00</published><updated>2005-05-21T22:46:07.783-05:00</updated><title type='text'>Busy day with webapp</title><content type='html'>Well, spent a bunch of time working on an ASP.Net application today.
I haven't done much at all with ASP.Net so there was a bit of head pounding.
However, by days end I had forms authentication set up.  A table with the UserID, Password, etc info was built on SQL Server.  Using stored procedures to get what I need.  Getting the spike solution integrated into the real application proved to be a little interesting.  I was running into issues because I hadn't remembered to abandon my session authentication between test runs.

I got the application set up to be cookieless and save all state information with a state server hosted on separate machine.  Had to edit the registry to permit non-local users to connect to the service.  Then I was able to set some session variables for the application.

Then I did some refactoring and created a common logout function for the application.  I also set up the application to get configuration (connection) information from the web.config.

So finally feeling like I had accomplished something, it was time to go home.  It was a beautiful ride home on the Harley.  It was extremely hard to keep from flexing the wrist.  The icing on the evening was catching a couple of crappie right off the bank (they were nesting).  Then I reeled in a nice small mouth bass with my ultra-lite combo.

Now to get some rest before getting back at it tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-111673356777894583?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/111673356777894583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/05/busy-day-with-webapp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111673356777894583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111673356777894583'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/05/busy-day-with-webapp.html' title='Busy day with webapp'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-111530415936537842</id><published>2005-05-05T09:42:00.000-05:00</published><updated>2005-05-05T09:42:39.366-05:00</updated><title type='text'>ColdHeat Soldering Iron</title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;I just received a ColdHeat Soldering Iron as a gift.&amp;nbsp;&lt;a href="https://www.asseenontvnetwork.com/vcc/coldheat/coldheat/115785/"&gt;https://www.asseenontvnetwork.com/vcc/coldheat/coldheat/115785/&lt;/a&gt;&amp;nbsp; It's a pretty slick little device.&amp;nbsp; The two big things that caught my attention are that it's cordless and they claim that the tip cools off near instantly.&amp;nbsp; Well after working with it a little bit I can say the following:&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Don't plan to use it for really fine work.&amp;nbsp;&amp;nbsp; It has a split tip that works more like a welder than a soldering iron.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;It works best on smaller gauge wire.&amp;nbsp; Seems like it would be great for splicing wires in the field.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;My initial assessment is I don't think it would work well to solder coax or coax connectors.&amp;nbsp; Because of the mass involved with the coax braid and the connectors I think it would be tough for this device to heat them up well.&amp;nbsp; I think with larger wires and connectors we'll see lots of cold solder joints using this device.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;Overall, I like it for it's intended use, soldering small gauge wires together in the field.&amp;nbsp; This will come in handy for antenna work.&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-111530415936537842?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/111530415936537842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/05/coldheat-soldering-iron.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111530415936537842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111530415936537842'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/05/coldheat-soldering-iron.html' title='ColdHeat Soldering Iron'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-111395378853627183</id><published>2005-04-19T18:34:00.000-05:00</published><updated>2005-04-19T18:36:28.536-05:00</updated><title type='text'>Thought for the day</title><content type='html'>Turn dissatisfaction into action!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-111395378853627183?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/111395378853627183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/04/thought-for-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111395378853627183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111395378853627183'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/04/thought-for-day.html' title='Thought for the day'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-111220334274263899</id><published>2005-03-30T11:22:00.000-06:00</published><updated>2005-03-30T11:22:22.743-06:00</updated><title type='text'>High Schoolers win underwater robot competition</title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;Check out this article.&amp;nbsp; Unbelievable.&amp;nbsp; These guys need to be in college (but can't afford it).&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;&lt;a href="http://www.wired.com/wired/archive/13.04/robot.html?pg=1&amp;amp;topic=(none)&amp;amp;topic_set=(none"&gt;http://www.wired.com/wired/archive/13.04/robot.html?pg=1&amp;amp;topic=(none)&amp;amp;topic_set=(none&lt;/a&gt;)&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-111220334274263899?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/111220334274263899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/03/high-schoolers-win-underwater-robot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111220334274263899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111220334274263899'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/03/high-schoolers-win-underwater-robot.html' title='High Schoolers win underwater robot competition'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-111206408342424722</id><published>2005-03-28T20:33:00.000-06:00</published><updated>2005-03-28T20:41:23.426-06:00</updated><title type='text'>Been busy - work, antennas, motorcycle</title><content type='html'>It's been a little since I last made an entry here.

I've been busy on a work project.  A conglomeration of VB.Net, Lotus Script, VBA, SQL server, DBF and XML stuff.  It's nearing test/production and I'll be happy to move on to the next project.

I was working on my motorcycle this weekend getting ready summer and came up short some parts.  I made the hour and a half round trip to the Harley dealer only to get home to find out he'd given me a male part that I needed as female.  That'll have to wait now.  Having to special order some vinyl tubing from another dealer too.  I'm really anxious to get the bike going again so I can get to the shop and have a new rear tire put on.

So, what to do since I couldn't get going on the bike?  I built an antenna.  A colinear design from the September 2003 QST.  It's about 9' tall (I built it for a higher frequency) and it works gang busters!  A friend will be putting it to use out at his farm so I'm looking forward to hearing how well it performs there.  I may build another one for putting out on a remote weather station.

Tonight I played a little QRP portable.  I was outside with a random wire (sort of) antenna with a tuner and RG-62 coax.  Worked VE6CQ in western Canada.  What a blast!  He had a bit of a hard time copying me at first, so I switched to the home rig.  Copy there was 59/59.  We did a quick swap of mics on the FT-817 to the regular mic with the One Big Punch installed and he said the signal was considerably stronger.  However, with the set up I had, RF was definately getting back into the mic.  Ah well, it was fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-111206408342424722?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/111206408342424722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/03/been-busy-work-antennas-motorcycle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111206408342424722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/111206408342424722'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/03/been-busy-work-antennas-motorcycle.html' title='Been busy - work, antennas, motorcycle'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110969165232157362</id><published>2005-03-01T11:40:00.000-06:00</published><updated>2005-03-01T12:00:21.436-06:00</updated><title type='text'>ADO.net, the Connection Pool &amp; Garbage Collection</title><content type='html'>&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;How often do we code something like this:&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;pre&gt;for each object O in ObjectsCollection
    SharedFunction.Processing(O)
    do some stuff
    SharedFunction.WriteToDb(O)
next&lt;/pre&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;strong&gt;A little background&lt;/strong&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;The SharedFunction.Processing call does some SQL reads. &lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;I'm using the SQLHelper from Microsoft.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;The problem is that with the above code after about 120 objects O I'm getting an error. Connection Time Out or Max Pool Size reached.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;strong&gt;The Cause&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;It is such a tight loop that garbage collection isn't having a chance to clean up the left over connections from the Processing and WriteToDb.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;The solution I used was to force a garbage collection. Then everything is honky dory. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Currently their is a "global" of sorts that carries the SQL Connection string. I didn't want to mess with a global connection as that's just asking for problems. However, an alternate solution could be to refactor SharedFunction.X to be instance functions, instantiate a connection in the instance and reuse it with the instance functions. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;After looking at this some more, the alternate solution really isn't that nice to implement. It would require modification of two Business Logic Layer code modules and their associated Data Access Layers. I'd rather not be worrying about carrying a connection around and be more focused on what I'm &lt;em&gt;really&lt;/em&gt; trying to accomplish.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110969165232157362?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110969165232157362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/03/adonet-connection-pool-garbage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110969165232157362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110969165232157362'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/03/adonet-connection-pool-garbage.html' title='ADO.net, the Connection Pool &amp; Garbage Collection'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110961791625777811</id><published>2005-02-28T13:11:00.000-06:00</published><updated>2005-02-28T13:11:56.270-06:00</updated><title type='text'>Zeigarnik effect </title><content type='html'>&lt;p&gt;&lt;font face="Arial" size="2"&gt;I read this with interest.&amp;nbsp; I would have to agree with it from my own personal observations.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial" size="2"&gt;What does this mean to us in terms of software development?&amp;nbsp; Is it better to end the day (or go to lunch?) in the middle of&amp;nbsp;a task?&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;div&gt;The Zeigarnik effect is the psychological tendency to remember an uncompleted task rather than a completed one. Bluma Zeigarnik first discovered this effect in the 1920's while in a viennese coffee shop. She noticed that a waiter was able to...&lt;br /&gt; [&lt;a class="ngquotelink" href="http://www.twelve71.org/blogs/rachel/archives/000733.html"&gt;Rachel Davies&lt;/a&gt;]&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110961791625777811?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110961791625777811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/02/zeigarnik-effect.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110961791625777811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110961791625777811'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/02/zeigarnik-effect.html' title='Zeigarnik effect '/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110903367580827211</id><published>2005-02-21T18:50:00.000-06:00</published><updated>2005-02-21T18:54:35.810-06:00</updated><title type='text'>Untitled</title><content type='html'>&lt;pre&gt;
The audio that spewed forth
assaulted my ears and shook my core.
The piercing highs made me wince.
Mushy bass churned in my stomach,
like a bowl of left out too long cereal.
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110903367580827211?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110903367580827211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/02/untitled.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110903367580827211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110903367580827211'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/02/untitled.html' title='Untitled'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110696342376179621</id><published>2005-02-08T23:30:00.000-06:00</published><updated>2005-02-17T14:07:51.333-06:00</updated><title type='text'>The Omelet model of Management</title><content type='html'>&lt;p&gt;Ok, so I believe in looking at the world around you and seeing if there is a metaphor their that goes along with some concept I've learned. The other morning I was cooking an omelet and saw how the steps I was taking fell in line with the primary functions of management. POSLC: Planning, Organizing, Staffing, Leading and Controlling.&lt;/p&gt;
&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="55%"&gt;&lt;p&gt;Decide what type of Omelet - what you want in it. &lt;/p&gt;&lt;/td&gt;&lt;td width="45%"&gt;Plan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Gather ingredients &lt;/td&gt;&lt;td&gt;Staff&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Prepare cook area and ingredients &lt;/td&gt;&lt;td&gt;Organize&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Saute the ingredients w/seasoning &lt;/td&gt;&lt;td&gt;Training&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Cook the omelet&lt;/p&gt;&lt;ul&gt;&lt;li&gt;medium to medium-high heatt (so it doesn't scorch)&lt;/li&gt;&lt;li&gt;watch the omelet rise&lt;/li&gt;&lt;li&gt;flip it over when ready &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Management functions&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Controlling&lt;/li&gt;&lt;li&gt;Stretching (working to minimize risk of failure)&lt;/li&gt;&lt;li&gt;Controlling and Leading &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Eat the omelet and smile&lt;/td&gt;&lt;td&gt;Appraise and give feedback &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110696342376179621?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110696342376179621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/02/omelet-model-of-management.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110696342376179621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110696342376179621'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/02/omelet-model-of-management.html' title='The Omelet model of Management'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110571493713343836</id><published>2005-01-14T08:58:00.000-06:00</published><updated>2005-01-28T19:54:44.370-06:00</updated><title type='text'>7 Habits &amp; The Church</title><content type='html'>It's been about 10 years since I last read this book. Now that I am working through it again I am able to internalize it much better. Definitely a book that is worth re-reading.

In my opinion it would behoove church leaders to check this book out. From what I have seen the church at large needs to re-examine it's mission and goals and objectives. I think we will start seeing more of this viewpoint with Generation Y'ers.

Generation Y people and to some extent gen X'ers are examining their faith's goals and objectives and are finding that they are inconsistent with current practices. One example is the "mega-church" with it's multi-million dollar building and expensive fixtures. The question is, "Why did we spend $10 million on a new church instead of going for a modest structure and &lt;em&gt;planting&lt;/em&gt; a lot more new churches?"

Counterpoint, how Spartan is too Spartan? I recently attended service at a new church plant. They are meeting in a former grocery store (for now). They do plan to build a "&lt;em&gt;real&lt;/em&gt;" church. They purchased chairs for seating and they have a band for the service. This all seems reasonable. But when does reasonable become too much? The gen Y'ers I know would be more than happy to meet, study and worship in someone's house or out in a field.

More later...
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110571493713343836?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.franklincovey.com' title='7 Habits &amp; The Church'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110571493713343836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/01/7-habits-church.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110571493713343836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110571493713343836'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/01/7-habits-church.html' title='7 Habits &amp; The Church'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110506960285448620</id><published>2005-01-06T21:43:00.000-06:00</published><updated>2005-01-06T21:46:42.856-06:00</updated><title type='text'>Pave Hawks go to Sri Lanka</title><content type='html'>Check out this brief article and some pictures of our Air Force sending some helicopters to help out in Sri Lanka.
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110506960285448620?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.af.mil/photos/story_photos.asp?storyID=123009517' title='Pave Hawks go to Sri Lanka'/><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110506960285448620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/01/pave-hawks-go-to-sri-lanka.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110506960285448620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110506960285448620'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/01/pave-hawks-go-to-sri-lanka.html' title='Pave Hawks go to Sri Lanka'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110490379619963717</id><published>2005-01-04T23:41:00.000-06:00</published><updated>2005-01-04T23:43:16.200-06:00</updated><title type='text'>The meaning of life</title><content type='html'>What is the meaning of life?  It is up to you to determine that.
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110490379619963717?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110490379619963717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/01/meaning-of-life.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110490379619963717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110490379619963717'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/01/meaning-of-life.html' title='The meaning of life'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110475836795047036</id><published>2005-01-03T07:17:00.002-06:00</published><updated>2011-12-28T22:51:49.490-06:00</updated><title type='text'>Washed my flash drive</title><content type='html'>&lt;p&gt;Well for the second time I've washed a flash drive. The first flash drive came through ok, although my level of confidence in it's reliability dropped significantly. This drive seems to be sealed much better. We shall see later today how it faired. This has got to happen more often than we'd think.&lt;/p&gt;

&lt;p&gt;UPDATE:  The drive seems to have made it OK.  Both drives are made by SanDisk.  One is the Cruzer Micro and the other a Cruzer Mini.  The only issue I've had is that the caps don't seem to fit very well now... too loose.&lt;/p&gt;

&lt;p&gt;Be careful to make sure that ALL moisture is removed from the drive.  Water can real a do job on your device by causing corrosion between the legs on the SMT components.  You can try and remove by flushing with rubbing alcohol and placing the USB drive in a container of uncooked rice.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110475836795047036?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110475836795047036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/01/washed-my-flash-drive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110475836795047036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110475836795047036'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/01/washed-my-flash-drive.html' title='Washed my flash drive'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9881483.post-110460697655825024</id><published>2005-01-01T13:03:00.000-06:00</published><updated>2005-03-01T17:11:40.696-06:00</updated><title type='text'>XP and the 7 Habits</title><content type='html'>I am currently reading Extreme Programming Perspectives and The Seven Habits of Highly Effective people. The thought that really struck me is how 7 Habits is about being principle centered and that's what XP is about. While the waterfall model is all about a rigid framework, XP is focusing on certain key principles and what needs to be done when we stick to our principles.

From personal experience it seems like we come with up rigid frameworks and steps when we are trying to get a group of people that aren't operating under the guidance of the same principles to produce something. And not surprisingly, no matter how detailed your process, the person operating outside of those guiding principles will find a way to break the process or bend it in a way that is contrary to the principle that is the fundamental reason for the process. So, my experience leads me to believe that no matter how many processes you put in place and no matter how detailed they are, if the developer isn't committed to the same principles, you aren't going to get the end result you were wanting. On the other hand, if everyone is committed to the same principles it seems like you don't need much of a framework to get the desired end result.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9881483-110460697655825024?l=soloso.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://soloso.blogspot.com/feeds/110460697655825024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://soloso.blogspot.com/2005/01/xp-and-7-habits.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110460697655825024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9881483/posts/default/110460697655825024'/><link rel='alternate' type='text/html' href='http://soloso.blogspot.com/2005/01/xp-and-7-habits.html' title='XP and the 7 Habits'/><author><name>Bryan Nehl</name><uri>http://www.blogger.com/profile/07738798938101870240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_EdDlpJZIv_Q/SZguLnzVU5I/AAAAAAAAADY/1975oCrP7hs/S220/me_coloredpencil.jpg'/></author><thr:total>0</thr:total></entry></feed>
