<?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-10441002</id><updated>2012-02-27T23:31:56.041-05:00</updated><category term='versioning'/><category term='mvc'/><category term='regex'/><category term='Twitter'/><category term='software architecture'/><category term='tech'/><category term='iPhone'/><category term='jQuery'/><category term='DNS'/><category term='javascript'/><category term='email spam'/><category term='agile'/><category term='sql'/><category term='web'/><category term='REST'/><category term='microsoft'/><category term='asp.net'/><category term='career'/><category term='demo'/><category term='Google'/><category term='management'/><category term='.NET'/><category term='database'/><title type='text'>Dave Juth's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default?start-index=26&amp;max-results=25'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>68</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10441002.post-5469578091429719705</id><published>2009-11-20T07:33:00.002-05:00</published><updated>2009-11-20T07:56:36.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>ASP.NET MVC Error Handling</title><content type='html'>I wrote a short how-to article about &lt;a target="_blank" href="http://www.davidjuth.com/asp-net-mvc-error-handler.aspx"&gt;trapping unhandled errors in ASP.NET MVC web applications&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5469578091429719705?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5469578091429719705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5469578091429719705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5469578091429719705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5469578091429719705'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/11/aspnet-mvc-error-handling.html' title='ASP.NET MVC Error Handling'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-2309377117768225756</id><published>2009-07-15T12:40:00.004-04:00</published><updated>2009-07-15T12:42:54.911-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Website is Back Up</title><content type='html'>Oh. My. Goodness. My website has been down for a couple weeks and I have been away and busy and just not on it. It's back up now. It was down due to a bug in a browsers settings file and the error message and "[No relevant source lines]" made it a little difficult to figure out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-2309377117768225756?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.davidjuth.com' title='Website is Back Up'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/2309377117768225756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=2309377117768225756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2309377117768225756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2309377117768225756'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/07/website-is-back-up.html' title='Website is Back Up'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4985094070067685542</id><published>2009-06-19T11:45:00.003-04:00</published><updated>2009-06-19T11:54:30.038-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Google Calendar Sync in iPhone 3.0</title><content type='html'>This is good! It wasn't very straightforward until I found the URL specified on &lt;a href="http://www.google.com/support/calendar/bin/answer.py?answer=99358#ical"&gt;Google's Getting Started with CalDAV&lt;/a&gt; page (see the "&lt;span style="font-style:italic;"&gt;Enable Google Calendar in Apple's iCal&lt;/span&gt;" link). &lt;br /&gt;&lt;br /&gt;Here's how to set up your Google Calendar on your iPhone:&lt;br /&gt;&lt;br /&gt;* On your iPhone, tap on Settings&lt;br /&gt;* Open Mail, Contacts and Calendar&lt;br /&gt;* Tap on Add Account...&lt;br /&gt;* Select Other&lt;br /&gt;* For Server, enter this URL and replace YOUREMAIL@DOMAIN.COM with your Google login/email address:  www.google.com/calendar/dav/YOUREMAIL@DOMAIN.COM/user &lt;br /&gt;* Enter your Google user name and password&lt;br /&gt;* Click the Next button and it will attempt to connect to your Google Calendar and verify that your iPhone is set up correctly.&lt;br /&gt;&lt;br /&gt;Now when you open your iPhone's calendar, you'll see all of your Google Calendar events. Very cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4985094070067685542?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.google.com/support/calendar/bin/answer.py?answer=99358#ical' title='Google Calendar Sync in iPhone 3.0'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4985094070067685542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4985094070067685542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4985094070067685542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4985094070067685542'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/google-calendar-sync-in-iphone-30.html' title='Google Calendar Sync in iPhone 3.0'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-9130923121881562106</id><published>2009-06-10T22:06:00.005-04:00</published><updated>2009-06-10T22:19:47.506-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>ZIP Code Lookup with the Google Geocoder</title><content type='html'>I have a client who has ended up (due to a misunderstanding by me) with a list of user registrations having some addresses without ZIP codes. So I decided I could probably fix all of them by using a ZIP code lookup service. The U.S. Postal Service has a web service for this, but after signing up and trying it I decided it was a real pain. The sign up process was a little heavy handed, but worse was the test server they restricted you to using until your "application" was "ready," and then you would need to contact them for access to the real site. &lt;br /&gt;&lt;br /&gt;I figured there must be a better way, so after some searching (including &lt;a href="http://www.programmableweb.com/"&gt;programmableweb.com&lt;/a&gt; and &lt;a href="http://www.data.gov/"&gt;data.gov&lt;/a&gt;), I found that &lt;a href="http://code.google.com/apis/maps/documentation/geocoding/"&gt;Google's Geocoder&lt;/a&gt; can do this.&lt;br /&gt;&lt;br /&gt;So my simple, kind of raw &lt;a href="http://www.davidjuth.com/rest-demo-google-geocoder-zipcode-lookup.aspx"&gt;REST demo of using the Google Geocoder for ZIP code lookup&lt;/a&gt; is working. Useful and simple, take a look.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-9130923121881562106?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.davidjuth.com/rest-demo-google-geocoder-zipcode-lookup.aspx' title='ZIP Code Lookup with the Google Geocoder'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/9130923121881562106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=9130923121881562106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9130923121881562106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9130923121881562106'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/zip-code-lookup-with-google-geocoder.html' title='ZIP Code Lookup with the Google Geocoder'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6678355856834647238</id><published>2009-06-10T21:17:00.007-04:00</published><updated>2009-06-10T22:15:54.648-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Make Your Own Twitter Badge with jQuery</title><content type='html'>For the geekily inclined, you can easily &lt;a href="http://www.davidjuth.com/make-your-own-twitter-badge-with-jquery.aspx"&gt;make your own Twitter badge using jQuery and the Twitter API&lt;/a&gt; and display your latest tweets on your website. Step-by-step instructions. Do it now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6678355856834647238?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.davidjuth.com/make-your-own-twitter-badge-with-jquery.aspx' title='Make Your Own Twitter Badge with jQuery'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6678355856834647238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6678355856834647238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6678355856834647238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6678355856834647238'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/make-your-own-twitter-badge-with-jquery.html' title='Make Your Own Twitter Badge with jQuery'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6223691419557879501</id><published>2009-06-10T17:01:00.006-04:00</published><updated>2009-06-10T21:16:27.810-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Performance of jQuery Selectors in ASP.NET</title><content type='html'>My &lt;a href="http://jutherman.blogspot.com/2007/12/aspnet-control-ids-and-jquery.html"&gt;old post&lt;/a&gt; about the problems with control ids in ASP.NET and using them with jQuery did not describe the small performance hit of using the "ends with selector," e.g., $("input[id$='txtDateStart']"). &lt;a href="http://encosia.com/2009/06/09/11-keystrokes-that-made-my-jquery-selector-run-10x-faster/"&gt;This post at encosia.com&lt;/a&gt; has some good tips for optimizing this a bit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6223691419557879501?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6223691419557879501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6223691419557879501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6223691419557879501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6223691419557879501'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/performance-of-jquery-selectors-in.html' title='Performance of jQuery Selectors in ASP.NET'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4823576904385211327</id><published>2009-06-03T22:04:00.006-04:00</published><updated>2009-06-03T22:15:38.975-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery and REST and Flickr and Google Maps Demos</title><content type='html'>My demo page has been updated, massively, over the past few weeks with REST demos using &lt;a href="http://www.jquery.com/"&gt;jQuery&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/djuth/"&gt;Flickr&lt;/a&gt;, the &lt;a href="http://code.google.com/apis/maps/"&gt;Google Maps API&lt;/a&gt; and some other stuff. It's fun but I also want to build up to something more novel and powerful using these techniques. No promises, but fingers crossed that I find time to keep moving forward.&lt;br /&gt;&lt;br /&gt;As far as blogging goes, well, it's been over two years since I've updated this. Doesn't bother me right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4823576904385211327?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.davidjuth.com/home.aspx' title='jQuery and REST and Flickr and Google Maps Demos'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4823576904385211327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4823576904385211327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4823576904385211327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4823576904385211327'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2009/06/jquery-and-rest-and-flickr-and-google.html' title='jQuery and REST and Flickr and Google Maps Demos'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6261954598237874087</id><published>2007-12-12T07:30:00.002-05:00</published><updated>2009-06-03T22:15:13.506-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>ASP.NET Control IDs and jQuery</title><content type='html'>I'm using &lt;a href="http://www.jquery.com/"&gt;jQuery&lt;/a&gt; a lot more for DOM manipulation, UI sugar and general lessening of javascript drudgery. In an aspx page, referencing a control using js is a pain because of how ASP.NET munges the control name. For example, "ddlDate" becomes something like "ctl00_ddlDate." I found lots of articles about this and various approaches, but they all seemed a little too involved or fragile. &lt;br /&gt;&lt;br /&gt;The good news is that the original control name always seems to be preserved at the end of the control id ("always" -- I hope that's correct and so far it's been working). So by using jQuery's &lt;span style="font-family:Courier New;font-weight:700;"&gt;&amp;nbsp;select[id$=&amp;nbsp;&lt;/span&gt; syntax, here is a really simple way to handle this:&lt;br /&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;language&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;javascript&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;src&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Images/jquery-1.2.1.pack.js&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;language&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;javascript&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;  $(document).ready(function(){&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;    var ddlDate = $("select[id$='ddDateName']");&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;    var txtStart = $("input[id$='txtDateStart']");&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;    var txtEnd = $("input[id$='txtDateEnd']")&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt; etc...&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6261954598237874087?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6261954598237874087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6261954598237874087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6261954598237874087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6261954598237874087'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/12/aspnet-control-ids-and-jquery.html' title='ASP.NET Control IDs and jQuery'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-3166920101022937049</id><published>2007-10-18T09:07:00.001-04:00</published><updated>2009-06-03T22:14:32.580-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>SQL Server 2005 Management Studio RANT #1</title><content type='html'>Number one of many rants about Management Studio, not #1 as in this is the worst thing about MS, because it's not the worst thing:&lt;br /&gt;&lt;br /&gt;Scripting a database to SQL Server 2000 (i.e. 8.0) format using the Tasks | Generate Scripts feature gives me a nice .sql script file. But when I run it in SQL 2000's Query Analyzer, it fails with syntax errors! Specifically, it's missing open parentheses on multiple lines. You've got to be kidding! &lt;br /&gt;&lt;br /&gt;I know I can fix all of these errors, and I know there are products that do a better job of scripting database schema than Microsoft's own tools. But, this should work.&lt;br /&gt;&lt;br /&gt;If I have time and continue with the many complaints I have about Management Studio, the conclusion is obvious: we need a much better IDE for SQL Server 2005.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-3166920101022937049?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/3166920101022937049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=3166920101022937049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3166920101022937049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3166920101022937049'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/10/sql-server-2005-management-studio-rant.html' title='SQL Server 2005 Management Studio RANT #1'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8319593251030981887</id><published>2007-07-26T14:15:00.001-04:00</published><updated>2009-06-03T22:16:53.440-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Microsoft Open Source Website</title><content type='html'>At first I thought &lt;a href="http://www.microsoft.com/opensource/default.mspx"&gt;this&lt;/a&gt; was an April Fool's joke. In July. Just not really sure what to think now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8319593251030981887?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/opensource/default.mspx' title='Microsoft Open Source Website'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8319593251030981887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8319593251030981887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8319593251030981887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8319593251030981887'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/07/microsoft-open-source-website.html' title='Microsoft Open Source Website'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-9175894787142854686</id><published>2007-07-20T09:45:00.000-04:00</published><updated>2007-07-20T09:57:13.135-04:00</updated><title type='text'>Collaborative Editing</title><content type='html'>I like reading &lt;a href="http://www.25hoursaday.com/weblog/default.aspx"&gt;Dare Obasanjo's&lt;/a&gt; blog. Though he is frequently too pro-Microsoft and, as one would expect, anti most-of-the-rest, he raises interesting issues and his counter arguments to much of the web zeitgeist is insightful. But I'm not sure why &lt;a href="http://www.25hoursaday.com/weblog/2007/07/17/NoteToSoftwareVendorsTheWorldIsCollaborativeAndLooselyCoupled.aspx"&gt;he  can't use something besides MS Word&lt;/a&gt; to edit a document with his coworkers.&lt;br /&gt;&lt;br /&gt;One of his usual targets, Google, offers &lt;a href="http://docs.google.com/"&gt;Google Docs&lt;/a&gt;, which is a great way to collaborate with a small team. I have used this to collaboratively edit documents, and I like it a lot for small group collaboration. And it's only one of maybe a hundred or more different web-based solutions for collaborative editing. &lt;br /&gt;&lt;br /&gt;The irony, of course, is that Dare is pointing out a key shortcoming of the traditional and still present Microsoft way. That is, fat-client, file-based solutions to things. Maybe that is still the problem with many of the Microsofties (and I certainly see this from time to time with people I know well who have a strong Microsoft background) and with the company in the larger sense -- that the web is still this thing that they don't feel too comfortable embracing to solve typical problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-9175894787142854686?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/9175894787142854686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=9175894787142854686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9175894787142854686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/9175894787142854686'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/07/collaborative-editing.html' title='Collaborative Editing'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8172869148600013715</id><published>2007-05-02T09:11:00.000-04:00</published><updated>2007-05-02T09:20:32.835-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email spam'/><title type='text'>Guerrilla Spam Filtering</title><content type='html'>We use Exchange and Outlook at the office for email, like too many organizations in the world. However, we have (I am embarrassed to say) not been using any spam filtering service or appliance. The result is that junk mail rolls in heavily each day. &lt;br /&gt;&lt;br /&gt;In Outlook, you can create rules and I have a billion of them to filter out keywords and known sources of spam (to the extent that that is effective). It is an OK 80% solution. But when I'm away and using Outlook Web Access, none of my desktop Outlook rules are applied. &lt;br /&gt;&lt;br /&gt;So my solution has been to leave Outlook running on my desktop at work. Then, when I run OWA my inbox is cleaned to the 80% level that my Outlook rules accomplish. This is not recommended and is not a good spam filtering strategy, but it actually works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8172869148600013715?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8172869148600013715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8172869148600013715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8172869148600013715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8172869148600013715'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/05/guerrilla-spam-filtering.html' title='Guerrilla Spam Filtering'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-5655711081655671074</id><published>2007-04-03T08:18:00.001-04:00</published><updated>2009-06-03T22:16:11.666-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>ASP.NET Master Page Title</title><content type='html'>There are a lot of articles about how to programmatically set the title for pages on a web site, such as &lt;a href="http://www.odetocode.com/Articles/419.aspx"&gt;this one&lt;/a&gt; at &lt;a href="http://www.odetocode.com/"&gt;odetocode.com&lt;/a&gt;. But I need to do something much more mundane -- set the title for ALL pages on my website to be the same but optionally, to be able to programmatically override the title for any web page.&lt;br /&gt;&lt;br /&gt;The straightforward way to use the same title for all pages if you are using master pages is to 1) set the &amp;lt;title&amp;gt; in the master page's HTML and 2) remove it from every content page's page directive. That works great. But I want to make this a little easier to maintain, so I hooked this into my site's base page and use web.config to maintain the site's title.&lt;br /&gt;&lt;br /&gt;My site's base page (BasePage), from which all of my site's pages are derived, is declared like this:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;BasePage&lt;/span&gt; : System.Web.UI.&lt;span style="color: teal;"&gt;Page&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In the BasePage constructor, I get the site's title from web.config and trap for any exception:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; BasePage()&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Title = &lt;span style="color: teal;"&gt;WebConfigurationManager&lt;/span&gt;.AppSettings[&lt;span style="color: maroon;"&gt;"SiteTitle"&lt;/span&gt;];&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;catch&lt;/span&gt; (&lt;span style="color: teal;"&gt;Exception&lt;/span&gt; ex)&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.Diagnostics.&lt;span style="color: teal;"&gt;Trace&lt;/span&gt;.WriteLine(ex.Message);&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Title = &lt;span style="color: maroon;"&gt;"My Site"&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This also allows me to forget about manually removing "Untitled Page" from the page directive in every content page. To programmatically set the title, should I need to, I expose a property that prevents setting it to blank (or to the default Visual Studio .NET setting):&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Title&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.Title;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;value&lt;/span&gt;.Trim().Length &amp;gt; 0 &amp;amp;&amp;amp; &lt;span style="color: blue;"&gt;value&lt;/span&gt; != &lt;span style="color: maroon;"&gt;"Untitled Page"&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.Title = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Now, to maintain my site's title, I just set it in web.config:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;add&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;key&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;SiteTitle&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;My Site&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;So this gives me a fairly clean way to maintain my site's title and also to override it per content page should I need to. For example, my contact page can append " - Contact Us" to the existing title by modifying the base page's Title property in Page_Load. &lt;br /&gt;&lt;br /&gt;Seems like a lot of work for something so simple. I'm sure there may be a cleaner way, but for now this seems fairly good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5655711081655671074?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5655711081655671074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5655711081655671074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5655711081655671074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5655711081655671074'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/04/aspnet-master-pages-and-titles.html' title='ASP.NET Master Page Title'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-2508288652349555988</id><published>2007-03-21T13:49:00.001-04:00</published><updated>2009-06-03T22:16:33.664-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><title type='text'>Visual Studio Find using RegEx</title><content type='html'>Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargh!&lt;br /&gt;&lt;br /&gt;Why couldn't Microsoft make the regex search use some existing regex dialect? Maybe they did (randomly!) pick one, but &lt;span style="font-weight: bold;"&gt;it's not the regex dialect they use in the .NET Framework&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I admit to always finding another way when faced with searching for something like the following lines (which happens to be a task for me today), but I'm keen to do it more easily:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;PROCEDURE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PROCEDURE &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So using Microsoft's VS.NET syntax, it's this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;     ^create:Zs+procedure&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's good to know: &lt;span style="font-weight:bold;"&gt;:Zs is a SPACE&lt;/span&gt;, and &lt;span style="font-weight:bold;"&gt;:Zs+ is ONE OR MORE SPACES&lt;/span&gt;. And if I want to find these:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;&amp;nbsp;TABLE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FUNCTION&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     CREATE&amp;nbsp;VIEW&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;     ^create:Zs+:w&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So &lt;span style="font-weight:bold;"&gt;:Zs+:w is ONE OR MORE SPACES FOLLOWED BY A WORD&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;And I'm going to refer back to this post because I won't remember this two months from now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-2508288652349555988?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/2508288652349555988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=2508288652349555988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2508288652349555988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/2508288652349555988'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/visual-studio-find-using-regex.html' title='Visual Studio Find using RegEx'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4730127365588731683</id><published>2007-03-14T14:38:00.000-04:00</published><updated>2007-03-14T15:03:39.318-04:00</updated><title type='text'>Durable Information</title><content type='html'>Email is a wonderful way to communicate. I keep in touch with people I would have long ago neglected because of it. It's almost free. It's fast. It's super convenient. It's flexible, and allows me to send not just my words, but pictures, files, links and even viruses if I'm irresponsible. It's fairly private, and can be totally secure if I choose the right provider and tools. OK, spam is a nightmare, but more or less, email is a great thing for communicating.&lt;br /&gt;&lt;br /&gt;Unfortunately, email doesn't cut it for storing &lt;span style="font-weight: bold; font-style: italic;"&gt;information that is durable&lt;/span&gt;, a phrase that I'm sort of adopting or making up for the context of this post. By durable I mean the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It needs to be found later by someone other than the email sender or recipient&lt;/li&gt;&lt;li&gt;It constitutes a record of a decision or other important information that is of interest to a group outside of the email sender or recipient&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is "owned" by someone other than the email sender or recipient.&lt;/li&gt;&lt;/ul&gt;So rather than elaborating on these cryptic bullet points, here's an example...&lt;br /&gt;&lt;br /&gt;I work on a small software project (I am the sole developer) for a client of my employer. The client and I communicate frequently about the state of project tasks, why certain things aren't meeting his needs, etc. This goes on over the course of one "release" of the project, or about six weeks. He emails me, I respond, he responds, etc. Then I find a problem, I fire off a message, he ignores it, we revisit it a month later without remembering much about it... and on and on.&lt;br /&gt;&lt;br /&gt;This is typical small company project management, which is to say, it's not being managed. The only way to get a complete picture of what was decided, how it was interpreted, what is left to do, how to login to the FTP server -- whatever -- is to sift through and piece together artifacts from the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My inbox&lt;/li&gt;&lt;li&gt;My sent items&lt;/li&gt;&lt;li&gt;The client's inbox&lt;/li&gt;&lt;li&gt;The client's sent items&lt;/li&gt;&lt;li&gt;Our IM logs&lt;/li&gt;&lt;li&gt;Some documents squirreled away on my company's network&lt;/li&gt;&lt;li&gt;His [My Documents] folder&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;The basic question when people default to blasting emails to think they are communicating effectively is this: &lt;span style="font-weight: bold;"&gt;Who OWNS THE INFORMATION? &lt;/span&gt;I would say the client and my company own the information, not me. So why would I think just leaving it in my inbox is appropriate?&lt;br /&gt;&lt;br /&gt;Yes, my company owns my inbox, but that is not the point. The issue is how to reduce the friction created by my laziness. That my company owns the information that I am mismanaging means I am obligated to store these bits of decisions and communications in such a way that it can be found. Found by my managers, auditors, the next developer who takes on this project after I'm on another, the client, QA people so they can tweak a test plan et. al.&lt;br /&gt;&lt;br /&gt;At the very least, emails should be saved off to a public folder. This is a pain, however. A good project management tool (such as &lt;a href="http://www.basecamphq.com/"&gt;basecamp&lt;/a&gt;) is much preferred for aggregating this type of communication and preserving it. Email should be used for notification or quick comments. Anything more long-lived than spur-of-the-moment has to be put somewhere else. Then it can be searched, prioritized, validated, transferred and generally managed. Durable information, not fleeing bits of conversation scattered across multiple inboxes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4730127365588731683?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4730127365588731683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4730127365588731683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4730127365588731683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4730127365588731683'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/durable-information.html' title='Durable Information'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-5377931228930701338</id><published>2007-03-13T13:16:00.000-04:00</published><updated>2007-03-13T20:57:14.433-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Harder to Type, Easier to Maintain</title><content type='html'>One of my favorite software books, &lt;a href="http://www.construx.com/Page.aspx?hid=535"&gt;Steve McConnell&lt;/a&gt;&lt;a href="http://www.construx.com/Page.aspx?hid=535"&gt;'s&lt;/a&gt; &lt;a href="http://www.amazon.com/Complete-Microsoft-Programming-Steve-McConnell/dp/1556154844"&gt;Code Complete&lt;/a&gt;, rails against hard-coded strings because they make an application difficult to maintain. At "typing time," it's the easiest and quickest way to do things. Thereafter, though, you've created a debt that you will pay down for the life of a project.&lt;br /&gt;&lt;br /&gt;When we work with DataSets, DataTables and other means of packaging data, it is hard to avoid littering code with literal strings that represent column names. This is not helped by our tools -- how hard would it have been for Microsoft to expose an &lt;a href="http://en.wikipedia.org/wiki/Enumerated_type"&gt;enum&lt;/a&gt; for column names from a &lt;a href="http://msdn2.microsoft.com/en-us/system.data.datatable.aspx"&gt;DataTable&lt;/a&gt; object in a generated typed &lt;a href="http://msdn2.microsoft.com/en-us/system.data.dataset.aspx"&gt;DataSet&lt;/a&gt;? (And why is "&lt;span style="font-style: italic;"&gt;strongly-typed DataSet&lt;/span&gt;" preferred over &lt;span style="font-style: italic;"&gt;"typed DataSet&lt;/span&gt;"?)&lt;br /&gt;&lt;br /&gt;Several years ago, when I first started using .NET, I created an database column enum and constants generator. Point it to a database and let it generate enums or constants (in C# or VB.NET) for every table and view, or pick the ones you want. It's part of the suite of tools I use to create the data layer and business layer in my applications.&lt;br /&gt;&lt;br /&gt;It's a simple thing. So instead of writing code like this:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20         dRow[\cf13 "LastName"\cf0 ] = \cf13 "Smith"\cf0 ;\par ??        dRow[\cf13 "FirstName"\cf0 ] = \cf13 "Bob"\cf0 ;} --&gt; &lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;   30&lt;/span&gt;&lt;span style="font-size:85%;"&gt;         dRow[&lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"LastName"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;] = &lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"Smith"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;   31&lt;/span&gt;&lt;span style="font-size:85%;"&gt;         dRow[&lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"FirstName"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;] = &lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"Bob"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;br /&gt;I can write it like this:&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20         dRow[\cf13 "LastName"\cf0 ] = \cf13 "Smith"\cf0 ;\par ??        dRow[\cf13 "FirstName"\cf0 ] = \cf13 "Bob"\cf0 ;} --&gt; &lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20         dRow[CustomerColumn.LastName] = \cf13 "Smith"\cf0 ;\par ??        dRow[CustomerColumn.FirstName] = \cf13 "Bob"\cf0 ;\par ??} --&gt; &lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;   30&lt;/span&gt;&lt;span style="font-size:85%;"&gt;         dRow[CustomerColumn.LastName] = &lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"Smith"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);font-size:85%;" &gt;   31&lt;/span&gt;&lt;span style="font-size:85%;"&gt;         dRow[CustomerColumn.FirstName] = &lt;/span&gt;&lt;span style=";font-size:85%;color:maroon;"  &gt;"Bob"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;br /&gt;A typical application is going to have references to columns in many places:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Assigning values to columns&lt;/li&gt;&lt;li&gt;Persisting data&lt;/li&gt;&lt;li&gt;Filtering (using the DataTable's &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;.Select&lt;/span&gt;&lt;/span&gt; method or a DataView's &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;.RowFilter&lt;/span&gt;&lt;/span&gt; property)&lt;/li&gt;&lt;li&gt;Sorting&lt;/li&gt;&lt;li&gt;Ad-hoc querying&lt;/li&gt;&lt;li&gt;Data binding and other tasks above in the designer for a form or web control&lt;/li&gt;&lt;/ul&gt;Aside from the visual designer code, giving up hard-coded strings for enums or constants is a very small change to make. &lt;del&gt;If&lt;/del&gt; When your database schema changes, just regenerate the source file for the enums/constants and fix up your code. &lt;span style="font-weight: bold; font-style: italic;"&gt;Most changes will now break the application at compile time&lt;/span&gt;,&lt;span style="font-weight: bold; font-style: italic;"&gt; not run time&lt;/span&gt;. This makes it trivial to identify and fix these issues. A large application with thousands of references and many developers just cannot be maintained with hard-coded strings for column names. &lt;span style="font-weight: bold; font-style: italic;"&gt;Catching these errors at run time requires 100% code coverage, and happens way too far downstream to NOT lose you money&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;GridViews and other designer-based code may still be a chore, but you're not making things worse because that's how they are whether or not the rest of your source code has hard-coded values.&lt;br /&gt;&lt;br /&gt;Does "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;LastName&lt;/span&gt;&lt;/span&gt;" look nicer than &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;CustomerColumn.LastName&lt;/span&gt;&lt;/span&gt;? Probably. Is "&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;LastName&lt;/span&gt;&lt;/span&gt;" easier to type? I'd say so. But it creates a mess, one that too many developers are keen to accept, unfortunately. Keep in mind, what I'm talking about here is for developers who haven't adopted &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;object relational mapping&lt;/a&gt; or other means of encapsulating and abstracting object data. If you're still using DataSets and DataTables, you need to consider the &lt;span style="font-weight: bold;"&gt;friction &lt;/span&gt;your are accepting by hard-coding string column names, primary keys, default values, filters and so forth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5377931228930701338?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5377931228930701338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5377931228930701338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5377931228930701338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5377931228930701338'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/harder-to-type-easier-to-maintain.html' title='Harder to Type, Easier to Maintain'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8650768580340798337</id><published>2007-03-12T07:37:00.000-04:00</published><updated>2007-03-13T09:13:49.843-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Agile FUD</title><content type='html'>Why do some people argue as though "agile" is some grand methodology, a prescribed process, comes with a big book and a two week training course and has a rigid set of mantras? It doesn't as best I can tell. I have adopted some agile practices in my daily routine, such as unit testing (though not TDD as of now), intensive refactoring, simple and frequent communication and continuous integration. There are a lot of agile practices that I do not have the expertise to try right now, or the right projects to try them on or the right team to try them with. I am basically fitting what I can into my current environment, reading all I can and reexamining every month or so to identify what else I can apply or do differently.&lt;br /&gt;&lt;br /&gt;I think this is the whole point of agile. That is, there is no one prescribed way. Rather, there are principles or fundamentals, and the practices reflect these in a sort of toolbox approach. And above all, the personnel involved are intelligent and experienced enough to use these things to improve how they create software and in turn improve the software they create.&lt;br /&gt;&lt;br /&gt;For example, sometimes we have projects that are remediation types of engagements. In other words, we are hired to fix something and it may last for a month. Can I do TDD? Should I set up a continuous integration server? It depends. I have enough experience to know which tools to apply to solve this problem.&lt;br /&gt;&lt;br /&gt;So when I read &lt;a href="http://www.secretgeek.net/agile_v_tdd.asp"&gt;something like this&lt;/a&gt; that portrays agile as some all-or-nothing "methodology," it makes me wonder first, if people like this are using some prescribed methodology already or instead have none whatsoever, and second, if they aren't just looking for a way to bash these ideas by portraying them as something they are not. That post at &lt;a href="http://www.secretgeek.com/"&gt;secretgeek&lt;/a&gt; makes it sound as though agile is loaded with ideas that contradict each other. I don't think this is the gist at all.&lt;br /&gt;&lt;br /&gt;One tool from the toolbox that has had a huge impact on how I write code is designing for testability. This is one of the first things I consider when creating any code. It forces me to think about:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How to structure the solution in Visual Studio .NET&lt;/span&gt;. I always create a "&lt;namespace&gt;.Tests" project in addition to the main project (it used to be ".Test" until one of the versions of the &lt;/namespace&gt;Test Driven .NET add-in for VS.NET &lt;namespace&gt;caused problems in projects named this way). Instead of creating some goofy form to drive my tests and therefore requiring me to manually test each time I make changes, all of my public methods can be launched through my unit tests. Right-click, Run Tests. Low stress. This is pretty standard stuff.&lt;br /&gt;&lt;/namespace&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How to design a class&lt;/span&gt;. When thinking about how to test it, you must immediately consider what the constructor does, how to initialize state, whether a static class is a good idea for the scenario, etc. Having to change these things later puts you into a much more defensive mentality, where you feel like you are constantly catching up and rethinking very basic design decisions. Again, pretty standard. Thinking about testing forces better design decisions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How to design its interface&lt;/span&gt;. When you know how your class can be used (i.e., because you thought about "exercising" it with unit tests at the outset), your &lt;a href="http://en.wikipedia.org/wiki/Interface_%28computer_science%29"&gt;interfaces&lt;/a&gt; are much cleaner and more consistent throughout a project.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How and where to initialize and destroy resources&lt;/span&gt;. Basic stuff, but again, having to tweak things later can be annoying, and being inconsistent has subtle implications for &lt;a href="http://en.wikipedia.org/wiki/Robustness"&gt;robustness&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Where to stash configuration information so that it is accessible in a very flexible way&lt;/span&gt;. Does the class need a SqlConnection? How do you provide it? Do you have different databases for development, testing, staging, performance testing and production? Instead of cluttering the class with code that accepts these, is it better to make it config-based? If you do, your ".Tests" project needs to be defined a certain way with its own config file, etc...&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;How NUnit can automatically run my unit tests to help me control regression&lt;/span&gt;. Now that you've thought through these other things, everything is set up to do this. You can make changes and perform major refactoring at will and know what the health of your application is.&lt;/li&gt;&lt;/ul&gt;The principle here is that these things enable me to set up my project to accommodate change and ensure quality is built in from the start of the project. That's the fundamental requirement to doing these things.&lt;br /&gt;&lt;br /&gt;Pretty standard stuff. I am amazed that it's still not universal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8650768580340798337?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8650768580340798337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8650768580340798337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8650768580340798337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8650768580340798337'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/agile-fud.html' title='Agile FUD'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-3269447060578126198</id><published>2007-03-09T11:20:00.001-05:00</published><updated>2009-06-03T22:17:16.771-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>ASP.NET 2.0 DataBinding Redux</title><content type='html'>In a &lt;a href="http://jutherman.blogspot.com/2007/02/aspnet-objectdatasource-and-business.html"&gt;previous post&lt;/a&gt; I mentioned my skepticism about using ObjectDataSource to bind business objects in ASP.NET 2.0. My desire to "implement some well-defined interfaces in our business objects and just have this stuff work" is touched on by the &lt;a href="http://www.entityspaces.net/blog/MicrosoftRuinedDataBindingInASPNET20WhenTheyDroppedComponentSupportFromTheDesignSurface.aspx"&gt;EntitySpaces&lt;/a&gt; guys, but it's more than just what I mentioned and it's touched a nerve.&lt;br /&gt;&lt;br /&gt;I think the musings that Microsoft may have yanked what support there was for design-time data binding in 2.0 in order to develop their own ORM functionality in ADO.NET v.next is likely correct. Just like Sandcastle-NDoc, Team System-NUnit-NAnt and the other things &lt;a href="http://jutherman.blogspot.com/2006/12/open-source-vs-microsoft.html"&gt;I mentioned previously&lt;/a&gt;, it seems Microsoft is going to go their own way and quash a good portion of the open source efforts to build on their tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-3269447060578126198?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/3269447060578126198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=3269447060578126198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3269447060578126198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/3269447060578126198'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/aspnet-20-databinding-redux.html' title='ASP.NET 2.0 DataBinding Redux'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-7375947805697284891</id><published>2007-03-09T10:03:00.000-05:00</published><updated>2007-03-09T10:21:38.942-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='versioning'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>SQL 2005 Script Files and VSS</title><content type='html'>Using Microsoft Visual SourceSafe 6.x and Microsoft SQL Server Management Studio (for SQL Server 2005) is a bit of a pain for scripting database changes. One problem is if you don't save the script file as ANSI, VSS cannot use its diff feature to show you the results. It will simply say, "Binary files differ." You need to save it as ANSI, since that's all VSS 6.x supports for visual diffs.&lt;br /&gt;&lt;br /&gt;To save your .sql files as ANSI:&lt;ul&gt;&lt;li&gt;Instead of just clicking the Save button, select File | Save As...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_U8FDkosc-vc/RfF4FstP18I/AAAAAAAAAAM/Fs-LbhnSE90/s1600-h/sql05_saveas.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_U8FDkosc-vc/RfF4FstP18I/AAAAAAAAAAM/Fs-LbhnSE90/s320/sql05_saveas.JPG" alt="" id="BLOGGER_PHOTO_ID_5039941497299916738" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Click the little arrow on the Save button and choose Save with Encoding...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_U8FDkosc-vc/RfF6IMtP2BI/AAAAAAAAAA0/ajGIzKPX2SU/s1600-h/sql05_saveencoding.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_U8FDkosc-vc/RfF6IMtP2BI/AAAAAAAAAA0/ajGIzKPX2SU/s400/sql05_saveencoding.JPG" alt="" id="BLOGGER_PHOTO_ID_5039943739272845330" border="0" /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Select the encoding and the line options, then click OK.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_U8FDkosc-vc/RfF5BctP1-I/AAAAAAAAAAc/SS8Jgj0lu44/s1600-h/sql05_saveasfinal.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_U8FDkosc-vc/RfF5BctP1-I/AAAAAAAAAAc/SS8Jgj0lu44/s320/sql05_saveasfinal.JPG" alt="" id="BLOGGER_PHOTO_ID_5039942523797100514" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Then you can check the .sql file into VSS. Subsequent edits will &lt;span style="font-weight: bold; font-style: italic;"&gt;not &lt;/span&gt;require you to go through all of these dialogs to properly save the file. Management Studio will use the file's current encoding and line break settings thereafter, so you can just (thankfully) click Save.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-7375947805697284891?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/7375947805697284891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=7375947805697284891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/7375947805697284891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/7375947805697284891'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/sql-2005-script-files-and-vss.html' title='SQL 2005 Script Files and VSS'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_U8FDkosc-vc/RfF4FstP18I/AAAAAAAAAAM/Fs-LbhnSE90/s72-c/sql05_saveas.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-1406202752102897138</id><published>2007-03-08T22:06:00.000-05:00</published><updated>2007-03-08T22:20:27.832-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>RFPs</title><content type='html'>Interesting take on RFPs at &lt;a href="http://www.airbagindustries.com/archives/airbag/scope.php"&gt;airbag&lt;/a&gt;. We have been occupied with some proposals recently, and I have to agree this is rarely a very fruitful way to land new business. So many of these RFPs are really for one or more of the following purposes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The company sending it out can satisfy some requirement that they found a consultant in a competitive manner&lt;/li&gt;&lt;li&gt;They've already found a consultant and need to appear that they did it in a competitive manner&lt;/li&gt;&lt;li&gt;They are looking for the lowest cost bidder and that is their top priority&lt;/li&gt;&lt;li&gt;They are not clear about what they want and are soliciting ideas through the RFP process.&lt;/li&gt;&lt;/ul&gt; The last point is actually positive, in my opinion. If you work for a consulting firm who has the capability that they are seeking, at least generally, the RFP can open the door for a dialog. If you are sharp and experienced, you can put some good ideas on their table. Responding to an RFP without having that dialog is rarely productive.&lt;br /&gt;&lt;br /&gt;Some of the comments to the airbag post really hit home:&lt;br /&gt;&lt;blockquote&gt;"The problem is rarely defined and the client usually has a vendor and solution already in mind."&lt;br /&gt;&lt;br /&gt;"They take a lot of time, you only have a marginal chance of winning the work. It really just drives your overhead up with a lot of non-billable work, making the clients that didn't send you a RFP essentially pay more."&lt;br /&gt;&lt;br /&gt;"The traditional RFP process is damn near a no-win situation for us. We ran the numbers and we've got a horrible track record when it comes to winning work of an RFP. Given the time it takes to address them (much more than other ways of bringing work in) we've realized that RFPs aren't really something we should be spending a whole lot of time on."&lt;br /&gt;&lt;br /&gt;"Submitting a "proposal" of any sorts before there's been any communication is akin to ordering a bride online. It may work for some people but it's unlikely they'll have a relationship that'll last. Too much room for misunderstandings and miscommunications."&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-1406202752102897138?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/1406202752102897138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=1406202752102897138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/1406202752102897138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/1406202752102897138'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/rfps.html' title='RFPs'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-8267553317158810960</id><published>2007-03-06T12:40:00.000-05:00</published><updated>2007-03-06T13:01:56.181-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Software Design's Dirty Little Secret</title><content type='html'>We spend a lot of time wringing our hands about how to do a better job gathering requirements. I think &lt;a href="http://www.designobserver.com/archives/017485.html"&gt;this bit&lt;/a&gt; reflects a very common scenario in how we convince clients that we're experts, and how things really end up going. We put forth some process or methodology that sounds impressive, like it's really going to squeeze every bit of uncertainty out of the project as early as possible and lead us down a clean, straight trail to the solution. Utter crap, yet we continue to push it because &lt;span style="font-style: italic;"&gt;that is what clients demand we tell them&lt;/span&gt;. So the &lt;a href="http://www.designobserver.com/"&gt;Design Observer&lt;/a&gt; lets us in on a version of the dirty little secret, one that applies in good part to software design as well:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;When I do a design project, I begin by listening carefully to you as you talk about your problem and read whatever background material I can find that relates to the issues you face. If you’re lucky, I have also accidentally acquired some firsthand experience with your situation. Somewhere along the way an idea for the design pops into my head from out of the blue. I can’t really explain that part; it’s like magic. Sometimes it even happens before you have a chance to tell me that much about your problem! Now, if it’s a good idea, I try to figure out some strategic justification for the solution so I can explain it to you without relying on good taste you may or may not have. Along the way, I may add some other ideas, either because you made me agree to do so at the outset, or because I’m not sure of the first idea. At any rate, in the earlier phases hopefully I will have gained your trust so that by this point you’re inclined to take my advice. I don’t have any clue how you’d go about proving that my advice is any good except that other people — at least the ones I’ve told you about — have taken my advice in the past and prospered. In other words, could you just sort of, you know...trust me?&lt;/span&gt;&lt;/blockquote&gt;So, is that how it really goes? Well, most of the time, it sort of goes that way. It has to. If custom software development were not so nebulous and prone to reexamination and modification at every step, it wouldn't be custom software. In other words, you would instead solve your well-defined problem by going to CompUSA and buying a solution for $79.99. The next alternative would be to modify your problem so it could be solved by the $79.99 solution. Some people do just that, and successfully. Using Microsoft Excel is a good example. It's probably the most widely used database application on the planet, though it was never intended to be a database.&lt;br /&gt;&lt;br /&gt;If you want truly custom software to help manage a truly unique problem (and lots of people have such a need), you should know what it takes. &lt;span style="font-weight: bold; font-style: italic;"&gt;Creativity&lt;/span&gt;. A &lt;span style="font-style: italic;"&gt;prescribed process&lt;/span&gt; can't get you 100% of the way there. You must be willing to accept at least a good portion of the process to be &lt;a href="http://en.wikipedia.org/wiki/Empirical"&gt;&lt;span style="font-style: italic;"&gt;empirical&lt;/span&gt;&lt;/a&gt;. That means it's not clean, it's not predictable and it's not going to make you comfortable.&lt;br /&gt;&lt;br /&gt;When a prospective consulting firm approaches you and claims they have a neat, linear, sequential process that they have proven over countless years, they are setting your expectations in such a way that you are likely to be frustrated. In other words, they are partially to completely full of crap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-8267553317158810960?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/8267553317158810960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=8267553317158810960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8267553317158810960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/8267553317158810960'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/03/software-designs-dirty-little-secret.html' title='Software Design&apos;s Dirty Little Secret'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-4639252083559177203</id><published>2007-02-27T07:09:00.000-05:00</published><updated>2007-02-27T07:53:16.644-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><title type='text'>Software Architecture - Why it Matters</title><content type='html'>I have worked with a few people over the years whom I would describe as the "just get it done and soon" type. These guys (these few have all been men) eschew putting much thought into the software they build, or thinking about &lt;a href="http://en.wikipedia.org/wiki/Kaizen"&gt;kaizen&lt;/a&gt; or continuous improvement. Working with them is frustrating because they tend to create systems that are better torn down than modified. In other words, thanks to their myopia and/or hubris (to the sales manager: "sure, we can do that in two weeks!"), the software they build has massive design debt and huge costs to maintain. (I am not going to get into the other extreme right now -- the guys who suffer from analysis paralysis -- but that, too, can be a big yet much different problem...)&lt;br /&gt;&lt;br /&gt;The well known benefits of good design are written about throughout the software development world. But the one benefit that may be most important is this: &lt;span style="font-weight: bold;"&gt;good software architecture is&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;motivational&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Working for a company that supports thoughtful software design ignites pride. Having people at all levels of a company that understand what good architecture is makes this possible. For me personally, it is a rush knowing that everyone from developers on my team to the CEO understands that this philosophy contributes to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A positive perception of our product&lt;/li&gt;&lt;li&gt;Motivation among the team, and&lt;/li&gt;&lt;li&gt;Increased profitability.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Motivation and internal pride glue together the customer satisfaction and financial sides of the business. &lt;span style="font-weight: bold;"&gt;Good software architecture is necessary to have a successful software business&lt;/span&gt;. Customer satisfaction and long term financial health are keys to "success," in my opinion. That's not all that defines success, but for me those two things are required.&lt;br /&gt;&lt;br /&gt;I have seen the architecture weenies that get so bogged down in design issues that they make slow and pained progress. However, that is usually when they are in an organization that is unbalanced and indulges them because it lacks good business people. It is more often, in my experience, that the siren song of "just get it done now, it's good enough" can influence people in almost any organization, and is therefore more dangerous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-4639252083559177203?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/4639252083559177203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=4639252083559177203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4639252083559177203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/4639252083559177203'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/software-architecture-why-it-matters.html' title='Software Architecture - Why it Matters'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-5869139599185742349</id><published>2007-02-26T07:49:00.000-05:00</published><updated>2007-02-26T07:50:31.123-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Adding Google Maps to your Site</title><content type='html'>Good &lt;a href="http://www.hanselman.com/blog/GoogleGuestMap2007AndAddingGoogleMapsToYourSite.aspx"&gt;post&lt;/a&gt; (yet another) from Scott Hanselman.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-5869139599185742349?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.hanselman.com/blog/GoogleGuestMap2007AndAddingGoogleMapsToYourSite.aspx' title='Adding Google Maps to your Site'/><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/5869139599185742349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=5869139599185742349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5869139599185742349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/5869139599185742349'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/adding-google-maps-to-your-site.html' title='Adding Google Maps to your Site'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-7191715653784847580</id><published>2007-02-23T13:14:00.001-05:00</published><updated>2009-06-03T22:14:52.670-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>OpenDNS</title><content type='html'>Scott Hanselman has a great &lt;a href="http://www.hanselman.com/blog/OpenDNS.aspx"&gt;post&lt;/a&gt; about &lt;a href="http://www.opendns.com/"&gt;OpenDNS&lt;/a&gt; which goes beyond what I know about it. However, a couple weeks ago I began using it due to frustrating issues with my ISP, and I think it's a good alternative to know about.&lt;br /&gt;&lt;br /&gt;I live in an area that technological time has largely ignored. I like it that way except for needing seriously fast internet access. For the first year and a half, I used (and will not put a hyperlink to) Direcway, or HughesNet as they are now called. A satellite ISP. It was better than dial-up, and that is all I can say about it without bashing it.&lt;br /&gt;&lt;br /&gt;Last summer I found out some of my neighbors used a local wireless ISP, which has several towers around the northern Shenandoah valley and will install an antenna for you to connect to its 802.11b access points. I am thirteen miles away from the nearest tower, but since I am 500 feet above the Shenandoah valley floor, I have a line of site to it. They hooked it up and it worked. It worked really well. The speed varies between 1mbs and 11mbs. A lot of the issues with satellite went away, such as weird timeouts with MS Outlook Web Access and the unholy bandwidth throttling (aka "Fair Access Policy"). Good riddance, satellite!&lt;br /&gt;&lt;br /&gt;All seemed good for a while, but then I started having occasional trouble connecting. My calls to their tech support would usually end up with them saying, "we can ping your antenna, why don't you power it off and back up." Often that fixed the problem, but not always. Usually after some time things would work again. But I was getting really peeved with the lack of reliability.&lt;br /&gt;&lt;br /&gt;I noticed one day that when opening a new tab in &lt;a href="http://www.mozilla.com/firefox"&gt;Firefox&lt;/a&gt; and experiencing the connection problems, some of my other tabs would still connect to their respective URLs. That made me think that this must be a DNS problem on my ISP's end.&lt;br /&gt;&lt;br /&gt;I stumbled across OpenDNS in a podcast I was listening to (something from &lt;a href="http://www.itconversations.com/"&gt;ITConversations&lt;/a&gt;, can't remember which podcast right now though). I modified my router's DNS configuration to use OpenDNS's servers instead of my ISP's. That was almost a month ago and my "connectivity" problems have not occurred since. So +1 for OpenDNS, and thanks to Scott for a lot more helpful info about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-7191715653784847580?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/7191715653784847580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=7191715653784847580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/7191715653784847580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/7191715653784847580'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/opendns.html' title='OpenDNS'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10441002.post-6811974974791196397</id><published>2007-02-18T06:20:00.001-05:00</published><updated>2009-06-03T22:21:33.769-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>ASP.NET ObjectDataSource and Business Objects</title><content type='html'>This past Friday's &lt;a href="http://msdn.microsoft.com/chats/"&gt;ASP.NET MVP Chat&lt;/a&gt; was very good, a lot of participation by well known experts. I learned a lot just sticking around reading both the experts' answers and the side banter.&lt;br /&gt;&lt;br /&gt;Anyway, one issue that has been bugging me is whether to use declarative data binding in ASP.NET 2.0. So I asked &lt;a href="http://weblogs.asp.net/scottgu/"&gt;Scott Guthrie&lt;/a&gt; if it was really a prime time thing or just something to "give good demo." He and &lt;a href="http://www.4guysfromrolla.com/"&gt;Scott Mitchell&lt;/a&gt; both suggested it's the way to go, so I poked around and found the following:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.asp.net/learn/dataaccess/default.aspx?t%20abid=63"&gt;ASP.NET 2.0 Data Tutorials&lt;/a&gt;&lt;br /&gt;&lt;a href="http://peterkellner.net/2006/09/18/expressionbuilderidentity/"&gt;Peter Kellner's SQLDataSource Comments&lt;/a&gt;&lt;br /&gt;&lt;a href="http://codebetter.com/blogs/brendan.tompkins/archive/2006/05/11/144539.aspx"&gt;Brendan Tompkins ObjectDataSource/GridView Experience&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/aspnet/DataTableAdapter.asp"&gt;DataTableAdapter Article at CodeProject&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lhotka.net/WeBlog/PermaLink.aspx?guid=c3293240-88c8-4f03-b4e3-01cef6ed1304"&gt;Rocky Lhotka's ObjectDataSource Frustration&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am not liking what I see.&lt;br /&gt;&lt;br /&gt;The gist of all this seems to be that the ASP.NET 2.0 data binding controls are fine for ADO.NET data objects, but when you have custom business objects, a lot of coding jujitsu may be required. In other words, not only are you &lt;span style="font-style: italic;"&gt;not &lt;/span&gt;saving time because you have to code a fair bit to make things like sorting and filtering work, but you are taking a leap of faith that the magic stuff being done for you behind the scenes is going to just work. The posts on the ASP.NET forums indicate a lot of issues that may consume quite a bit of time to debug. Again, it seems like for ADO.NET data objects, it works mostly, but for custom business objects, the jury is out.&lt;br /&gt;&lt;br /&gt;Peter Kellner's experience (above) is another twist. To use SqlDataSource when a query requires filtering based on the current user id (a pretty common requirement), he documents a somewhat arcane technique to get this to work declaratively. That's cool, but now we're creating more "maintenance debt," and I'm left wondering what else is lurking to trip me up if I go down this recommended path.&lt;br /&gt;&lt;br /&gt;We really should be able to implement some well-defined interfaces in our business objects and just have this stuff work. That has to be the best approach, and I have to think this is very close to being possible right now. I am going to check this out a bit more before I give up and go back to "DataSource = " and "DataBind()" and other trusted but monotonous ways.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10441002-6811974974791196397?l=blog.davidjuth.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.davidjuth.com/feeds/6811974974791196397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10441002&amp;postID=6811974974791196397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6811974974791196397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10441002/posts/default/6811974974791196397'/><link rel='alternate' type='text/html' href='http://blog.davidjuth.com/2007/02/aspnet-objectdatasource-and-business.html' title='ASP.NET ObjectDataSource and Business Objects'/><author><name>D.</name><uri>http://www.blogger.com/profile/14357681633250496039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
