<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>The Runtime.com</title><link>http://www.theruntime.com/blogs/MainFeed.aspx</link><description>.NET by Subtext</description><generator>Subtext Version 1.9.5.0</generator><item><title>Trustworthy Languages</title><link>http://theruntime.com/blogs/devprime/archive/2008/10/10/trustworthy-languages.aspx</link><pubDate>Fri, 10 Oct 2008 07:43:52 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/devprime/archive/2008/10/10/trustworthy-languages.aspx</guid><wfw:comment>http://theruntime.com/blogs/devprime/comments/2693.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/devprime/comments/commentRss/2693.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/devprime/archive/2008/10/10/trustworthy-languages.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://theruntime.com/blogs/devprime/services/trackbacks/2693.aspx</trackback:ping><source url="http://theruntime.com/blogs/devprime/rss.aspx">Trustworthy Languages</source><description>&lt;p&gt;I was emailing with a VS languages team member yesterday, and asked him why he wrote a piece of code a certain way (just some sample snippet that he used to illustrate an idea in the email thread). He responded that he normally codes day-to-day in C++, and generally distrusts the language, so he tries to be as explicit as possible.&lt;/p&gt;
&lt;p&gt;And that got me thinking about the concept of trustworthy languages.&lt;/p&gt;
&lt;p&gt;It seems like sometimes we're so focused on the addition features related to many other engineering aspects and goals, that we normally don't ask the question: "at the end of the day, do you trust this language?" Before we can really answer that, it's important to understand why wouldn't you trust a language. I think some factors are:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;The interpreter/compiler generates logic that is counter-intuitive. This is often the case when the language tries to do the thinking for you, and allows you to skip being explicit by providing some default behavior if you don't supply specifics. The problem occurs when the compiler (by default) does something you don't expect, therefore causing unforseen runtime behavior or errors. &lt;/li&gt;
    &lt;li&gt;The language implicitly resolves/casts/converts types, even when it's not "safe". For example, what will the code actually excute given   var X = "100" + 4? Will the results be "1004" or 104 or NAN? This of course, is an easy example, but in more complex logic, the type resolutions can really bite you in unexpected ways. This is also a problem with languages that play fast and loose with pointers. In this category, I'd place most scripting languages like Javascript, as well as VB with Option Strict OFF, and also C. In this respect, languages like Java, C#, and VB with Option Strict ON do pretty well. &lt;/li&gt;
    &lt;li&gt;The language supports inheritance and OOP, but the rules of member resolution aren't clear. For example, let's say that you have a base class that defines a member, and you redefine it three subclasses later. Will the new member shadow the base class member, or replace it? "Good" languages force you to specify, but "bad" languages just allow you to define members however you want, and the compiler or runtime will decide what to do later. Or even better, what happens if you have multiple inheritance and inherit 2 base classes, each of which contain a member with the same name and arguments? Similarly speaking, what if you can, on top of all this other stuff, create AOP-style mix-in kinds of members? If a mix-in member clashes with a base-class member, who wins? &lt;/li&gt;
    &lt;li&gt;The code just crashes... a lot... for no apparent reason (*cough*ActionScript*cough*) &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This doesn't mean that languages can't have default unspecified behavior, but does mean that languages should be consistent and intuitive when doing default, unspecified things. And if people can't agree on the correct behavior, then it's not intuitive, therefore, untrustworthy. The more consistent and intuitive the results, the more the programmer will trust the compiler with decision making.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/devprime/aggbug/2693.aspx" width="1" height="1" /&gt;</description><dc:creator>DevPrime</dc:creator></item><item><title>Tampa User eXperience (TUX) - 10-8-2008 - Agenda</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/10/06/tampa-user-experience-tux---10-8-2008---agenda.aspx</link><pubDate>Mon, 06 Oct 2008 13:07:15 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/10/06/tampa-user-experience-tux---10-8-2008---agenda.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2692.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2692.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/10/06/tampa-user-experience-tux---10-8-2008---agenda.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2692.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Tampa User eXperience (TUX) - 10-8-2008 - Agenda</source><description>&lt;p&gt;This Wednesday, we are having our second TUX meeting! Bill Reiss will be doing a talk on Silverlight2 (with a little more design emphasis than my JavaScript talk last month). We are addressing some of the things raised in the survey (and haven’t addressed them all yet). In light of this new format we will also be introducing some smaller talks along with the main speaker. &lt;/p&gt;  &lt;p&gt;So here’s the agenda:&lt;/p&gt;  &lt;p&gt;- Arrive between 6:30 and 7:00pm, for a social time and with food (thank you, TekSystems)&lt;/p&gt;  &lt;p&gt;- Welcome by me and introduction of TekSystems (who is buying our food) - 5 minutes&lt;/p&gt;  &lt;p&gt;- Group Business (I know this is only the 2nd meeting but we do have some business that needs to be taken care of) - 5 minutes&lt;/p&gt;  &lt;p&gt;- First of our "short" talks: &lt;a href="http://theruntime.com/blogs/danastevens/Default.aspx"&gt;Dana Stevens&lt;/a&gt; (yep, the same guy who blogs with me at &lt;a href="http://www.theruntime.com/blogs/"&gt;TheRuntime.com&lt;/a&gt;) will be doing a short jQuery talk - 15 minutes&lt;/p&gt;  &lt;p&gt;- Shawn was supposed to do the other short talk, but he had to go out of town, so I’ll be filling in with a couple quick demos of some stuff I’ve found recently that I think are pretty cool (and are UX-related)... - in less than 10 minutes&lt;/p&gt;  &lt;p&gt;- &lt;a href="http://silverlightrocks.com/community/blogs/silverlight_games_101/default.aspx"&gt;Bill&lt;/a&gt; &lt;a href="http://www.bluerosegames.com/SilverlightBrassTacks/"&gt;Reiss&lt;/a&gt; (Silverlight guru/MVP and good guy) will be giving us an Intro to Silverlight2 (using both Visual Studio and Blend, so it’ll be designer-friendly as well as developer-friendly) - 1 hour &lt;/p&gt;  &lt;p&gt;BTW, afterwards we’ll have some kind of after the group meet and greet. I missed that some of you went to Starbucks last time, and instead I went with the group that went to BW3 (across the street).&lt;/p&gt;  &lt;p&gt;If you need info on how to get to where we meet (or additional info) check out the web site : &lt;a href="http://www.tampaux.org"&gt;http://www.tampaux.org&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2692.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Hiding and Showing Columns Based On a Parameter in Reporting Services</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/29/hiding-and-showing-columns-based-on-a-parameter-in-reporting.aspx</link><pubDate>Mon, 29 Sep 2008 02:34:37 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2008/09/29/hiding-and-showing-columns-based-on-a-parameter-in-reporting.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2691.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2691.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/29/hiding-and-showing-columns-based-on-a-parameter-in-reporting.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2691.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">Hiding and Showing Columns Based On a Parameter in Reporting Services</source><description>&lt;p&gt;Hiding and showing columns is simple in Reporting Services - each column has a "Visibility" property that can be set using an expression. The expression could be driven by a parameter, calculation or data and only needs to resolve to "True" or "False".&lt;/p&gt;
&lt;p&gt;One way I use to hide and show columns is allowing the user to select which columns to show using a multi-value parameter (to do this, you must be running at least Reporting Services 2005 which introduced multi-value parameters). Here's my method, step-by-step:&lt;/p&gt;
&lt;div style="PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px; PADDING-TOP: 5px; BACKGROUND-COLOR: #eeeeef"&gt;
&lt;p style="MARGIN-TOP: 0px"&gt;&lt;strong&gt;Step 1&lt;/strong&gt; is to set up the parameter. In the "Parameters" dialog, add a new parameter called "ColumnsToDisplay", type some values and labels in, and mark the parameter "Multi-value". Make sure your parameter does not accept Nulls or Blanks:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/4iQ9Nr7lSgaPlfJpIuTlYQ"&gt;&lt;img alt="" border="0" src="http://lh6.ggpht.com/thomasswilliams/SOBJsbwIvWI/AAAAAAAAAbg/oDAInGOWq9A/s288/hiding-showing-columns-september-2008-report-parameters.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; is to create a table with columns that can be hidden or shown:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/XtvxvX5O9SNv2fBjyeeVcw"&gt;&lt;img alt="" border="0" src="http://lh5.ggpht.com/thomasswilliams/SOBKYpmClNI/AAAAAAAAAbo/nJXNjC3MBVc/s288/hiding-showing-columns-september-2008-table.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The query behind the dataset is shown below:&lt;/p&gt;
&lt;p style="MARGIN: 10px"&gt;&lt;code&gt;SELECT 'Sales' AS Department, 'Established 1/Jan/2006' AS Column1, 'Located in Building A' AS Column2, 'Managed by Fred' AS Column3, '10 Staff' AS Column4 &lt;br /&gt;
UNION &lt;br /&gt;
SELECT 'Payroll', 'Established 4/Dec/2005', 'Located in Building S', 'Managed by Paul', '3 Staff (2 Part-Timers)' &lt;br /&gt;
UNION &lt;br /&gt;
SELECT 'IT', 'Established 9/Jun/2008', 'Located in Building S', 'Managed by Julie', '4 Staff' &lt;br /&gt;
UNION &lt;br /&gt;
SELECT 'Executive Office', 'Established 1/Sep/2006', 'Located in Building G', 'Managed by Colin', '2 Staff' &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; is to add a function called "IsColumnSelected" that accepts the multi-value parameter and a column name and returns a boolean value:&lt;/p&gt;
&lt;p style="MARGIN: 10px"&gt;&lt;code&gt;''' &amp;lt;summary&amp;gt;&lt;br /&gt;
''' Return whether the passed column name has been selected&lt;br /&gt;
''' in the multi-value parameter, whether it should be visible&lt;br /&gt;
''' or not.&lt;br /&gt;
''' &amp;lt;/summary&amp;gt;&lt;br /&gt;
Public Shared Function IsColumnSelected(ByRef objMultiValueParam() As Object, ByVal strColumnName As String) As Boolean&lt;br /&gt;
&lt;br /&gt;
    ' return whether the passed column name is in the multi-value&lt;br /&gt;
    ' parameter array&lt;br /&gt;
    Return 0 &amp;lt; InStr(vbNullChar &amp;amp; Join(objMultiValueParam, vbNullChar) &amp;amp; _ &lt;br /&gt;
        vbNullChar, vbNullChar &amp;amp; strColumnName &amp;amp; vbNullChar)&lt;br /&gt;
&lt;br /&gt;
End Function&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This function does the job of looking through the multi-value parameter (an object array) and returning whether the passed column name is in the array, without a loop. It's based on old VB tip at &lt;a href="http://www.devx.com/vb2themax/Tip/18364"&gt;http://www.devx.com/vb2themax/Tip/18364&lt;/a&gt; which uses the Visual Basic "Join" function to combine the array to a string, and then check if the passed column name is in the string. Simple, and it works for small amounts of data (like this sample).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt; hooks all the pieces together using an expression that needs to be put in each column's "Visibility" property which calls "IsColumnSelected". Put the expression below in the "Visibility" property of the first column:&lt;/p&gt;
&lt;p style="MARGIN: 10px"&gt;&lt;code&gt;=Not Code.IsColumnSelected(Parameters!ColumnsToDisplay.Value, "Column1")&lt;/code&gt;&lt;/p&gt;
&lt;p style="MARGIN-BOTTOM: 0px"&gt;This expression needs to be put in each column that needs to be hidden or shown, passing the correct column name as the second parameter.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;After doing this, you should have a basic method to hide or show columns based on a multi-value parameter in Reporting Services:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/TQk-PV-YN3_lLz9hjrdk2Q"&gt;&lt;img alt="" border="0" src="http://lh6.ggpht.com/thomasswilliams/SOBLnNtp5sI/AAAAAAAAAb4/Hk9XWd1_NWk/hiding-showing-columns-september-2008-result.gif" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Notes: One limitation I should mention is that the PDF export format still allows space for the hidden columns, even if they're not shown. Other formats (Excel, HTML) don't do this.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/reporting+services"&gt;reporting services&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/visibility"&gt;visibility&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/multi-value+parameter"&gt;multi-value parameter&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/column"&gt;column&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/hide"&gt;hide&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2691.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>OT: Star Wars Culture</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/29/ot-star-wars-culture.aspx</link><pubDate>Mon, 29 Sep 2008 02:32:16 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2008/09/29/ot-star-wars-culture.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2690.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2690.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/29/ot-star-wars-culture.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2690.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">OT: Star Wars Culture</source><description>&lt;p&gt;Via &lt;a href="http://feeds.delicious.com/v2/rss/popular?count=15"&gt;Delicious Popular Bookmarks&lt;/a&gt;, I found a great link to &lt;a href="http://delicious.com/url/59d33095e558f2bda5feeccc9964e284"&gt;Star Wars-inspired art from design blog Abduzeedo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I loved Star Wars as a kid and my eldest son TJ has inherited the obsession (we even have to ask *not* to talk about Star Wars when we're playing games or discussing movies!)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/fun"&gt;fun&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/starwars"&gt;starwars&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/art"&gt;art&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2690.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>I Can See Your Email from My House in Alaska</title><link>http://theruntime.com/blogs/devprime/archive/2008/09/26/i-can-see-your-email-from-my-house-in-alaska.aspx</link><pubDate>Fri, 26 Sep 2008 11:17:04 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/devprime/archive/2008/09/26/i-can-see-your-email-from-my-house-in-alaska.aspx</guid><wfw:comment>http://theruntime.com/blogs/devprime/comments/2689.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/devprime/comments/commentRss/2689.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/devprime/archive/2008/09/26/i-can-see-your-email-from-my-house-in-alaska.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/devprime/services/trackbacks/2689.aspx</trackback:ping><source url="http://theruntime.com/blogs/devprime/rss.aspx">I Can See Your Email from My House in Alaska</source><description>&lt;p&gt;I should have probably blogged about this earlier, but this has been a really busy week for me on my project. Shortly after my latest post on passwords, I had several talks with associates. Quite a few of them were ribbing about how I'm too security conscious. As if there is such a thing as too much security.&lt;/p&gt;
&lt;p&gt;Then, right on que as if to prove my point, Sarah Palin's email account got "hacked". I say that in the loosest, pop-culture sense of the word, because it really isn't a hack. A hack is someone disassembling a backbone router's operating code and discovering a buffer overflow flaw that they can use to inject code that will take over the router. In this case, someone simply stole Palin's email credentials in a way that could have been accomplished by a savvy sixth grader. And that's the whole point - hacking into a computer to steal info is really, really hard provided the system is well-locked-down. That's why today's ID and data thieves don't hack code - they hack people. Social engineering is far easier to do. So much easier that even non-techie ID and data thieves can do it. That's what makes social engineering attacks so dangerous. Instead of keeping an eye on a handful of alpha nerds with NPD, you have to watch out for thousands and thousands of con artists.&lt;/p&gt;
&lt;p&gt;In case you missed the affair in question, someone got into Palin's Yahoo! email account. Did they use some kind of crypto-defeating stealth code, or a supercomputer bot network to crack the password? Nope. They simply guessed the answer to her "forgot my password" question. And, they did it so easily because the answer to the question was available to the public! If the alleged accounts are to be believed, it was the location where she met her husband. Anyone with an internet search engine and connectivity could have gotten it.&lt;/p&gt;
&lt;p&gt;So the point is that your password is a means of authentication. And so is the answer to the magic reset question! But if you're going to provide a backup or replacement authentication mechanism, it needs to be at *least* as secure as the primary one! In this case, your password is only as strong as the answer to the question. You wouldn't publicly post your password, so why publicily post the answer to the question?! Or perhaps more appropriately, why select a question-answer that is available in public?&lt;/p&gt;
&lt;p&gt;I guess it all boils down to my assertion that the question-answer password reset mechanism is inherently bad. Good password mechanisms force people to select good passwords, but question-answer mechanisms seem to cater to a person's natural tendency to be lazy and choose the path of least resistance... which is something that most ID and data theives would love for you to. They are really only in business because they can depend on so many people behaving that way.&lt;/p&gt;
&lt;p&gt;In short, shame on Sarah Palin for using a public email system for government business. Shame on Yahoo! for using this absurd mechanism for password resetting - or, on the other hand, if they feel they *have* to use such a system, then shame on them for allowing this sort of question. I would say shame on the idiot who broke into her account, but let's face it, people who do this on a regular basis really don't care.&lt;/p&gt;
&lt;p&gt;Now as it turns out, there is a real possibility this person isn't a professional con or ID/data thief, but just someone who wanted to take a sneak peak at her emails to see if there was anything politically hot in it. That's not to excuse them in the slightest - they committed a *criminal* act. But the fact that an ordinary person who may not be a pro at breaking into systems can do this, should be a frightening enough reminder to take what I said previously seriously. Don't add yourself or your app to my wall of shame.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/devprime/aggbug/2689.aspx" width="1" height="1" /&gt;</description><dc:creator>DevPrime</dc:creator></item><item><title>Nifty Internet Site #89742 (http://drop.io)</title><link>http://theruntime.com/blogs/danastevens/archive/2008/09/25/nifty-internet-site-89742-httpdrop.io.aspx</link><pubDate>Thu, 25 Sep 2008 10:42:14 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/danastevens/archive/2008/09/25/nifty-internet-site-89742-httpdrop.io.aspx</guid><wfw:comment>http://theruntime.com/blogs/danastevens/comments/2688.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/danastevens/comments/commentRss/2688.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/danastevens/archive/2008/09/25/nifty-internet-site-89742-httpdrop.io.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/danastevens/services/trackbacks/2688.aspx</trackback:ping><source url="http://theruntime.com/blogs/danastevens/rss.aspx">Nifty Internet Site #89742 (http://drop.io)</source><description>&lt;p&gt;I was looking for an incoming fax service, and found this site, which offers incoming fax and a few other nifty things, for free.  I can't say the incoming fax is business-grade reliable (yet) as they're still working out the kinks, but I hope they can get it all sorted out because the concept is really groovy.  Check them out at &lt;a href="http://drop.io"&gt;http://drop.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;eFax still offers a free incoming fax service, but you have to use their software to read the faxes.  It's located here:  &lt;a target="_blank" href="https://www.efax.com/en/efax/twa/signupFree?rqcp=2"&gt;&lt;font face="Arial"&gt;http://www.efax.com/efax-free&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is why the Internet is cool.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/danastevens/aggbug/2688.aspx" width="1" height="1" /&gt;</description><dc:creator>Dana Stevens</dc:creator></item><item><title>Getting the &amp;quot;unwashed&amp;quot; (aka &amp;quot;blue collar coders&amp;quot;) to unit test</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/23/getting-the-quotunwashedquot-aka-quotblue-collar-codersquot-to-unit-test.aspx</link><pubDate>Tue, 23 Sep 2008 14:05:06 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/23/getting-the-quotunwashedquot-aka-quotblue-collar-codersquot-to-unit-test.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2687.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2687.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/23/getting-the-quotunwashedquot-aka-quotblue-collar-codersquot-to-unit-test.aspx#comment</comments><slash:comments>5</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2687.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Getting the &amp;quot;unwashed&amp;quot; (aka &amp;quot;blue collar coders&amp;quot;) to unit test</source><description>&lt;p&gt; &lt;/p&gt;  &lt;p&gt;Roy Osherove has a great post on &lt;a href="http://weblogs.asp.net/rosherove/archive/2008/09/20/goodbye-mocks-farewell-stubs.aspx"&gt;making TDD more accessible&lt;/a&gt; (which I would be remiss to mention that I am not really a part of the TDD movement except as a outsider/skeptic). There are a bunch of additional comments/posts in this regard which I won’t bore you with. You either got here because my post got linked to Roy’s thread or you are a regular reader here. &lt;/p&gt;  &lt;p&gt;I was actually encouraged by Roy’s thoughts(again). He really gets it (I mean the reason why blue collar developers don’t do TDD). It’s all reminiscent of something I heard from within the security culture: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;If it isn’t secure by default then... it isn’t really secure. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;For instance, MVC was a web framework talked about by a bunch of people but no one REALLY used it until RAILS did it and made it easy to do (at least that’s my guess). In the ASP.NET space there have been alternative web frameworks (mostly MVC), but until MS did an MVC framework that was easy to use everyone used any web forms (you could have used an alternative ASP.NET Web Framework you know). &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Improvements??&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When I was at CodeBetter, I remember a lot of people complaining about how MS made it easy to develop crappy code using all kinds of ugly evil drag and drop mechanisms (DataSets and DataGrids come to mind). &lt;/p&gt;  &lt;p&gt;As I look back on it, if that crew had decided let’s make it easier to build testable code by releasing a bunch of templates and making improvements to the testing frameworks (an add-in for VS that auto-creates class methods/properties while I’m writing test code would have been awesome). It could have even used mocking frameworks to determine what calls should be made in those properties/methods and add comments to that effect... This would make testing easier and would encourage test first. &lt;/p&gt;  &lt;p&gt;You see there’s a way to get better code written, but it involves creating tools that make it easier to write good code (so "why would I want to write bad code... it’s easy to write good code"). I know for some of this won’t resonate. I fear that some love being "l33t" and so as long as coding is hard they feel like they are at the top of the food chain. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A Personal Experience &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Chad Myers and I chatted a few weeks ago (or was it last week) in email about the testing I was doing. He really wanted me to post about my experience here. So, while I was being called out on my post where I was talking about SpDD, I was writing MbUnit code that looked like this: &lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; [RowTest(&lt;span style="color: #006080"&gt;"'A' Must Be False When Settings Object DisAllows 'A' For Customer"&lt;/span&gt;)]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; [Row(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, 1, 2, 3, 4)]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; A_Must_Be_False_When_Settings_Object_DisAllows_A_For_Customer(&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; expected, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; parm1, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; parm2, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; parm3, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; parm4)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     &lt;span style="color: #008000"&gt;// Set up conditions&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     Assert.AreEqual(expected, SomeObj.SomeMethod(someSignature[]), &lt;span style="color: #006080"&gt;""&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I did this for something in my day job that absolutely had to be correct. Quality had to be 100%. The class under test had a bunch of rules (specs) that had to be tested. It had to be right... no questions asked, and having a regression suite of tests was an added benefit (it would never be wrong). &lt;/p&gt;

&lt;p&gt;While I didn’t use classic DI, I was pretty close (so I could have mocked every dependency if I wanted to with minimal effort). Anyway, the net result was great. I have a set of regression tests and confidence that my understanding of the spec is covered with tests (so the end result should be a quality class that does what I would expect it to do).&lt;/p&gt;

&lt;p&gt;Anyway, I’m really ashamed of one thing though. I’m afraid to admit that it took entirely too long IMNHO (Shawn C. don’t freak... it was a critical need): 1.5 days roughly. &lt;/p&gt;

&lt;p&gt;Things like PEX may have helped a little, but the truth is I didn’t have time to learn a new tool (so I have no idea how quickly I could have done it with PEX)... I know, we never have the time. There are also tools out there for auto-gen’ing tests, but those aren’t that great either. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Change &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Something needs to change in this space for adoption to take off. Believe it or not I hope something does. The idea of a suite of regression tests sounds awesome to me... the idea that I have to write that test code isn’t quite so appealing... it either has to be easier to write tests or writing tests needs to help write code for me. At least that’s a suggestion. &lt;/p&gt;

&lt;p&gt;As previously mentioned, I am not a TDDer. I’m a guy who gets some of these Alpha Geek ideas, but I’m more a "Beta Geek." I have one foot in the blue collar developer corner and one foot slightly over the line toward cutting edge developer... I try to walk the line and find better ways of doing things which is why TDD has me somewhat hung up (I like tests and the net result... but I don’t like the effort involved). I know TDD is about something else as well... but for me the benefit is the regression suite... all other things are simply window dressing appealing to an unknown "best practices" authority.&lt;/p&gt;

&lt;p&gt;[That’s another rant in and of itself... the whole "best practices" thing.... who’s defining this? You guys sometimes need to do a better job with that... quoting "best practices" is like saying "it’s better because I said so." At least that’s what most of us hear... if you are going to use it then quote your authority.... at least if you say "Fowler said" then I can determine if "Fowler" is an authority I respect, and whether he carries weight with me].&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2687.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Krakadiska - Sounds of the MacBook Pro</title><link>http://theruntime.com/blogs/danastevens/archive/2008/09/22/krakadiska---sounds-of-the-macbook-pro.aspx</link><pubDate>Mon, 22 Sep 2008 10:42:58 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/danastevens/archive/2008/09/22/krakadiska---sounds-of-the-macbook-pro.aspx</guid><wfw:comment>http://theruntime.com/blogs/danastevens/comments/2686.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/danastevens/comments/commentRss/2686.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/danastevens/archive/2008/09/22/krakadiska---sounds-of-the-macbook-pro.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/danastevens/services/trackbacks/2686.aspx</trackback:ping><source url="http://theruntime.com/blogs/danastevens/rss.aspx">Krakadiska - Sounds of the MacBook Pro</source><description>&lt;p&gt;I'm still lovin' the MacBook Pro, and having fun with it.  However, there's one thing that I didn't expect, and that was the surprisingly noisy slot-loading optical drive.  The first time I loaded a disc into it, it went Snap! Izzz!  Whirrr!  CLICK! Snap!  I honestly wondered if it had cracked the disc in half.  Was I going to have to pick out the pieces of a shredded DVD with needle-nose pliers?  But no --- this is a feature.   The other slot-loaders I've had, mostly CD players, load a disk is near silence, with perhaps only a muted click, and soft spin-up.   (But then, perhaps the violent snapping noises enable super-precise positioning for ultra-accurate DVD burning and reading.  How have other drives performed for all these years without them?  Who knows?)&lt;/p&gt;
&lt;p&gt;What I do know is that Apple actually posted &lt;a href="http://support.apple.com/kb/HT1723?viewlocale=en_US"&gt;the sounds of the MacBook Pro.&lt;/a&gt;  So you can listen before you buy.  Now that's thinking different.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/danastevens/aggbug/2686.aspx" width="1" height="1" /&gt;</description><dc:creator>Dana Stevens</dc:creator></item><item><title>I'm a PC . . . but I bought a Mac.</title><link>http://theruntime.com/blogs/danastevens/archive/2008/09/22/im-a-pc-.-.-.-but-i-bought-a.aspx</link><pubDate>Sun, 21 Sep 2008 23:40:38 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/danastevens/archive/2008/09/22/im-a-pc-.-.-.-but-i-bought-a.aspx</guid><wfw:comment>http://theruntime.com/blogs/danastevens/comments/2685.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/danastevens/comments/commentRss/2685.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/danastevens/archive/2008/09/22/im-a-pc-.-.-.-but-i-bought-a.aspx#comment</comments><slash:comments>3</slash:comments><trackback:ping>http://theruntime.com/blogs/danastevens/services/trackbacks/2685.aspx</trackback:ping><source url="http://theruntime.com/blogs/danastevens/rss.aspx">I'm a PC . . . but I bought a Mac.</source><description>&lt;p&gt;First, a brief historical interlude.  My first paying job in the computer industry was at a computer retailer in Tampa, Florida.  It was a small company with eleven employees, two store locations, and we built and sold clones, set up small networks, and enjoyed the high margins that a hardware retailer could get (20% and up!) back in the early 1990s.  Like at many small companies, we all did it all, and wore every hat there was to wear.  It was a fabulous time in the industry, and I developed an affinity for hardware tech.  I never got tired of building machines and troubleshooting hardware issues.  And even after many years now, I still love the hardware and still build my own rigs.  &lt;/p&gt;  &lt;p&gt;I’ve gone through a number of notebook computers, and for me, the first question to consider when buying a notebook is: Do I want a smaller notebook with long battery life, or do I want big screen and horsepower (with the understanding that battery life might equal 25 minutes)?&lt;/p&gt;  &lt;p&gt;My last notebook was a big Sony Vaio.  I made the decision that I wanted something in the 'desktop replacement' class, and it was heavy, large, and battery life was around 30 minutes.  and while I really liked the Sony hardware, the overall experience I had with the notebook was miserable.  The notebook came with no disks at all, and so I had to burn my own driver-backup disks.  Yuk.  Plus, when I actually needed them, months later, the disks didn’t work, and I had to call up Sony, where they cheerfully told me that I could order a set of disks for $99.  Nice.  Anyway, I used that notebook for a year and a half, sold it, and was 'without notebook' for a while.&lt;/p&gt;  &lt;p&gt;Last week, I decided it was time to get portable again. I wanted something smaller this time, but still with enough juice for Visual Studio.  I had heard from quite a few developers that really liked the MacBook Pro, running Boot Camp/VM Fusion/Parallels in order to load Vista and (the all-important aforementioned) Visual Studio).  The machines certainly look cool, but is that enough to justify the premium?  To check it out, I went to Best Buy and tinkered with all the notebooks . . . which is an enjoyable afternoon all unto itself.  Then I plunked down my two large on the MacBook Pro 15.4" model. (My path to the dark side was complete!)&lt;/p&gt;  &lt;p&gt;I must report that I really like this machine.  Not to get existential, but Apple just gets it.  After messing around with OS X, which is nifty, I partitioned the drive for Vista, installed that OS, and wondered how bad the driver situation would be.  After installing Vista, I inserted the Apple CD, and Vista immediately recognized setup.exe, ran it, which installed the Boot Camp software on Vista, along with all the drivers - - - even the ones that control the keyboard backlighting.  That’s just cool.  Wifi works, Bluetooth works . . . it all just works.  Dang, just like the slogan.  Credit where credit is due: the boys from Cupertino design a good notebook.&lt;/p&gt;  &lt;p&gt;For a mouse, I picked up the Logitech VX Nano.  I use the MX Revolution when I code, and I just love the heavy, metal scroll wheel.  That’s the best feature I’ve found yet on a mouse, and the VX Nano has a scroll wheel just like his big brother.&lt;/p&gt;  &lt;p&gt;All in all, I am one extremely satisfied customer. Now I’m wondering if I’ll ever buy anything except an Intel-based Apple notebook.  They rule.  &lt;/p&gt;  &lt;p&gt;And as a historical observation, the camps of Apple Fanboys and the camps of Microsoft Fanboys were once clearly delineated.  It’s interesting that in recent years the lines of demarcation have blurred . . . to the point where Windows developers buy Apple notebooks to run Visual Studio on a Windows OS inside OS X to build code that gets deployed to Windows Server machines.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/danastevens/aggbug/2685.aspx" width="1" height="1" /&gt;</description><dc:creator>Dana Stevens</dc:creator></item><item><title>Dependency Injection (DI) with Generics (or maybe not)?</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/18/dependency-injection-di-with-generics.aspx</link><pubDate>Thu, 18 Sep 2008 09:39:39 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/18/dependency-injection-di-with-generics.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2684.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2684.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/18/dependency-injection-di-with-generics.aspx#comment</comments><slash:comments>12</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2684.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Dependency Injection (DI) with Generics (or maybe not)?</source><description>&lt;p&gt;[I am not the post boy for doing DI; I’m on good record for seeming to be against it, but I was reading an article on DI (yes, I read up on a number of things that run counter to my beliefs... I’m a thinker, so I think debate is a good thing and learning about the stuff outside your normal realm is a way to better yourself).]&lt;/p&gt;
&lt;p&gt;I don’t think I’ve ever seen anyone talk about this and I did it recently. Basically you create a class like this:&lt;/p&gt;
&lt;div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; font-size: 8pt; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;
&lt;div style="border-style: none; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   1:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; MyClassWithADependency&amp;lt;T&amp;gt; : SomeBaseClass &lt;span style="color: rgb(0, 0, 255);"&gt;where&lt;/span&gt; T:ISomeInterface,&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   3:&lt;/span&gt;     T _dependency;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   4:&lt;/span&gt;     &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; MyClassWithADependency()&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   6:&lt;/span&gt;         _dependency = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; T();&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   7:&lt;/span&gt;  &lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   8:&lt;/span&gt;         &lt;span style="color: rgb(0, 128, 0);"&gt;// Use _dependency in the rest of your code&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;  10:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you are a TDD guy (or are familiar with unit testing), you have just enabled a whole scenario of things. Mind you have I have no idea how well this works with an IOC library (Ask Jeremy Miller or one of those guys), but the idea really has some merit for me (although I won’t be doing this everywhere).&lt;/p&gt;
&lt;p&gt;In my case I am preparing for an expansion on a library I just wrote for work. It has something to do with reading Excel documents with FarPoint Spread and importing the data... what quickly came to light is that there will very quickly be a number of new requirements for our app that use Excel imports (so new data, so parsing mechanisms). BTW, our mechanism uses FarPoint to generate an Excel export file that is used by our users for data entry.&lt;/p&gt;
&lt;p&gt;Anyway, I wanted to keep much of my parsing routines, but merge in new data structures. Injection via generics works great. I was even able to derive a new class based on a specific generic like this:&lt;/p&gt;
&lt;div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; font-size: 8pt; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;
&lt;div style="border-style: none; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   1:&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; MyNewClass : MyClassWithADependency&amp;lt;ClassThatImplementsISomeInterface&amp;gt;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   3:&lt;/span&gt;     &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; MyNewClass() : &lt;span style="color: rgb(0, 0, 255);"&gt;base&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   5:&lt;/span&gt;     }&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: rgb(244, 244, 244);"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   6:&lt;/span&gt;     &lt;span style="color: rgb(0, 128, 0);"&gt;// Rest of your definition goes here&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: white;"&gt;&lt;span style="color: rgb(96, 96, 96);"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Testing??&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since I’m not a TDD guy nor do I use Automated Test tools like MbUnit on a heavy basis, I will defer on this one. I will rely on someone like &lt;a href="http://www.lostechies.com/blogs/chad_myers/"&gt;Chad&lt;/a&gt; or one of my regular readers to do it for me.&lt;/p&gt;
&lt;p&gt;[Of course this example may be totally "whack" in which case tell me, please...]&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2684.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Using speech recognition to improve productivity</title><link>http://theruntime.com/blogs/davebalzer/archive/2008/09/16/using-speech-recognition-to-improve-productivity.aspx</link><pubDate>Tue, 16 Sep 2008 06:41:10 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/davebalzer/archive/2008/09/16/using-speech-recognition-to-improve-productivity.aspx</guid><wfw:comment>http://theruntime.com/blogs/davebalzer/comments/2683.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/davebalzer/comments/commentRss/2683.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/davebalzer/archive/2008/09/16/using-speech-recognition-to-improve-productivity.aspx#comment</comments><slash:comments>3</slash:comments><trackback:ping>http://theruntime.com/blogs/davebalzer/services/trackbacks/2683.aspx</trackback:ping><source url="http://theruntime.com/blogs/davebalzer/rss.aspx">Using speech recognition to improve productivity</source><description>&lt;p&gt;I have always been fascinated with speech recognition technology, but have never found it very useful in the past.  The accuracy with which recognition software translated what I said to written words has always been very poor.  Windows commands were cumbersome.  I found myself spending more time correcting what I’d dictated and it proved to be an ineffective form of user input.&lt;/p&gt;
&lt;p&gt;I’ve been running Windows Vista for a while now, but hadn't noticed the speech recognition software that’s built into it until just the other day.  I decided to give it a try.  I had not read any reviews, so I went into it blindly.  I ran through the tutorial that I found in the control panel and then enabled speech recognition.  It gives you a toolbar that indicates the current status.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://theruntime.com/blogs/images/theruntime_com/blogs/davebalzer/WindowsLiveWriter/Usingspeechrecognitiontoimproveproductiv_79EA/WindowsVistaSpeechToolbar_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="49" alt="WindowsVistaSpeechToolbar" width="244" border="0" src="http://theruntime.com/blogs/images/theruntime_com/blogs/davebalzer/WindowsLiveWriter/Usingspeechrecognitiontoimproveproductiv_79EA/WindowsVistaSpeechToolbar_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;The word recognition is far superior to anything I’ve tried in the past.  The commands are more natural than any I’ve attempted to use previously.  Dictating can be a very natural experience by just speaking to the computer and having it transcribe your thoughts. Controlling windows by voice takes some getting used to, but with a little practice it becomes second nature.&lt;/p&gt;
&lt;p&gt;I certainly wouldn’t try to code using voice recognition at this point, but when writing documentation, emails and even blog posts it is already starting to increase my productivity.  Speech recognition is still far from being a completely effective technology, but what I’ve experienced with this new version in Windows Vista has shown me that it has come a long way.  I’m excited about what the future holds.&lt;/p&gt;
&lt;p&gt;By the way, this post was written entirely with speech recognition including selecting and pasting the image in.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/davebalzer/aggbug/2683.aspx" width="1" height="1" /&gt;</description><dc:creator>Dave Balzer</dc:creator></item><item><title>Configurable Date Grouping (Day, Week or Month) using SQL</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/15/configurable-date-grouping-day-week-or-month-using-sql.aspx</link><pubDate>Mon, 15 Sep 2008 02:04:36 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2008/09/15/configurable-date-grouping-day-week-or-month-using-sql.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2682.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2682.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/15/configurable-date-grouping-day-week-or-month-using-sql.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2682.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">Configurable Date Grouping (Day, Week or Month) using SQL</source><description>&lt;p&gt;Recently I needed configurable grouping in an SQL statement - the exact requirement was that the results be grouped by day, week or month, depending on the user's selection.&lt;/p&gt;
&lt;p&gt;This can be done without a table of dates or dynamic SQL by using a CASE statement in the GROUP BY clause.&lt;/p&gt;
&lt;p&gt;Here's an example with CASE to achieve configurable date grouping using the "TransactionHistory" table in AdventureWorks:&lt;/p&gt;
&lt;div style="FONT-SIZE: 0.9em; LINE-HEIGHT: 0em"&gt;
&lt;p&gt;&lt;span style="COLOR: green; FONT-FAMILY: Consolas"&gt;--"group by" variable &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue; FONT-FAMILY: Consolas"&gt;DECLARE&lt;/span&gt;&lt;span style="FONT-FAMILY: Consolas"&gt; @GroupBy &lt;span style="COLOR: blue"&gt;TINYINT&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: green; FONT-FAMILY: Consolas"&gt;--******** CHANGE GROUPING HERE ******** &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: green; FONT-FAMILY: Consolas"&gt;--group by Day (0), Week (1) or Month (2) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue; FONT-FAMILY: Consolas"&gt;SET&lt;/span&gt;&lt;span style="FONT-FAMILY: Consolas"&gt; @GroupBy &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; 2 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: green; FONT-FAMILY: Consolas"&gt;--**************************************&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: green; FONT-FAMILY: Consolas"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: green; FONT-FAMILY: Consolas"&gt;--need to set the first day of week to be Monday so that &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: green; FONT-FAMILY: Consolas"&gt;--the datepart calculations work &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue; FONT-FAMILY: Consolas"&gt;SET&lt;/span&gt;&lt;span style="FONT-FAMILY: Consolas"&gt; &lt;span style="COLOR: blue"&gt;DATEFIRST&lt;/span&gt; 1 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue; FONT-FAMILY: Consolas"&gt;SELECT&lt;/span&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;  &lt;span style="COLOR: green"&gt;--apply dynamic grouping based on "@GroupBy" &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;        &lt;span style="COLOR: green"&gt;--note that the "GROUP BY" clause needs to match this CASE statement &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;        [TheDate] &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; &lt;span style="COLOR: blue"&gt;CASE&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: green"&gt;--day: ignore time by converting to date-only string format then back to date&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: blue"&gt;WHEN&lt;/span&gt; @GroupBy &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; 0 &lt;span style="COLOR: blue"&gt;THEN&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;SMALLDATETIME&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;25&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; 106&lt;span style="COLOR: gray"&gt;))&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: green"&gt;--week: get next Sunday after the date by adding (7 - weekday) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: green"&gt;--e.g. to a Tuesday (day 2) we add 5 to get Sunday &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: green"&gt;--     to a Sunday, we add 0 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: blue"&gt;WHEN&lt;/span&gt; @GroupBy &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; 1 &lt;span style="COLOR: blue"&gt;THEN&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;SMALLDATETIME&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;25&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   &lt;span style="COLOR: fuchsia"&gt;DATEADD&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: fuchsia"&gt;day&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; 7 &lt;span style="COLOR: gray"&gt;-&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;DATEPART&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;weekday&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; 106&lt;span style="COLOR: gray"&gt;))&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: green"&gt;--month: get first day of month by calculating the current &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: green"&gt;--day of month minus (the date minus 1) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: green"&gt;--e.g. on the 5th of the month, minus 4 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: green"&gt;--     on the first of the month, minus 0 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: blue"&gt;WHEN&lt;/span&gt; @GroupBy &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; 2 &lt;span style="COLOR: blue"&gt;THEN&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;SMALLDATETIME&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;25&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   &lt;span style="COLOR: fuchsia"&gt;DATEADD&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: fuchsia"&gt;day&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; &lt;span style="COLOR: gray"&gt;-(&lt;/span&gt;&lt;span style="COLOR: fuchsia"&gt;DATEPART&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: fuchsia"&gt;day&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;)&lt;/span&gt; &lt;span style="COLOR: gray"&gt;-&lt;/span&gt; 1&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; 106&lt;span style="COLOR: gray"&gt;))&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;        &lt;span style="COLOR: blue"&gt;END&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt;  &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;        &lt;span style="COLOR: green"&gt;--some value here &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;        &lt;span style="COLOR: fuchsia"&gt;COUNT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionID]&lt;span style="COLOR: gray"&gt;)&lt;/span&gt; &lt;span style="COLOR: blue"&gt;AS&lt;/span&gt; [NumberOfTransactions] &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue; FONT-FAMILY: Consolas"&gt;FROM&lt;/span&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;    AdventureWorks&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;Production&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionHistory] TH &lt;span style="COLOR: blue"&gt;WITH&lt;/span&gt; &lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;NOLOCK&lt;/span&gt;&lt;span style="COLOR: gray"&gt;)&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue; FONT-FAMILY: Consolas"&gt;GROUP&lt;/span&gt;&lt;span style="FONT-FAMILY: Consolas"&gt; &lt;span style="COLOR: blue"&gt;BY&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;        &lt;span style="COLOR: blue"&gt;CASE&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: blue"&gt;WHEN&lt;/span&gt; @GroupBy &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; 0 &lt;span style="COLOR: blue"&gt;THEN&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;SMALLDATETIME&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;25&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; 106&lt;span style="COLOR: gray"&gt;))&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: blue"&gt;WHEN&lt;/span&gt; @GroupBy &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; 1 &lt;span style="COLOR: blue"&gt;THEN&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;SMALLDATETIME&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;25&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   &lt;span style="COLOR: fuchsia"&gt;DATEADD&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: fuchsia"&gt;day&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; 7 &lt;span style="COLOR: gray"&gt;-&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;DATEPART&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;weekday&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; 106&lt;span style="COLOR: gray"&gt;))&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;            &lt;span style="COLOR: blue"&gt;WHEN&lt;/span&gt; @GroupBy &lt;span style="COLOR: gray"&gt;=&lt;/span&gt; 2 &lt;span style="COLOR: blue"&gt;THEN&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;SMALLDATETIME&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; &lt;span style="COLOR: fuchsia"&gt;CONVERT&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: blue"&gt;VARCHAR&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;25&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   &lt;span style="COLOR: fuchsia"&gt;DATEADD&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: fuchsia"&gt;day&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; &lt;span style="COLOR: gray"&gt;-(&lt;/span&gt;&lt;span style="COLOR: fuchsia"&gt;DATEPART&lt;/span&gt;&lt;span style="COLOR: gray"&gt;(&lt;/span&gt;&lt;span style="COLOR: fuchsia"&gt;day&lt;/span&gt;&lt;span style="COLOR: gray"&gt;,&lt;/span&gt; TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;)&lt;/span&gt; &lt;span style="COLOR: gray"&gt;-&lt;/span&gt; 1&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;                                   TH&lt;span style="COLOR: gray"&gt;.&lt;/span&gt;[TransactionDate]&lt;span style="COLOR: gray"&gt;),&lt;/span&gt; 106&lt;span style="COLOR: gray"&gt;))&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY: Consolas"&gt;        &lt;span style="COLOR: blue"&gt;END&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue; FONT-FAMILY: Consolas"&gt;ORDER&lt;/span&gt;&lt;span style="FONT-FAMILY: Consolas"&gt; &lt;span style="COLOR: blue"&gt;BY&lt;/span&gt; 1 &lt;span style="COLOR: blue"&gt;ASC&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I tried this in SQL Server 2005 but it should work in SQL Server 2000 as well (additionally, &lt;a href="http://msdn.microsoft.com/en-us/library/aa992075(VS.80).aspx"&gt;full instructions on getting the AdventureWorks sample database are here on MSDN&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/sql+server"&gt;sql server&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/group+by"&gt;group by&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/dynamic"&gt;dynamic&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/date"&gt;date&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2682.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>OT: Improving my T-SQL What?</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/15/ot-improving-my-t-sql-what.aspx</link><pubDate>Mon, 15 Sep 2008 02:02:14 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2008/09/15/ot-improving-my-t-sql-what.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2681.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2681.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/15/ot-improving-my-t-sql-what.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2681.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">OT: Improving my T-SQL What?</source><description>&lt;p&gt;Aussie SQL Server MVP Rob Farley has been busy lately, speaking at TechEd (&lt;a href="http://msmvps.com/blogs/robfarley/archive/2008/09/03/dat283.aspx"&gt;and blogging his presentation here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;He's doing his TechEd talk at the Melbourne SQL Server User Group on Tuesday night and obviously means fair-dinkum business, as evidenced by the subject line of the invite e-mail :-)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/jSnQmU2rbP2aUuYGaYigBw"&gt;&lt;img src="http://lh5.ggpht.com/thomasswilliams/SM3KplCtKkI/AAAAAAAAAaM/QZqBg8xdQS8/s400/aussug%20invitation%20september.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;(The full subject actually read "AUSSUG: Invitation: Improving Your T-SQL Arsenal (Rob Farley)", but in my e-mail client it was cut off...he he...)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a href="http://technorati.com/tag/funny" rel="tag"&gt;funny&lt;/a&gt;, &lt;a href="http://technorati.com/tag/email" rel="tag"&gt;email&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2681.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>TUX First Meeting wrap up</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/12/tux-first-meeting-wrap-up.aspx</link><pubDate>Fri, 12 Sep 2008 07:57:22 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/12/tux-first-meeting-wrap-up.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2680.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2680.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/12/tux-first-meeting-wrap-up.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2680.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">TUX First Meeting wrap up</source><description>&lt;p&gt;I am proud to say that our team pulled together our first meeting ever without any hitches that I know of. Most people found it fairly easily (despite my probably insufficient instructions). We had about 28 people (I think) show up.&lt;/p&gt;  &lt;p&gt;As you may know (or you may not because you missed it), I spoke at the first meeting on an in depth talk on the MS Ajax Client Script enhancements (we’ll try not to get quite this heavily "developer-centric" in the future). We gave out the MSDN Premium that Bill Reiss donated to us and Chris Faulhaber won it. Feedback from the surveys was great and we’ll be using that data to help improve ourselves (watch the blog here or hopefully the one on the new site once it’s ready). The new site is at &lt;a href="http://www.tampaux.org"&gt;www.tampaux.org&lt;/a&gt; (and I know I keep saying it should be live soon... and well it should be live soon)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devfish.net/fullblogitemview.aspx?blogid=579"&gt;Joe Healy also blogged about us&lt;/a&gt;. Joe will probably have some more pictures (and I know we have some pictures on our site as well)&lt;/p&gt;  &lt;p&gt;Anyway, we look forward to seeing you next month on October 8th at Answers Systems at 6:30 ("Same UX-Time, Same UX-Channel"). Bill Reiss (MVP-Silverlight) will be doing a presentation on Silverlight which promises to be a little more heavily design. We’re all looking forward to seeing you.&lt;/p&gt;  &lt;p&gt;If you have an ideas, feel free to use the contact form on my blog to let me know... even if you want to criticize me. Please do. We want to make this group great!&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2680.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>VSLive NY Sessions Posted</title><link>http://theruntime.com/blogs/brianpeek/archive/2008/09/12/vslive-ny-sessions-posted.aspx</link><pubDate>Fri, 12 Sep 2008 01:10:50 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2008/09/12/vslive-ny-sessions-posted.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2679.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2679.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2008/09/12/vslive-ny-sessions-posted.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2679.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">VSLive NY Sessions Posted</source><description>&lt;p&gt;Thanks to everyone that attended my VSLive NY session.  I hope it was informative.  I have posted the slide-decks and source code for both of my sessions so you can tinker with the projects on your own.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.brianpeek.com/files/folders/2008/entry2953.aspx" target="_blank"&gt;Creating a Simple 2D Game Using XNA Game Studio to Run on a PC, Xbox 360, or Microsoft Zune&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.brianpeek.com/files/folders/2008/entry2952.aspx" target="_blank"&gt;Interfacing External Hardware Using Managed Code&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Questions and comments welcome, as always.  Thanks!&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2679.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>Why I am one of the worst programmers on the planet (in some circles)?</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/11/why-i-am-one-of-the-worst-programmers-on-the.aspx</link><pubDate>Thu, 11 Sep 2008 10:45:19 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/11/why-i-am-one-of-the-worst-programmers-on-the.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2678.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2678.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/11/why-i-am-one-of-the-worst-programmers-on-the.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2678.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Why I am one of the worst programmers on the planet (in some circles)?</source><description>&lt;p&gt;First of all, we had a great turn out at the first TUX (Tampa User eXperience) User Group last night (more on that in another post... I’m still pretty exhausted).&lt;/p&gt;  &lt;p&gt;I got to meet someone last night that I have maligned (sort of) in my blog. I hope he took my comment in the levity that it was meant to be taken. I told him that "everything is your fault" once you leave.&lt;/p&gt;  &lt;p&gt;It’s an adage that I have told others and it is very true. It’s easy for the new guy to come in and say... all the code written before I got here is crap (NOTE: that is not what I said in my current position and I tend to try NOT to say that). Everything has a context that as the new guy you don’t have. And it also is very easy for someone to say "yeah, that last guy screwed that up," because the alternative is that "well, I contributed to the problem that is giving someone else pain" is just not something most people are willing to own up to. &lt;/p&gt;  &lt;p&gt;So that said... I can tell you that I have built a lot of code under duress that quite frankly sucks. I’d hate to be you if you are maintaining it. I have also built stuff (in the past) that was a bad pattern choice for a particular problem. I did what I did because a) I wanted to use technology such and such and this problem came close to fitting, or b) I was flat out bored and wanted to do something different. I believe I have outgrown that... I tend to bug my peers a lot with "What do you think about doing this this way?" Mainly because I don’t want to repeat some of my past sins...&lt;/p&gt;  &lt;p&gt;FWIW, if you get mentioned on my blog indirectly (I really do try to somewhat keep who I’m talking about anonymous... I’m not trying to ruin your career), its probably because I found a really cool solution to a problem that resulted from your solution which for whatever reason didn’t take something into account. Please, don’t take it personal... read up on what I did and offline tell me what you think. Maybe you might want to know "what happened?" I’ll be more than happy to tell you.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2678.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>GrDD Refactored...</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/10/grdd-refactored.aspx</link><pubDate>Wed, 10 Sep 2008 12:12:59 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/10/grdd-refactored.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2677.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2677.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/10/grdd-refactored.aspx#comment</comments><slash:comments>18</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2677.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">GrDD Refactored...</source><description>&lt;p&gt;You probably think that GrDD AKA "Git 'R Done" development is a joke. And in some respects it is, but the concepts behind it are not. I have been talking to some friends and I think I have a pretty good idea of what we are talking about. Now mind you I’m not a methodology guy. I want to stress that. I’m just trying to get this out of my system.&lt;/p&gt;
&lt;p&gt;Before I proceed, I know there are some "agilists" out there who are subscribed because they can’t wait to pounce on an idea that is counter to their ideas (and since TheRuntime.com seems to be the center for "Alt ALT.NET". Please resist the urge. I know it’s hard to believe that there are a not a few of us who are skeptics, but there are (and some way smarter than me). If anything I’m trying to present an alternative idea that might lead people towards your thinking and maybe make some of it more palatable for other skeptics. &lt;/p&gt;
&lt;p&gt;Just to make myself clear to y’all, I typically tolerate all kinds of dialog and even invite it... but if you are planning on flaming all I can say is do it elsewhere... if you have something you think adds to my dialog then please feel free... If you aren’t "agile" then you are really invited to take part... I’ve had some ideas since my CodeBetter days that got shouted down back there, and I think it has merit for those practicing more of a GrDD &amp;lt;smile /&amp;gt; practice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GrDD refactored = ClDD&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ClDD is really a better acronym for what I have been touting. Client Driven Development or simple ClDD (could be pronounced "Cloudy" which is how it often starts). The idea here is focusing in on the client’s needs and working hard toward achieving that goal with minimal additional distractions. That may mean developing a web site with MS Access at the core of the site (I’ve done it/am doing it again)... It doesn’t mean that you don’t try to talk the client out of it... just that you are doing what the client ultimately wants done (and you aren’t building extra stuff beyond what is needed). I know that ruffles the feathers of some agilists, but the idea is simply put that you have to understand what the client needs and you make tradeoffs to meet the deadline. (BTW, this is what makes Billy Hollis an honorary GrDD prophet... see &lt;a href="http://theruntime.com/blogs/jacob/archive/2008/07/10/too-much-quality.aspx"&gt;Jacob’s post back here&lt;/a&gt;... he gets it IMNHO). FWIW, This is really a re-hash of the RAD methodology from the turn of the millenium (or thereabout).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about Quality? &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[This is one I’m poking around with right now... it’s the idea from way back in the CodeBetter days. I’ll forego using the agile name, but it will be apparent what I’m re-purposing.]  One of the things I really want to do more of is POUT (Plain Old Unit Testing). My problem could be resolved by answering the question "What should I test?" Some would say "Everything!" But I think there is a diminishing set of returns. Testing an empty constructor or testing a simple property seems like waste of time to me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enter SpDD&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The idea that I have come up with involves recording the specs or rules of a system... call them    &lt;br /&gt;
"stories" or use cases or simply business rules and build tests around as many of these as is possible (as long as you have the time to do so). Now this doesn’t produce 100% code coverage nor does it always produce 100% testable code (which to some is important)... it might represent Test First written code or it might represent Test Last written code... what I want to be able to do is determine that my code is living up to the spec, and have a set of regression tests to prove this to myself (I’m not sure what I think of the testing tools in this arena at this point... verdict is still out for me).&lt;/p&gt;
&lt;p&gt;BTW, SpDD is pronounced "Spee-Dee."&lt;/p&gt;
&lt;p&gt;[Alright Rob, Jacob... what do you think? Poke holes in it as it’s just an idea at this point... not something I’m doing, yet]&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2677.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>So Chrome compiles JS... So does DLRScript</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/10/so-chrome-compiles-js.-so-does-dlrscript.aspx</link><pubDate>Wed, 10 Sep 2008 07:34:58 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/10/so-chrome-compiles-js.-so-does-dlrscript.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2676.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2676.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/10/so-chrome-compiles-js.-so-does-dlrscript.aspx#comment</comments><slash:comments>1</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2676.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">So Chrome compiles JS... So does DLRScript</source><description>&lt;p&gt;I just wanted to point out to the world that my Open Source &lt;a href="http://codeplex.com/dlrscript"&gt;DLRScript&lt;/a&gt; (built on top of Silverlight 2 Beta2) compiles JavaScript (and it uses the familiar Script tag).&lt;/p&gt;  &lt;p&gt;The major difference is I am one guy (doing too much sidework that my personal projects are suffering) versus the huge Google regime. I’m also not as far as long from a compatibility perspective that I would like to be.&lt;/p&gt;  &lt;p&gt;The big thing that DLRScript proves though is that Silverlight can be used to create a consistent/performant Script runtime for the browser... in fact the best thing with DLRScript is that you can swap out JavaScript and use something else... like Ruby! (or Python).&lt;/p&gt;  &lt;p&gt;Once I’m done tech reviewing John Papa’s book I need to devote some more quality time to this...&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2676.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Tampa UX (TUX) First Meeting Tomorrow Night (Sept. 10th, 2008)!</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/09/tampa-ux-tux-first-meeting-tomorrow-night-sept.-10th-2008.aspx</link><pubDate>Tue, 09 Sep 2008 12:28:54 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/09/tampa-ux-tux-first-meeting-tomorrow-night-sept.-10th-2008.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2675.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2675.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/09/tampa-ux-tux-first-meeting-tomorrow-night-sept.-10th-2008.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2675.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Tampa UX (TUX) First Meeting Tomorrow Night (Sept. 10th, 2008)!</source><description>&lt;p&gt;Since we are still waiting on the website to go live (it will be at &lt;a href="http://www.tampaux.org"&gt;http://www.tampaux.org&lt;/a&gt; once the files get copied up), here’s some detailed info on the TUX meeting tomorrow ay 6:30 (for food) with the actual meeting starting around 7:00pm (we should be done around 9:00pm)&lt;/p&gt;  &lt;p&gt;Here’s Answers Systems (where we’re meeting) on Virtual Earth&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:84E294D0-71C9-4bd0-A0FE-95764E0368D9:926223b2-f2ec-40bc-ae3e-44751ae34e87" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;a href="http://maps.live.com/default.aspx?v=2&amp;amp;cp=28.03562~-82.65376&amp;amp;lvl=13&amp;amp;style=r&amp;amp;sp=aN.28.03668_-82.65289_Answer%2520Systems_Next%2520to%2520McDonald’s&amp;amp;mkt=en-US&amp;amp;FORM=LLWR" id="map-ada06814-4816-4d8c-a9b0-1f4701777f7a" alt="Click to view this map on Live.com" title="Click to view this map on Live.com"&gt;&lt;img src="http://theruntime.com/blogs/images/theruntime_com/blogs/jaykimble/WindowsLiveWriter/TampaUXTUXFirstMeetingTomorrowN.10th2008_CB9F/map-51b5592a42c6.jpg" width="320" height="240" alt="Map image" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;That address is &lt;/p&gt;  &lt;p&gt;4029 Tampa Rd, Oldsmar, FL 34677-3206.&lt;/p&gt;  &lt;p&gt;Basically, if you are coming from Tampa, take Hillsborough Ave. to Oldsmar. We’re the bullding (on the same side of the street) just past the McDonald’s that you come to after passing RaceTrack Rd.&lt;/p&gt;  &lt;p&gt;If you are coming from Pinellas, take 580 (or Tampa Rd) east. Look for right after 580 merges with Tampa Rd, look for the McDonald’s on the left (you can also turn at the light right after the merger with Tampa Rd. (but then you have to drive clear through the parking lot to get to our building).&lt;/p&gt;  &lt;p&gt;Answers Systems is the building next to McDonald’s (actually it is across the little side road there... not sure of the name... the back of our building faces McDonald’s).&lt;/p&gt;  &lt;p&gt;BTW, if you get lost my cell phone is 727.608.6453 (feel free to call me if you get lost).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;PS Contest!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In case you forgot, some lucky winner will walk away with an MSDN Premium Subscription (thanks to Bill Reiss)&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2675.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Coding4Fun Book News</title><link>http://theruntime.com/blogs/brianpeek/archive/2008/09/04/coding4fun-book-news.aspx</link><pubDate>Thu, 04 Sep 2008 21:00:42 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2008/09/04/coding4fun-book-news.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2674.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2674.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2008/09/04/coding4fun-book-news.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2674.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">Coding4Fun Book News</source><description>&lt;p&gt;Now that we have finished writing &lt;a href="http://www.amazon.com/dp/0596520743?tag=brianpcom-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0596520743&amp;amp;adid=0FQ6QZT3Z2Z76QW741PC&amp;amp;" target="_blank"&gt;the book&lt;/a&gt;, we finally have an official title and chapter listing.  Someday we may even have a cover.&lt;/p&gt;  &lt;p&gt;The title has morphed into &lt;a href="http://www.amazon.com/dp/0596520743?tag=brianpcom-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0596520743&amp;amp;adid=0FQ6QZT3Z2Z76QW741PC&amp;amp;" target="_blank"&gt;Coding4Fun: 10 .NET Programming Projects for Wiimote, YouTube, World of Warcraft, and More&lt;/a&gt; and the final chapter listing (not necessarily in this order) is:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Alien Attack:&lt;/b&gt; Create a 2D clone of Space Invaders with XNA for the PC, Xbox 360, and Zune &lt;/li&gt;    &lt;li&gt;&lt;b&gt;LEGO Soldier:&lt;/b&gt; Create an action game using Popfly with a custom-built virtual LEGO character &lt;/li&gt;    &lt;li&gt;&lt;b&gt;World of Warcraft RSS Feed Reader:&lt;/b&gt; Use WoW's customizable interface to have feeds pop up while you're gaming &lt;/li&gt;    &lt;li&gt;&lt;b&gt;InnerTube:&lt;/b&gt; Download YouTube videos automatically and convert them to a file format for off-line viewing &lt;/li&gt;    &lt;li&gt;&lt;b&gt;PeerCast:&lt;/b&gt; Stream video files from any PC &lt;/li&gt;    &lt;li&gt;&lt;b&gt;TwitterVote:&lt;/b&gt; Create custom online polls on Twitter &lt;/li&gt;    &lt;li&gt;&lt;b&gt;WHSMail:&lt;/b&gt; Build a website with ASP.NET for Windows Home Server that lets you view the messages stored on a computer with Outlook &lt;/li&gt;    &lt;li&gt;&lt;b&gt;"Wiimote" Controlled Car:&lt;/b&gt; Steer your remote-controlled car by tilting the Wii Remote controller left and right &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Wiimote Whiteboard:&lt;/b&gt; Create an interactive whiteboard using a Wii Remote &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Holiday Lights:&lt;/b&gt; Synchronize your holiday light display with music to create your own light show &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;We also have an official web site for the book located at &lt;a title="http://www.c4fbook.com/" href="http://www.c4fbook.com/"&gt;http://www.c4fbook.com/&lt;/a&gt;.  This will be the “go to” place for source code downloads, forum discussions, updates to all projects as we continue to work on them, and everything else you will need to fully enjoy the book.&lt;/p&gt;  &lt;p&gt;Get your pre-order in now and save 34% off the list price at &lt;a href="http://www.amazon.com/dp/0596520743?tag=brianpcom-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0596520743&amp;amp;adid=0FQ6QZT3Z2Z76QW741PC&amp;amp;" target="_blank"&gt;Amazon&lt;/a&gt;!  Or, buy from &lt;a href="http://oreilly.com/catalog/9780596520748/index.html" target="_blank"&gt;O’Reilly&lt;/a&gt; with another book and get a 3rd free!&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2674.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>TUX Update... (AKA I missed something)</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/04/tux-update.-aka-i-missed-something.aspx</link><pubDate>Thu, 04 Sep 2008 14:27:56 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/04/tux-update.-aka-i-missed-something.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2673.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2673.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/04/tux-update.-aka-i-missed-something.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2673.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">TUX Update... (AKA I missed something)</source><description>&lt;p&gt;&lt;strong&gt;MSDN Premium Subscription is up for grabs&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I forgot to mention this &lt;a href="http://theruntime.com/blogs/jaykimble/archive/2008/09/03/tux-tampa-ux-is-next-wednesday-sept.-10th-at-630pm.aspx"&gt;yesterday&lt;/a&gt;. Bill Reiss our resident MVP is giving away an MSDN Premium Subscription. So if you come you have a chance at &lt;img height="154" src="http://theruntime.com/blogs/images/theruntime_com/blogs/jaykimble/WindowsLiveWriter/TUXTampaUXisnextWednesdaySep.10that630pm_125D9/tux%20penguin_4.png" width="169" align="right" /&gt;getting it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Multi-location&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;BTW, we are working toward being multi-location, so if you are in another state in the US (probably more of an East Coast thing) or in Florida, one of our goals is to make our meetings available via streaming (but only to groups... sorry you won’t be able to just dial up our stream from your desk at home)&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2673.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>TUX (Tampa UX) is next Wednesday (Sept. 10th) at 6:30pm</title><link>http://theruntime.com/blogs/jaykimble/archive/2008/09/03/tux-tampa-ux-is-next-wednesday-sept.-10th-at-630pm.aspx</link><pubDate>Wed, 03 Sep 2008 18:53:52 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2008/09/03/tux-tampa-ux-is-next-wednesday-sept.-10th-at-630pm.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2672.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2672.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2008/09/03/tux-tampa-ux-is-next-wednesday-sept.-10th-at-630pm.aspx#comment</comments><slash:comments>1</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2672.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">TUX (Tampa UX) is next Wednesday (Sept. 10th) at 6:30pm</source><description>&lt;p&gt;The Tampa User eXperience User Group will have its first meeting next Wednesday. The presentation will be MS Ajax Client Script 101 by Jay E. Kimble (me). &lt;a href="http://theruntime.com/blogs/images/theruntime_com/blogs/jaykimble/WindowsLiveWriter/TUXTampaUXisnextWednesdaySep.10that630pm_125D9/tux%20penguin_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="218" alt="tux penguin" src="http://theruntime.com/blogs/images/theruntime_com/blogs/jaykimble/WindowsLiveWriter/TUXTampaUXisnextWednesdaySep.10that630pm_125D9/tux%20penguin_thumb_1.png" width="240" align="right" border="0" /&gt;&lt;/a&gt;We will be meeting at  Answers Systems (4029 Tampa Road, Oldsmar, Fl 34677... right next to the Oldsmar Fleamarket).&lt;/p&gt;  &lt;p&gt;Email me if you are planning on coming (use the contact form on the site). I will post my cell phone a day or two before (so you have someone to call in case you get lost).&lt;/p&gt;  &lt;p&gt;Pizza and drinks will be supplied, so come on out.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2672.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Prognostication.NET</title><link>http://theruntime.com/blogs/devprime/archive/2008/09/02/prognostication.net.aspx</link><pubDate>Tue, 02 Sep 2008 09:27:18 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/devprime/archive/2008/09/02/prognostication.net.aspx</guid><wfw:comment>http://theruntime.com/blogs/devprime/comments/2671.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/devprime/comments/commentRss/2671.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/devprime/archive/2008/09/02/prognostication.net.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/devprime/services/trackbacks/2671.aspx</trackback:ping><source url="http://theruntime.com/blogs/devprime/rss.aspx">Prognostication.NET</source><description>&lt;p&gt;"C#, .NET, Visual Basic, FoxPro, COM."&lt;/p&gt;
&lt;p&gt;"What are Microsoft technologies that should have died by now?"&lt;/p&gt;
&lt;p&gt;It's really interesting how the development community, in light of being a community of engineers, is so enthralled and passionate about subjective analysis and fortune-telling. I recently ran into a few online conversations with some long-time friends that lead me to think back to around 2001 to 2003 - a time rife with predictions about Microsoft technologies - and how most of those predictions never quite panned out. &lt;/p&gt;
&lt;p&gt;After the J++ lawsuit debacle, Microsoft decided to take Sun head-on with a brand new (yet another) C-derived language: C#, and its accompanying runtime and base class library. Right from the get-go, Microsoft had a hard time making people take the language seriously, even having to spend an inordinate amount of time explaining how the correct pronunciation was "see-sharp". Well, after 8 years, C# is alive and kicking. And so is the .NET stack. Few Microsoft shops would rather develop solutions in anything else these days. Interestingly enough, while C# borrowed much from other environments (including Java - and not forgetting that Java itself is heavily derivative), Java has in the past few years adopted many things from the C# language, runtime, BCL and IDE. &lt;/p&gt;
&lt;p&gt;VB has had a standing obituary for over a decade (which never quite proved to be reliable), but never a more pronounced one than during the first .NET release. People who always hated VB and "classic" VB aficionados alike derided the new "abomination" called VB.NET and perfunctorily declared Visual Basic dead. For some who were passionate about classic VB (and even classic BASIC, if ever there was such a standard), it was not merely that the VB flavor they knew and loved was dead and replaced by this thing so-called Visual Fred, VB.NOT, B#, or C-flat, but also that the new critter in VB clothing would be dead before long as well. Nothing could be farther from the truth. VB in its current incarnation is still the leading Microsoft development language (in terms of market share), beating both C++ and C#, and C# by a landslide at that. &lt;/p&gt;
&lt;p&gt;And while Microsoft, in a series of (monumental) marketing and technical blunders and omissions, has shut VB out of certain niches, VB's market share still rivals that of Java according to Forrester, much more so than C#. &lt;/p&gt;
&lt;p&gt;Of course, the opposite was also stated - that classic VB would die before long. Perhaps the feeding tube and respirator have been removed, but VB6 has shown a stubborn resilience and unwillingness to fade into the sunset. To me, that's hardly a surprise and only validates what I've said all along - that any development technology that is sufficiently adopted simply can't disappear in a short period of time. Chances are that one of your banks/credit-institutions/card companies/utility companies is still running a 15+ year old COBOL application. &lt;/p&gt;
&lt;p&gt;FoxPro. OK, Fox is gasping its last breath if you can't exactly call it dead. It's not really feasible to see that any other way. Unlike VB, FoxPro won't get a reincarnation. However, it does leave behind a legacy. It seeded many of the ideas behind some of the SQL Server tools as well as being an inspirational source for LINQ. &lt;/p&gt;
&lt;p&gt;For some who were absolutely giddy about .NET, there was the prediction that all other non-.NET development for the Microsoft platform would fade away - and most specifically, with regards to COM. Look, COM is most certainly a pain in the backside, but I always said it was far too ingrained near the heart of Windows to ever be removed. Like Iron Man, the best you can do is isolate yourself from the shrapnel with a shiny piece of technology. And MS isn't abstaining from developing new things with COM either. For 2005, the entire SSIS pipeline was built specifically for... you guessed it, COM. &lt;/p&gt;
&lt;p&gt;Having said all that, there are some things that have indeed bought the farm. Most of them were first stabs that proved somewhat inadequate. The biggest example I can find is Remoting. Not that there was too much wrong with the technology, but it simply wasn't as encompassing or as flexible as its successor, WCF. Of course, Remoting is more like undead than dead (it's still fully supported in the framework, but won't get any fixes or additions), still limping around in (now) legacy applications until someone gets the time to migrate it over to WCF. And WCF is a bit overwhelming for the average crowd, with all its buttons and levers. Of course, if you can complain about WCF's complexity, Remoting is probably not your thing either. &lt;/p&gt;
&lt;p&gt;A number of binding technologies seem to be destined for the same fate as well. I don't know if it's just me, but binding is always in a state of flux and nobody ever seems to *finally* get it right once and for all - a state of affairs that I'm sure leaves the anti-binding group in a standing ovation. &lt;/p&gt;
&lt;p&gt;And moving forward, I will throw my own prediction into the hat. It's hard to see that LINQ to SQL will survive Entity Framework. It would be a ridiculous situation to have LINQ technology, and yet have no way to query into a database using it. LINQ to SQL seemed to be a ready candidate to fill that hole for the initial release. But it's an extremely poor OR/M, if I'm even allowed to call it that, and is rife with limitations that make it impractical for a lot of scenarios. EF, on the other hand, just isn't finished. It's an ambitious vision to be sure, but once it's done, you will have a much more flexible system that can connect to multiple data sources (not just SQL Server), easily plug into custom entities, removes the lame 1-to-1 mapping between tables and entities, and all while keeping with a simple set of similar designers. In other words, it would effectively do everything LINQ to SQL does and much more. It's also being worked into the guts of ADO.NET Data Services as well. &lt;/p&gt;&lt;img src="http://theruntime.com/blogs/devprime/aggbug/2671.aspx" width="1" height="1" /&gt;</description><dc:creator>DevPrime</dc:creator></item><item><title>User Interface That Works - The Microwave With Only 4 Buttons</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/01/user-interface-that-works---the-microwave-with-only-4.aspx</link><pubDate>Mon, 01 Sep 2008 02:13:29 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2008/09/01/user-interface-that-works---the-microwave-with-only-4.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2670.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2670.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2008/09/01/user-interface-that-works---the-microwave-with-only-4.aspx#comment</comments><slash:comments>6</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2670.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">User Interface That Works - The Microwave With Only 4 Buttons</source><description>&lt;p&gt;At work we have a very simple microwave with only 4 buttons (not counting the door open lever/button):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.com/thomasswilliams/Screenshots/photo#5227956519045994978"&gt;&lt;img src="http://lh3.ggpht.com/thomasswilliams/SI1uwVLsmeI/AAAAAAAAAR4/7rwqvc6RQuo/s400/microwave-ui.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This microwave manages to be one of the most effective user interfaces I've ever come across. Pressing the plus ("+") button ups the time in 10 second increments, until you reach 90 seconds, and then it ups the time in 1 minute intervals. Once you pass 90 seconds, the display shows whole minutes. You can't set a time of 17 seconds, for example, or even 6 minutes and 30 seconds.&lt;/p&gt;
&lt;p&gt;Pressing the minus button decreases the time by 1 minute if the current time is more more than 90 seconds, and then it decreases the time in 10 second intervals down to zero. Pressing the "Start" button increases the time in 1 minute intervals, but only up to 3 minutes.&lt;/p&gt;
&lt;p&gt;All this I've figured out by experimentation. I reckon it's the lack of numeric precision and the associated traditional numeric keypad that makes this 4-button microwave so effective. The "+", "-", "Start" and "Cancel" buttons are self-explanatory, and experimenting with them instantly tells you what they do.&lt;/p&gt;
&lt;p&gt;Contrast this with the &lt;a href="http://theruntime.com/blogs/thomasswilliams/archive/2008/04/23/a-short-rant-on-one-example-of-why-over-engineering-stuff.aspx"&gt;horrible boiling water unit that I blogged about previously&lt;/a&gt;, where the buttons are unlabeled (and clicking them does nothing anyway), and the 4-button microwave comes out a long way in front.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Links: &lt;a href="http://theruntime.com/blogs/thomasswilliams/archive/2008/04/23/a-short-rant-on-one-example-of-why-over-engineering-stuff.aspx"&gt;http://theruntime.com/blogs/thomasswilliams/archive/2008/04/23/a-short-rant-on-one-example-of-why-over-engineering-stuff.aspx&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a href="http://technorati.com/tag/design" rel="tag"&gt;design&lt;/a&gt;, &lt;a href="http://technorati.com/tag/kitchen" rel="tag"&gt;kitchen&lt;/a&gt;, &lt;a href="http://technorati.com/tag/ui" rel="tag"&gt;ui&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2670.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>Handling Passwords</title><link>http://theruntime.com/blogs/devprime/archive/2008/08/29/handling-passwords.aspx</link><pubDate>Fri, 29 Aug 2008 09:46:13 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/devprime/archive/2008/08/29/handling-passwords.aspx</guid><wfw:comment>http://theruntime.com/blogs/devprime/comments/2669.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/devprime/comments/commentRss/2669.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/devprime/archive/2008/08/29/handling-passwords.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/devprime/services/trackbacks/2669.aspx</trackback:ping><source url="http://theruntime.com/blogs/devprime/rss.aspx">Handling Passwords</source><description>&lt;p&gt;There are two reasons I’m writing this post. First, I’ve noticed a slew of articles and blog entries lately about the topic. Now, that’s good from the perspective that it’s an indication of people taking the topic seriously, and also helps to get the word out. Second, I’ve noticed that the authors often have incomplete and/or somewhat inaccurate information, which I’m sure they got from reading someone else’s incomplete and/or inaccurate material. That doesn’t necessarily make it bad, but they write the material with an authoritative tone – because, you know, blog authors are all leading experts in their fields, including fields they decide to wander into on any given day for the sake of a post &lt;/p&gt;
&lt;p&gt;For those of you who missed the sarcasm: don’t believe everything you read on the internet, no matter who it comes from. Sounds like common sense, but that includes your favorite bloggers too, no matter how sharp you think they are. And on that note, I’ll give my standard security warning – although I’m pretty handy with math, I do not consider myself a true cryptanalyst. I am a hobbyist, enthusiast, and avid studier of cryptography. While some have considered that would make me something of an expert, I merely study the work of great cryptanalysts and I would prefer to be seen as just a guy who’s about to show you some of the things you need to know. So I encourage you to use this blog post the way you should use any blog post – as a stepping stone to research further, rather than the end-all and final word on the subject. The key being that when it comes to security, most developers just don’t know what they don’t know. Finally, the world of cryptology is steeped in detailed jargon and math formulas. This level of detail is absolutely necessary because in security, the devil is in the tiniest detail (and there are many). However, that level of detail also puts off about 90% of software developers. But since they are the ones who are entrusted with securing software, I will try to keep things at a fairly understandable level. Also, there are a few recent news items related to this topic that just begged to blogged about. So let’s dive right in. &lt;/p&gt;
&lt;h3&gt;The Importance of Passwords&lt;/h3&gt;
&lt;p&gt;Authentication is a critical operation for a vast amount of software. Systems need to know who any given user is. All of the user’s access to any given system, what they can and can’t do or see, is determined ultimately by who the system thinks they are. Password authentication works on the principle that a user knows a password that nobody else knows. The software has a record that lets it determine if a given user enters the right password. If they do, the software can be reasonably sure the user is who they claim to be. But in order for that to be effective, you need two things:&lt;br /&gt;
1) The password MUST be something that only the user knows. That means that a user must never divulge the password to ANYONE, including operators of the software.&lt;br /&gt;
2) It must be physically infeasible for someone else to get a hold of, or guess the password.&lt;br /&gt;
In order to get #2 right, the user is responsible for using a password that others can’t feasibly guess. This relates to password strength, which I’ll get to in a minute. It also means that the software must take precautions to forbid anyone but the user from seeing or otherwise getting a hold of the password. This means you should never, EVER, store a password in plain text. Ever. It doesn’t matter who you think has access to the data or not, stuff happens, and before you know it, your entire customer base’s data is in the hands of a malicious data thief. This has happened to MANY large corporations (for example, Citibank) despite their security measures. Besides being bad for business (most states are starting to require companies to publicly divulge when this sort of data compromise happens), some states now have laws that hold you (the data keeper) accountable and liable for data loss and compromise. That means users may be able to sue you if you didn’t do enough to protect their sensitive data. &lt;/p&gt;
&lt;p&gt;So why not use something else for authentication? For example, we know DNA, digital fingerprinting, possibly retinal scanning, and other biometrics are unique to a person, and not easily compromised or duplicated. Well, if you lose your finger or eye, it’s gone. If your DNA is ever compromised, you can’t really change it the way you would change your password. It’s compromised forever and you’d be stuck with the option of never doing computerized banking or shopping ever again (which I’m sure would be the least of your worries at that point). So for now, passwords are the “in” thing. &lt;/p&gt;
&lt;h3&gt;Password Strength&lt;/h3&gt;
&lt;p&gt;Because this system relies on the basis that only one person knows their password, you, as a user, must be responsible for creating passwords others can’t guess. With only 48 8-bit characters, the possible combinations of letters, numbers, and symbols (before you even touch Unicode) are unfathomable. But there are only a few hundred thousand actual words in any given language, so don’t use real words as passwords. Computers can run through an entire dictionary in less than a second, so breaking such passwords with what’s called “brute force” (checking all possibilities) is extremely easy for a computer. Furthermore, if you use real words, a computer doesn’t have to check all possibilities under some situations (more on that later). But on a computer that can check 1 Billion combinations per second, it would still take tens if not hundreds of trillions of years to go through 48 characters of possible combinations (assuming you could use up all 8 bits in each character). Also remember that as far as brute force attacks are concerned, security improves exponentially (not linearly) with password length. For example, doubling the size of a password doesn’t double the number of combinations, it squares them. &lt;/p&gt;
&lt;p&gt;So as far as security goes, you MUST have sufficiently long passwords. I’ve seen systems that require a limited number of characters (around 6 or 8 or so) and this is just not good enough. Anything less than 16 is probably asking for trouble – because on top of the number of bit combinations, people typically only use a limited set of values for each 8-bits (character, assuming non-Unicode). If you only use real words, then a potential data thief has an extremely narrow set of combinations to work with, so it’s important to really mix it up with as many combinations of numbers, letters, and symbols as possible. Also important for both users and software developers is the concept that passwords and validation algorithms must be case-sensitive. In English, with a 26 letter alphabet, you have 52 possible alphabetic characters (upper and lower case), but if your algorithm is case insensitive, you’ve thrown out 26 possibilities for each 8-bit chunk... which drastically reduces the overall effectiveness of the string when considering combinations. Since chances are that you are already working with a set of characters that doesn’t use up all 8 bits to begin with, then you really cripple the system by removing uniqueness based on character case.&lt;/p&gt;
&lt;p&gt;This of course, must be balanced with memory (human, not RAM). A password is absolutely no good if the user can’t remember it. So it must be easy enough to remember, and difficult enough to foil guessing. Arbitrary strings of characters usually end up being one or the other, but not both. A lot of passwords are stored in a database, and that becomes one of the most popular reasons for limiting the size. However, there are some techniques which do not limit the size of the password – effectively making them as long as you want (even if they are stored in a database). For such systems, a good alternative is to have a pass phrase. Just like passwords, it’s important to mix things up with letters, numbers, and symbols, but you can use an entire sentence of text (although, you’d probably want to avoid using too many “real” words). It’s easier to remember a phrase of large text than it is to remember an arbitrary albeit smaller string of characters. Unfortunately, few systems allow you to enter as much password text as you want, even if they are capable of storing much larger phrases. However, it is definitely something to consider if you are about to implement a new system. As far as resilience against brute force attacks go, the longer the better.&lt;/p&gt;
&lt;h3&gt;Storing Passwords&lt;/h3&gt;
&lt;p&gt;If you are thinking of storing passwords in plain text, just hang up your hat and go home. Leave the system unfinished. It’s simply not worth the future trouble and liability you are subjecting yourself to.  That leaves you the option of somehow scrambling the password so that even if the data is stolen, people won’t be able to discover anyone’s password. At this point, I really need to re-iterate rule #1 of encryption: Do not EVER invent your own data protection algorithm. I know you think you are smart, have an advanced degree, and have been programming since [insert your favorite archaic system here]. But unless you are a cryptanalyst [expert], you will regret it. Data thieves don’t care about your pedigree, and as smart as you think you are, the odds are definitely in their favor, not yours. In fact, crypto-systems’ strength isn’t necessarily measured by the intelligence of the person who came up with the algorithm. Many extremely smart people (I’ll wager smarter than both you and I put together) have created systems that ultimately failed at the hands of some malicious hacker.  Secure systems have withstood many years of attacks and analysis. That’s what you should go with – a standard that has a proven track record with no vulnerabilities found.&lt;/p&gt;
&lt;p&gt;Now is a good time to point out there are fundamentally two types of data protection primitives in use: encryption and cryptographic hash codes. The main difference between the two (although many details differ) is that encryption entails an algorithm that can both encrypt and decrypt text – that is to say, it can encrypt a chunk of plain text, and subsequently, it can decrypt the scrambled data back into plain text. On the other hand, cryptographic hash codes are one-way. You can’t “decode” a hash result back into the original plain text.&lt;/p&gt;
&lt;p&gt;There are many encryption schemes and algorithms out there, but for the sake of this conversation, let’s just say that all the useful ones require keys. These keys must be securely stored. If an attacker gets hold of the keys, they can decode your entire database of passwords, and at that point, the passwords might as well have been in plain text to begin with. Effective “key management” is very difficult, and I’ll postulate that you shouldn’t have to return scrambled passwords back to plain text anyway (more on that later).&lt;/p&gt;
&lt;h3&gt;Cryptographic Hashes&lt;/h3&gt;
&lt;p&gt;Cryptographic hash algorithms have a few important properties: &lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;They take an arbitrary amount of text and turn it into a (usually smaller) fixed-length code. Among other things, this makes cryptographic hash algorithms ideal for pass phrases. No matter how long the phrase is, the resulting hash code is a relatively small and fixed size (let’s say 128 or 512 bits or 32 to 64 bytes). &lt;/li&gt;
    &lt;li&gt;Running the same piece of plain text through a cryptographic hash algorithm will always result in the same hash code. &lt;/li&gt;
    &lt;li&gt;They should be as collision resistant as possible. That means that two different strings of plain text shouldn’t result in the same hash code. This is very important and I’ll discuss it later as well. &lt;/li&gt;
    &lt;li&gt;The algorithm shouldn’t be reversible. If all you have is the resulting hash code, it should be mathematically infeasible to run the algorithm backwards (or run some variation of the algorithm or any algorithm at all for that matter) that changes the resulting hash code back into the original plain text. &lt;/li&gt;
    &lt;li&gt;Changing the plain text input, even a tiny little bit, will cause significant changes in the resulting hash code. You shouldn’t be able to approximate the original text by using similar text, as they should result in wildly different codes. There should also be no resulting patterns where the occurrence of a sequence in plain text can be deduced from a sequence in the hash code. &lt;/li&gt;
&lt;/ol&gt;
From these properties, we can concoct a Hash-based password scheme. When a user creates a password, the password is run through a hash algorithm. The system stores the resulting hash code. When the user re-enters their password for authentication, the system runs the newly-entered password through the same hash algorithm, and then checks the results with the stored hash code. If both match, then we know we have the original password (due to properties 2 and 3 above). Note that we never stored the actual password, and because of property 4, we shouldn’t be able to algorithmically derive the original password from the stored code.
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Wow! That was easy. Well, not so fast, cowboy.  We still have a number of vulnerabilities to account for. In order to secure a system, you have to know how people will attack it. You can buy and install the thickest titanium steel door with the most complicated tamper-proof lock and it will do absolutely no good if someone can just go around to the back and open a window to get in. That is what cyber attackers live for, and they are much better at this than most of us. If you just took the preceding section into account, you would be in for a world of hurt, so it would be a good idea to see just how attackers try to get passed the system.&lt;/p&gt;
&lt;h3&gt;When Dictionaries aren’t Your Friend&lt;/h3&gt;
&lt;p&gt;The number one reason to avoid real words is that a brute force attack normally has to consider every possible combination. But if you use normal words (and most people apparently do), the attacker can just look at a much smaller set – about 500,000 or so possible words in the English language, for example. &lt;/p&gt;
&lt;p&gt;If you just relied on the scheme I detailed above, then the attacker doesn’t even have to resort to brute force. They can use the so-called Dictionary or Rainbow Table attacks. Basically, someone sets up a dictionary of hash codes for every possible word (more complex dictionaries have combinations of text, numbers, etc.). That way, if an attacker gets the stored hash code, their software just looks up the hash code in the dictionary or rainbow table, and viola, they have the corresponding plain text (and it took considerably less time than 13 trillion years).&lt;/p&gt;
&lt;p&gt;“So what,” I hear some of you say, “nobody has access to the password storage.” Think again. This is exactly the sort of attack that set entire UNIX networks on fire decades ago. The older Microsoft LanMan scheme suffers from the same problem. Many banks, online shopping companies, and even government agencies have had their data stolen in the past couple of years alone. It can happen to you. In fact, I’ve worked for two companies that hired me after having compromised data.&lt;/p&gt;
&lt;h3&gt;Salt and Speed Kills Rainbows&lt;/h3&gt;
&lt;p&gt;In order to foil these attacks, you have to produce hash codes such that pre-generation is infeasible. The first step is what’s called Salt or Nonce. This means that you append a piece of random data to the password before hashing it. This helps to stop even common words from being susceptible to dictionary/rainbow table attacks, but it’s still a good 