CINXE.COM

<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="generator" content="Gatsby 4.24.4"/><meta data-react-helmet="true" name="description" content="Steve is an experienced software architect and trainer, focusing currently on ASP.NET Core and Domain-Driven Design."/><meta data-react-helmet="true" name="theme-color" content="#fff"/><meta data-react-helmet="true" property="og:type" content="business.business"/><meta data-react-helmet="true" property="og:title" content="Ardalis is Steve Smith - ardalis"/><meta data-react-helmet="true" property="og:url" content="/"/><meta data-react-helmet="true" property="og:image" content="/img/og-image.jpg"/><style data-href="/styles.eb8fec05cba5de708da7.css" data-identity="gatsby-global-css">@import url(https://fonts.googleapis.com/css?family=Open+Sans:300,400);pre[class*=language-].line-numbers{counter-reset:linenumber;padding-left:3.8em;position:relative}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{border-right:1px solid #999;font-size:100%;left:-3.8em;letter-spacing:-1px;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;user-select:none;width:3em}.line-numbers-rows>span{counter-increment:linenumber;display:block}.line-numbers-rows>span:before{color:#999;content:counter(linenumber);display:block;padding-right:.8em;text-align:right}.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;text-align:right;-webkit-user-select:none;user-select:none}.command-line-prompt>span:before{content:" ";display:block;opacity:.7;padding-right:.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user=root]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}.command-line-prompt>span[data-continuation-prompt]:before{content:attr(data-continuation-prompt)}.command-line span.token.output{opacity:.7}code[class*=language-],pre[class*=language-]{word-wrap:normal;background:none;color:#f8f8f2;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;line-height:1.5;text-shadow:0 1px rgba(0,0,0,.3)}pre[class*=language-]{border-radius:.3em;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8292a2}.token.punctuation{color:#f8f8f2}.token.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#ae81ff}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#a6e22e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#e6db74}.token.keyword{color:#66d9ef}.token.important,.token.regex{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.entity{cursor:help}.badgescard,.firstinfo{align-items:center;display:flex;justify-content:center}.container{background-color:#fff;z-index:10}.content-card{-webkit-animation:animatop .9s cubic-bezier(.425,1.14,.47,1.125) forwards;animation:animatop .9s cubic-bezier(.425,1.14,.47,1.125) forwards;position:relative}.card{border-radius:3px;box-shadow:0 10px 20px rgba(0,0,0,.2);font-size:18px;min-height:100px;overflow:hidden;padding:20px;width:700px}.card:after{-webkit-animation:rotatemagic .75s cubic-bezier(.425,1.04,.47,1.105) 1s both;animation:rotatemagic .75s cubic-bezier(.425,1.04,.47,1.105) 1s both;background:#3571b8;content:"";display:block;height:300px;position:absolute;width:190px}.card-sidebar{background-color:#fff;border-radius:3px;font-size:15px;left:0;margin-top:-4%;min-height:100px;overflow:hidden;padding:10px;position:relative;width:400px!important}.card-sidebar:after{-webkit-animation:rotatemagic .75s cubic-bezier(.425,1.04,.47,1.105) 1s both;animation:rotatemagic .75s cubic-bezier(.425,1.04,.47,1.105) 1s both;background:#3571b8;content:"";display:block;height:300px;position:absolute;width:190px}.tile.is-child{width:100%}.tile:not(.is-child){display:flex;width:100%}@media only screen and (max-width:1024px){.card{display:none}.card-sidebar,.recent-post{width:100%!important}.twitter-timeline{margin-left:2%!important;width:600px!important}.blog-list-item .featured-thumbnail{margin:0 0 1em;text-align:center;width:100%}.blog-list-item header{display:block;width:800px!important}}@media only screen and (max-width:480px){.card{display:none}.card-sidebar{background-color:#fff;border-radius:3px;font-size:12px;left:0;min-height:180px;overflow:hidden;padding:0;position:relative;width:340px!important}.card-sidebar:after{-webkit-animation:rotatemagic .75s cubic-bezier(.425,1.04,.47,1.105) 1s both;animation:rotatemagic .75s cubic-bezier(.425,1.04,.47,1.105) 1s both;background:#3571b8;content:"";display:block;height:240px;position:absolute;width:150px}.sidebar{left:50%!important;margin:0!important;visibility:collapse;width:380px!important}.tile:not(.is-child){display:block;width:100%}.recent-post{width:320px!important}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding-bottom:0!important;padding-left:0!important;padding-right:0!important;padding-top:0}.MuiButton-root{margin-left:-5%!important;margin-top:5%!important}.MuiOutlinedInput-input{padding:14.5px 10px!important;width:280px!important}}@media only screen and (min-width:320px){.MuiOutlinedInput-input{padding:14.5px 10px!important;width:250px!important}}.sidebar{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(43,37,35,.1),0 0 0 1px rgba(43,37,35,.02);color:#4a4a4a;display:block;left:50%;padding-top:1.25rem;position:absolute;-webkit-transform:translate(-50%);transform:translate(-50%);z-index:0}.sidebar,ul li:before{font-weight:400;line-height:20px}.sidebar,h2,ul li:before{float:none;list-style:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIlJREFUeNpiYCATMKILmBbuMABSAUA84XS/xwdcGpmwiO0H4noQDTREgBSNMGCATzM2jYXEaGbEZhpQYQKQmo8kdAGIHZH9jNWpQAULgFQims3rifUjyBaSQhUWJaDQhfntA5rfccYjuiaQ/y4QE494NRHyI05NIMCCRcwRmuQWADU9YKA2AAgwANXjLnb5SuGCAAAAAElFTkSuQmCC);padding-right:.5em;position:relative;text-decoration:none}.sidebar,h2{font-weight:700;line-height:30px}.twitter-timeline{margin-left:2%!important}.firstinfo{flex-direction:row;padding:0;position:relative;z-index:2}.firstinfo img{border-radius:50%;height:120px;width:120px}.firstinfo .profileinfo{padding:0 10px 0 0}.firstinfo .profileinfo h1{font-size:1.8em}.firstinfo .profileinfo h3{color:#3571b8;font-size:1.2em;font-style:italic}.firstinfo .profileinfo p.bio{color:#5a5a5a;font-style:normal;line-height:1.2;padding:0}@-webkit-keyframes animatop{0%{bottom:-500px;opacity:0}to{bottom:0;opacity:1}}@keyframes animatop{0%{bottom:-500px;opacity:0}to{bottom:0;opacity:1}}@-webkit-keyframes animainfos{0%{bottom:10px}to{bottom:-42px}}@keyframes animainfos{0%{bottom:10px}to{bottom:-42px}}@-webkit-keyframes rotatemagic{0%{left:-253px;opacity:0;top:-24px;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{left:-78px;top:-24px;-webkit-transform:rotate(-30deg);transform:rotate(-30deg)}}@keyframes rotatemagic{0%{left:-253px;opacity:0;top:-24px;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{left:-78px;top:-24px;-webkit-transform:rotate(-30deg);transform:rotate(-30deg)}}.message-body{border-color:#5bc0de!important;border-radius:4px!important;border-style:solid;border-width:0 0 0 6px!important;font-size:1.7em}cite{color:#5bc0de!important}form input{border:2px;border-radius:6px;box-shadow:0 4px 1px rgba(0,0,0,.1);display:block;font-family:Merriweather,sans-serif;font-size:1.5em;margin-top:.5em;outline:0;padding:.7em;resize:none;width:60%}.form-control input:focus{background-color:#ffdae8}.section{padding:.8rem 1.5rem!important}.box{box-shadow:none!important}.navbar{font-size:1.2em;font-variant:unset;font-weight:600;min-height:5em}.recent-post{align-items:center;display:block;font-size:1em;margin-left:13px;width:340px}.recent-post,ul li:before{float:none;font-weight:400;left:3%;line-height:30px;list-style:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIlJREFUeNpiYCATMKILmBbuMABSAUA84XS/xwdcGpmwiO0H4noQDTREgBSNMGCATzM2jYXEaGbEZhpQYQKQmo8kdAGIHZH9jNWpQAULgFQims3rifUjyBaSQhUWJaDQhfntA5rfccYjuiaQ/y4QE494NRHyI05NIMCCRcwRmuQWADU9YKA2AAgwANXjLnb5SuGCAAAAAElFTkSuQmCC);padding-right:.5em;position:relative;text-decoration:none}@media print,screen and (min-width:769px){.column.is-12{flex:none;width:100%}}.subtitle{font-size:1rem!important;padding-top:4px}@media screen and (max-width:768px){.blog-list-item .featured-thumbnail{margin:0 0 1em;max-width:100%;text-align:center}.blog-list-item header{display:block;width:360px!important}}@media screen and (min-width:1024px){.navbar{min-height:4.25rem!important}}pre{font-family:Courier\ 10 Pitch,Courier,monospace;white-space:pre}code,pre{font-size:95%;line-height:140%;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-o-pre-wrap}code{background:#faf8f0;font-family:Monaco,Consolas,Andale Mono,DejaVu Sans Mono,monospace}#content code{border:1px solid #bebab0;display:block;padding:.5em 1em}body{margin:0;overflow:hidden;padding:0;width:100vw}.content .taglist{line-height:.5px!important;padding:2px!important}.MuiButton-root{height:55px!important;left:5%!important}.MuiOutlinedInput-input{width:300px!important}.MuiButton-containedPrimary{background-color:#3571b8!important;color:#fff}.form{left:55%!important;padding:10px!important}.content .catlist{align-items:center;display:block;flex-wrap:wrap;justify-content:left;list-style:none;margin:1.5rem 1.5rem 0 0;word-break:break-word!important}.gatsby-highlight-code-line{background-color:#feb;border-left:.25em solid #f99;display:block;margin-left:-1em;margin-right:-1em;padding-left:.75em;padding-right:1em}.gatsby-highlight pre[class*=language-].line-numbers{overflow:initial;padding:0 0 0 2.8em}.googletextbox{font-size:1em;padding:.1em}code[class*=language-],pre[class*=language-]{color:#9efeff;direction:ltr;font-family:Operator Mono,Fira Code,Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:17px;font-weight:400;-webkit-hyphens:none;hyphens:none;letter-spacing:.5px;line-height:25px;-o-tab-size:4;tab-size:4;text-align:left;text-shadow:0 1px #222245;white-space:pre;word-break:normal;word-spacing:normal}code[class*=language-] ::-moz-selection,code[class*=language-] ::selection,code[class*=language-]::-moz-selection,code[class*=language-]::selection,pre[class*=language-] ::-moz-selection,pre[class*=language-] ::selection,pre[class*=language-]::-moz-selection,pre[class*=language-]::selection{background:#a599e9;color:inherit}pre[class*=language-]{margin:.5em 0;overflow:auto;padding:2em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#1e1e3f}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em}.token{font-weight:400}.token.cdata,.token.comment,.token.prolog{color:#b362ff}.token.atrule,.token.delimiter,.token.important,.token.keyword,.token.selector{color:#ff9d00}.token.attr-name,.token.operator{color:#ffb454}.token.punctuation{color:#fff}.token.boolean{color:#ff628c}.token.builtin,.token.doctype,.token.tag,.token.tag .punctuation{color:#ff9d00}.token.entity,.token.symbol{color:#6897bb}.token.constant,.token.number,.token.property,.token.variable{color:#ff628c}.token.char,.token.string{color:#a5ff90}.token.attr-value,.token.attr-value .punctuation{color:#a5c261}.token.attr-value .punctuation:first-child{color:#a9b7c6}.token.url{color:#287bde;text-decoration:underline}.token.function{color:#fad000}.token.regex{background:#364135}.token.bold{font-weight:700}.token.italic{font-style:italic}.token.inserted{background:#0f0}.token.deleted{background:#ff000d}code.language-css .token.property,code.language-css .token.property+.token.punctuation{color:#a9b7c6}code.language-css .token.id,code.language-css .token.selector>.token.attribute,code.language-css .token.selector>.token.class,code.language-css .token.selector>.token.pseudo-class,code.language-css .token.selector>.token.pseudo-element{color:#ffc66d}.token.class-name{color:#fb94ff}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:none}pre .line-highlight,pre .line-highlight.line-highlight,pre>code.line-highlight{background:linear-gradient(90deg,rgba(179,98,255,.17),transparent);margin-top:36px}pre .line-highlight:before,pre .line-highlight[data-end]:after,pre>code.line-highlight:before,pre>code.line-highlight[data-end]:after{content:""}pre code{padding-left:0}.navbar .navbar-menu{box-shadow:none!important}.content .taglist{align-items:center;display:flex;flex-wrap:wrap;justify-content:left;list-style:none;margin:1.5rem 1.5rem 0 0}.content .taglist li{margin-bottom:1.5rem;margin-top:0;padding:0 2rem 1rem 0}.full-width-image-container{left:50%;margin:2em -50vw;position:relative;right:50%}.full-width-image,.full-width-image-container{align-items:center;background-position:bottom;background-size:cover;display:flex;height:400px;justify-content:center;width:100vw}.btn{background-color:#fff;border-radius:.25rem;box-shadow:inset 0 0 0 2px #3571b8;color:#000;display:inline-block;font-size:18px;font-size:1rem;font-weight:700;line-height:1.25;padding:12px 16px 10px;text-align:center;text-decoration:none;transition:all .15s ease}.btn:hover{background-color:#3571b8;color:#fff}.margin-top-0{margin-top:0!important}.navbar-item .icon{color:#2b2523}.icon svg{fill:currentColor;height:1.5rem;width:1.5rem}.navbar-brand .navbar-item.logo{padding:0 1rem}footer.footer{background-color:transparent;padding:3rem 0 0}.social{padding:2em}.social a{background-color:#f5f5f5;border-radius:1em;display:inline;height:1em;margin:.5em;padding:.5em .5em .3em;vertical-align:middle;width:1em}.blog-list-item.is-featured{background-color:#2989d879}.blog-list-item header{display:flex;margin-bottom:1em}.blog-list-item .featured-thumbnail{flex-basis:100%;margin:0}/*! bulma.io v0.8.2 | MIT License | github.com/jgthms/bulma */@-webkit-keyframes spinAround{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.button{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.box:not(:last-child),.content:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.subtitle:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.button,.input,.textarea{align-items:center;-moz-appearance:none;-webkit-appearance:none;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding:calc(.5em - 1px) calc(.75em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.input:active,.input:focus,.is-active.button,.is-active.input,.is-active.textarea,.textarea:active,.textarea:focus{outline:none}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */body,h1,h2,h3,h4,html,li,p,textarea,ul{margin:0;padding:0}h1,h2,h3,h4{font-size:100%;font-weight:400}ul{list-style:none}button,input,textarea{margin:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:#fff;font-size:16px;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility}article,footer,header,section{display:block}body,button,input,textarea{font-family:BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif}code{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#333;font-size:1em;font-weight:400;line-height:1.5}a{color:#3273dc;cursor:pointer}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#f14668;font-size:.875em;font-weight:400;padding:.25em .5em}img{height:auto;max-width:100%}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}@media screen and (max-width:768px){.is-size-3-mobile{font-size:2rem!important}.is-size-5-mobile{font-size:1.25rem!important}}@media print,screen and (min-width:769px){.is-size-2-tablet{font-size:2.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-4-widescreen{font-size:1.5rem!important}}.has-text-centered{text-align:center!important}.has-background-black{background-color:#2b2523!important}.has-text-primary{color:#2b2523!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#0f0d0c!important}.has-text-white-ter{color:#f5f5f5!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-block{display:block!important}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(43,37,35,.1),0 0 0 1px rgba(43,37,35,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(43,37,35,.1),0 0 0 1px #3273dc}a.box:active{box-shadow:inset 0 1px 2px rgba(43,37,35,.2),0 0 0 1px #3273dc}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding:calc(.5em - 1px) 1em;text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button:hover{border-color:#b5b5b5;color:#363636}.button:focus{border-color:#3273dc;color:#363636}.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-link{background-color:#3273dc;border-color:transparent;color:#fff}.button.is-link:hover{background-color:#276cda}.button.is-link:focus,.button.is-link:hover{border-color:transparent;color:#fff}.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#2366d1;border-color:transparent;color:#fff}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (min-width:1216px){.container{max-width:1152px}}@media screen and (min-width:1408px){.container{max-width:1344px}}.content li+li{margin-top:.25em}.content p:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.icon{align-items:center;display:inline-flex;height:1.5rem;justify-content:center;width:1.5rem}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.notification{background-color:#f5f5f5;border-radius:4px;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code{background:#fff}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-link{background-color:#3273dc;color:#fff}@-webkit-keyframes moveIndeterminate{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{0%{background-position:200% 0}to{background-position:-200% 0}}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body).is-link{background-color:#3273dc;color:#fff}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle span,.title span{font-weight:inherit}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-4{font-size:1.5rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.input,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.textarea:active,.textarea:focus{border-color:#3273dc;box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(43,37,35,.05);max-width:100%;width:100%}.is-link.input,.is-link.textarea{border-color:#3273dc}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.field:not(:last-child){margin-bottom:.75rem}.control{box-sizing:border-box;clear:both;font-size:1rem;text-align:left}.card,.control{position:relative}.card{background-color:#fff;box-shadow:0 .5em 1em -.125em rgba(43,37,35,.1),0 0 0 1px rgba(43,37,35,.02);color:#4a4a4a;max-width:100%}.menu,.message{font-size:1rem}.message{background-color:#f5f5f5;border-radius:4px}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-link{background-color:#eef3fc}.message.is-link .message-body{border-color:#3273dc;color:#2160c4}.message-body{border:solid #dbdbdb;border-radius:4px;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.navbar{background-color:#fff}.navbar{min-height:3.25rem;position:relative;z-index:30}.navbar.is-link{background-color:#3273dc;color:#fff}.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#2366d1;color:#fff}}.navbar>.container{width:100%}.navbar-brand,.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem}.navbar-brand{flex-shrink:0}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;margin-left:auto;position:relative;width:3.25rem}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;-webkit-transform-origin:center;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,-webkit-transform;transition-property:background-color,opacity,transform;transition-property:background-color,opacity,transform,-webkit-transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:first-child{top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:first-child{-webkit-transform:translateY(5px) rotate(45deg);transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){-webkit-transform:translateY(-5px) rotate(-45deg);transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}a.navbar-item{cursor:pointer}a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#3273dc}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item{align-items:center;display:flex}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(43,37,35,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar-burger{display:none}.navbar-item{align-items:center;display:flex}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}a.navbar-item.is-active{color:#2b2523}a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}@media print,screen and (min-width:769px){.column.is-offset-1{margin-left:8.33333%}.column.is-4{flex:none;width:33.33333%}.column.is-6{flex:none;width:50%}.column.is-7{flex:none;width:58.33333%}.column.is-10{flex:none;width:83.33333%}.column.is-12{flex:none;width:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:.75rem}.columns.is-multiline{flex-wrap:wrap}@media print,screen and (min-width:769px){.columns:not(.is-desktop){display:flex}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media print,screen and (min-width:769px){.tile:not(.is-child){display:flex}.tile.is-4{flex:none;width:33.33333%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-10{flex:none;width:83.33333%}.tile.is-12{flex:none;width:100%}}.section{padding:3rem 1.5rem}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}@media screen and (min-width:769px) and (max-width:1023px){.blog-list-item .featured-thumbnail{flex-basis:50%}}@media screen and (max-width:768px){.blog-list-item header{display:block}.blog-list-item .featured-thumbnail{margin:0 0 1em;max-width:70%;text-align:center}}a{text-decoration:none}</style><script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl+'';f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer', 'GTM-NVBMVX8');</script><title data-react-helmet="true">Software Development | Ardalis is Steve Smith - ardalis</title><link data-react-helmet="true" rel="alternate" type="application/rss+xml" title="RSS Feed for Ardalis" href="/rss.xml/"/><link data-react-helmet="true" rel="apple-touch-icon" sizes="180x180" href="/img/apple-touch-icon.png"/><link data-react-helmet="true" rel="icon" type="image/png" href="/img/favicon-32x32.png" sizes="32x32"/><link data-react-helmet="true" rel="icon" type="image/png" href="/img/favicon-16x16.png" sizes="16x16"/><link data-react-helmet="true" rel="mask-icon" href="/img/safari-pinned-tab.svg" color="#ff4400"/><link rel="sitemap" type="application/xml" href="/sitemap/sitemap-index.xml"/><style id="jss-server-side"></style></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NVBMVX8" height="0" width="0" style="display: none; visibility: hidden" aria-hidden="true"></iframe></noscript><div id="___gatsby"><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><div><nav class="navbar is-transparent" role="navigation" aria-label="main-navigation"><div class="container"><div class="navbar-brand"><a class="navbar-item" title="Logo" href="/"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAA8CAYAAADc3IdaAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AUaFDE304pirgAAFAJJREFUeNrtnWuUFNW1x/+8RBQRb0TUCCKaiIrgMFXVNeioGDVqjBFRQ2JMYu7FBwJdp7pnesY7gBo16sVHjBo0PtY1JgZ0KcShq6p73g+J4AMf+MAkeNVEE18gIjjAOvdD74Geoaf7nO6q7p6e+rDX4gN9XlX1m3P22fu/wTlHvkydFz1AYfYNqhm/UzHsJZlMZfYdGost0eY5E/I5Tt+yNwCHA7hS0L7rr5lvUu9XPjtTDGvByQvXcr22k+s17QLWwU9e/BJXmbXUf1j9BlhnA+CC1jyA1+lIAHcD+A2Ae9LYfQDOk2h3OICfAfgDgLUAXgLQDuAuAKf6wBK0sjkrRyhG9I1AdQtXmS1sWriRq2bsU8WoP8oHQr/4EGdIAGvFAF6n6RLrdLtgm98G0JamnR0Ern19YGWwcub8Qo+0c9V0pIClMpvrtR283Ije5gPBB1YJrZMG4GvBdbpBoL1DALwp2N4SH1hpd1dLhyrMekmPtEnDSmU2D4SbuGpY/9bmN3/Th4IPLB9YKdu7U2LddwII+MDqa3dlWhcHqluy2l11W0VNB1eYvdCHgg8sH1gp/VYbJNZd+Jg54IA1cxkfrDC7VY+0Zw0rldk8UNXMFcN+7+T50YN9MPjA8oHVo60TAGySBNbTPrBS3QwGnXO0cCPXzFhOwFKZzfWaTq4xO+iDwQeWD6webU0FsFkSWPU+sFKGMkQtvaYjZ1ipzOaB6hauGNaG0+Y27+/DwQeWD6zdbf0HgA8kgfWAD6zegaJBp1ILxbs0M+4KsFTT4XqkjSsh++c+HHxg+cDq0d4TksCa5QOrN7BM68kKl3ZXe3ZZrVwxrHWVi5qG+4DwgeUDa3d70wBsE2yvCcA+PrCSj4KhqKKG4tu0UNxVYKlmjOvVLVwzrdk+IHxg+cDq0eaPBZzvnQDG+3FYvUMZDOshvbZD6hZQNOxBj7RxJWi1V1Y2DfEh4QPLB1aPdqcAeBjAXwFsBbALwKcA1gG4DsAoPzWn91HQsI5XWWyLFm4Q8kupzN6lGHaTYlhbRW4TNTPGA+EmHmDRc31I+MDygZWy/QMBnATgFErZGewnP/ed5HyPqO8qUNXEFcN6v9y0j0jEa7UJhji0c5XZtg8JH1g+sHy1hqxt2oL4OI05H2tVjQLgcbhe28EVZt3COYfCnMv0SJvY0TAU55oZ36mx+tP9B+kDywdW0c1vCIB9KQp/txUdsMqZfVNFbae4EgOztihG/CjOOU6b27y/Ythv6YKKDnpNB1eN6FM+KFx5uQ4CMA5AGYBKACfTceIYAN/ob8ACMAzAeBrPFQCqANxMci330b+DAC4EMCnfCgalBCyKA6sAcA3J5TxJqhFrADzfyywA/wvgVySDcyKAkQUBlh5yxijM+jBQ1SSWH1jbuZfWlRK0g3Tcywy8UJyrofhXqrGqvB9C4kAAxwH4HoBLAcwFwADMBnAegKMBHOBh/8cCuBrAg/RyvUvX4jt7fSxfU1BijBJsz0nnuC0ksACMAnA+6UitJqezyDi+BvAizU9P0/4lJM+Sya4pdWDRWv+IdLf+TzIGrLfkzXr6IzIDwNC8AUsJWjWJm0FHADYNXDXj2wMhZ1qPNsL1Y1VmfRCoahaHnmE9lscHdQqAmQAu6MN+QDa2j53MTACPA/g7gO1pHuQ2AG8DeBTATwAc5NJfwqsAxDP0nck20F/I44sBWAAmArgJwDs5zClZycABcHaKfmKCbawBMKgA8jJXA5gH4No0FgRwQQ5rPYZuG992Ya37Crv4SV/r59qHXFHVMVJl0b8HZI5zzFreRzrPjcK7rMRN5JayYP2kPAFrteDCX9Prd2eS8mO2D/IdALUAxmQx5pEAQnTV7ebLtYVUM79ZCGABOBjAbXRt78XHcy+AA5P6axL8XbwAwKqQmFdHpvH10ccPPQRVquDWSs+ApRjW3IQig4DD3IxzLdy4Q2P26anbqj9KNezPA+FGcekZw7ovT8B6TnDB70r6TYTiYdx4kG/JpFUAOI3+4nv5cm0AcD71d2o+gEXH5tfy8OF0AJhIfXYWMbA0AF2C7TXIAgvArXkCVe9TxsJkZ707An2LXxihMmt9oLpVMPCznZcHVzWnjeVi1lJR530gcSP5uRbyvlgFvcAii/0U/f9FHj3MiwXGGs7x6Cd7lPo5gHIJOK/I8hn8d54/nBfJgb+6yIH1tVvj6+XGuL8AsEq2u10FlrLAuUyvbhXcXTk8UNXMy41o2l2CxuwpKrO/Fk3tIbjdVETAepH8BV48wE8BTM4wzl8X4MXaCuABAF94BSwA/1Ogj6aZnMMDDVi1BYbVv5OLZ+T8AVf+9NHhCrPWiAZ8BiKtXDGiLweMZRmvkVVmLa+o6RSXUWb2v5S59WOLBFg7JF4gWbs+wxhvLPBLtsMLYAH4ZYHnxQcSsCjE5csCruNmADNc9WEpzL4oUC2TB9jOFcOZIxTTFbJO00LxXaLif3pNB1fN6HVFAiyv7D0AB6cZ3y/6yUctBSwK/eA+sPIKrN9nOf+PyN9Xn2TPAmgF8LcUoTOprAvAD111ulcubhqiGlaz8O4qcYP417LIC6MknPlx0RvDhIyytfHkmvrRJQysa9KM7XgPb8wKBiwKW/inCz62DQAaATxD8UM2XUhs8oG1V3vjAXwsMeftlHR9BoDDAAxL0eZgAN+gBO159Cz6am+e62ENmuGcpYUadmmhmFgaTk07V4xVtXKqD86shJJDTEzgr6ada8y+tkSB9VK69Ab6EHP1F8QBLCXH9lXkw3iAPu5PCwSsx3LoYw2AagCTU8WyUcrIUQBmAVjm0hGoFIB1kcR8P8m2ijeA02n3JTTfHEMZVtWL736auMrsD5Vw81jZXZxiWGv1SKu4wF/Qev2skLNfPwDWJwDeoFCJtRRrlU6E7ZI04zojh9CJlymtYnyGuU+gNJe/5AtYAAJZ3nS+BeAyWaE68ts86wML1RLzNV34rubRTvchTyLdy41V09VQfIfMLZ7C7CXZgdGZIx7j5XA90sqVoH1FkQKrO0r8TDrqjKar4+EUCHkCpTw82etDbQYwJM24svnIPqObzP0k12AogCvJV+E1sJ7Iot3H0/n5JG7HugYwsO6UOAqWufRtTQYwwhNgqcz+g2hxiUSSs/NFebDx29lF0a8YqRrWO8JR9JE2rhjW2vHzV+1TRMD6nKLNZRKJdQAt9PtT0/y/4wB8JTmed9PlzQmO70QAr3oFLNrRyfqXHnDxWQcHMLDulvANnlHU8jLlZvQkNRTbqoUaBHdXz3GFWY/mnKcoqg8vGOuVR2C9C6Aiy/6GA/h+OgE2ChCV9VW59VdxQg7QygSsOZLtNaZy9uY4v/sHKLAWSsz3qaIGlmpYD1XUPiesqKCF4tsDoXotJ2CFm8eqzPlAVAlCj7Rx1bCaMXPZ4AIDaxMAxeNQi6jkmC51uf+pdLx0G1h/kmjrCwBTPVjb0XQVP9CAdbHknB8GMK7ogFU2v3GiypzNWkg8z09l1kp3yoZZt1eI6sSbMa6FG3eppnV2gYFV5TGsDpa8fn7Go3EsdBNYAPYDsFGiraUervG1AxBYR2dxHP8ngesS8keNlfWPug4sxbCXCAv0mTFOx8bvujHYQFXsGNWMbdIEk6L1mnauGlZ9AYG10WvRfwDTJW4HdwI406NxjCbJHLeANUlSz+oUjwXq3huAgaO5hMnsIp2sl0lvzaYLlDsALABwLj3jUZ4BK6G7bn1MaTCC1W2i7ZWL3atuoxrRh0X14rVQnKtmrEsx7YoCAes3echt/JnEeF5x28fTayy3uAiscyVA/KrXdfYo0HSgAWs63FMZSSfet4wyNCa4CizVsK6Xcnx7UD8wEHKmqabTJRxOUdPBVcN6skDAmp0HYEUkxvOgx2P5nuQLng5YV0i081ge1nnuQANWln+EcrFNAP6Y7hQg/MCmzo8erJr2+6JKoHp1C1eY9dKkRa+7/hddNaJPCYdUhBq4FopvKzejJ+UZWF1eO9tpPHdJvBALPB7LRAqGdQNYMn6jujys83ckYFxKwBqaQ05hLmlUjyQLQ0oDSw1aTDSqXWUO1xMl5edyzlFXxwfV1fFBM2cuGzxT8tausnLxkO7f19XxQZxzTDOcs1Qz3iWWErRbRvl3eQbWllQLXmBgzfJ4LMMkVU3TAesGiXbm5mGdVZed2v0CWEnP9Y4CpKK9DWCaNLCmBJ85UGW2cODmnoh0a7XC7LjK7CaV2U2qYTdrZryl3PzzsYJH0KsCkdb23b9ndpPCrAbVsJpVw9ouquKQkFF2viw37WPzCKzNMkGieQLWjDyM522XgHVTkQFLkUgRKilgJfVxIYAX8gytfwAolwJWIjWmTbjsfLJ6gh5p43qkNWE1bbziutVcY9GA4I3k3adc/8qe30dauR5pI9UHR2ostMu6M8/AGpOHD+luiYf/I4/HMlwyZikdsEyJdiJ5WOdTJXS+ShJY1M8I8i92euyQT7Y3u1OtMg5wcsjZTzHsdbqg/HEmR7wWbuRKKKqI7bDs2yquW517v8zmgXAjV5j9cblpH1FiwJJR4Ax7PJZvSQaQrnBJ1+vBPKzz5QPR6Z5BOvl0KgLSmQehv5uEgKWa9o/1SCvXTKdfA6v7xlBj1i9LDFgyO5E/eTyW810Ma5CRN1mT6wcoMLd7fWCldcyPpxSyCNUYXEGqHm8B+JByXXPZkX0E4CARaZfnsjkOFiOwEjec0X9MCTljSghYsyRzGkcXyW4vE7BkPsAvABzn8VH3dR9YWV3CjCTRvnFUTfw/qdDt+iygdW6mhOPvB6qauahzu9iBtXuXZVhVJQSs4yS14y/3sJL1ey4CazSAf0m0daOHa3zBQJRI9vi9HUkaWFsl1vWWTMBqEA9l6B/A0qtbuGJYG8rmxEeVCLBk//qv8yIqXDKAVTT5uUUyj+1Qj9a4xQeWZ+/vAomjopXGdxU9Qws37HJtd1UkwNpdCINFrykFYNGYHpT8oBa63P+0LHXRMwFLtkrOox6s7dws5lVqcViHexU6QsfF9wXHvT7N7ir6jLAyQr8DVisvN6xXy+asHFEiwLoI8jlcl7rU9zjJHZ4MsE4TrLDiiToGRbdv8YG1O9L9Cbd3sQAOkAg2frsPUMTKVSaer9ddEadHzFUqcyUOK5VRbJbwTSZF4rPoZSUCrJGkBy9bBvzyHPudnGMg4QqB26d1WbS72IU1PY9UYvlABlaK5Pp3SCt/sEvv7owMdQx6ujP6SMP5o/juyul2yr+pGNZzqmE/36cx+3kt1LBGC0WPE9xhzdNrOtembdOwn1cNa7XK7HXduzhhgT9mrS5bunZofwcWjasuSwmQewAcIdnXvgAMF6roiGi6ZytT/BSAE7JYx1Gk5741h3mVilrDiWmecTuBa2QO7+z+VIBFdF2fSFF2/tkTVGZ/lUhnEQwVMKyNU9izh6OublDZnKVDM5nwhGYuGzzp4uXDMrVXV8cHTQ45+ynMbhG+JOhWkzCsC0oEWIdK+AJ62wcAbqaKMcMz1D1cQBpH+aqac1AWip/JOvr30nX6/hn6mUQQfsMv88UBYB/Bd309VRpXZaSLaLxtkus6N5Xv6n7R8vDdYQIKc2qK4cZBYfZFwjUMyfmuGtGmUgAWje2/cvzQuugI9jSAJQBqANxOvovVFO9UiLqEV7rQ12s0r1sAXEc70joAv6VnutkvpNqjvSVZ1s18hI6R0wEcA+CQJDueKngvzyIyfheAqT3lj8ONE1XT+UyrahTfXZnO+0q4fmwxAGvSouXDFGatEQ10JUXUnYpR/50SAdZg+ihLrfLzkCx06/1S9VmOj+LO3MgT/JRUaLstl/Sdtr1Sc5Sgfauo/HEiobiDK8HoDcUAq6Q5XKFH2oR9WRU1HVwxon8uBWAlXUG/UUrASqrOs7HA4y15PawsL3DyYef0ANb0qthhqml/KFqVJhBu4hqzP562ID6umIBVNmflCCVovxYQTNbWQnGusdhOxayvKAVgJTlLC/XSbZeQYVkhOa/pLjj6s7UmiXJm/X2HNVuysInXtnQveRnNtBcJyx8zm+s1nbw8aN1eTLDaU+TVmq/XtIvvsmo7uMKs35cKsJKcyOvz/GJ9QtIjG70AVpLW+0d5ntdGUqJoGEA+LDXHIrlu2arkatB75I+Z/a6o/LEWbuSq6XwWYPbRxQiswGL7IIXZG4XnE2rgqulsU4LO1FIBFo31yCxL2Gdjm3dv24ENXgErKf7rL3mElUr9OgMsrOHQAsgjJ9vTAA7YS3FUYXYwsbsSjGGq7eSqGf1tMcJq947RsGr1WvE5JW5GraWlBKwkR7whmUicTWXrs5L6fN5LYCUlR98pmfgtaw0Ajknq87EBGul+SZ53W9spzGavMAlMWrR8mGpE39QF5Y9pN7LVDblhL236tbHDVMP6SLQkmZYQ+NtUNj86sZSA1Utc7w6XwbUTwOMAJvbqS/Smst6FeVXQLuArl3dV83t/MAB+Lfj79lJLfiY1jqspdMErUHWRjpbe5zjKjegsPdIud6vGoo8UM6ySbz1l/HKJeofO7aUIrF7HRBNAcw5xVZ9RbNaMPvq4la6wt6SxL90UFKSg15vpg9qWxZy+oliz+QDGpik99jKlI63tw9YBuL+EJZL3BTATwEO0s97hAqT+RhkXGYvhQmXWO6JxV1qogWtm7Ettnj2lPwBLCzkTVMP+KBAWjStr4iqzPtNCzoRSBVaKxOULASwGsJJ8T119ONObSD3hBwAOEUhvOZJUKPuyI71aH7pwmE3yvXGKAdqV4tjxCoDfUaDjt/K89v1eXoai4csoRecWcpC/niHe6gMArbTb/yndaAtnv/w/LBIG8ME2qG8AAAAHdEVYdEF1dGhvcgCprsxIAAAACHRFWHRDb21tZW50APbMlr8AAAAKdEVYdENvcHlyaWdodACsD8w6AAAADnRFWHRDcmVhdGlvbiB0aW1lADX3DwkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjAtMDUtMjZUMjA6Mzk6NTMrMDA6MDBIKo/0AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIwLTA1LTI2VDIwOjM5OjUzKzAwOjAwOXc3SAAAAAx0RVh0RGVzY3JpcHRpb24AEwkhIwAAAAt0RVh0RGlzY2xhaW1lcgC3wLSPAAAACXRFWHRTb2Z0d2FyZQBdcP86AAAAB3RFWHRTb3VyY2UA9f+D6wAAAAZ0RVh0VGl0bGUAqO7SJwAAAAh0RVh0V2FybmluZwDAG+aHAAAAAElFTkSuQmCC" alt="Ardalis" style="width:150px"/></a><div class="navbar-burger burger " data-target="navMenu" role="button" tabindex="0"><span></span><span></span><span></span></div></div><div id="navMenu" class="navbar-menu "><div class="navbar-start has-text-centered"><a class="navbar-item" href="/blog">Blog</a><a class="navbar-item" href="/training-classes">Training</a><a class="navbar-item" href="/mentoring">Mentoring</a><a class="navbar-item" href="/tips">Subscribe</a><a class="navbar-item" href="/interviews">Interviews</a><a class="navbar-item" href="/books">Books</a><a class="navbar-item" href="/tools-used">Tools Used</a><a class="navbar-item" href="/contact-us">Contact</a></div><div class="navbar-end has-text-centered"><a class="navbar-item" href="https://www.facebook.com/StevenAndrewSmith" target="_blank" rel="noopener noreferrer"><span class="icon"><img src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RmFjZWJvb2sgaWNvbjwvdGl0bGU+PHBhdGggZD0iTTIyLjY3NiAwSDEuMzI0Qy41OTMgMCAwIC41OTMgMCAxLjMyNHYyMS4zNTJDMCAyMy40MDguNTkzIDI0IDEuMzI0IDI0aDExLjQ5NHYtOS4yOTRIOS42ODl2LTMuNjIxaDMuMTI5VjguNDFjMC0zLjA5OSAxLjg5NC00Ljc4NSA0LjY1OS00Ljc4NSAxLjMyNSAwIDIuNDY0LjA5NyAyLjc5Ni4xNDF2My4yNGgtMS45MjFjLTEuNSAwLTEuNzkyLjcyMS0xLjc5MiAxLjc3MXYyLjMxMWgzLjU4NGwtLjQ2NSAzLjYzSDE2LjU2VjI0aDYuMTE1Yy43MzMgMCAxLjMyNS0uNTkyIDEuMzI1LTEuMzI0VjEuMzI0QzI0IC41OTMgMjMuNDA4IDAgMjIuNjc2IDAiLz48L3N2Zz4=" alt="facebook"/></span></a><a class="navbar-item" href="https://www.linkedin.com/in/stevenandrewsmith" target="_blank" rel="noopener noreferrer"><span class="icon"><img src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+TGlua2VkSW4gaWNvbjwvdGl0bGU+PHBhdGggZD0iTTIwLjQ0NyAyMC40NTJoLTMuNTU0di01LjU2OWMwLTEuMzI4LS4wMjctMy4wMzctMS44NTItMy4wMzctMS44NTMgMC0yLjEzNiAxLjQ0NS0yLjEzNiAyLjkzOXY1LjY2N0g5LjM1MVY5aDMuNDE0djEuNTYxaC4wNDZjLjQ3Ny0uOSAxLjYzNy0xLjg1IDMuMzctMS44NSAzLjYwMSAwIDQuMjY3IDIuMzcgNC4yNjcgNS40NTV2Ni4yODZ6TTUuMzM3IDcuNDMzYy0xLjE0NCAwLTIuMDYzLS45MjYtMi4wNjMtMi4wNjUgMC0xLjEzOC45Mi0yLjA2MyAyLjA2My0yLjA2MyAxLjE0IDAgMi4wNjQuOTI1IDIuMDY0IDIuMDYzIDAgMS4xMzktLjkyNSAyLjA2NS0yLjA2NCAyLjA2NXptMS43ODIgMTMuMDE5SDMuNTU1VjloMy41NjR2MTEuNDUyek0yMi4yMjUgMEgxLjc3MUMuNzkyIDAgMCAuNzc0IDAgMS43Mjl2MjAuNTQyQzAgMjMuMjI3Ljc5MiAyNCAxLjc3MSAyNGgyMC40NTFDMjMuMiAyNCAyNCAyMy4yMjcgMjQgMjIuMjcxVjEuNzI5QzI0IC43NzQgMjMuMiAwIDIyLjIyMiAwaC4wMDN6Ii8+PC9zdmc+" alt="linkedin"/></span></a><a class="navbar-item" href="https://twitter.com/ardalis" target="_blank" rel="noopener noreferrer"><span class="icon"><img src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+VHdpdHRlciBpY29uPC90aXRsZT48cGF0aCBkPSJNMjMuOTU0IDQuNTY5Yy0uODg1LjM4OS0xLjgzLjY1NC0yLjgyNS43NzUgMS4wMTQtLjYxMSAxLjc5NC0xLjU3NCAyLjE2My0yLjcyMy0uOTUxLjU1NS0yLjAwNS45NTktMy4xMjcgMS4xODQtLjg5Ni0uOTU5LTIuMTczLTEuNTU5LTMuNTkxLTEuNTU5LTIuNzE3IDAtNC45MiAyLjIwMy00LjkyIDQuOTE3IDAgLjM5LjA0NS43NjUuMTI3IDEuMTI0QzcuNjkxIDguMDk0IDQuMDY2IDYuMTMgMS42NCAzLjE2MWMtLjQyNy43MjItLjY2NiAxLjU2MS0uNjY2IDIuNDc1IDAgMS43MS44NyAzLjIxMyAyLjE4OCA0LjA5Ni0uODA3LS4wMjYtMS41NjYtLjI0OC0yLjIyOC0uNjE2di4wNjFjMCAyLjM4NSAxLjY5MyA0LjM3NCAzLjk0NiA0LjgyNy0uNDEzLjExMS0uODQ5LjE3MS0xLjI5Ni4xNzEtLjMxNCAwLS42MTUtLjAzLS45MTYtLjA4Ni42MzEgMS45NTMgMi40NDUgMy4zNzcgNC42MDQgMy40MTctMS42OCAxLjMxOS0zLjgwOSAyLjEwNS02LjEwMiAyLjEwNS0uMzkgMC0uNzc5LS4wMjMtMS4xNy0uMDY3IDIuMTg5IDEuMzk0IDQuNzY4IDIuMjA5IDcuNTU3IDIuMjA5IDkuMDU0IDAgMTMuOTk5LTcuNDk2IDEzLjk5OS0xMy45ODYgMC0uMjA5IDAtLjQyLS4wMTUtLjYzLjk2MS0uNjg5IDEuOC0xLjU2IDIuNDYtMi41NDhsLS4wNDctLjAyeiIvPjwvc3ZnPg==" alt="twitter"/></span></a><a class="navbar-item" href="https://www.youtube.com/ardalis/" target="_blank" rel="noopener noreferrer"><span class="icon"><img src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48dGl0bGU+WW91VHViZSBpY29uPC90aXRsZT48cGF0aCBkPSJNMjMuNDk1IDYuMjA1YTMuMDA3IDMuMDA3IDAgMCAwLTIuMDg4LTIuMDg4Yy0xLjg3LS41MDEtOS4zOTYtLjUwMS05LjM5Ni0uNTAxcy03LjUwNy0uMDEtOS4zOTYuNTAxQTMuMDA3IDMuMDA3IDAgMCAwIC41MjcgNi4yMDVhMzEuMjQ3IDMxLjI0NyAwIDAgMC0uNTIyIDUuODA1IDMxLjI0NyAzMS4yNDcgMCAwIDAgLjUyMiA1Ljc4MyAzLjAwNyAzLjAwNyAwIDAgMCAyLjA4OCAyLjA4OGMxLjg2OC41MDIgOS4zOTYuNTAyIDkuMzk2LjUwMnM3LjUwNiAwIDkuMzk2LS41MDJhMy4wMDcgMy4wMDcgMCAwIDAgMi4wODgtMi4wODggMzEuMjQ3IDMxLjI0NyAwIDAgMCAuNS01Ljc4MyAzMS4yNDcgMzEuMjQ3IDAgMCAwLS41LTUuODA1ek05LjYwOSAxNS42MDFWOC40MDhsNi4yNjQgMy42MDJ6Ii8+PC9zdmc+" alt="youtube"/></span></a><a class="navbar-item" href="https://github.com/ardalis" target="_blank" rel="noopener noreferrer"><span class="icon"><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iQ2FwYV8xIiB3aWR0aD0iNDM4LjU0OSIgaGVpZ2h0PSI0MzguNTQ5IiB4PSIwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MzguNTQ5IDQzOC41NDkiIHk9IjAiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzOC41NDkgNDM4LjU0OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PHBhdGggZD0iTTQwOS4xMzIsMTE0LjU3M2MtMTkuNjA4LTMzLjU5Ni00Ni4yMDUtNjAuMTk0LTc5Ljc5OC03OS44QzI5NS43MzYsMTUuMTY2LDI1OS4wNTcsNS4zNjUsMjE5LjI3MSw1LjM2NSBjLTM5Ljc4MSwwLTc2LjQ3Miw5LjgwNC0xMTAuMDYzLDI5LjQwOGMtMzMuNTk2LDE5LjYwNS02MC4xOTIsNDYuMjA0LTc5LjgsNzkuOEM5LjgwMywxNDguMTY4LDAsMTg0Ljg1NCwwLDIyNC42MyBjMCw0Ny43OCwxMy45NCw5MC43NDUsNDEuODI3LDEyOC45MDZjMjcuODg0LDM4LjE2NCw2My45MDYsNjQuNTcyLDEwOC4wNjMsNzkuMjI3YzUuMTQsMC45NTQsOC45NDUsMC4yODMsMTEuNDE5LTEuOTk2IGMyLjQ3NS0yLjI4MiwzLjcxMS01LjE0LDMuNzExLTguNTYyYzAtMC41NzEtMC4wNDktNS43MDgtMC4xNDQtMTUuNDE3Yy0wLjA5OC05LjcwOS0wLjE0NC0xOC4xNzktMC4xNDQtMjUuNDA2bC02LjU2NywxLjEzNiBjLTQuMTg3LDAuNzY3LTkuNDY5LDEuMDkyLTE1Ljg0NiwxYy02LjM3NC0wLjA4OS0xMi45OTEtMC43NTctMTkuODQyLTEuOTk5Yy02Ljg1NC0xLjIzMS0xMy4yMjktNC4wODYtMTkuMTMtOC41NTkgYy01Ljg5OC00LjQ3My0xMC4wODUtMTAuMzI4LTEyLjU2LTE3LjU1NmwtMi44NTUtNi41N2MtMS45MDMtNC4zNzQtNC44OTktOS4yMzMtOC45OTItMTQuNTU5IGMtNC4wOTMtNS4zMzEtOC4yMzItOC45NDUtMTIuNDE5LTEwLjg0OGwtMS45OTktMS40MzFjLTEuMzMyLTAuOTUxLTIuNTY4LTIuMDk4LTMuNzExLTMuNDI5Yy0xLjE0Mi0xLjMzMS0xLjk5Ny0yLjY2My0yLjU2OC0zLjk5NyBjLTAuNTcyLTEuMzM1LTAuMDk4LTIuNDMsMS40MjctMy4yODljMS41MjUtMC44NTksNC4yODEtMS4yNzYsOC4yOC0xLjI3Nmw1LjcwOCwwLjg1M2MzLjgwNywwLjc2Myw4LjUxNiwzLjA0MiwxNC4xMzMsNi44NTEgYzUuNjE0LDMuODA2LDEwLjIyOSw4Ljc1NCwxMy44NDYsMTQuODQyYzQuMzgsNy44MDYsOS42NTcsMTMuNzU0LDE1Ljg0NiwxNy44NDdjNi4xODQsNC4wOTMsMTIuNDE5LDYuMTM2LDE4LjY5OSw2LjEzNiBjNi4yOCwwLDExLjcwNC0wLjQ3NiwxNi4yNzQtMS40MjNjNC41NjUtMC45NTIsOC44NDgtMi4zODMsMTIuODQ3LTQuMjg1YzEuNzEzLTEyLjc1OCw2LjM3Ny0yMi41NTksMTMuOTg4LTI5LjQxIGMtMTAuODQ4LTEuMTQtMjAuNjAxLTIuODU3LTI5LjI2NC01LjE0Yy04LjY1OC0yLjI4Ni0xNy42MDUtNS45OTYtMjYuODM1LTExLjE0Yy05LjIzNS01LjEzNy0xNi44OTYtMTEuNTE2LTIyLjk4NS0xOS4xMjYgYy02LjA5LTcuNjE0LTExLjA4OC0xNy42MS0xNC45ODctMjkuOTc5Yy0zLjkwMS0xMi4zNzQtNS44NTItMjYuNjQ4LTUuODUyLTQyLjgyNmMwLTIzLjAzNSw3LjUyLTQyLjYzNywyMi41NTctNTguODE3IGMtNy4wNDQtMTcuMzE4LTYuMzc5LTM2LjczMiwxLjk5Ny01OC4yNGM1LjUyLTEuNzE1LDEzLjcwNi0wLjQyOCwyNC41NTQsMy44NTNjMTAuODUsNC4yODMsMTguNzk0LDcuOTUyLDIzLjg0LDEwLjk5NCBjNS4wNDYsMy4wNDEsOS4wODksNS42MTgsMTIuMTM1LDcuNzA4YzE3LjcwNS00Ljk0NywzNS45NzYtNy40MjEsNTQuODE4LTcuNDIxczM3LjExNywyLjQ3NCw1NC44MjMsNy40MjFsMTAuODQ5LTYuODQ5IGM3LjQxOS00LjU3LDE2LjE4LTguNzU4LDI2LjI2Mi0xMi41NjVjMTAuMDg4LTMuODA1LDE3LjgwMi00Ljg1MywyMy4xMzQtMy4xMzhjOC41NjIsMjEuNTA5LDkuMzI1LDQwLjkyMiwyLjI3OSw1OC4yNCBjMTUuMDM2LDE2LjE4LDIyLjU1OSwzNS43ODcsMjIuNTU5LDU4LjgxN2MwLDE2LjE3OC0xLjk1OCwzMC40OTctNS44NTMsNDIuOTY2Yy0zLjksMTIuNDcxLTguOTQxLDIyLjQ1Ny0xNS4xMjUsMjkuOTc5IGMtNi4xOTEsNy41MjEtMTMuOTAxLDEzLjg1LTIzLjEzMSwxOC45ODZjLTkuMjMyLDUuMTQtMTguMTgyLDguODUtMjYuODQsMTEuMTM2Yy04LjY2MiwyLjI4Ni0xOC40MTUsNC4wMDQtMjkuMjYzLDUuMTQ2IGM5Ljg5NCw4LjU2MiwxNC44NDIsMjIuMDc3LDE0Ljg0Miw0MC41Mzl2NjAuMjM3YzAsMy40MjIsMS4xOSw2LjI3OSwzLjU3Miw4LjU2MmMyLjM3OSwyLjI3OSw2LjEzNiwyLjk1LDExLjI3NiwxLjk5NSBjNDQuMTYzLTE0LjY1Myw4MC4xODUtNDEuMDYyLDEwOC4wNjgtNzkuMjI2YzI3Ljg4LTM4LjE2MSw0MS44MjUtODEuMTI2LDQxLjgyNS0xMjguOTA2IEM0MzguNTM2LDE4NC44NTEsNDI4LjcyOCwxNDguMTY4LDQwOS4xMzIsMTE0LjU3M3oiLz48L2c+PGRpdiBpZD0iZGl2U2NyaXB0c1VzZWQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiLz48c2NyaXB0IGlkPSJnbG9iYWxWYXJzRGV0ZWN0aW9uIiBzcmM9ImNocm9tZS1leHRlbnNpb246Ly9jbWtkYm1mbmRrZmdlYmxkaG5rYmZobG5lZWZkYWFpcC9qcy93cnNfZW52LmpzIi8+PC9zdmc+" alt="Github"/></span></a></div></div></div></nav><div><section class="section"><div class="container"><div class="columns"><div class="tile is-ancestor"><div class="tile is-vertical is-7"><div class="tile"><div class="tile is-parent"><article class="tile is-child box"><div class="content"><div class="column is-10 is-offset-1" style="margin-bottom:6rem"><h3 class="title is-size-4 is-bold-light">960 posts categorized under “Software Development”</h3><ul class="catlist"><li><a href="/interfaces-describe-what-implementations-describe-how/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Interfaces Describe What - Implementations Describe How</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 September 2024</p><p style="width:100%;margin-top:2rem">When working with software development, especially in object-oriented or component-based systems, understanding the distinction between interfaces and implementations is crucial. The two terms often come up in conversations about architecture, design patterns, and coding best practices, but what do they really mean? In this post, we&#x27;ll break down the difference and why it matters. YouTube What is…</p><br/></li><li><a href="/from-microservices-to-modular-monoliths/"><h2 class="is-size-2" style="width:100%;word-break:break-word">From Microservices to Modular Monoliths</h2><img src="/static/bb8769e1b15474a72ab20ff58f2dfea4/4e530/from-microservices-to-modular-monoliths.png" alt="From Microservices to Modular Monoliths" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 July 2024</p><p style="width:100%;margin-top:2rem">What do you do when you find yourself in microservice hell? How do you keep the gains you (hopefully) made in breaking up your legacy ball of mud, without having to constantly contend with a massively distributed system? Migrate to a modular monolith. Microservices Microservices have been all the rage for the past several years. They offer a way to break up large, monolithic applications into…</p><br/></li><li><a href="/navigation-properties-between-aggregates-modules/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Modeling Navigation Properties Between Aggregates or Modules</h2><img src="/static/cf9e9e1b9e6684d276bf60c4670afe27/4e530/modeling-navigation-properties-between-aggregates-modules.png" alt="Modeling Navigation Properties Between Aggregates or Modules" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 June 2024</p><p style="width:100%;margin-top:2rem">One of the key challenges in developing a modular monolith is managing the communication between different modules, especially when it comes to handling data dependencies across module boundaries. Recently, I received an interesting question from one of the students of my modular monoliths course, which I thought others might appreciate. Student Query Modular Monolith course question (EFCore…</p><br/></li><li><a href="/comparing-unit-testable-code-with-maintainable-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Comparing Unit Testable Code with Maintainable Code</h2><img src="/static/560bccdc6e765c0a3e800eface52047d/4e530/comparing-unit-testable-code-with-maintainable-code.png" alt="Comparing Unit Testable Code with Maintainable Code" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2024</p><p style="width:100%;margin-top:2rem">Writing maintainable code should be a goal in most software engineering projects. Although definitions and especially hard measurements of what maintainable means with regard to software may vary, it can be useful to compare maintainable code to the much more easily verified unit testability of that code. Introduction When discussing software quality, two important concepts often arise: unit…</p><br/></li><li><a href="/effectively-sharing-resources-between-modules-modular-monolith/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Effectively Sharing Resources Between Modules in a Modular Monolith</h2><img src="/static/9c59956eb676d2885e904b84ead8b856/4e530/effectively-sharing-resources-between-modules-modular-monolith.png" alt="Effectively Sharing Resources Between Modules in a Modular Monolith" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 May 2024</p><p style="width:100%;margin-top:2rem">One of the key challenges in developing a modular monolith is managing the communication between different modules, especially when it comes to handling data dependencies across module boundaries. Recently, I received an interesting question from one of the students of my modular monoliths course, which I thought others might appreciate. Student Query Hi Steve, I have another question for you…</p><br/></li><li><a href="/clean-architecture-sucks/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Clean Architecture Sucks</h2><img src="/static/122853a6b33d0b145944a824f9fbf747/4e530/clean-architecture-sucks.png" alt="Clean Architecture Sucks" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 May 2024</p><p style="width:100%;margin-top:2rem">The other day I was participating in a conversation online in an architecture forum. One of the participants was complaining about the mess they were cleaning up from a team they&#x27;d joined. The team had, ostensibly, been following Clean Architecture, but the code they had produced was a mess. Their conclusion: Clean Architecture sucks. They led with: Clean Architecture and its obsession with…</p><br/></li><li><a href="/technology-edges-bleeding-leading-rusting/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Navigating the Edges of Technology in Software Development: Bleeding, Leading, Dull, and Rusting</h2><img src="/static/783bafeeb82888452c3332521dd3f4ae/4e530/technology-edges-bleeding-leading-dull-rusting.png" alt="Navigating the Edges of Technology in Software Development: Bleeding, Leading, Dull, and Rusting" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 April 2024</p><p style="width:100%;margin-top:2rem">In the fast-evolving world of software development, keeping pace with technology trends is both a necessity and a challenge. Companies and developers often find themselves making critical decisions about whether to adopt new technologies early (bleeding edge), wait until they mature (leading edge or cutting edge), or continue using older, more established technologies (what I&#x27;ll call the dull edge…</p><br/></li><li><a href="/stop-debugging-start-running-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Stop Debugging and Start Running in Visual Studio</h2><img src="/static/2770e9f7993e484c471178ad44cced3f/6050d/stop-debugging-start-running-visual-studio.png" alt="Stop Debugging and Start Running in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 April 2024</p><p style="width:100%;margin-top:2rem">NOTE: Watch the video above to see actual timings of starting with and without debugging. Vote for this feature request to make Run vs Debug more obvious in Visual Studio.. Thanks! I work with a lot of different .NET developers as a trainer, architect, and consultant with NimblePros. One thing that I&#x27;m frequently pointing out to them is the difference in startup speed for their applications when…</p><br/></li><li><a href="/5-rules-dtos/"><h2 class="is-size-2" style="width:100%;word-break:break-word">5 Rules for DTOs</h2><img src="/static/91daa50bf1dfd2df7f2b1641e22251d2/6050d/5-Rules-DTOs.png" alt="5 Rules for DTOs" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 April 2024</p><p style="width:100%;margin-top:2rem">If you don&#x27;t like reading, here&#x27;s my YouTube video with samples that covers why these 5 rules will help you write better DTOs: What&#x27;s a DTO? A DTO is a Data Transfer Object. Its job is to transfer data, and it can be used both to send data and to receive it. Often, data transferred will use different types (possibly even different programming languages and technology stacks) on each end of the…</p><br/></li><li><a href="/active-local-nuget-server/"><h2 class="is-size-2" style="width:100%;word-break:break-word">An Active Local NuGet Server</h2><img src="/static/10ff227d7124b285e9db32ff77e708b6/4e530/active-local-nuget-server.png" alt="An Active Local NuGet Server" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 February 2024</p><p style="width:100%;margin-top:2rem">As I&#x27;m writing this the Internet is out. When that happens, it makes it very difficult to work on development projects that have NuGet dependencies, especially when it comes to adding anything new to a project. A local NuGet server that kept up-to-date with my commonly used packages would be helpful right now. NuGet already has a local NuGet cache. You&#x27;ll find it in your user profile folder. Here…</p><br/></li><li><a href="/introducing-modular-monoliths-goldilocks-architecture/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Introducing Modular Monoliths: The Goldilocks Architecture</h2><img src="/static/da3f931f45eae950713cf57bfa3a19a4/4e530/introducing-modular-monoliths-goldilocks-architecture.png" alt="Introducing Modular Monoliths: The Goldilocks Architecture" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 February 2024</p><p style="width:100%;margin-top:2rem">In the world of software architecture, finding the perfect balance between complexity and simplicity can often feel like an elusive quest. Developers and architects are constantly navigating the spectrum between traditional monoliths, known for their simplicity but criticized for their scalability and maintainability issues, and microservices, praised for their scalability and flexibility but…</p><br/></li><li><a href="/hello-mongodb-getting-started-mongo-dotnet/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Hello, MongoDB - Getting Started with Mongo and dotnet 8</h2><img src="/static/38ad04be9cea91fcc1e0cdd86429d23e/4e530/hello-mongodb-getting-started-mongo-dotnet.png" alt="Hello, MongoDB - Getting Started with Mongo and dotnet 8" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 February 2024</p><p style="width:100%;margin-top:2rem">Integrating .NET Core with MongoDB in a Dockerized Environment Hello, fellow developers! Whether you&#x27;re building a new project or integrating into an existing one, this guide is your starting point for a &quot;hello world&quot; level application in the .NET 8 plus MongoDB stack. Let&#x27;s get to it! Prerequisites Before we begin, ensure you have the following installed on your machine: Docker .NET SDK (I&#x27;m…</p><br/></li><li><a href="/hello-redis-getting-started-with-redis-dotnet/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Hello, Redis - Getting Started with Redis and dotnet 8</h2><img src="/static/719f1444b52f911b4b232d8dc5a78e0c/4e530/hello-redis-getting-started-with-redis-dotnet.png" alt="Hello, Redis - Getting Started with Redis and dotnet 8" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 February 2024</p><p style="width:100%;margin-top:2rem">Integrating Redis Caching in .NET 8 Applications Redis is an open-source, in-memory data structure store, used as a database, cache, and message broker. It&#x27;s known for its speed and flexibility, making it an excellent choice for caching in modern applications. In this article, we&#x27;ll explore how to use Redis for caching in a .NET 8 application, covering both setting up Redis using Docker on a…</p><br/></li><li><a href="/http-file-not-sending-auth-header/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Solved! Visual Studio .http File Not Sending Authorization Header</h2><img src="/static/2c9f26f006ac87c33a28210bc9b0d49f/4e530/http-file-not-sending-auth-header.png" alt="Solved! Visual Studio .http File Not Sending Authorization Header" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2024</p><p style="width:100%;margin-top:2rem">I ran into a weird problem with how Visual Studio was sending API requests. I was trying to use a bearer token, and it worked fine in Swagger, but from an .http file the Authorization header was simply being ignored, resulting in a 401 Unauthorized. The Problem I&#x27;d built a simple ASP.NET Core webapi project using the default template. I was using the built-in support for .http files to execute…</p><br/></li><li><a href="/log-request-headers-middleware/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Log Request Headers Middleware for ASP.NET Core</h2><img src="/static/e1ce485064b5ab0f203b9f1de96dda6d/4e530/log-request-headers-middleware.png" alt="Log Request Headers Middleware for ASP.NET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 January 2024</p><p style="width:100%;margin-top:2rem">Recently I ran into a weird problem with how Visual Studio was sending API requests and I really wanted to see exactly what headers were being sent to my ASP.NET Core app. So I wrote this simple bit of middleware to do the job. What is Middleware If you&#x27;re not familiar with middleware, it&#x27;s a set of functions (&quot;request delegates&quot;) that are executed in a particular order as part of every request…</p><br/></li><li><a href="/2023-year-in-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">2023 Year in Review</h2><img src="/static/4f931f745eb3102e23dfb7dafe357509/4e530/2023-year-in-review.png" alt="2023 Year in Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 January 2024</p><p style="width:100%;margin-top:2rem">Now that CodeMash is over (I had a workshop and 2 talks, including a new one), I can focus enough to write up this review post. For those who care to see how things have progressed over the years, a brief history of similar such posts is listed below. If you want to write your own such article, I have a checklist linked at the bottom of the list. My 2017 Year in Review My 2018 Year in Review My…</p><br/></li><li><a href="/scaling-your-software-team-develop-vs-hiring/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Scaling Your Software Team: Development vs. Hiring</h2><img src="/static/dc2df87262156b04a0af0b6e1759819f/4e530/scaling-your-software-team-develop-vs-hiring.png" alt="Scaling Your Software Team: Development vs. Hiring" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 December 2023</p><p style="width:100%;margin-top:2rem">Scaling up and scaling out, originally application terms, offer a fresh perspective on team development. In team contexts, scaling up involves enhancing existing members&#x27; skills, offering depth and cost efficiency, whereas scaling out adds new members for diverse skills and increased capacity. The choice hinges on project needs and long-term goals, each strategy presenting distinct benefits and…</p><br/></li><li><a href="/new-course-refactoring-solid-csharp-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">New Course - Refactoring to SOLID C# Code</h2><img src="/static/764dac2fb50a039029b256ed9bd834c9/4e530/new-course-refactoring-solid-csharp-code.png" alt="New Course - Refactoring to SOLID C# Code" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 November 2023</p><p style="width:100%;margin-top:2rem">I&#x27;m thrilled to announce the release of my latest Pluralsight course, Refactoring to SOLID C# Code. This course is designed for software developers, architects, and anyone interested in enhancing their coding skills, especially in the C# programming language. Description Legacy code is often difficult to maintain and extend. In this course, Refactoring to SOLID C# Code, you’ll learn to apply…</p><br/></li><li><a href="/entity-framework-core-understanding-migrations-snapshots-synchronization/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Understanding Migrations, Snapshots, and Synchronization in Entity Framework Core</h2><img src="/static/b674c6a2807b27b3d0b95a6c26995dc3/4e530/entity-framework-core-understanding-migrations-snapshots-synchronization.png" alt="Understanding Migrations, Snapshots, and Synchronization in Entity Framework Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2023</p><p style="width:100%;margin-top:2rem">Entity Framework Core: Understanding Migrations, Snapshots, and Synchronization Entity Framework Core (EF Core) is a powerful tool for managing database schema migrations and synchronization in .NET projects. This article aims to explore the core components that EF Core uses to maintain this sync: migration files, model snapshots, and a special database table. We&#x27;ll also clarify the roles of and…</p><br/></li><li><a href="/process-bloat-silent-killer-developer-productivity/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Process Bloat: The Silent Killer of Developer Productivity</h2><img src="/static/f13f5d18dce95fb79caffb751fcdde05/4e530/process-bloat-silent-killer-developer-productivity.png" alt="Process Bloat: The Silent Killer of Developer Productivity" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 October 2023</p><p style="width:100%;margin-top:2rem">Introduction In the exhilarating infancy stages of a software development project, teams are marked by agility, prompt decision-making, and a zest for delivering valuable features. Yet, as projects gain complexity and scale, many fall prey to a lesser-known but insidious anti-pattern: Process Bloat. This bureaucratic monster not only hampers innovation but becomes a silent killer of developer…</p><br/></li><li><a href="/principles-lean-software-development/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Principles of Lean Software Development</h2><img src="/static/2fe851f08b9e837bb79044da164cf354/4e530/principles-lean-software-development.png" alt="Principles of Lean Software Development" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 October 2023</p><p style="width:100%;margin-top:2rem">Lean Software Development is an agile project management and product development framework that originated from Lean manufacturing principles. It focuses on delivering value to the customer by optimizing resources, workflows, and processes. Below is a breakdown of its core principles: 1. Eliminate Waste The first principle of Lean Software Development is to eliminate waste, a concept borrowed from…</p><br/></li><li><a href="/introduction-to-masstransit-csharp-guide/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Introduction to MassTransit: A Guide to Streamlined Messaging in C#</h2><img src="/static/b0942936dcc4e6e98128b7fa1abdc19c/4e530/introduction-to-masstransit-csharp-guide.png" alt="Introduction to MassTransit: A Guide to Streamlined Messaging in C#" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 September 2023</p><p style="width:100%;margin-top:2rem">If you&#x27;re interested in building distributed, scalable, and robust applications in C#, you may have heard of MassTransit. This open-source messaging framework simplifies working with message brokers like RabbitMQ and Azure Service Bus, allowing you to focus more on business logic and less on infrastructure concerns. What Is MassTransit? MassTransit is a free, open-source distributed application…</p><br/></li><li><a href="/trunk-based-development-vs-long-lived-feature-branches/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Trunk-Based Development vs. Long-Lived Feature Branches: Which One is Right for Your Software Team?</h2><img src="/static/0d3a4e4d0a9ddfe9dac9bd5cb67c9926/4e530/trunk-based-development-vs-long-lived-feature-branches.png" alt="Trunk-Based Development vs. Long-Lived Feature Branches: Which One is Right for Your Software Team?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 September 2023</p><p style="width:100%;margin-top:2rem">When it comes to effective software development strategies, two distinct approaches often lock horns: Trunk-Based Development and Long-Lived Feature Branches. Each has its unique merits and challenges, and knowing which one to adopt can significantly influence your project&#x27;s success. In this post, we&#x27;ll delve deep into the pros and cons of both approaches and even show you a C# example…</p><br/></li><li><a href="/building-resilient-email-method-dotnet-retry-outbox-pattern/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Building a Resilient Email Sending Method in .NET with SmtpClient, Retry Support, and the Outbox Pattern</h2><img src="/static/0702451c2b7e647355137d9cfd74ec2d/4e530/building-resilient-email-method-dotnet-retry-outbox-pattern.png" alt="Building a Resilient Email Sending Method in .NET with SmtpClient, Retry Support, and the Outbox Pattern" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 September 2023</p><p style="width:100%;margin-top:2rem">Introduction In the world of software applications, email sending functionalities are indispensable. From password resets to notifications, you can&#x27;t afford to let a hiccup in the network or an SMTP server issue derail you. So how do you ensure reliability in email operations? In this post, we&#x27;ll dive into creating a resilient email sending method in .NET using the class and incorporating retry…</p><br/></li><li><a href="/aspnetcore-clean-architecture-template-version-8/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Core Clean Architecture Template v8 Released</h2><img src="/static/1d5659a55198f9e6e800d0890fd5043a/4e530/aspnetcore-clean-architecture-template-v8.png" alt="ASP.NET Core Clean Architecture Template v8 Released" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 August 2023</p><p style="width:100%;margin-top:2rem">I&#x27;ve just published a new version of my Clean Architecture Solution Template for ASP.NET Core applications. This is version 8 of the template, though to be clear it is still targeting the current version of .NET (.NET 7). I&#x27;ll create another update once .NET 8 ships in November 2023. What&#x27;s New This version introduces some pretty major changes, which I&#x27;ll highlight here. The biggest ones have to…</p><br/></li><li><a href="/mastering-unit-tests-dotnet-best-practices-naming-conventions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Mastering Unit Tests in .NET: Best Practices and Naming Conventions</h2><img src="/static/3446ef0b6c0997b466549767af0d66c1/4e530/mastering-unit-tests-dotnet-best-practices-naming-conventions.png" alt="Mastering Unit Tests in .NET: Best Practices and Naming Conventions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 August 2023</p><p style="width:100%;margin-top:2rem">Unit testing is a crucial part of modern software development. It ensures that code is working as intended and can be a lifesaver when refactoring or adding new features. It&#x27;s like having a friendly guard dog that barks if anything suspicious is going on in your code! In the context of .NET, there are some unique considerations and tools that can help make your unit tests even more effective. In…</p><br/></li><li><a href="/managing-up-developers-guide-career-advancement/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Mastering the Art of Managing Up: A Developer&#x27;s Guide to Career Advancement</h2><img src="/static/96bf9a339f8c17d67c821aaf5b83f2a1/4e530/managing-up-developers-guide-career-advancement.png" alt="Mastering the Art of Managing Up: A Developer&#x27;s Guide to Career Advancement" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 August 2023</p><p style="width:100%;margin-top:2rem">Mastering the Art of Managing Up: A Developer&#x27;s Guide to Career Advancement Learn the essential skills behind &quot;Managing Up&quot; tailored for the software development world, with insights from Steve Smith. Uncover how this vital technique can pave your path to career success, giving you the leverage and influence in your organization. Dive into actionable tips, enriched examples, and the benefits for…</p><br/></li><li><a href="/porting-moq-nsubstitute/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Porting Moq to NSubstitute</h2><img src="/static/e5b2cc1a4d92c180dc6424dfd94e367a/4e530/porting-moq-nsubstitute.png" alt="Porting Moq to NSubstitute" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 August 2023</p><p style="width:100%;margin-top:2rem">If for some reason you find yourself wanting to switch from Moq to another test double framework like NSubstitute, here&#x27;s how to do it. Working with Moq I&#x27;ve used Moq for many years and am comfortable with it. I also appreciate that it has a short name, which makes it easier to type, say, etc. than longer names with 4+ syllable. I&#x27;ve heard of NSubstitute but never used it until literally today…</p><br/></li><li><a href="/latest-dotnet-roadmap/"><h2 class="is-size-2" style="width:100%;word-break:break-word">What&#x27;s the latest .NET roadmap?</h2><img src="/static/686ebda86b6a4c19c0ab114e4ff1da68/4e530/latest-dotnet-roadmap.png" alt="What&#x27;s the latest .NET roadmap?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 May 2023</p><p style="width:100%;margin-top:2rem">.NET Roadmap The latest version of .NET is 7. The current roadmap is for .NET 8. .NET 8 is scheduled to ship in November 2023 and will be an LTS release. Some organizations find it advisable to only use LTS releases, but be advised that staying on an older LTS release when a Standard (STS) release is available may mean missing out on security and performance fixes that shipped in the STS release…</p><br/></li><li><a href="/when-and-how-to-use-blazor-components/"><h2 class="is-size-2" style="width:100%;word-break:break-word">When and How to Use Blazor Components</h2><img src="/static/6426b776d8543fc925dec61de825c623/4e530/when-and-how-to-use-blazor-components.png" alt="When and How to Use Blazor Components" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 May 2023</p><p style="width:100%;margin-top:2rem">When and How to Use Blazor Components Blazor is a powerful framework for building web applications using C# instead of JavaScript. One of the key features of Blazor is its component-based architecture, which allows you to create reusable and encapsulated UI elements. In this article, we will explore when and how to use Blazor components effectively. Why Use Blazor Components? Blazor components…</p><br/></li><li><a href="/avoid-dbcontext-iqueryable-proliferation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Proliferating DbContext or IQueryable in .NET Apps</h2><img src="/static/d0f81843fd048e8505daae2dad5205c3/4e530/avoid-dbcontext-iqueryable-proliferation.png" alt="Avoid Proliferating DbContext or IQueryable in .NET Apps" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 May 2023</p><p style="width:100%;margin-top:2rem">Most .NET apps use EF Core and a DbContext for data access, but maintainability can suffer when the use of a DbContext or an IQueryable derived from it is allowed to spread throughout an application. Let&#x27;s briefly describe how IQueryable works with EF Core and then consider how restricting access to IQuerable (or not) affects the overall maintainability of an app. What is IQueryable The and…</p><br/></li><li><a href="/top-free-tools-dotnet-webapi-load-testing-benchmarking/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Top Free Tools for .NET Web API Load Testing and Benchmarking</h2><img src="/static/a592bca8a5970044ccd1e18028b812e4/4e530/top-free-tools-dotnet-webapi-load-testing-benchmarking.png" alt="Top Free Tools for .NET Web API Load Testing and Benchmarking" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 April 2023</p><p style="width:100%;margin-top:2rem">I&#x27;m evaluating different approaches to data access and other cross-cutting concerns in .NET 7 Web APIs, both for clients and in preparation for an upcoming conference talk. I wanted to be able to load test endpoints locally as one way to assess performance. Looking for good local tools that aren&#x27;t bloated and hard to use (yes I&#x27;m talking to you, JMeter), I quickly found K6. It seemed to serve my…</p><br/></li><li><a href="/2022-year-in-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">2022 Year in Review</h2><img src="/static/23115094418f659fd6e8add8097192a4/4e530/2022-year-in-review.png" alt="2022 Year in Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 March 2023</p><p style="width:100%;margin-top:2rem">This is something I usually try to write in early January but here it is March already and I&#x27;m finally feeling up to it. It&#x27;s been a rough winter and I&#x27;ve not been motivated to write or create much content, but I&#x27;m starting to come around. Getting this done will hopefully let me knock out a bunch of other things I have in the queue. So, without further preamble, let&#x27;s take a look back at 2022. Oh…</p><br/></li><li><a href="/monitor-sites-with-uptime-robot-or-your-own-process/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Monitor Sites with Uptime Robot or Your Own Process</h2><img src="/static/2de7d78840f8a234d2ae100c4777afda/4e530/monitor-sites-with-uptime-robot-or-your-own-process.png" alt="Monitor Sites with Uptime Robot or Your Own Process" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 January 2023</p><p style="width:100%;margin-top:2rem">If you have your own web sites or apps that you maintain, it&#x27;s helpful to know when they&#x27;re not working. One tool I&#x27;ve been using for a long time is a site called Uptime Robot. Of course, with just a little bit of code you can easily write your own small application that can periodically check the status of one or more sites and alert you to a problem. The Problem I run a number of sites…</p><br/></li><li><a href="/delete-bin-obj-folders-recursively/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Delete dotnet bin and obj folders recursively</h2><img src="/static/ff7c12a97f203612e4e855798939658e/4e530/delete-bin-obj-folders-recursively.png" alt="Delete dotnet bin and obj folders recursively" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 December 2022</p><p style="width:100%;margin-top:2rem">Although Visual Studio and the dotnet CLI both offer clean commands, neither one really cleans up bin and obj files generated by the build process, and often things are left behind that cause problems. Here&#x27;s how to really remove all bin and obj folders recursively. Scenario You want to remove all bin and obj folders from your solution or git repo. Sometimes there are files in the bin and/or obj…</p><br/></li><li><a href="/add-all-projects-to-solution/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Add All Projects to Solution with dotnet CLI</h2><img src="/static/2c9e6fc8c551876ac24db62e7dcc7bdd/4e530/add-all-projects-to-solution.png" alt="Add All Projects to Solution with dotnet CLI" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 December 2022</p><p style="width:100%;margin-top:2rem">If you need to just create a new solution file with all projects in all subfolders in it, this should work for you. Scenario For whatever reason, you&#x27;d like to quickly create a Visual Studio solution file that includes all of the Visual Studio (dotnet) projects in any subfolder. In my case, sometimes I&#x27;ve needed to do this in order to easily be able to calculate code metrics on the total of a…</p><br/></li><li><a href="/microsoft-account-azure-login-problem-solved/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Microsoft Account Azure Login Problem Resolved</h2><img src="/static/7caea36ba3e09e5316beab21d99781c7/4e530/microsoft-account-azure-login-problem-solved.png" alt="Microsoft Account Azure Login Problem Resolved" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 December 2022</p><p style="width:100%;margin-top:2rem">In November 2022, I started having problems logging into the Azure portal with my Microsoft Account that I&#x27;ve had for years, and which worked elsewhere. I managed to resolve the issue finally with the help of a Microsoft support ticket. Read on if you&#x27;re having a similar problem. The Problem When logging into the Azure Portal (portal.azure.com), with my Microsoft Account (which is not a &quot;Work or…</p><br/></li><li><a href="/scaling-redis/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Scaling Redis</h2><img src="/static/1025c3f61517f69ef2cce79f01a4304b/4e530/scaling-redis.png" alt="Scaling Redis" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 November 2022</p><p style="width:100%;margin-top:2rem">Redis is a popular open source cache server. When you have a web application that reaches the point of needing more than one front end server, or which has a database that&#x27;s under too much load, introducing a Redis server between the application server and its database is a common approach. However, sometimes a single redis server is insufficient for the required load and performance requirements…</p><br/></li><li><a href="/introducing-spectre-console/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Introducing Spectre.Console</h2><img src="/static/39457f5cd05d098ac1dd733e7011059a/4e530/introducing-spectre-console.png" alt="Introducing Spectre.Console" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 October 2022</p><p style="width:100%;margin-top:2rem">Spectre.Console is a dotnet library for making beautiful, more useful console applications. Here&#x27;s a quick introduction to getting started with it. If you&#x27;d rather watch a video, I&#x27;ve recorded a quick video for NimblePros&#x27; YouTube channel: YouTube: Introducing Spectre.Console Getting Started The quickest way to get started with Spectre.Console is to add it to a new console application. You can…</p><br/></li><li><a href="/connect-to-linux-ssh/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Connect to Linux with ssh</h2><img src="/static/80882beade56c32dfd42b8aa7effbd69/4e530/connect-to-linux-ssh.png" alt="Connect to Linux with ssh" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 October 2022</p><p style="width:100%;margin-top:2rem">If you have a linux VM you need to work on, the typical way to connect to it is with ssh. Here&#x27;s how to get started. What is ssh The utility ssh is short for Secure Shell or Secure Socket Shell and is similar to the insecure terminal emulator telnet. You can use it to create a terminal session on a remote computer. If you&#x27;re coming from a Windows background and are used to using remote desktop/RDP…</p><br/></li><li><a href="/rainbow-colorized-brackets-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Rainbow Colorized Brackets in Visual Studio</h2><img src="/static/d4c0cd2535dc1730af56a754d3b44f72/4e530/rainbow-colorized-brackets-in-visual-studio.png" alt="Rainbow Colorized Brackets in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 August 2022</p><p style="width:100%;margin-top:2rem">A popular extension and later core feature of VS Code, rainbow bracket colorization is now available as a free extension for Visual Studio called Rainbow Braces, by Mads Kristensen. It was just released in the last week and currently lists support only for Visual Studio 2022. Colorizing brackets makes it much easier to visually match opening and closing brackets (or braces or parentheses or curly…</p><br/></li><li><a href="/working-effectively-github-issues/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working Effectively with GitHub Issues</h2><img src="/static/7b199aea269e6539a30501839d586475/4e530/working-effectively-github-issues.png" alt="Working Effectively with GitHub Issues" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 June 2022</p><p style="width:100%;margin-top:2rem">GitHub Issues offer a simpler approach to work item management than many other systems like Jira or Azure DevOps. Despite being lightweight, it can and is used to effectively track and prioritize work on thousands of projects of all sizes. Everything is an Issue In GitHub, every work item is an Issue. Issues can be decorated with tags that indicate whether a particular Issue is a Bug, Question…</p><br/></li><li><a href="/quickly-trimming-video-files/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Quickly Trimming Video Files</h2><img src="/static/673a95b4e930a063ce370824e885ad94/4e530/quickly-trimming-video-files.png" alt="Quickly Trimming Video Files" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 June 2022</p><p style="width:100%;margin-top:2rem">I do a fair bit of video editing as part of producing content for Pluralsight, clients, and YouTube. Recently I took on the task of editing 48 videos from the Stir Trek 2022 conference, each of which mostly just needed time trimmed from the start and end of the presentation. I tried my usual tools, but then I found a new tool that works much better! TechSmith Camtasia I&#x27;ve been using TechSmith…</p><br/></li><li><a href="/domain-modeling-encapsulation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Domain Modeling - Encapsulation</h2><img src="/static/f41638de1885d939cfad57590dce3e29/4e530/domain-modeling-encapsulation.png" alt="Domain Modeling - Encapsulation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 May 2022</p><p style="width:100%;margin-top:2rem">Domain models should encapsulate logic operations so that there is only one way to perform a given logical operation. That means avoiding exposing entity state and ensuring operations flow through specific methods. By funneling specific operations through specific code pathways, you can be sure constraints around the operations are enforced. In the previous article, I demonstrated some of the…</p><br/></li><li><a href="/domain-modeling-anemic-models/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Domain Modeling - Anemic Models</h2><img src="/static/1ee6990e0c9d4ccc1eece5ce9c71ea7f/4e530/domain-modeling-anemic-models.png" alt="Domain Modeling - Anemic Models" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 May 2022</p><p style="width:100%;margin-top:2rem">When building a domain model, proper object-oriented design and encapsulation should be applied as much as possible. Some teams choose to intentionally create anemic models with little encapsulation, which can lead to problems. Some of my past NimblePros clients have even had coding conventions and standards that basically required every domain entity be essentially a DTO, with no methods and a…</p><br/></li><li><a href="/commands-events-versions-and-owners/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Commands, Events, Versions, and Owners</h2><img src="/static/4c7893a7ff2bf9624ee92958d4076896/4e530/commands-events-versions-and-owners.png" alt="Commands, Events, Versions, and Owners" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 May 2022</p><p style="width:100%;margin-top:2rem">Commands and events are two common types of messages used in distributed application architectures, including microservice designs. Sometimes message formats need to be updated. Which party in the communication is responsible for the message definition? Who owns the message schema? Let&#x27;s look at an example. Distributed Messages Example Imagine you have a product catalog service. Other systems rely…</p><br/></li><li><a href="/aggregate-responsibility-design/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Aggregate Responsibility Design</h2><img src="/static/bc4af7b4255c202529a5ca6601e45081/4e530/aggregate-responsibility-design.png" alt="Aggregate Responsibility Design" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 April 2022</p><p style="width:100%;margin-top:2rem">The Aggregate Pattern comes from Domain-Driven Design and provides a way to encapsulate business logic among several related objects. The pattern has a few rules that, when followed, can help to organize complexity by creating an encapsulation boundary somewhere between the individual entity or value object and the whole domain model. The basic rules of the Aggregate pattern are: Every aggregate…</p><br/></li><li><a href="/learning-consumption-creation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Learning by Consumption and Creation</h2><img src="/static/e42878d79bc17286c49f2ec67cd962bd/4e530/learning-consumption-creation-title.png" alt="Learning by Consumption and Creation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 April 2022</p><p style="width:100%;margin-top:2rem">Preamble After a conversation on our devBetter Discord server, I published a short twitter thread about learning. It resonated a bit and as of writing this has had over 22k impressions, so I figured I&#x27;d make an article out of it. Note that doing this is literally one of the tips in the thread, so this is slightly meta. twitter thread analytics screenshot Have a Learning Strategy If you&#x27;re in a…</p><br/></li><li><a href="/deploy-more-often/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Deploy More Often</h2><img src="/static/7622321d22cf331946d69943ef13c3c0/4e530/deploy-more-often.png" alt="Deploy More Often" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 March 2022</p><p style="width:100%;margin-top:2rem">If you&#x27;re not already practicing continuous deployment, odds are your team and company would benefit from more frequent deployments. Let&#x27;s look at why this is true. Deploying Software Deploying software is the process of moving it from your development team&#x27;s tools into a production (or sometimes other) environment. Deploying software is not necessarily the same as releasing it, though for many…</p><br/></li><li><a href="/github-diagrams-with-mermaid/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GitHub Diagrams with Mermaid</h2><img src="/static/0ef838d74f89f9708ac468f28d9e46d7/4e530/github-diagrams-with-mermaid.png" alt="GitHub Diagrams with Mermaid" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 February 2022</p><p style="width:100%;margin-top:2rem">GitHub recently announced support for diagrams embedded directly in markdown files. The new feature leverages the Mermaid diagramming and charting tool, which is JavaScript-based and supports many common diagram formats. I&#x27;ve solved this problem in other ways in the past and in this article I&#x27;ll show how to get started using Mermaid in your GitHub projects and how it compares to other approaches…</p><br/></li><li><a href="/web-api-dto-considerations/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Web API DTO Considerations</h2><img src="/static/32a085db6ae9a85e98997b45ecdf6cae/4e530/web-api-dto-considerations.png" alt="Web API DTO Considerations" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 January 2022</p><p style="width:100%;margin-top:2rem">When designing web APIs, it&#x27;s important to think about how the data being passed to and from the endpoint will be structured. How important is reuse in these considerations, and how much reuse can you get away with before it starts causing other problems? Recently someone in my devBetter coaching group asked: Why do you create Request and Response classes in your ApiEndPoints? Is just a DTO not…</p><br/></li><li><a href="/generate-ssh-rsa-keys-windows-wsl/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Generate SSH RSA Key Pairs on Windows with WSL</h2><img src="/static/9919ca73fee1a0f6b8d4f229d367f295/4e530/generate-ssh-rsa-keys-windows-wsl.png" alt="Generate SSH RSA Key Pairs on Windows with WSL" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 January 2022</p><p style="width:100%;margin-top:2rem">Secure Shell Protocol (SSH) keys provide an alternate way to authenticate with many services like GitHub. Creating them on Windows is simple using Windows Subsystem for Linux (WSL). Windows Subsystem for Linux First you&#x27;ll need to have WSL running on your computer. Set up WSL for Windows. Generate SSH RSA Key Pair Open a WSL terminal (Start -&gt; WSL -&gt; Enter) and enter the following command: It will…</p><br/></li><li><a href="/guard-clauses-and-exceptions-or-validation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Guard Clauses and Exceptions or Validation?</h2><img src="/static/fbd57af68af9e530f461284d50990f1e/4e530/guard-clauses-and-exceptions-or-validation.png" alt="Guard Clauses and Exceptions or Validation?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 January 2022</p><p style="width:100%;margin-top:2rem">Guard Clauses provide an elegant way to ensure code inputs are valid, typically by throwing exceptions. Validation provides a solution to a similar problem, typically without the use of exceptions. When does it make sense to use each of these techniques? This article is a response to a question I received from one of my tips newsletter subscribers, Chad Boettcher. He asked: I just have a quick…</p><br/></li><li><a href="/why-use-datetimeoffset/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Why Use DateTimeOffset</h2><img src="/static/c8166182a364652dc4e8116239397bcd/4e530/why-use-datetimeoffset.png" alt="Why Use DateTimeOffset" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 January 2022</p><p style="width:100%;margin-top:2rem">Raise your hand if you&#x27;ve stored entity values in a database as DateTime. Ok, everybody has their hand up. You can put your hand down - you look silly doing that while reading an article on some website. Using DateTime for entity properties and database fields is ubiquitous, but if you really care about the time portion of the value, it&#x27;s often ambiguous. What time zone is the date in? Is it…</p><br/></li><li><a href="/datetime-as-a-value-object/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DateTime as a Value Object</h2><img src="/static/998bcae42d592b5aef0dcb73024c2146/4e530/datetime-as-a-value-object.png" alt="DateTime as a Value Object" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 January 2022</p><p style="width:100%;margin-top:2rem">Value Objects are a key part of Domain-Driven Design and domain models created by this process. However, they&#x27;re not used nearly as often by teams as they should be, and they&#x27;re frequently misunderstood even by experienced dev teams. When teaching teams how to better understand Value Objects and incorporate them more in their domain models, I&#x27;ve found the .NET type to be a useful example. First…</p><br/></li><li><a href="/2021-year-in-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">2021 Year in Review</h2><img src="/static/d50214b5889908448db472d9de633f7a/4e530/2021-year-in-review.png" alt="2021 Year in Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 January 2022</p><p style="width:100%;margin-top:2rem">Time for a recap of stats and important (and not so important) milestones from 2021, the SECOND year of the COVID-19 pandemic (yeah we thought 2020 would be THE year of the pandemic. Turns out... not so much.). Here are some other year-in-review recaps for reference and a checklist for writing your own: My 2017 Year in Review My 2018 Year in Review My 2019 Year in Review My Year in Review Post…</p><br/></li><li><a href="/what-are-abstractions-in-software-development/"><h2 class="is-size-2" style="width:100%;word-break:break-word">What are Abstractions in Software Development</h2><img src="/static/a0bb29654ccf059381d4876edbee2bda/4e530/what-are-abstractions-in-software-development.png" alt="What are Abstractions in Software Development" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 January 2022</p><p style="width:100%;margin-top:2rem">Software developers deal with abstractions every day. But just what is an abstraction? There are differing definitions that can sometimes cause confusion. Let&#x27;s consider a few of them. Definitions Oxford (via Google as the default/top definition) defines abstraction: ab·strac·tion /abˈstrakSH(ə)n/ noun the quality of dealing with ideas rather than events. &quot;topics will vary in degrees of…</p><br/></li><li><a href="/make-implicit-explicit/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Make the Implicit Explicit</h2><img src="/static/298b203f18d9ef7039fa0d5282e01554/4e530/make-implicit-explicit.png" alt="Make the Implicit Explicit" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 December 2021</p><p style="width:100%;margin-top:2rem">When practicing software architecture and design, one important consideration is how the rules of the system are modeled. Are the rules ad hoc and a matter of tribal knowledge of the developers who came before, or are they explicit in the way the system and its classes are designed and used? Whenever possible, favor making the implicit explicit in your design, so that as developers come and go…</p><br/></li><li><a href="/clean-architecture-asp-net-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Clean Architecture with ASP.NET Core</h2><img src="/static/4ada3d8aa2c18c12124162f1c7f5ce99/4e530/clean-architecture-asp-net-core.png" alt="Clean Architecture with ASP.NET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 November 2021</p><p style="width:100%;margin-top:2rem">In late 2021, I presented a 30-minute session at dotNetConf on the topic of Clean Architecture with ASP.NET Core 6. At the time of writing this 2 weeks later, the video has 82k views, making it the most-watched YouTube video of the conference (not necessarily during the live event). You can check it out here if you&#x27;re interested: In this article, I want to go into a bit more depth on the topic of…</p><br/></li><li><a href="/avoid-using-exceptions-determine-api-status/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Using Exceptions to Determine API Status Codes and Responses</h2><img src="/static/2448fafd367e7b0fd9e7b43137c5e22e/4e530/avoid-using-exceptions-determine-api-status.png" alt="Avoid Using Exceptions to Determine API Status Codes and Responses" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 November 2021</p><p style="width:100%;margin-top:2rem">It&#x27;s typical for API endpoints to call application or domain services. In the case of success, the API can simply return Ok and the result of the service call. But for non-success cases, should you use exceptions to communicate from the service to the endpoint, so that it can return an appropriate status code and response? Assuming you read the title of this article, you probably already know the…</p><br/></li><li><a href="/screencast-video-demo-checklist/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Screencast Video Demo Checklist</h2><img src="/static/b0f2b6fea99cb3cdb893656cca316a07/4e530/screencast-video-demo-checklist.png" alt="Screencast Video Demo Checklist" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 November 2021</p><p style="width:100%;margin-top:2rem">Recording a short screencast video can be a very effective way to provide a demo to stakeholders or show how a bug can be reproduced. Follow this checklist to make sure you don&#x27;t miss something important. In a previous article, I wrote about how to make better, faster demos using screencast videos. Once you&#x27;ve got that all sorted out and have chosen the technology you want to use to record and…</p><br/></li><li><a href="/markdown-code-block-syntax-highlighting-and-diff/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Markdown Code Block Syntax Highlighting and Diff</h2><img src="/static/bd35ea6896cd4e45dd1ecd440df2b441/4e530/markdown-code-block-syntax-highlighting-and-diff.png" alt="Markdown Code Block Syntax Highlighting and Diff" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 November 2021</p><p style="width:100%;margin-top:2rem">If you&#x27;re writing blog posts, GitHub content, and/or Stack Over flow questions and answers using Markdown, it&#x27;s often helpful to show code in code blocks of within code fences. Did you know these support many different languages to allow for proper syntax highlighting, including a diff &#x27;language&#x27;? Markdown code fences Markdown is a great language to use to write content in, because it offers built…</p><br/></li><li><a href="/dotnet-format-and-file-scoped-namespaces/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Dotnet Format and File Scoped Namespaces</h2><img src="/static/da1e912b5ad1cc684f884c1090687c35/4e530/dotnet-format-and-file-scoped-namespaces.png" alt="Dotnet Format and File Scoped Namespaces" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2021</p><p style="width:100%;margin-top:2rem">The dotnet format tool is now a part of the dotnet CLI with .NET 6, and you can use it to easily adopt the new file scoped namespace feature that ships with C# 10. dotnet format If you don&#x27;t know the dotnet format tool, it&#x27;s available as a separate install in previous versions of .NET, but ships as part of the .NET 6 SDK. It&#x27;s used to format your codebase using rules specified in an file, and can…</p><br/></li><li><a href="/design-patterns-overview/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Design Patterns Overview</h2><img src="/static/a0fc2f0b1279536aad70b641d9627aa1/4e530/design-patterns-overview.png" alt="Design Patterns Overview" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 October 2021</p><p style="width:100%;margin-top:2rem">Design patterns provide reusable approaches to common problems and allow for higher level discussions of software design. Learn the basics of design patterns, how to recognize and implement them, how to combine them, and how to learn them. Design Patterns - An Overview I&#x27;ve been meaning to write about this topic for over a year now but better late than never, I guess! I&#x27;ve always been fond of…</p><br/></li><li><a href="/better-faster-demos-with-screencast-videos/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Better Faster Demos with Screencast Videos</h2><img src="/static/b9a9a599a940cd87ad9cf4f6977e7f0f/4e530/better-faster-demos-with-screencast-videos.png" alt="Better Faster Demos with Screencast Videos" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 October 2021</p><p style="width:100%;margin-top:2rem">Do you ever need to demo your app to users, customers, or stakeholders? Is it part of your regular software delivery process? What about when you want to describe to a coworker how a new feature should work, or what the repro of a bug looks like? If pictures are worth 1000 words, videos are worth millions. Let&#x27;s explore some scenarios in which video could be useful and usually far more efficient…</p><br/></li><li><a href="/grouping-assertions-in-tests/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Grouping Assertions in Tests</h2><img src="/static/5a0c33f1a0859496dd48efbc71803780/4e530/grouping-assertions-in-tests.png" alt="Grouping Assertions in Tests" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 September 2021</p><p style="width:100%;margin-top:2rem">Although it&#x27;s generally considered a best practice to assert only one thing per test, sometimes one logical &quot;thing&quot; may require multiple assertion statements to be executed. In such cases, it&#x27;s helpful to be able to see all of the parts of the larger assertion that failed, so you don&#x27;t end up chasing after them one by one. As an example, let&#x27;s say you have a class that is initialized with its…</p><br/></li><li><a href="/github-actions-on-demand/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GitHub Actions On Demand</h2><img src="/static/45be44039c0430aa3785afabfa09518c/4e530/github-actions-on-demand.png" alt="GitHub Actions On Demand" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 September 2021</p><p style="width:100%;margin-top:2rem">I use GitHub Actions a lot. They&#x27;re a great tool for performing continuous integration (CI) and continuous deployment (CD) for your applications. However, by default they typically only are triggered by changes to your application&#x27;s source code in the form of commits and/or merges/rebases. This means that to trigger a particular workflow, you usually need to make a commit, and obviously this can…</p><br/></li><li><a href="/dependency-injection-book-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Dependency Injection Book Reviewed</h2><img src="/static/0a146df1b025712bfcdee6811d015e90/4e530/dependency-injection-book-reviewed.png" alt="Dependency Injection Book Reviewed" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 September 2021</p><p style="width:100%;margin-top:2rem">I like to use an index card as a bookmark when I&#x27;m reading non-fiction books, so that I can come back to interesting topics later or review certain points in an article of my own, like this one. Usually one index card is sufficient, but in reading Dependency Injection: Principles, Practices, and Patterns by Steven von Deursen and Mark Seemann(affiliate link) I filled two front and back. There is a…</p><br/></li><li><a href="/should-controllers-reference-repositories-services/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Should Controllers Reference Repositories or Services</h2><img src="/static/63d908ef169dd70d8f9aaeafbcf5b1e9/4e530/should-controllers-reference-repositories-services.png" alt="Should Controllers Reference Repositories or Services" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 September 2021</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 A common question students ask when learning about Clean Architecture, SOLID, and/or Domain-Driven Design (DDD) is whether controllers (or razor pages or API Endpoints should work with repositories directly, or if they should only communicate with services. As with many questions in software, the answer is, &quot;it depends&quot;, but I can offer some recommendations. A related…</p><br/></li><li><a href="/refactoring-value-objects/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Refactoring to Value Objects</h2><img src="/static/2cd55c56ee0fbf415b26dc1c918a41df/4e530/refactoring-value-objects.png" alt="Refactoring to Value Objects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 September 2021</p><p style="width:100%;margin-top:2rem">Value Objects are a part of Domain-Driven Design, and Julie Lerman and I cover them in our DDD Fundamentals course on Pluralsight. Even if you&#x27;re not applying Domain-Driven Design to your application, you can take advantage of refactoring your business classes to avoid code smells like primitive obsession (follow the link for more on refactoring and code smells). To demonstrate this concept, I&#x27;m…</p><br/></li><li><a href="/comparing-techniques-communicating-between-services/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Comparing Techniques for Communicating Between Services</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 August 2021</p><p style="width:100%;margin-top:2rem">In distributed software applications, different services or processes or apps frequently need to communicate with one another. Modern architectural trends toward microservices and containers and cloud-native apps have all increased the likelihood that apps will increasingly be deployed not as single monoliths, but as collections of related services. There are only so many different ways these…</p><br/></li><li><a href="/script-new-dotnet-solution-from-cli/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Create a new Solution and Projects using dotnet CLI</h2><img src="/static/c8f8b1640918fd48e7de3f007469fa18/4e530/create-new-solution-and-projects-using-dotnet-cli.png" alt="How to Create a new Solution and Projects using dotnet CLI" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 August 2021</p><p style="width:100%;margin-top:2rem">I create a lot of samples, demos, open source projects, etc. and I like to use the fairly standard repository layout of having a solution file in the root and project files in a src subfolder. Achieving this in Visual Studio is tedious, but fortunately this series of dotnet CLI commands quickly create the structure for you. This script uses the following commands, which have good documentation…</p><br/></li><li><a href="/writing-efficiently/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Writing Efficiently</h2><img src="/static/769fa3ef3ad3056ad5f0dd2389ad4f46/4e530/writing-efficiently.png" alt="Writing Efficiently" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 August 2021</p><p style="width:100%;margin-top:2rem">Working in professional software development teams requires a lot of writing. As you advance in your career, frequently the percentage of time you&#x27;ll be writing emails and other correspondence versus writing source code will increase. As your responsibilities grow, so too does your need to communicate effectively with larger numbers of people in and beyond your organization. Writing effectively is…</p><br/></li><li><a href="/improving-method-function-clarity/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Improving Method and Function Clarity</h2><img src="/static/fa0564486106bae860c69f9a2c98fc64/4e530/improving-method-function-clarity.png" alt="Improving Method and Function Clarity" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 June 2021</p><p style="width:100%;margin-top:2rem">(Originally sent to my weekly tips subscribers in March of 2019) When you look at a method or function, it should have a name that describes what it does. Naming things is hard but important, and probably the most important thing you can do when you design a method is give it a good name. This mainly applies to methods (or functions) that are or may be called from more than one place. It&#x27;s less…</p><br/></li><li><a href="/prioritizing-and-microservices/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Prioritizing and Microservices</h2><img src="/static/47334c20cdd5fdb61f84cb7f5bfd943c/4e530/prioritizing-and-microservices.png" alt="Prioritizing and Microservices" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 June 2021</p><p style="width:100%;margin-top:2rem">It&#x27;s not unusual to have different levels of prioritization in backend systems. Imagine you have a process that generates and sends reports that users have requested. Some of these might be low-priority reports that are simply generated periodically so they&#x27;re available to view, while others might be generated on demand, with a user actively waiting for the results. These could be further…</p><br/></li><li><a href="/csharp-generics-best-practices/"><h2 class="is-size-2" style="width:100%;word-break:break-word">C# Generics Best Practices</h2><img src="/static/43b57d25451c986609e54cfef2833e19/4e530/csharp-generics-best-practices.png" alt="C# Generics Best Practices" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 June 2021</p><p style="width:100%;margin-top:2rem">There was a time when C# didn&#x27;t support generics. It was a dark time. Ragged bands of .NET developers roamed the harsh landscape, copy-pasting strongly-typed list implementations to avoid the evils of primitive boxing operations. Forced to choose between loose typing and explicit casts at every turn, would-be developers of strongly-typed object models somehow managed to endure and ship (mostly…</p><br/></li><li><a href="/what-if-product-owners-reported-to-dev-teams/"><h2 class="is-size-2" style="width:100%;word-break:break-word">What If Product Owners Reported to Dev Teams?</h2><img src="/static/7945cb2150964bf4d6d2364d70a82db9/4e530/what-if-product-owners-reported-to-dev-teams.png" alt="What If Product Owners Reported to Dev Teams?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 June 2021</p><p style="width:100%;margin-top:2rem">In most organizations, if there&#x27;s a Product Owner, the dev team is generally subservient to it and charged with building whatever the Product Owner comes up with. That&#x27;s not to say they aren&#x27;t often &quot;on the same team&quot;, but the flow of responsibility is usually the PO pushes new requirements and the developers respond to them. Sometimes this relationship, even if only implied, has ramifications for…</p><br/></li><li><a href="/vs-code-disable-logging-loading-symbols/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VS Code Disable Logging Loading Symbols</h2><img src="/static/ea330f846632ce338dbdf70d4544fa71/4e530/vs-code-disable-logging-loading-symbols.png" alt="VS Code Disable Logging Loading Symbols" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 May 2021</p><p style="width:100%;margin-top:2rem">When I create a new .NET (5) console application and run it in VS Code, I get output like the following: console output loading symbols This is just a lot of noise that adds no value and I&#x27;d like to disable it so I can see the actual output of my program. Fortunately, there&#x27;s a simple way to do this - just add a setting in your file: launch.json file Here&#x27;s the relevant setting if you just want…</p><br/></li><li><a href="/use-autohotkey-to-paste-text-as-typing/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Use AutoHotKey to Paste Text as Typing</h2><img src="/static/ec27a4016e988332207a64c2a17a9cee/4e530/use-autohotkey-to-paste-text-as-typing.png" alt="Use AutoHotKey to Paste Text as Typing" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 May 2021</p><p style="width:100%;margin-top:2rem">I&#x27;ve heard about AutoHotKey before but never gotten round to installing it until recently. Basically I had a bunch of text (code) that I wanted to display in chunks as part of an upcoming Pluralsight course. I didn&#x27;t want it to just all appear at once, but rather to show as if it were being typed. But actually typing frequently involves typos and backspaces and other distractions. I knew others…</p><br/></li><li><a href="/github-fetch-upstream/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GitHub Fetch Upstream Branch</h2><img src="/static/fbb6a0ceb7eadde274c6f844b8900a0c/4e530/github-fetch-upstream-title.png" alt="GitHub Fetch Upstream Branch" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 May 2021</p><p style="width:100%;margin-top:2rem">A couple of years ago, I wrote an article on how to use the git command line to sync a fork with its upstream branch. Now, you should need those instructions much less frequently, because GitHub has added support for it to its web application. You&#x27;ll find it in the image below: GitHub Fetch Upstream Once you click on the &#x27;Fetch Upstream&#x27; button, there&#x27;s a dialog to confirm: GitHub Fetch Upstream…</p><br/></li><li><a href="/simple-systems-galls-law/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Simple Systems and Gall&#x27;s Law</h2><img src="/static/aaa217e76bc49110e25e322fba795a87/4e530/simple-systems-galls-law.png" alt="Simple Systems and Gall&#x27;s Law" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 May 2021</p><p style="width:100%;margin-top:2rem">When it&#x27;s time to build that big new system to replace the aging old one, consider Gall&#x27;s Law and the benefit of frequent feedback and evolutionary development. Gall&#x27;s Law states: A complex system that works is invariably found to have evolved from a simple system that worked. A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over with a…</p><br/></li><li><a href="/add-imgbot-to-github-repository/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Add ImgBot to your GitHub Repository</h2><img src="/static/8e52d33ee01e4e1f3c778674256c09d0/4e530/add-imgbot-github-repository.png" alt="Add ImgBot to your GitHub Repository" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 April 2021</p><p style="width:100%;margin-top:2rem">My blog is hosted on GitHub using GatsbyJS and Netlify. One nice thing about this setup is that I have complete control over my content, and it&#x27;s all version controlled and backed up both on GitHub and on various machines where I&#x27;ve cloned the repo. Along with the text content, almost all of the images associated with my content are in the same repository. Sometimes they&#x27;re hi-res screenshots…</p><br/></li><li><a href="/testing-exceptions-with-xunit-and-actions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Testing Exceptions with xUnit and Actions</h2><img src="/static/fcc0f709335fca5a0a3fa377ef9b6613/4e530/testing-exceptions-xunit-actions.png" alt="Testing Exceptions with xUnit and Actions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 April 2021</p><p style="width:100%;margin-top:2rem">When you&#x27;re writing unit tests for a method, it&#x27;s a good idea to test various failure conditions (&quot;sad paths&quot;) in addition to testing the expected, everything is working condition (&quot;happy path&quot;). In particular, if you have a method that may throw exceptions, especially if they&#x27;re custom domain exceptions, you should be sure you&#x27;re testing this behavior. Another common source of exceptions is guard…</p><br/></li><li><a href="/speed-up-docker-compose-with-parallel-builds/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speed Up Docker Compose with Parallel Builds</h2><img src="/static/1f0b49be800cf61815d7c803142530d2/4e530/speed-up-docker-compose-with-parallel-builds.png" alt="Speed Up Docker Compose with Parallel Builds" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 April 2021</p><p style="width:100%;margin-top:2rem">I&#x27;ve been using docker-compose quite a bit lately for a distributed app that includes 3 front end apps, 2 databases, RabbitMQ, and PaperCut (test email server). For the most part, this works great as a way to encapsulate all of these processes and run them in a containerized manner so that everything works together. But building this whole solution is pretty slow, by default. When you work with…</p><br/></li><li><a href="/measure-command-line-script-time-elapsed/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to measure elapsed time of command line tools using PowerShell</h2><img src="/static/d4b3d5e9d7c256eb575c0d63aec323ee/4e530/measure-command-line-script-time.png" alt="How to measure elapsed time of command line tools using PowerShell" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 April 2021</p><p style="width:100%;margin-top:2rem">I&#x27;m using the command line to run build scripts and other tasks more and more, especially now that .NET Core / .NET 5 has the CLI and things like and are in heavy use. When you&#x27;re running a single command, like or it usually tells you about how long it took to run. But when you have a scripted build that involves multiple steps, it&#x27;s often nice to be able to see how long the whole thing took…</p><br/></li><li><a href="/run-docker-rabbitmq-command-streamdeck/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Run a Docker Command to Launch RabbitMQ from a StreamDeck</h2><img src="/static/17751e16bebff9743d038c1e86e36886/4e530/run-docker-rabbitmq-command-streamdeck.png" alt="Run a Docker Command to Launch RabbitMQ from a StreamDeck" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 March 2021</p><p style="width:100%;margin-top:2rem">I&#x27;m working on a distributed system demo that relies on RabbitMQ for its inter-app messaging. Not wanting to force users to actually have to install RabbitMQ, I&#x27;m using Docker to run it. It&#x27;s really easy to do this. If you&#x27;ve never tried to launch RabbitMQ, complete with its management web app, from a docker command line, try this: Once you&#x27;ve run that, open up localhost:15672 and you should be…</p><br/></li><li><a href="/hardware-hides-many-sins/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Hardware Hides Many Sins</h2><img src="/static/9ce472142f7db0cbb3116e29ea284c19/4e530/hardware-hides-many-sins.png" alt="Hardware Hides Many Sins" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 March 2021</p><p style="width:100%;margin-top:2rem">Early in my career I was taught this lesson by one of my clients. We were building an application for internal use at the company which would run on a dedicated server sitting in a server room in the same building as its users. I had concerns that some approach we were taking was inefficient. My client (and mentor at the time) explained: Hardware hides many sins. What he meant was, it didn&#x27;t…</p><br/></li><li><a href="/new-software-project-checklist/"><h2 class="is-size-2" style="width:100%;word-break:break-word">New Software Project Checklist</h2><img src="/static/3d46a28a16f19228d4a16f60747294a0/6050d/ultimate-new-software-project-checklist.png" alt="New Software Project Checklist" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 March 2021</p><p style="width:100%;margin-top:2rem">A client I&#x27;m working with wanted a set of initial decisions and questions their team should address as they begin a new project. I did a bit of research, thinking surely such a list must exist already, but I didn&#x27;t find one I liked. So I made an open source one and put it on GitHub. If you just want to jump to it now, check out the Ultimate New Software Project Decision Checklist. In coming up…</p><br/></li><li><a href="/related-data-without-foreign-keys/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Designing for Related Data without Foreign Keys</h2><img src="/static/4be52e5780644be9f99ee7bb9928f571/4e530/related-data-without-foreign-keys.png" alt="Designing for Related Data without Foreign Keys" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 March 2021</p><p style="width:100%;margin-top:2rem">A recent discussion on the devBetter.com private server spurred this article. One of the members was trying to work out a fairly complex design involving many different parts, and the idea of trying to model all of this as a set of database tables with primary key and foreign key relationships was daunting. The sheer number of many-to-many and one-to-many relationships along with recursive and…</p><br/></li><li><a href="/dto-or-poco/"><h2 class="is-size-2" style="width:100%;word-break:break-word">What is the difference between a DTO and a POCO (or POJO)</h2><img src="/static/a5504e778cde8f0be22a689791acdc35/4e530/dto-or-poco.png" alt="What is the difference between a DTO and a POCO (or POJO)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 February 2021</p><p style="width:100%;margin-top:2rem">Two terms that come up frequently when discussing software development in .NET and C# are DTO and POCO. Some developers use these terms interchangeably. So, what is the difference between a DTO and a POCO? First, let&#x27;s define each term. Data Transfer Object (DTO) A DTO is a &quot;Data Transfer Object&quot;. It&#x27;s an object whose purpose is to transfer data. By definition, a DTO should only contain data, not…</p><br/></li><li><a href="/keep-tests-short-and-dry-with-extensions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Keep Tests Short and DRY with Extension Methods</h2><img src="/static/3fba91025cc6c7f2bfde1ccedaf7eb92/4e530/keep-tests-short-and-dry-with-extensions.png" alt="Keep Tests Short and DRY with Extension Methods" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 February 2021</p><p style="width:100%;margin-top:2rem">Today as I was writing functional tests for API endpoints again I created some helpers to assist with the boilerplate code involved in such tests. When you&#x27;re testing an API endpoint, you typically need to write code that looks like this: Create data to send in request (optional) Make an HTTP request to a route/URL Verify the response is successful Capture the response as a string Convert the…</p><br/></li><li><a href="/mvc-controllers-are-dinosaurs-embrace-api-endpoints/"><h2 class="is-size-2" style="width:100%;word-break:break-word">MVC Controllers are Dinosaurs - Embrace API Endpoints</h2><img src="/static/889af2a808b333b6b5dc76866e1bdb63/6050d/embrace-api-endpoints.png" alt="MVC Controllers are Dinosaurs - Embrace API Endpoints" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 January 2021</p><p style="width:100%;margin-top:2rem">I&#x27;ve been programming web applications using the MVC pattern for a very long time. What&#x27;s more, I&#x27;ve been helping companies dig themselves out of technical debt for an even longer time, and I work with a wide variety of teams every year. So, I&#x27;ve seen things. And while I would absolutely never want to return to the old Web Forms way of building apps, I can tell you that more often than not, MVC…</p><br/></li><li><a href="/2020-year-in-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">2020 Year in Review</h2><img src="/static/bc44764b30262ef7408aff9fa3864f39/4e530/2020-year-in-review.png" alt="2020 Year in Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 January 2021</p><p style="width:100%;margin-top:2rem">Time for a recap of stats and important (and not so important) milestones from 2020, the year of the COVID-19 pandemic. Here are some other year-in-review recaps for reference and a checklist for writing your own: My 2017 Year in Review My 2018 Year in Review My 2019 Year in Review My Year in Review Post Checklist Blogging Last year I added 41 articles to my blog - the same as the year before…</p><br/></li><li><a href="/data-deficient-messages/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Data Deficient Messages</h2><img src="/static/424e4c97184a33ef7047ab7aac27f1ae/4e530/data-deficient-messages.png" alt="Data Deficient Messages" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 December 2020</p><p style="width:100%;margin-top:2rem">A common feature of distributed architectures is message-based communication between systems or microservices. Whether using a message bus or queue, messages provide a means of reducing coupling between systems, allowing overall systems to remain available even when some subsystems are not. However, when designing the messages that will be used in such systems, care must be taken to include…</p><br/></li><li><a href="/avoid-wrapping-dbcontext-in-using/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Wrapping DbContext in Using (and other gotchas)</h2><img src="/static/221e87fed9fd41e84b2b4ed4c26a0cc9/4e530/avoid-wrapping-dbcontext-in-using.png" alt="Avoid Wrapping DbContext in Using (and other gotchas)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 December 2020</p><p style="width:100%;margin-top:2rem">EF and EF Core DbContext types implement . As such, best practice programming suggests that you should wrap them in a block (or new C# 8 using statement). Unfortunately, doing this, at least in web apps, is generally a bad idea. I work with a lot of clients who are migrating from .NET Framework to .NET Core and .NET 5. Some of them weren&#x27;t using dependency injection in their legacy apps, or weren…</p><br/></li><li><a href="/littles-law/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Little&#x27;s Law</h2><img src="/static/23ee832c49614b74177d9b1c1b7126ac/4e530/littles-law.png" alt="Little&#x27;s Law" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 November 2020</p><p style="width:100%;margin-top:2rem">Little&#x27;s Law was first described in 1954 and later proved by John Little in 1961. It is typically expressed as: L = λW L represents the &quot;long term average&quot; number of customers in a stationary system λ represents the &quot;long term average effective arrival rate&quot; of new customers W represents the average time a customer spends in the system It&#x27;s important to recognize that Little&#x27;s Law is used in the…</p><br/></li><li><a href="/cap-pacelc-and-microservices/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CAP Theorem, PACELC, and Microservices</h2><img src="/static/37328e774e4dc56e7248d39e6aedeb56/4e530/cap-pacelc-and-microservices.png" alt="CAP Theorem, PACELC, and Microservices" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 November 2020</p><p style="width:100%;margin-top:2rem">CAP Theorem (wikipedia) is a classic &quot;given 3 choices, choose 2&quot; topic. The three choices are Consistency, Availability, and Partition Tolerance. You can&#x27;t have all three. CAP Theorem Given distributed data or systems, the choice mostly comes up when there is a network partition, meaning two nodes of the system can&#x27;t communicate immediately with one another. At that point there is a partition, and…</p><br/></li><li><a href="/github-actions-from-cli/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GitHub Actions from CLI</h2><img src="/static/7950308d24745e722564da1792648fa0/4e530/generate-github-actions-from-dotnet-new-templates.png" alt="GitHub Actions from CLI" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 November 2020</p><p style="width:100%;margin-top:2rem">Tim Heuer recently published an article showing how to create your own dotnet CLI templates for generating GitHub action YAML files. I thought I&#x27;d give it a try and see how it worked, so here&#x27;s my experience with it. It works by adding a template to the list of available templates used with the command. Install the template To install custom templates, you run this command and specify a NuGet…</p><br/></li><li><a href="/estimates-are-necessary/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Estimates Are Necessary</h2><img src="/static/1e06d551495f47525f54830e01a41c8c/4e530/estimates-are-necessary.png" alt="Estimates Are Necessary" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 November 2020</p><p style="width:100%;margin-top:2rem">This is the fifth and last of the 5 Laws of Software Estimates. I expanded on the fourth law of software estimates in my previous article. Like all things, how you view estimates is heavily context-dependent. If you&#x27;re a developer who wants to maximize the amount of value you provide by building software, estimates do little to support this directly. As already covered by the previous 4 laws of…</p><br/></li><li><a href="/attempt-made-to-access-socket/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Solved - An attempt was made to access a socket in a way forbidden</h2><img src="/static/a261378bede377d1f178c51f8744e796/6050d/attempt-was-made-to-access-a-socket-forbidden.png" alt="Solved - An attempt was made to access a socket in a way forbidden" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 November 2020</p><p style="width:100%;margin-top:2rem">I&#x27;m assuming you&#x27;re here because you are seeing this error and are wondering why: The reason is most likely due to a Windows Update that restricted access to certain ports on Windows machines. The details are here. You can view a list of which ports are excluded from your user by running this command: On my Windows 10 machine I get this output: Specifically, I had an ASP.NET Core web app that…</p><br/></li><li><a href="/shift-risk-left/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Shift Risk Left</h2><img src="/static/8e1bd12d6da1c181c08acfbe62666373/4e530/shift-risk-left.png" alt="Shift Risk Left" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2020</p><p style="width:100%;margin-top:2rem">When planning, whether for a large project or a single feature, there will be risks. Identifying risks and planning appropriate mitigations or countermeasures is an important part of planning. The military does this constantly in its planning, and has many tools for identifying and calculating risks based on likelihood and severity, and requires that mitigations be put in place and proper…</p><br/></li><li><a href="/estimates-are-temporary/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Estimates Are Temporary</h2><img src="/static/fb43f7baebd8a73e5b8b883bfb8fe05d/4e530/estimates-are-temporary.png" alt="Estimates Are Temporary" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 October 2020</p><p style="width:100%;margin-top:2rem">This is the fourth of the 5 Laws of Software Estimates. I expanded on the third law of software estimates in my previous article. Estimates are made for a given point in time, when a certain set of information and assumptions are known and held. As time passes, new information becomes available and assumptions change. The older the estimate, the more likely it is to be stale. Since by definition…</p><br/></li><li><a href="/estimates-are-wrong/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Estimates Are Wrong</h2><img src="/static/ff9f8a8d2184e5d072c2bdde0ea4d5f1/4e530/estimates-are-wrong.png" alt="Estimates Are Wrong" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 October 2020</p><p style="width:100%;margin-top:2rem">This is the third of the 5 Laws of Software Estimates. I expanded on the second law of software estimates in my previous article. Nobody should be surprised when estimates are wrong, they should be surprised when they are right! If estimates were accurate, they&#x27;d be called exactimates. Think about weather forecasting. Even with all of the software modeling and vast arrays of sensors we have in the…</p><br/></li><li><a href="/estimates-are-non-transferable/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Estimates Are Non-Transferable</h2><img src="/static/28d13c94cea69a0108f1780b857f1ba0/4e530/estimates-are-non-transferable.png" alt="Estimates Are Non-Transferable" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 September 2020</p><p style="width:100%;margin-top:2rem">This is the second of the 5 Laws of Software Estimates. I expanded on the first law of software estimates in my previous article. Estimates generally cannot be transferred between individuals. If I ask five team members to estimate a given story, using whatever units they wish (time, points, etc.), I&#x27;m likely to get a range of answers that could vary by 200% or more! The hope may be that averaging…</p><br/></li><li><a href="/estimates-are-waste/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Estimates Are Waste</h2><img src="/static/ca510f10d863d50c87245b0da6907bae/4e530/estimates-are-waste.png" alt="Estimates Are Waste" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 September 2020</p><p style="width:100%;margin-top:2rem">This is the first of the 5 Laws of Software Estimates. It&#x27;s all about context. In the context of software development, of delivering business value in the form of working software, estimates provide no value. In the context of choosing what software to build, there may certainly be value in estimates, but even there it&#x27;s an ROI calculation, with the hope being that the estimates will provide more…</p><br/></li><li><a href="/postels-law-robustness-principle/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Postel&#x27;s Law - The Robustness Principle</h2><img src="/static/74927afa2455cfb08907de315c48e952/4e530/postels-law-the-robustness-principle.png" alt="Postel&#x27;s Law - The Robustness Principle" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 September 2020</p><p style="width:100%;margin-top:2rem">Postel&#x27;s Law, also known as the robustness principle, states: Be conservative in what you do, be liberal in what you accept from others. Jon Postel wrote this in an early version of the TCP specification in 1980, and it has since been referred to as Postel&#x27;s Law. Origin The main goal of this principle is to maximize the tolerance individual components of a system have for small incompatibilities…</p><br/></li><li><a href="/conways-law-ddd-and-microservices/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Conway&#x27;s Law, DDD, and Microservices</h2><img src="/static/4560ab6ef4633a6ec46c5a193b65938c/c5cc7/2011.06.27_organizational_charts.png" alt="Conway&#x27;s Law, DDD, and Microservices" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 August 2020</p><p style="width:100%;margin-top:2rem">Conway&#x27;s Law states that &quot;any organization that designs a system will produce a design whose structure is a copy of the organization&#x27;s communication structure.&quot; This has significant impacts on how software is built, especially if microservices and/or Domain-Driven Design are adopted. Mel Conway observed that separate organizational units or teams within a larger organization, when working together…</p><br/></li><li><a href="/invest-in-good-user-stories/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Invest in Good User Stories</h2><img src="/static/5cf8a3dace264aaf17629a186035b00a/4e530/invest-in-good-user-stories.png" alt="Invest in Good User Stories" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 August 2020</p><p style="width:100%;margin-top:2rem">User stories are a useful tool for describing requirements of software applications. User stories have been a part of agile methodologies like XP and Scrum for over twenty years. You can use the proven mnemonic INVEST to remember important principles of good stories. What is a User Story A user story is &quot;a placeholder for a conversation.&quot; It&#x27;s meant to describe high level requirements from an end…</p><br/></li><li><a href="/data-access-principles/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Data Access Principles</h2><img src="/static/d8924d4441710a212baf480795810db9/4e530/data-access-principles.png" alt="Data Access Principles" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 July 2020</p><p style="width:100%;margin-top:2rem">What are some guiding principles that can be applied to data access in software applications and architecture? In preparing a workshop on evolving data access patterns, I&#x27;ve been considering the principles that are most important when it comes to data access in software applications. I collected the start of this list of data access principles in a twitter thread in which I asked for additional…</p><br/></li><li><a href="/design-no-duplicates-rule-in-domain-model/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Design a No Duplicates Rule in your Domain Model?</h2><img src="/static/14fb0a8c1ec72a2e4d99a91b34cfcb9f/4e530/design-no-duplicates-rule-domain-model.png" alt="Design a No Duplicates Rule in your Domain Model?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 July 2020</p><p style="width:100%;margin-top:2rem">Update 17 May 2023 I haven&#x27;t been streaming on Twitch for a while (as noted in the original article) but I have continued to use this sample to demonstrate how to perform work in your domain model that requires data. I&#x27;ve updated the GitHub repo a bit, but overall the concepts remain pretty much the same. One thing I haven&#x27;t added (that you generally should avoid) is just a static method that…</p><br/></li><li><a href="/immediate-domain-event-salvation-with-mediatr/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Immediate Domain Event Salvation with MediatR</h2><img src="/static/e228ea292067a64ec43e3d3f69ec64ca/4e530/immediate-domain-event-salvation-with-mediatr.png" alt="Immediate Domain Event Salvation with MediatR" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 July 2020</p><p style="width:100%;margin-top:2rem">Domain events are one of my favorite patterns and one Julie Lerman and I cover in our DDD Fundamentals course, on Pluralsight. I differentiate between two kinds of domain events: pre-persistence and post-persistence. You&#x27;ll find a good implementation of post-persistence domain events (using MediatR) in my Clean Architecture solution template. However, until recently, I hadn&#x27;t built an immediate…</p><br/></li><li><a href="/the-singleton-design-pattern/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The Singleton Design Pattern</h2><img src="/static/902e8b04dfc7c62338ff1ed00aa11cb0/4e530/singleton-design-pattern.png" alt="The Singleton Design Pattern" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 June 2020</p><p style="width:100%;margin-top:2rem">The Singleton Design Pattern is a fairly simple creational pattern used to ensure that there is only ever a single instance of a class in an object-oriented language. It&#x27;s useful for ensuring expensive class instances are only created once and to eliminate the need to try and orchestrate between multiple class instances that are each trying to access a single shared resource, such as a file or…</p><br/></li><li><a href="/stream-deck-cpu-graph-buttons/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Stream Deck CPU Graph Buttons</h2><img src="/static/2efabde03069b5461c3bf64b1e5f19fd/4e530/stream-deck-cpu-buttons.png" alt="Stream Deck CPU Graph Buttons" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 May 2020</p><p style="width:100%;margin-top:2rem">I&#x27;ve been using a Stream Deck (affiliate link) for a while now and I keep finding more and more uses for the device. Recently, I started looking for more active buttons to display common utilities like CPU, Graphics Processor, and Network I/O graphs. It&#x27;s easy to configure a button to just show the current CPU percentage, but I wanted an actual CPU graph in a Stream Deck button, and that wasn&#x27;t…</p><br/></li><li><a href="/never-use-the-same-value-for-two-ids-or-other-values-in-your-tests/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Never use the same value for two IDs (or other values) in your tests</h2><img src="/static/a0019e9a331b1c2207ca43fdd02259eb/4c509/tests.png" alt="Never use the same value for two IDs (or other values) in your tests" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 May 2020</p><p style="width:100%;margin-top:2rem">When you&#x27;re writing automated tests, whether you&#x27;re following TDD or not, you want to avoid the possibility of testing the wrong thing. This is surprisingly easy to do if you&#x27;re not careful, I can say from personal experience! One way this can easily happen is if you&#x27;re quickly writing a series of tests, and doing so using copy-paste programming, like you might see here: This is from one of my…</p><br/></li><li><a href="/configuring-a-local-test-email-server/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configuring a Local Test Email Server</h2><img src="/static/608e6b21bec74b23f4e720e707a6227d/4e530/configuring-a-local-test-email-server.png" alt="Configuring a Local Test Email Server" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 May 2020</p><p style="width:100%;margin-top:2rem">It’s been a few years since I wrote about using a tool like Smtp4Dev for local test emails (and that article has issues), so here’s an update. If you’re working with code that should send emails sometimes, it’s really helpful to be able to let that code still run, but not actually send emails. That’s where running a local test email server on your development machine comes in. Here are a few…</p><br/></li><li><a href="/integrate-github-and-discord-with-webhooks/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Integrate GitHub and Discord with Webhooks</h2><img src="/static/3478884e59b30a4f547fce05978530f5/4c509/integrate-github-discord-webhooks-760x360.png" alt="Integrate GitHub and Discord with Webhooks" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 April 2020</p><p style="width:100%;margin-top:2rem">I&#x27;ve started using Discord more and more for things like my private group coaching program focused on software developers. It&#x27;s worked quite well and is completely free for our needs. You can easily add bots and notifications from other systems, including your own ASP.NET web applications, using web hooks. One of the easier ways to configure notifications from things you care about as a developer…</p><br/></li><li><a href="/stored-procedures-orms-and-graphql/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Stored Procedures, ORMs, and GraphQL</h2><img src="/static/bd864b8d774c06ff18b4e7984b5a61ff/4e530/stored-procedures-orms-graphql.png" alt="Stored Procedures, ORMs, and GraphQL" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 April 2020</p><p style="width:100%;margin-top:2rem">GraphQL is the new ORM, and your API endpoint is the new stored procedure About fifteen years ago, a debate raged in the still-young .NET development world over how best to access data. On the one side were the traditionalists, among them database administrators (DBAs) and many experienced software developers with experience building efficient, performant applications. On the other were (mostly…</p><br/></li><li><a href="/configuring-logging-in-azure-app-services/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configuring Logging in Azure App Services</h2><img src="/static/26bf365b5c6a2ac8ea4fa954a1771b50/4e530/configuring-logging-in-azure-app-service.png" alt="Configuring Logging in Azure App Services" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 April 2020</p><p style="width:100%;margin-top:2rem">Azure App Services are a very easy and economical way to quickly deploy your ASP.NET/ASP.NET Core apps to the cloud. You can get started for free if you just want to try out something you&#x27;re developing (without uptime considerations) and entry-level plans are pretty affordable: The docs for publishing to an Azure App Service are pretty good so I won&#x27;t get into that here. I recommend configuring…</p><br/></li><li><a href="/are-boolean-flags-on-methods-a-code-smell/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Are Boolean Flags on Methods a Code Smell?</h2><img src="/static/00dbc881f3aa3a8e88e7306a9a723c02/4e530/are-boolean-flags-on-methods-a-code-smell.png" alt="Are Boolean Flags on Methods a Code Smell?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 April 2020</p><p style="width:100%;margin-top:2rem">Recently I had one of my newsletter subscribers ask me a question about whether it was a good practice to use a boolean parameter to alter the behavior of a method. Martin Fowler describes (many of*) these as Flag Arguments. The topic is also covered in this StackExchange question. Clean Code also discusses it. On a slightly related note, the Flags Over Objects antipattern describes this same…</p><br/></li><li><a href="/add-discord-notifications-to-asp-net-core-apps/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Add Discord Notifications to ASP.NET Core Apps</h2><img src="/static/442458becd613e04040a3cc48c27e07e/4e530/add-discord-notifications-aspnetcore-apps.png" alt="Add Discord Notifications to ASP.NET Core Apps" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 April 2020</p><p style="width:100%;margin-top:2rem">I&#x27;m continuing to have fun building out features for the devBetter site, which provides resources for my group coaching members. We meet weekly to answer questions, work through exercises together, and share progress, but we also have a very active Discord server where we do a lot of the same thing throughout the week. As I was working on integrating GitHub actions with deployments to Azure, I…</p><br/></li><li><a href="/adapter-design-pattern/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Adapter Design Pattern</h2><img src="/static/e30d0ec244eb22cee8ce354effced5ed/4e530/adapter-design-pattern.png" alt="Adapter Design Pattern" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 April 2020</p><p style="width:100%;margin-top:2rem">A couple of months ago I published a new, revised course called C# Design Patterns: Adapter on Pluralsight. It&#x27;s one of my favorite patterns and its predecessor, the Design Patterns Library, remains one of the most popular courses of all time on Pluralsight. It&#x27;s almost 16 hours long but I encourage you to get through it as an achievement if you can. Look for a revised learning path through the…</p><br/></li><li><a href="/streaming-checklist/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Streaming Checklist</h2><img src="/static/f306f54c7bc53504e561f9b18bc48a06/4c509/streaming-checklist-760x360.png" alt="Streaming Checklist" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 March 2020</p><p style="width:100%;margin-top:2rem">I&#x27;m a fan of checklists – they&#x27;re an intermediate step before automating a process to ensure it&#x27;s done correctly and consistently. You&#x27;ll find a number of different checklists on this site. This one is about streaming, specifically for my twitch.tv/ardalis account. I&#x27;ve been meaning to blog about this forever, but it&#x27;s just been sitting in my OneNote for the longest time while other things have…</p><br/></li><li><a href="/github-draft-pull-requests/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GitHub Draft Pull Requests</h2><img src="/static/fa2c1e0845d898cb665cf03388301f4a/4c509/github-draft-pull-requests-760x360.png" alt="GitHub Draft Pull Requests" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 March 2020</p><p style="width:100%;margin-top:2rem">A feature introduced last month by the GitHub team is called draft pull requests. When you create a Draft Pull Request, it cannot be merged until it is marked as ready for review. This is useful because often pull requests are used as conversations, often prior to the work being ready to merge. Common approaches to this in the past have included such classic approaches as: Adding “WIP” for “Work…</p><br/></li><li><a href="/getting-started-with-architecture-decision-records/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Started with Architecture Decision Records</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 March 2020</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 Have you ever been on a software team for a while, and then someone new joins the team and starts asking the usual questions about why this or that technology or pattern is being used on the project? And then a few months later, someone else joins and all the same questions come up again? Or maybe some team member, whether new or not, constantly wants to relitigate…</p><br/></li><li><a href="/priorities-of-work-on-a-board/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Priorities of Work on a Board</h2><img src="/static/a6c44a53f6b61b1d0167d3aa843f9d34/4c509/priorities-of-work-on-board-760x360.png" alt="Priorities of Work on a Board" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 March 2020</p><p style="width:100%;margin-top:2rem">This is obvious once you think about it but I’ve found many people haven’t thought about it so I’m going to lay it out here real quick. A lot of teams use some kind of task or kanban board today to track the status of work. This is typically part of some kind of agile or Scrum or kanban process. If you want to learn more about kanban, check out my short course on the fundamentals of kanban…</p><br/></li><li><a href="/rest-commands-and-queries-in-vs-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">REST Commands and Queries in VS Code</h2><img src="/static/ca5b81951b1118c162ff6a2e43922d93/4c509/rest-commands-and-queries-in-vs-code.png" alt="REST Commands and Queries in VS Code" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 February 2020</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 Recently in one of our great devBetter discussions, Rick Hodder (go follow him now) shared a cool extension for VS Code. Basically, it lets you turn VS Code into a REST client. Think of it like a combination of Postman and Azure Data Studio (or LinqPad or SSMS if you prefer). Now, I like Postman. It&#x27;s a great and powerful tool. But it&#x27;s a lot more effort to issue a…</p><br/></li><li><a href="/git-autocorrect/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Git Autocorrect</h2><img src="/static/c61ca4e0043c30d3e765ce4df9dc75f4/4c509/git-autocorrect-still-760x360.png" alt="Git Autocorrect" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 February 2020</p><p style="width:100%;margin-top:2rem">I don’t know how I didn’t know about this before now, but apparently you can turn on autocorrect for your git command line, and it will accept (after a short delay in which you can cancel) commands that are close to but not exactly correct. Example: You probably meant: And it will go ahead and do that for you. Setting it up You can set this up in your git config, either globally or per repo. I don…</p><br/></li><li><a href="/encapsulation-boundaries-large-and-small/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Encapsulation Boundaries Large and Small</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 January 2020</p><p style="width:100%;margin-top:2rem">Writing any significantly complex software application involves the use of encapsulation boundaries and abstractions. Think about the smallest bit of executable code in your program: an expression or perhaps a statement. This typically maps roughly to a line of code. You can build entire applications using only this structure. If you do, they look something like this: A program made up of a…</p><br/></li><li><a href="/2019-year-in-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">2019 Year in Review</h2><img src="/static/9ff468fdaec0693ce79d541c521ca294/4c509/2019-year-in-review-760x360.png" alt="2019 Year in Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 January 2020</p><p style="width:100%;margin-top:2rem">Yes, it’s that time again. Time for another recap of what happened last year. If you’re reading this, and you’re not me, you probably are mostly interested in the most popular articles from last year, in case you missed something others found interesting. So, I’ll start with those. If you’re looking for other years in review, or want a checklist to help with writing your own year in review article…</p><br/></li><li><a href="/codemash-2020-recap-and-cloud-design-patterns-talk/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Codemash 2020 Recap and Cloud Design Patterns Talk</h2><img src="/static/9de33c17f18ded81a65c5ef99a3bca73/5d2c5/codemash_2020_original.png" alt="Codemash 2020 Recap and Cloud Design Patterns Talk" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 January 2020</p><p style="width:100%;margin-top:2rem">I&#x27;m home after surviving another great Codemash! I&#x27;m not sure how many Codemash events I&#x27;ve attended but I think it&#x27;s [ALL OF THEM] - 2 (looks like the first one was in 2007 so if my math is right (takes off socks) that would be 14 total minus 2 is 12). I had to miss one year when my twins (now 5) were born, and I missed last year due to a work conflict. Here&#x27;s my quick recap of the event, which…</p><br/></li><li><a href="/using-grep-to-find-strings-in-markdown-md-files-on-windows/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using Grep to Find Strings in Markdown .md Files on Windows</h2><img src="/static/e43404b7f7cb582a84deb7a498469a0c/4c509/using-grep-find-strings-markdown-windows.png" alt="Using Grep to Find Strings in Markdown .md Files on Windows" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 December 2019</p><p style="width:100%;margin-top:2rem">I recently needed to find which of a bunch of markdown files had a particular string in them. My initial thought, since I&#x27;m on Windows, was to use Windows File Explorer&#x27;s search dialog. No dice - it found no results when I knew there were some. I did a quick search for &#x27;windows explorer search markdown files&#x27; which led me to a Super User thread that said I&#x27;d have to install a Markdown Preview to…</p><br/></li><li><a href="/domain-driven-design-with-asp-net-core-workshop/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Domain-Driven Design with ASP.NET Core Workshop</h2><img src="/static/a7c72d6bd375aaf48d2f70d2748a7e5d/4c509/domain-driven-design-aspnet-core-workshop.png" alt="Domain-Driven Design with ASP.NET Core Workshop" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 November 2019</p><p style="width:100%;margin-top:2rem">I first learned about Domain-Driven Design, or DDD, over ten years ago. Since then, I&#x27;ve given more workshops on the topic, both public and private on sites, than I can remember. Julie Lerman and I also published a very popular course, DDD Fundamentals, on Pluralsight, which I expect we will refresh in the coming year. (By the way, there&#x27;s a 40% off sale for Black Friday going on now (as I write…</p><br/></li><li><a href="/moving-from-controllers-and-actions-to-endpoints-with-mediatr/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Moving from Controllers and Actions to Endpoints with MediatR</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 November 2019</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 (or Controllers are dinosaurs - it&#x27;s time to embrace Endpoints) Update Feb 2020: I&#x27;ve started a GitHub repo and NuGet package to implement Endpoints in ASP.NET Core (without MediatR and with file linking in Visual Studio). Check it out after reading this and see what you think. Controllers are a key part of the MVC pattern. They&#x27;re the entry point, responsible for…</p><br/></li><li><a href="/sketch-themes-for-prototypes/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Sketch Themes for Prototypes</h2><img src="/static/e24c688e8f075c3ee3506ef849bcab6e/9e035/image-7-715x360.png" alt="Sketch Themes for Prototypes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 October 2019</p><p style="width:100%;margin-top:2rem">Last week during one of my devBetter coaching sessions, the conversation turned to spikes and Minimum Viable Products (and even not-so-viable products). Sometimes, in order to get rapid feedback, it&#x27;s useful to throw together a prototype that has literally nothing going on in the backend, but lets the user get a sense of how the application would flow. The problem, of course, is that once users…</p><br/></li><li><a href="/be-humble-and-kind/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Be Humble and Kind</h2><img src="/static/3956fc3af4a54de22ff2229e1b4fde36/4c509/be-humble-and-kind-760x360.png" alt="Be Humble and Kind" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 October 2019</p><p style="width:100%;margin-top:2rem">This originally went out just to my Weekly Dev Tips mailing list, but I got a lot of positive comments and requests to share it, so I’m publishing it here. Sign up for Weekly Dev Tipsto get a new tip in your inbox each Wednesday. I’m not a big fan of country music (my wife is, however) but Tim McGraw’s Humble and Kind has it right. Don’t let success get to your head. You don’t know everything – be…</p><br/></li><li><a href="/running-integration-tests-in-build-pipelines-with-a-real-database/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Running Integration Tests in Build Pipelines with a Real Database</h2><img src="/static/ed1bcf895695d762b6dd9b3695bbe36e/4c509/running-integration-tests-in-build-pipelines-with-a-real-database.png" alt="Running Integration Tests in Build Pipelines with a Real Database" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 October 2019</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 A pain point for some organizations is figuring out how to run tests that involve databases. These are not unit tests, by most folks&#x27; definition (including my own: unit test or integration test and why you should care). Nonetheless, they&#x27;re important and ideally they should run as part of your build pipeline. Recently I&#x27;ve come up with a technique that works quite…</p><br/></li><li><a href="/configure-different-implementations-for-different-controllers-in-configureservices/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configure Different Implementations for Different Controllers in ConfigureServices</h2><img src="/static/05544846c39c9321471fd73525d6cf4c/4c509/configure-different-services-for-controllers.png" alt="Configure Different Implementations for Different Controllers in ConfigureServices" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 October 2019</p><p style="width:100%;margin-top:2rem">You may find yourself in a position where you need to have two (or more) different implementations of the same interface within your ASP.NET Core application. This may be because your application is too big to allow you to fully replace one implementation with another all at once, so you&#x27;re rolling out the updates one type at a time. Let&#x27;s say the services in question relate to persistence, and…</p><br/></li><li><a href="/dotnet-ef-does-not-exist/"><h2 class="is-size-2" style="width:100%;word-break:break-word">dotnet-ef does not exist</h2><img src="/static/d72fb4d2d4a8aaf2811b61f3c1b4f503/4c509/dotnet-ef-tool-install.png" alt="dotnet-ef does not exist" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 October 2019</p><p style="width:100%;margin-top:2rem">If you&#x27;re trying to run EF Core migrations using commands like or and you&#x27;re getting errors like the one shown in the screenshot above, here&#x27;s the fix. You need to install the dotnet-ef tool, ideally globally so you can run it from anywhere. To do so, run this script from a command prompt/terminal window: dotnet tool install --global dotnet-ef Once you&#x27;ve done so, you should be able to run your…</p><br/></li><li><a href="/attacking-technical-debt/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Attacking Technical Debt</h2><img src="/static/173f99c5160f8e3cbaaf32deacc556b2/4c509/attacking-technical-debt.png" alt="Attacking Technical Debt" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 September 2019</p><p style="width:100%;margin-top:2rem">Technical Debt is a metaphor for shortcuts and hacks in software that make it more difficult to change and maintain than it could be with an optimal design. Many applications have accumulated a large amount of technical debt, and figuring out how to deal with it is a fairly common challenge for many developers, especially senior developers starting new contracts or jobs at companies that need help…</p><br/></li><li><a href="/enforce-developer-workflow-policies-with-branch-protection/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Enforce Developer Workflow Policies with Branch Protection</h2><img src="/static/43dbc4d8b090d3cf3b68854db1aa690f/4c509/enforce-developer-workflow-policies-with-branch-protection.png" alt="Enforce Developer Workflow Policies with Branch Protection" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 September 2019</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 A frequent question I hear from clients is some variant of &quot;Ok, Continuous Integration is great, but how do we get everybody on the team to pay attention to it?&quot; This is obviously a bigger problem if the question is coming from a lone junior developer, as opposed to a technical manager. In the case of the junior developer, they may need some help convincing the rest…</p><br/></li><li><a href="/git-graph-visualizes-branches-in-vs-code-for-free/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Git Graph Visualizes Branches in VS Code for Free</h2><img src="/static/21d1316f5173b6fabbac6d601187defc/4c509/git-graph-visualizes-branches-in-vs-code-for-free.png" alt="Git Graph Visualizes Branches in VS Code for Free" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 September 2019</p><p style="width:100%;margin-top:2rem">I recently discovered a very nice VS Code extension to use with git. You can view my full list of tools and extensions I use here if you&#x27;re interested. In this case, I was working from a locked down laptop for a financial services company that&#x27;s a client of mine (talk to me if you&#x27;d like help building better software), and I wanted to see a good visualization of the my branch in relation to other…</p><br/></li><li><a href="/which-is-more-important-line-coverage-or-branch-coverage/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Which is more important, line coverage or branch coverage?</h2><img src="/static/5f88caf833cc94b4f4a9695e27fd7157/4c509/which-is-more-important-line-coverage-branch-coverage.png" alt="Which is more important, line coverage or branch coverage?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 August 2019</p><p style="width:100%;margin-top:2rem">I&#x27;ve been setting up code coverage for some of my clients&#x27; projects and some of my own open source projects, like Clean Architecture and Specification (100%!) and Guard Clauses (99%...). I wrote up how to configure Azure DevOps to generate code coverage reports that properly merge the results from multiple test projects using ReportGenerator. When you look at a code coverage report, whether it&#x27;s…</p><br/></li><li><a href="/configure-visual-studio-to-name-private-fields-with-underscore/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configure Visual Studio to Name Private Fields with Underscore</h2><img src="/static/207110a9cdda88e2eb4c58bc7a34bc85/4c509/configure-visual-studio-name-private-fields-underscore.png" alt="Configure Visual Studio to Name Private Fields with Underscore" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 August 2019</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 Most C# coding standards recommend using camelCase for local variables and _camelCase for private or internal (and I also say for protected, but that&#x27;s just me) fields. Unfortunately, out of the box Visual Studio just uses camelCase for these fields, which makes typical dependency injection scenarios annoying in constructors: I much prefer this version: Fortunately…</p><br/></li><li><a href="/using-multiple-solutions-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using Multiple Solutions in Visual Studio</h2><img src="/static/59faf93fd18001938d3b6432d38c51db/4e530/using-multiple-solutions-in-visual-studio.png" alt="Using Multiple Solutions in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 August 2019</p><p style="width:100%;margin-top:2rem">I&#x27;ve given this advice quite a number of times so I figured it was time to put it into an online article. If you&#x27;re a .NET developer you probably use or have used Visual Studio. Visual Studio has two kinds of project organization file formats: projects and solutions. Solutions are essentially groups of projects. Most software applications involve more than one project, and so virtually every…</p><br/></li><li><a href="/minimize-new-in-automated-tests/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Minimize new in Automated Tests</h2><img src="/static/4294a21ee71f3f79cad62a34d1af8d87/4e530/minimize-new-in-automated-tests.png" alt="Minimize new in Automated Tests" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 August 2019</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 Automated tests have gained a lot of acceptance in recent years. Not long ago, many organizations bristled at the notion of having their expensive developers spend time writing code that wasn&#x27;t actually going to ship to production, but instead would just verify that the &quot;real&quot; code worked. Today, the idea that testing in many instances is something computers can do…</p><br/></li><li><a href="/how-to-grab-a-pull-request-locally-with-git-command-line/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Grab a Pull Request Locally with Git Command Line</h2><img src="/static/1fa94dad077a8db2183be990a896b066/e9313/image-5.png" alt="How to Grab a Pull Request Locally with Git Command Line" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 July 2019</p><p style="width:100%;margin-top:2rem">If you&#x27;re working with git, especially with open source, sometimes you&#x27;ll find that you want to work with a particular pull request, or PR, locally. Maybe you&#x27;re reviewing the PR and instead of just eyeballing it in the browser you want to actually run the code and see what it does (novel idea, I know!). In any case, actually getting the code from a PR, especially one from a fork that isn&#x27;t even…</p><br/></li><li><a href="/configuring-entities-in-ef-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configuring Entities in EF Core</h2><img src="/static/5b7ca3e4e470d0c951f6e8d7c558efbe/4e530/configuring-entities-ef-core.png" alt="Configuring Entities in EF Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 July 2019</p><p style="width:100%;margin-top:2rem">I&#x27;ve worked with many clients who are upgrading from EF 6 to EF Core. Many of them are coming from EDMX files, and are wondering what the best approach is in EF Core to configure entities based on the database (or vice versa). Regardless of whether your C# entities are written first or the database is, somewhere you need to have mapping information to let Entity Framework know how it should store…</p><br/></li><li><a href="/generate-code-coverage-reports-with-reportgenerator-in-azure-devops/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Generate Code Coverage Reports with ReportGenerator in Azure DevOps</h2><img src="/static/121abc4ea4131019ce5bea089380dc0d/4e530/generate-code-coverage-reports-reportgenerator-azure-devops.png" alt="Generate Code Coverage Reports with ReportGenerator in Azure DevOps" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 July 2019</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 Recently I&#x27;ve been looking at different ways to generate code coverage reports during automated builds. I&#x27;m mostly working with Azure DevOps for builds these days, as they&#x27;ve come a long way since the early TFS days and the hosted version is now free for open source projects. This is really nice because I have a bunch of open source projects and I understand the value…</p><br/></li><li><a href="/testing-production-api-endpoints-with-xunit/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Testing Production API Endpoints with xUnit</h2><img src="/static/a6d2c3ce6742210c37eb9e66417d6226/4c509/testing-production-api-endpoints-with-xunit.png" alt="Testing Production API Endpoints with xUnit" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 July 2019</p><p style="width:100%;margin-top:2rem">I&#x27;m a big fan of unit tests and integration tests and have written about them frequently. I also authored the original docs on writing integration tests in ASP.NET Core using TestHost and related types. However, sometimes it&#x27;s worthwhile to be able to test actual, live API endpoints. This article will lay out a relatively simple way to do this in a configurable manner using xUnit. In the past, I…</p><br/></li><li><a href="/syncing-a-fork-of-a-github-repository-with-upstream/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Syncing a Fork of a GitHub Repository with Upstream</h2><img src="/static/a65ace01a21258b6c2e80d8bf93002ab/4c509/syncing-a-fork-of-a-github-repository-with-upstream.png" alt="Syncing a Fork of a GitHub Repository with Upstream" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 June 2019</p><p style="width:100%;margin-top:2rem">Update 13 October 2023 GitHub made this easier. You can still use the approach below, but also check out how you can Fetch Upstream directly in GitHub.com. I work on a few GitHub projects, like the Microsoft Docs, where I&#x27;m a relatively frequent contributor but I don&#x27;t have commit rights. This means that I need to make a fork of their repository, do some work in my fork, and then send a pull…</p><br/></li><li><a href="/fixed-problem-connecting-to-docker-for-windows-aspnet-app/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Fixed Problem Connecting to Docker for Windows ASPNET App</h2><img src="/static/f7aef1e15e004d7b80724fca61e40de0/4c509/fixed-problem-connecting-to-docker-for-windows-aspnet-app.png" alt="Fixed Problem Connecting to Docker for Windows ASPNET App" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 June 2019</p><p style="width:100%;margin-top:2rem">Recently I was working on some WinForms and classic MVC (not Core) apps built with ASP.NET and migrating them to Azure using containers. There&#x27;s a repo with samples and an ebook on modernizing your .NET apps so they can take advantage of containers and cloud architecture. Check it out if this sounds like something you think you&#x27;ll be doing. Anyway, while running these apps locally using Docker for…</p><br/></li><li><a href="/create-alias-to-set-window-title-in-powershell/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Create Alias to Set Window Title in PowerShell</h2><img src="/static/71d14e85497a0a397b06479e9a55075d/4c509/create-alias-to-set-window-title-in-powershell-760x360.png" alt="Create Alias to Set Window Title in PowerShell" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 May 2019</p><p style="width:100%;margin-top:2rem">I’ve written previously about how to set the window title in PowerShell. Unfortunately, it’s a little complicated. Recently on twitter, though, Greg MacLellan showed me how to create an alias so you can just type to set the window title. This involves editing your PowerShell profile, which you may not even have, so here are the steps to take to make this happen. First, determine if you have a…</p><br/></li><li><a href="/speaking-and-presenting-last-minutes-checklist/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking and Presenting Last Minutes Checklist</h2><img src="/static/30c82f70c0bdcb9fe5fc4379cd07bcd3/4c509/speaking-and-presenting-last-minutes-checklist-760x360.png" alt="Speaking and Presenting Last Minutes Checklist" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 May 2019</p><p style="width:100%;margin-top:2rem">You have a presentation to give. You’ve been asked to speak to a group of your peers. You’re giving a conference session. The previous presenter just finished – you’re up as the next speaker. You have fifteen minutes. What do you need to do? This isn’t the checklist for what to do after you’ve just found out you have a presentation to give, or you were just accepted to speak at a conference. There…</p><br/></li><li><a href="/automatically-detect-expiring-https-ssl-certificates/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Automatically Detect Expiring HTTPS SSL Certificates</h2><img src="/static/42000562d5fa4d97d5221721d900a0bb/4c509/automatically-detect-expiring-https-ssl-certificates.png" alt="Automatically Detect Expiring HTTPS SSL Certificates" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 May 2019</p><p style="width:100%;margin-top:2rem">All too often we hear about a site going down or suffering problems because they&#x27;ve let their public x509 certificate expire. SSL certificates, which are required for HTTPS to work for secure connections using TLS to domains, expire after a number of years. Often, the team or individual who purchased and installed the initial HTTPS certificate is no longer in that role by the time the expiration…</p><br/></li><li><a href="/how-to-add-files-to-a-github-repo-you-don’t-own/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Add Files to a GitHub Repo You Don’t Own</h2><img src="/static/9ef24b37b1db2b3116c9d46edb2f5783/4c509/how-to-add-files-to-a-github-repo-you-dont-own-760x360.png" alt="How to Add Files to a GitHub Repo You Don’t Own" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 May 2019</p><p style="width:100%;margin-top:2rem">There are a bunch of GitHub (and other git host) repositories that aren’t really for software projects, but rather are for documentation or other resources. For example, the ASP.NET Core docs, or various awesome lists, or the slides and materials from conferences like Stir Trek. Frequently, even as a non-developer, you may want to contribute to such repositories, maybe even just as simply as to…</p><br/></li><li><a href="/ultimate-developer-rig-2019/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Ultimate Developer Rig 2019</h2><img src="/static/fe3a9caa7173795f0d37401d6ff30781/4c509/dev-machine-2019-buildout-760x360.png" alt="Ultimate Developer Rig 2019" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 April 2019</p><p style="width:100%;margin-top:2rem">I recently upgraded my desktop developer machine. My goal was to support more docker-based application development including ones that run multiple microservices at the same time, like the eShopOnContainers sample that I assist with (see also my own eShopOnWeb sample and eBook). My friend Bill Henning (of Actipro Software fame) came up with the initial parts list for his machine back in November…</p><br/></li><li><a href="/set-up-reverse-dns-ptr-record-for-windows-azure/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Set up Reverse DNS (PTR) Record for Windows Azure</h2><img src="/static/7c1b89c0c392c5b7c983e4b456918f71/05b00/azure-logo.png" alt="Set up Reverse DNS (PTR) Record for Windows Azure" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 April 2019</p><p style="width:100%;margin-top:2rem">Windows Azure offers support for RDNS (PTR) records, which are used to get a hostname from an IP address (the opposite of what DNS does, hence the name). Microsoft has an article that describes how to set RDNS up, but it assumes you&#x27;ve already installed the azure CLI tools. Since I&#x27;m going through the process from scratch, I thought I&#x27;d share the full process here. You&#x27;ll need to have npm…</p><br/></li><li><a href="/add-https-to-any-site-for-free/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Add HTTPS To Any Site For Free</h2><img src="/static/cbf2088fbce5f24d4ce9d35f76e187ef/4c509/cloudflare-addsite-760x360.png" alt="Add HTTPS To Any Site For Free" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 March 2019</p><p style="width:100%;margin-top:2rem">Back in the old days, adding HTTPS/SSL/TLS to secure a web site was a big deal. You had to spend hundreds of dollars for a certificate, then install it on the web server. It had to be specific to the subdomain you were using, or you had to shell out even more bucks for the wildcard cert. And they’d expire sometimes, and your site would go down, and that was never fun. Times have changed. Yes, you…</p><br/></li><li><a href="/the-more-you-know-the-more-you-realize-you-dont-know/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The More You Know The More You Realize You Don&#x27;t Know</h2><img src="/static/c1908a187b30eb7597d9927a8d7aea2d/6050d/IMG_0133.png" alt="The More You Know The More You Realize You Don&#x27;t Know" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 February 2019</p><p style="width:100%;margin-top:2rem">Aristotle famously wrote, &quot;The more you know, the more you realize you don&#x27;t know.&quot; In the image above, you can see the effect this has on confidence as one&#x27;s experience grows. Initially, your confidence is low since you know you&#x27;re inexperienced. However, after a short while, you start to &quot;get it&quot;, and you get into a comfort zone. Depending on how demanding your environment is, you might stay…</p><br/></li><li><a href="/how-to-hide-the-connection-bar-in-remote-desktop-connection-rdp/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Hide the Connection Bar in Remote Desktop Connection (RDP)</h2><img src="/static/6e1d3f0553eff0f73676f7904e9e8090/5cc5c/hide-connection-bar-in-remote-desktop-rdp.png" alt="How to Hide the Connection Bar in Remote Desktop Connection (RDP)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 February 2019</p><p style="width:100%;margin-top:2rem">Sometimes, like when you&#x27;re trying to record a full screen video from a (virtual) machine you&#x27;ve connected to using remote desktop, you&#x27;d like to hide the blue connection bar that display at the top of the screen. In my case, I was recording how something installs on a fresh Windows 10 virtual machine that I was connecting to over RDP since it was hosted in Azure. The blue bar at the top of the…</p><br/></li><li><a href="/nuget-publication-checklist/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Nuget Publication Checklist</h2><img src="/static/bc6b17c48b35d0b7d209dc3027fc505f/4c509/nuget-package-publication-checklist.png" alt="Nuget Publication Checklist" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 January 2019</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 I have a few Nuget packages that I maintain, and when I get a new PR or add a new feature or bugfix, I like to try and get the change out quickly. Unfortunately, this is a somewhat manual process for me currently, and I don&#x27;t do it all that often, so I screw it up a high percentage of the time. Or I end up putting it off because it&#x27;s not something I can just click a…</p><br/></li><li><a href="/2018-year-in-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">2018 Year in Review</h2><img src="/static/baf3bb2aa0528a692e126b0c3aacbf34/4e530/2018-year-in-review.png" alt="2018 Year in Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 January 2019</p><p style="width:100%;margin-top:2rem">Now that 2018&#x27;s been over for a few weeks, I&#x27;ve had a chance to compile some data from a variety of sources that I thought some people might find interesting, including future me. This post will include details on the traffic for my blog as well as other properties, how things are going with my podcast, where things are headed with devBetter, and a few other random bits. This Blog In 2018, I…</p><br/></li><li><a href="/load-testing-and-the-requests-per-second-curve/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Load Testing and the Requests per Second Curve</h2><img src="/static/6b9fd99aa5efb497ffd9f23ad0b7e8ac/4c509/Requests-per-second.png" alt="Load Testing and the Requests per Second Curve" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 January 2019</p><p style="width:100%;margin-top:2rem">There are a few basic curves you look for when load testing. They&#x27;re pretty much standard, but there&#x27;s not a lot of information out there about them, specifically. In this post I&#x27;m going to just describe one such curve, and what it tells you. It&#x27;s the Requests per Second (or RPS or R/S) curve. Some tools will show you Pages per Second (P/S) which generally has the same properties. This curve will…</p><br/></li><li><a href="/becoming-a-developer-team-force-multiplier/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Becoming a Developer Team Force Multiplier</h2><img src="/static/4098e42d4828833365f08bbf0e43455f/4e530/becoming-a-developer-team-force-multiplier.png" alt="Becoming a Developer Team Force Multiplier" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 January 2019</p><p style="width:100%;margin-top:2rem">I have clients who describe me and my team as a &quot;force multiplier&quot; for their development organization. What does this mean, and how can it apply to you? How can you become a force multiplier for your team or company? I talked about this topic briefly in a previous weekly dev tip email (subscribe): A force multiplier is anything that increases the capabilities of existing resources. The &#x27;force…</p><br/></li><li><a href="/support-for-value-objects-in-csharp/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Support for Value Objects in C#</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 December 2018</p><p style="width:100%;margin-top:2rem">Last Updated: 26 Sep 2024 As someone who uses many Domain-Driven Design patterns in my .NET code, I&#x27;ve long wanted to have built-in immutable value objects in C#. Value objects have a few characteristics: They&#x27;re immutable. You can&#x27;t change their state (once created - see below). Their state is fully set when they&#x27;re created. Because they&#x27;re immutable once created. Two value objects are considered…</p><br/></li><li><a href="/analyzing-404s-with-google-analytics/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Analyzing 404s with Google Analytics</h2><img src="/static/d102041522991e72e3d57e6df245bb82/4c509/google-analytics-custom-404-report-results.png" alt="Analyzing 404s with Google Analytics" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 December 2018</p><p style="width:100%;margin-top:2rem">I&#x27;ve been wanting to analyze broken links coming into my site so that I could add 301 redirects if necessary. I figured I could probably use Google Analytics to analyze 404s and broken links on my site. With a bit of research I was able to get this working as a custom report. I initially tried importing a couple of custom reports I found in the gallery, but none of them worked so I created my own…</p><br/></li><li><a href="/double-dispatch-in-c-and-ddd/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Double Dispatch in C# and DDD</h2><img src="/static/db1d7b2aca65efc3e1a34b481aa11b36/4e530/double-dispatch-in-csharp-and-ddd.png" alt="Double Dispatch in C# and DDD" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 December 2018</p><p style="width:100%;margin-top:2rem">Double dispatch is a pattern you can use in C# to control how communication flows between two objects. A frequent use of the pattern is to pass &quot;this&quot; to a function on another class, allowing that class to communicate back to or manipulate the calling object instance. It can also be used to achieve polymorphic behavior. I have a GitHub sample you can browse or download that demonstrates some of…</p><br/></li><li><a href="/the-javascript-npm-event-stream-vulnerability/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The JavaScript npm event-stream Vulnerability</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 November 2018</p><p style="width:100%;margin-top:2rem">A few months ago a clever attack was introduced in the event-stream npm package. It&#x27;s been explained in detail here, but let me sum it up in TL;DR form here for anybody who hasn&#x27;t been paying attention: 1. In September 2018 the attacker approached the maintainer of a fairly popular npm package and offered to take over maintenance duties - the maintainer agreed and gave the attacker rights to their…</p><br/></li><li><a href="/clean-architecture-with-aspnet-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Clean Architecture with ASP.NET Core</h2><img src="/static/8ca9bc563061dc1feb147e85b3b35cef/4c509/clean-architecture-with-aspnet-core.png" alt="Clean Architecture with ASP.NET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 November 2018</p><p style="width:100%;margin-top:2rem">I&#x27;ve been doing workshops showing teams how to properly architect ASP.NET Core applications using Clean Architecture for the last couple of years. The most recent one was a 4-day on site workshop I did a couple of weeks ago. This is just a quick recap of what we covered. Each team is different and has different needs, so the precise agenda varies to suit the needs of the team. Day One: Unit…</p><br/></li><li><a href="/fun-browser-javascript-tricks-and-hacks/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Fun Browser JavaScript Tricks and Hacks</h2><img src="/static/1ea08a1468628a84edce95f3bfc912a3/4c509/fun-browser-javascript-tricks-and-hacks.png" alt="Fun Browser JavaScript Tricks and Hacks" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 November 2018</p><p style="width:100%;margin-top:2rem">I occasionally present to school-age kids on software development, and an easy way to get them engaged is to show them how something already familiar to them - web sites - can easily be manipulated using tools they already have available. None of these are my own personal creation, but I&#x27;m listing them here for others to benefit from and for me to easily locate in the future, as some of the…</p><br/></li><li><a href="/add-images-easily-to-github/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Easily Add Images to GitHub</h2><img src="/static/b620082e40b017d683f9c01a29477085/4c509/github-insert-image.png" alt="Easily Add Images to GitHub" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 October 2018</p><p style="width:100%;margin-top:2rem">When working with GitHub on things like ReadMe.md files, it&#x27;s often helpful to include pictures. Unfortunately, when editing markdown files online, there&#x27;s no built-in capability to add images: GitHub Markdown Editor UPDATE: You can now paste images directly into the markdown editor on the GitHub web site. So, no need to paste them into issues/comments and then copy the URL - it&#x27;s now there…</p><br/></li><li><a href="/a-retrospective-retro/"><h2 class="is-size-2" style="width:100%;word-break:break-word">A Retrospective Retro</h2><img src="/static/1ef38f164c4620f711d785680c2e94b8/0ff54/blank-color-colorful-209678.jpg" alt="A Retrospective Retro" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 October 2018</p><p style="width:100%;margin-top:2rem">At a client today I facilitated a retrospective for the dev team. I&#x27;ve done a few of these in the past, both for agile software teams and also After Action Reviews (AARs) in the US Army. For AARs, the usual format is to discuss what was supposed to happen, what really happened, what went well, and what didn&#x27;t go well. Then, identify any changes or controls that should be added to improve for next…</p><br/></li><li><a href="/configure-sounds-for-builds-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configure Sounds for Builds in Visual Studio</h2><img src="/static/2c0d322db60c9b2a133846f1ac6e3316/3891b/windows-sounds.png" alt="Configure Sounds for Builds in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 October 2018</p><p style="width:100%;margin-top:2rem">Recently Jeff Fritz tweeted about setting up a sound for his twitch stream and Immo Landwerth suggested using it with Visual Studio. I thought this was a great idea and set it up myself in just a few minutes. Here&#x27;s what you need to do in a few simple steps. Find Sounds There are plenty of sounds built into Windows that you can use, or you can search for free sounds online. I ended up using these…</p><br/></li><li><a href="/replace-logo-with-icon-on-smaller-screens/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Replace Logo with Icon on Smaller Screens</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 October 2018</p><p style="width:100%;margin-top:2rem">I&#x27;m not a responsive design expert. Or even close. But I did recently figure out how to replace a full logo with a smaller square icon on a web site so when it&#x27;s viewed on a phone the header is more compact. Here&#x27;s how I did it so I can find it again, and to help others, and so smarter people can come by and tell me better ways to do it. The HTML The CSS #icon { display: none; } #logo { display…</p><br/></li><li><a href="/dev-up-conference-2018-and-a-small-speaking-hitch/"><h2 class="is-size-2" style="width:100%;word-break:break-word">dev up Conference 2018 (and a small speaking hitch)</h2><img src="/static/02adee7c29a4d98dc708696c9a142e4b/4c509/primary-brand.png" alt="dev up Conference 2018 (and a small speaking hitch)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 October 2018</p><p style="width:100%;margin-top:2rem">This week I was in St. Louis presenting at dev up, a &quot;new&quot; conference that&#x27;s actually no so new, as it was previously the St. Louis Day(s) of .NET, which has been a thing for over a decade, I think. This was my first time at any of the St. Louis events, in any case. I got in Sunday pretty early and spent some time working and meeting up with a few friends. I had an all day workshop the next day…</p><br/></li><li><a href="/speaking-at-nopcommerce-days-2018/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking at nopCommerce Days 2018</h2><img src="/static/2b026df868312a01047232dd18b5f0fa/a84be/nopCommerce.jpg" alt="Speaking at nopCommerce Days 2018" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 October 2018</p><p style="width:100%;margin-top:2rem">Next month on 8-9 November I&#x27;ll be joining many great speakers in Las Vegas for nopCommerce Days 2018. If you&#x27;re unfamiliar with it, nopCommerce is an open source e-commerce solution with a large community of developers and store owners. This 2-day event will be the largest conference they&#x27;ve held, and will have over 700 attendees. I&#x27;ll be speaking about architecting ASP.NET Core solutions using…</p><br/></li><li><a href="/building-a-cachedrepository-in-aspnet-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Building a CachedRepository in ASPNET Core</h2><img src="/static/ec7b2c3cd5d424ee020a0a1e57c84f1b/4c509/building-a-cachedrepository-in-aspnet-core.png" alt="Building a CachedRepository in ASPNET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 August 2018</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 I&#x27;m a fan of proper use of design patterns, and you can get big gains from layering multiple patterns together. One prime example of this in web applications is the combination of the Strategy, Repository, and Proxy/Decorator patterns to create the CachedRepository pattern. This pattern separates caching responsibility from persistence responsibility and makes it…</p><br/></li><li><a href="/whats-new-in-asp-net-core-2-1/"><h2 class="is-size-2" style="width:100%;word-break:break-word">What&#x27;s New in ASP.NET Core 2.1</h2><img src="/static/3e801ff435a9d16e4955329d32149747/31119/msdn-august2018.png" alt="What&#x27;s New in ASP.NET Core 2.1" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 August 2018</p><p style="width:100%;margin-top:2rem">My latest MSDN Magazine feature article covering What&#x27;s New in ASP.NET Core 2.1 was published a few days ago: Microsoft recently released ASP.NET Core 2.1 along with .NET Core 2.1 and Entity Framework (EF) Core 2.1. Combined, these releases offer some great improvements in performance, as well as additional features for .NET Core developers. Microsoft is also offering Long-Term Support (LTS) with…</p><br/></li><li><a href="/measuring-aggregate-complexity-in-software-applications/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Measuring Aggregate Complexity in Software Applications</h2><img src="/static/312a96eee7ab3d37e712b51f5ae27115/4e530/measuring-aggregate-complexity.png" alt="Measuring Aggregate Complexity in Software Applications" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 August 2018</p><p style="width:100%;margin-top:2rem">A variety of tools will let you measure the complexity of a given method in your .NET applications. If you have a high-end SKU of Visual Studio, it will calculate code metrics for your application, one of which is Cyclomatic Complexity (CC). You can also use tools like NDepend, which I highly recommend if you want to quickly gain deep insight into large, complex codebases. Cyclomatic complexity…</p><br/></li><li><a href="/moving-applicationuser-with-identity-ui-library/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Moving ApplicationUser with Identity UI Library</h2><img src="/static/8db8257a124ece5acb58b379d3062c09/4c509/ApplicationUserRazorError.png" alt="Moving ApplicationUser with Identity UI Library" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 July 2018</p><p style="width:100%;margin-top:2rem">One of the new features in ASP.NET Core 2.1 is Razor Class Libraries, which let you compile razor files into NuGet packages. Another that builds on this is the ASP.NET Core Identity functionality as a Razor Class Library. Using this functionality, you can add Identity functionality to your application without having to add all the associated Razor views/pages. Having done that, if you then move…</p><br/></li><li><a href="/test-secure-web-apis-with-visual-studio-web-tests/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Test Secure Web APIs with Visual Studio Web Tests</h2><img src="/static/7896aa7fa4f1a2bcee213e7f07d9db9c/4c509/test-secure-api-with-visual-studio-web-test-760x360.png" alt="Test Secure Web APIs with Visual Studio Web Tests" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 July 2018</p><p style="width:100%;margin-top:2rem">A common approach to securing APIs is through the use of bearer tokens, like JWT. If you’re using JWT, you may find this site useful to easily examine JWT token contents. A common scenario when working with APIs secured by bearer tokens is to have to do something like this: Send credentials to token server to get a token (with some limited lifetime) Use the token from step 1 in the header of…</p><br/></li><li><a href="/calculate-code-metrics-in-vs2017-for-core-and-standard-projects/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Calculate Code Metrics in VS2017 for Core and Standard Projects</h2><img src="/static/227386ead142a5fde3d375b945a774fd/4c509/calculate-code-metrics.png" alt="Calculate Code Metrics in VS2017 for Core and Standard Projects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 July 2018</p><p style="width:100%;margin-top:2rem">A feature I use quite a bit in Visual Studio is the Calculate Code Metrics tool, found under the Analyze menu. You can use it to get some nice information about your projects, including Cyclomatic Complexity, Depth of Inheritance, Class Coupling, and Lines of Code. Microsoft aggregates these into a Maintainability Index as well (which for some reason they color code Green even when it&#x27;s abysmal…</p><br/></li><li><a href="/should-i-add-caching-to-my-web-application/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Should I Add Caching to my Web Application?</h2><img src="/static/78ed00aa2bf4a0e42e14aff0a1a9e35c/07abd/caching-flowchart.png" alt="Should I Add Caching to my Web Application?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 April 2018</p><p style="width:100%;margin-top:2rem">I created a helpful flow chart to use when answering the question, Should I add caching to my web application (or, &quot;Should I implement caching in my ASP.NET (Core) App&quot;)? Most web applications have at least some data that&#x27;s used frequently by the site, but doesn&#x27;t change frequently. There&#x27;s no reason not to cache this data in most cases. If you use a pattern like the CachedRepository, it&#x27;s…</p><br/></li><li><a href="/momentum-dev-conference-and-design-patterns/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Momentum Dev Conference and Design Patterns</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 April 2018</p><p style="width:100%;margin-top:2rem">Yesterday I presented Design Pattern Mastery at Momentum Dev Con, a first-year regional developer conference held in Cincinnati, Ohio. The event opened up with a Women In Technology panel that was very well-received, and used 50-minute sessions with 10-minute breaks to pack a lot of sessions into the one day event. I thought the organizers did a fantastic job and from what I could see, everything…</p><br/></li><li><a href="/weeklydevtips-podcast-checklist/"><h2 class="is-size-2" style="width:100%;word-break:break-word">WeeklyDevTips Podcast Checklist</h2><img src="/static/549509c74b92757685909e5e224b6efc/8c332/WeeklyDevTips_600x591-600x360.png" alt="WeeklyDevTips Podcast Checklist" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 April 2018</p><p style="width:100%;margin-top:2rem">I&#x27;ve been doing a podcast for a little over six months now, called Weekly Dev Tips. The episodes are just 5-10 minutes long and don&#x27;t have a lot of extra fluff - they&#x27;re just straight and to the point, describing a particular tip that some developers will find helpful. The idea is that you can binge on back episodes (ideally start at the beginning) and get a ton of actionable tips in the time you…</p><br/></li><li><a href="/positive-reinforcement-in-code-reviews/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Positive Reinforcement in Code Reviews</h2><img src="/static/54b03aafcfbed1027fbfdd5858122766/4c509/positive-reinforcement-in-code-reviews.png" alt="Positive Reinforcement in Code Reviews" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 March 2018</p><p style="width:100%;margin-top:2rem">Many developers dread reviews of their code, and one reason for this is probably that most reviewers only offer criticism rather than encouragement. Remember as a code reviewer that you can reinforce the things you see that are done well, which can be every bit as important and effective as nitpicking every style guide violation or misplaced bracket. Here are some actual comments I&#x27;ve left…</p><br/></li><li><a href="/finding-things-in-visual-studio-2017/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Finding Things in Visual Studio 2017</h2><img src="/static/ac3757e27dbb7bd019fce0ed0f40ca3c/31119/vs-go-to-all-pascal-search.png" alt="Finding Things in Visual Studio 2017" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 March 2018</p><p style="width:100%;margin-top:2rem">I&#x27;m a proponent of small, single-purpose files for most things in software applications. This helps follow certain SOLID principles, like Single Responsibility and Interface Segregation. It also means my applications tend to have a large number of files. This isn&#x27;t a problem unless you have a hard time working with lots of files. Fortunately, there are tools that make it easier to work with many…</p><br/></li><li><a href="/how-to-modify-visual-studio-2017-or-install-preview-versions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Modify Visual Studio 2017 or Install Preview Versions</h2><img src="/static/ae4acbec4d252ffda4c26d0fb864e456/9deb5/vs-notifications.png" alt="How to Modify Visual Studio 2017 or Install Preview Versions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 March 2018</p><p style="width:100%;margin-top:2rem">When Visual Studio has updates available, you&#x27;ll see a notification flag change color at the top of the screen: vs-notifications When you run the update, the installer will also show you if there are other versions available, such as previews. vs-installer However, if you close the installer dialog it can be difficult to get back to it short of waiting for another update. The trick to finding it…</p><br/></li><li><a href="/improve-performance-through-advance-preparation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Improve Performance through Advance Preparation</h2><img src="/static/413811c0ce2ec5744a1a3b3f551fcdcd/4c509/improve-performance-through-advance-preparation.png" alt="Improve Performance through Advance Preparation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 March 2018</p><p style="width:100%;margin-top:2rem">When looking at tuning application performance, a common principle to follow is this one: Maximize the amount of work not done. It&#x27;s hard to make doing something faster than doing nothing, so do nothing whenever you can. A common way to do very little is to queue up work (in the form of a Command, typically) so that some other process can actually perform the work later. However, you can also…</p><br/></li><li><a href="/api-feature-folders/"><h2 class="is-size-2" style="width:100%;word-break:break-word">API Feature Folders</h2><img src="/static/a50e2945f1f7a5ea8831f0e8e078b6ee/c526b/api-feature-folders.png" alt="API Feature Folders" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 February 2018</p><p style="width:100%;margin-top:2rem">I&#x27;ve written about feature folders for ASP.NET Core before, and how Razor Pages does a great job of solving this problem for page/view-based endpoints. However, I wanted to take a moment to address APIs, which are an increasingly important part of modern web applications. In ASP.NET Core (and unlike ASP.NET 5 / Web API 2), Web API controllers are just controllers. You don&#x27;t need to inherit from a…</p><br/></li><li><a href="/github-octotree-chrome-extension/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GitHub Octotree Chrome Extension</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 February 2018</p><p style="width:100%;margin-top:2rem">If you use GitHub a lot, as I do, you may appreciate this great Chrome extension, Octotree. Octotree is a free extension that adds a treeview navigation control to GitHub (and GitLab Enterprise, according to their docs) repositories, making it much easier to navigate around larger projects. You can see it in action here: [caption id=&quot;attachment_1946&quot; align=&quot;aligncenter&quot; width=&quot;822&quot;]github-octotree…</p><br/></li><li><a href="/javascript-let-const-and-var/"><h2 class="is-size-2" style="width:100%;word-break:break-word">JavaScript let const and var</h2><img src="/static/6e7436135c7d4a3dc8795f6396978e42/4c509/javascript-let-const-and-var.png" alt="JavaScript let const and var" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 February 2018</p><p style="width:100%;margin-top:2rem">In the latest version of JavaScript, there are several ways to declare variables: let, const, and of course, var. If you&#x27;ve been using JavaScript for a while, you&#x27;re familiar with var, which has been a part of the language from the start. The two new keywords added with EcmaScript 6 (ES6) are let and const, and they offer different scoping than var. I&#x27;ll start with my recommendation on when to use…</p><br/></li><li><a href="/improve-tests-with-the-builder-pattern-for-test-data/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Improve Tests with the Builder Pattern for Test Data</h2><img src="/static/36bc7209b46e189ab2c7e8febeb91351/4c509/improve-tests-with-the-builder-pattern-for-test-data.png" alt="Improve Tests with the Builder Pattern for Test Data" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 February 2018</p><p style="width:100%;margin-top:2rem">Note: UPDATED: October 2022 I recently wrote about an example where I was able to apply the Builder Design Pattern to an Angular/TypeScript service. Another area where I&#x27;ve been finding the pattern helpful is in unit tests. Last year, I learned about this technique from Kenneth Truyers&#x27; blog post, and I&#x27;ve been using it to good effect for several months now on a few different projects. Check out…</p><br/></li><li><a href="/javascript-es6-linq-equivalents/"><h2 class="is-size-2" style="width:100%;word-break:break-word">JavaScript ES6 LINQ Equivalents</h2><img src="/static/f1268581f1de9afc426321f8c8989ebe/4c509/javascript-es6-linq-equivalents.png" alt="JavaScript ES6 LINQ Equivalents" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 January 2018</p><p style="width:100%;margin-top:2rem">As I&#x27;m working with JavaScript and TypeScript more and more these days, I often find myself wishing for LINQ statements to use to easily work with collection data. Fortunately, there are equivalents for all of the most common LINQ statements, and with ES6 arrow functions the syntax is also very concise and familiar. You can see them in action in this fiddle, or just check out the code here…</p><br/></li><li><a href="/applying-the-builder-pattern-to-improve-an-angular-service/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Applying the Builder Pattern to Improve an Angular Service</h2><img src="/static/c6a1999bf316dc90381f51fd1bab25f2/4c509/applying-the-builder-pattern-to-improve-angular-service.png" alt="Applying the Builder Pattern to Improve an Angular Service" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 January 2018</p><p style="width:100%;margin-top:2rem">Angular - Typescript Recently I was working on an Angular/Typescript service that was building up some navigation-related properties, driving the menu of a SPA application. The existing service had a helper method that took in two arrays full of potential validation issues on the SPA’s different tabs, and based on these it would return an appropriately-styled and configured Tab object. Initially…</p><br/></li><li><a href="/codemash-aftermash-2018/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Codemash Aftermash 2018</h2><img src="/static/b3bf14aa3e34c789e02d3efdf8f80250/84afe/codemash2018.png" alt="Codemash Aftermash 2018" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 January 2018</p><p style="width:100%;margin-top:2rem">I attended Codemash 2018 last week, and it was (as usual) a great conference. I enjoyed seeing many friends and colleagues and I gave two talks that were both well-attended (one standing room only) and well-received. Here’s a quick recap of the conference. I was fortunate to have a room at the Kalahari, and (better still) a room close to the convention center. I arrived on Tuesday and sat in on…</p><br/></li><li><a href="/how-to-get-involved-with-microsoft-developer-community/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Get Involved with the Microsoft Developer Community</h2><img src="/static/8f42821ba4fd8318dfb972520b1cae96/6050d/microsoft-developer.png" alt="How to Get Involved with the Microsoft Developer Community" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 January 2018</p><p style="width:100%;margin-top:2rem">The other day, someone wrote me to ask: To cut to the chase, I was wondering if, given your experience, you had any recommendations or advice for landing an internship with Microsoft. I work a lot with .NET and Azure through my web development business and I am extremely interested in all things Microsoft. This particular question related to an internship, but I&#x27;ve often seen similar questions…</p><br/></li><li><a href="/how-to-become-master-writing-c-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to become master writing C# code</h2><img src="/static/2b99f2895cbd09e39abe186a45eaaa82/4c509/how-to-become-master-writing-csharp-code.png" alt="How to become master writing C# code" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 December 2017</p><p style="width:100%;margin-top:2rem">The other day, someone posted to a discussion list I’m on with this subject line: How to become master writing C# code The discussion that followed had a lot of great ideas and insights, from many well-respected and experienced C# developers. It would be a shame not to share some of the ideas that were offered. Since it’s a private list, I’m refraining from crediting ideas with those who presented…</p><br/></li><li><a href="/listing-strongly-typed-enum-options-in-c/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Listing Strongly Typed Enum Options in C#</h2><img src="/static/20521217ebfb06f5ae8b887bf45c946f/4c509/csharp.png" alt="Listing Strongly Typed Enum Options in C#" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 November 2017</p><p style="width:100%;margin-top:2rem">In a previous article, I wrote about the Strongly Typed Enum Pattern in C#, which can be used in place of the built-in enum. Read that article to get a quick understanding of why you might not want to use enum types. Go ahead, this article will still be here. Ok, so in that example, I had a list of options (for instance, Roles) that I wanted to represent using objects instead of primitive enum…</p><br/></li><li><a href="/keep-master-and-origin-branches-working-if-possible/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Keep master and origin branches working if possible</h2><img src="/static/ec6d643f63e697a946e9e71609a26fa7/53f65/git-logo.svg_.png" alt="Keep master and origin branches working if possible" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 November 2017</p><p style="width:100%;margin-top:2rem">Here are two tips that teams I work with have found useful when working with git for larger projects with many team members that I thought I would share: Only merge into master if code is working The first tip is that you should only merge (or commit, but that should be rare) into master if your code is working. That is, it compiles and all of its tests run, and not just on your own machine, but…</p><br/></li><li><a href="/displaying-and-setting-current-aspnet-assembly-version/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Displaying and Setting Current ASP.NET Assembly Version</h2><img src="/static/b1adeb7576300320cab6c0ccc78aa189/94be0/manifestversioning.png" alt="Displaying and Setting Current ASP.NET Assembly Version" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 November 2017</p><p style="width:100%;margin-top:2rem">When you’re building web applications and you’re setting up continuous integration and delivery pipelines, it’s worthwhile to know which particular version of the application is deployed to a given environment. One of the easiest ways to share this information is from the application itself. Many sites will display build or version information in their footer or on a particular page. You can do…</p><br/></li><li><a href="/razor-pages-model-nullreferenceexception/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Razor Pages Model NullReferenceException</h2><img src="/static/93c77701e932aad9f273cc1b04f2d377/0ff54/pay-1036469_1280.jpg" alt="Razor Pages Model NullReferenceException" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 November 2017</p><p style="width:100%;margin-top:2rem">Here’s a quick tip: If you’re adding a new Razor Page to an ASP.NET Core 2.0+ project, and you add a codebehind model class, but then when you try to use it you get a NullReferenceException, this might be why. First, specify the model correctly from the razor page (Index.cshtml): If you’re literally adding just one page to your project, you need to make sure you specify the full namespace of the…</p><br/></li><li><a href="/enforcing-model-validation-policy-in-web-apis/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Enforcing Model Validation Policy in Web APIs</h2><img src="/static/d3ccc9290dc402d1dcc8e68e5d7f99ba/0ff54/webdesign-3411373_1280.jpg" alt="Enforcing Model Validation Policy in Web APIs" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 November 2017</p><p style="width:100%;margin-top:2rem">If you’re exposing a Web API, one of the most basic things you should be doing on every request, and especially on those requests that mutate your system’s state, is ensuring that the data you’re accepting is valid. ASP.NET Core MVC (and Web API 2 and MVC 5, too!) supports model validation as part of the model binding process. You’re likely familiar with it and have seen it used in combination…</p><br/></li><li><a href="/encapsulation-in-objects-and-applications/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Encapsulation in Objects and Applications</h2><img src="/static/86c6191ca1dcdc8edae40badd031b4ab/4c509/encapsulation-in-objects-and-applications.png" alt="Encapsulation in Objects and Applications" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 November 2017</p><p style="width:100%;margin-top:2rem">Encapsulation is a key principle of software development in general, and object-oriented design in particular. It refers to the ability for constructs (objects, functions, other things) to expose a public interface with which clients can interact, while keeping their internal implementation hidden. Encapsulation offers a host of benefits, most important being to allow the construct in question to…</p><br/></li><li><a href="/recent-talks-and-interviews-at-dogfoodcon/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Recent Talks and Interviews at DogfoodCon</h2><img src="/static/5126e97abe53ffb379d80605493838f1/0ff54/interview-2207741_1280.jpg" alt="Recent Talks and Interviews at DogfoodCon" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2017</p><p style="width:100%;margin-top:2rem">Earlier this month I presented a couple of talks at DogfoodConin Columbus, Ohio. Sorry it’s taken me so long to share my presentations, but here they are, finally: Improving the Design of Existing Software from Steven Smith Introducing ASP.NET Core 2.0 from Steven Smith While at DogfoodCon I was also interviewed by DevCoaches for their podcast. You can listen to the episode here, where we talk…</p><br/></li><li><a href="/aspnet-core-inmemorydatabase-upgrade-breaking-change/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASPNET Core InMemoryDatabase Upgrade Breaking Change</h2><img src="/static/b691adb7589bf127c805bdaea867d186/0ff54/digitization-5140055_1280.jpg" alt="ASPNET Core InMemoryDatabase Upgrade Breaking Change" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 October 2017</p><p style="width:100%;margin-top:2rem">There’s a minor breaking change in ASP.NET Core 2.0 that I’ve encountered while updating my Clean Architecture sample. In 1.x, you could configure EF Core to use an In Memory database, and when you did so, you could optionally specify a name: One of the most common scenarios for using an in memory database is for testing. Unfortunately, the state of the in memory database is not reset between test…</p><br/></li><li><a href="/your-api-and-view-models-should-not-reference-domain-models/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Your API and View Models Should Not Reference Domain Models</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 October 2017</p><p style="width:100%;margin-top:2rem">If you’re organizing your application following Clean Architecture and Domain-Driven Design, with your Core domain model in one project that is referenced by your UI and Infrastructure projects, you should be careful what you expose in your client-facing models. Client facing models typically reside in the UI layer as ViewModels or ApiModels, or they may be called DTOs (Data Transfer Objects). In…</p><br/></li><li><a href="/better-performance-from-async-operations/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Better Performance from Async Operations</h2><img src="/static/3a38cbaabb87fec4c9e4c1f4e9887076/4c509/better-performance-from-async-operations.png" alt="Better Performance from Async Operations" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 September 2017</p><p style="width:100%;margin-top:2rem">The C# language has had support for the async and await keywords (and yet another new way to perform asynchronous operations) for a while now. They’re still confusing to many developers (including me sometimes!) and can be a source of many pitfalls. I mostly work in ASP.NET projects, and the default project templates have all been using async for some time. New developers often assume this is…</p><br/></li><li><a href="/weekly-dev-tips-podcast/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Weekly Dev Tips Podcast</h2><img src="/static/68653507ac9f41cbf5dfc44d3a1a1d5b/8c332/WeeklyDevTips_600x591.png" alt="Weekly Dev Tips Podcast" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 September 2017</p><p style="width:100%;margin-top:2rem">I started a weekly newsletter last year that&#x27;s been going for over 70 weeks now sending a short, practical developer tip each week. You can subscribe to it here if you haven&#x27;t already. Tips go out every Wednesday at 10am Eastern Time. In August 2017, I launched a podcast with a similar structure. Weekly Dev Tips just published its 5th episode, and each episode so far is under 10 minutes long. They…</p><br/></li><li><a href="/tracking-tasks-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tracking Tasks in Visual Studio</h2><img src="/static/4985486d9c35d02e0b5badaf111eb3d0/c9139/vstasklist.png" alt="Tracking Tasks in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 September 2017</p><p style="width:100%;margin-top:2rem">I was recently mentoring a client remotely who was using Visual Studio. They were demonstrating some of the work they had done and design decisions they had made, and I was listening and asking questions. Occasionally I would make a suggestion. They would stop to take notes somewhere (I don’t recall if it was paper or in another app). I quickly asked if they were familiar with the built-in Task…</p><br/></li><li><a href="/working-through-roadblocks-a-guide-for-new-programmers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working Through Roadblocks - A Guide for New Programmers</h2><img src="/static/4fb4ac75fbd03f00f42e4ac3586c8265/c3638/NotSureIfGoodProgrammer.jpg" alt="Working Through Roadblocks - A Guide for New Programmers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 September 2017</p><p style="width:100%;margin-top:2rem">Last Updated April 2024 This is advice that I have given to many novice developers, and that I would like to have been able to give to myself when I just getting started (though some of the advice refers to resources that didn&#x27;t exist then - alas). If you find it useful, please consider sharing it with someone you know who might also benefit from it. Roadblocks As a programmer or software…</p><br/></li><li><a href="/aspnet-core-razor-pages-–-worth-checking-out/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASPNET Core Razor Pages – Worth Checking Out?</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="ASPNET Core Razor Pages – Worth Checking Out?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 August 2017</p><p style="width:100%;margin-top:2rem">You may have heard that in ASP.NET Core MVC 2.0, there is a new feature called Razor Pages. This feature allows you to create pages that don’t need to have a controller or action, and which can optionally have an associated PageModel class instead of a ViewModel. If you’ve been programming for a while, especially in the ASP.NET space, this may trigger some immediate reactions. Oh no! The return of…</p><br/></li><li><a href="/using-mediatr-in-aspnet-core-apps/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using MediatR in ASPNET Core Apps</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 August 2017</p><p style="width:100%;margin-top:2rem">I&#x27;ve started looking at using MediatR for my domain events implementations. To that end, I created a quick sample project using ASP.NET Core 2.0. Overall things were pretty easy to get going. If you haven’t used MediatR before, or if you’re looking for a quick intro on how to set it up for ASP.NET Core, keep reading (if not, how did you get here? Was the title not clear?). Installing MediatR…</p><br/></li><li><a href="/breakpoint-labels-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Breakpoint Labels in Visual Studio</h2><img src="/static/efd1e6157f1544e062fc796f8f74d1da/4e530/breakpoint-labels-in-visual-studio.png" alt="Breakpoint Labels in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 August 2017</p><p style="width:100%;margin-top:2rem">Breakpoints offer a great way to debug our software, letting us literally stop time during code execution and inspect what&#x27;s going on at that moment. It&#x27;s a bit like being a speedster like Quicksilver, who can almost stop time and manipulate the environment between moments in time: Unfortunately, in larger applications, we may find that we have quite a few places where we might want to stop and…</p><br/></li><li><a href="/troubleshooting-razor-pages-and-pagemodel-classes/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Troubleshooting Razor Pages and PageModel Classes</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="Troubleshooting Razor Pages and PageModel Classes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 August 2017</p><p style="width:100%;margin-top:2rem">When using the new Razor Pages feature in ASP.NET Core 2.0, you can (and usually should) define a separate “codebehind” file for your PageModel class. If you’re using Visual Studio, this class will be associated with your Razor Page as a nested file in the Solution Explorer, making it easy to locate. The class will also be easier to unit test than if you were to put your functionality directly…</p><br/></li><li><a href="/debugging-aspnet-core-routes/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Debugging ASPNET Core Routes</h2><img src="/static/a27b8a3af69d6f21e19b753873f1102c/2095e/routedebugging.png" alt="Debugging ASPNET Core Routes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 August 2017</p><p style="width:100%;margin-top:2rem">Routing in ASP.NET MVC apps has often presented challenges to developers, resulting in a bunch of different route debugging tools and nuget packages. In ASP.NET Core, there tends to be less routing confusion because of the emphasis on attribute routing, rather than the traditional routing tables. With ASP.NET Core 2.0 and Razor Pages, this trend continues since Razor Pages use convention-based…</p><br/></li><li><a href="/entity-framework-core-string-interpolation-fromsql/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Entity Framework Core String Interpolation FromSql</h2><img src="/static/d7689c26ade03f8f7c41f72c441ad74a/f4668/ef-core-string-interpolation.png" alt="Entity Framework Core String Interpolation FromSql" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 August 2017</p><p style="width:100%;margin-top:2rem">String interpolation is one of my favorite features in C# 6. It lets us replace this kind of code: with this: In Entity Framework Core 1.x, you could use string interpolation for SQL queries, but it would just perform literal string interpolation. For example, consider this code: This will result in the literal SQL string: Running this on your database is likely to result in an error like this one…</p><br/></li><li><a href="/roslynator-for-vs-2017/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Roslynator for VS 2017</h2><img src="/static/391801dafd1482f3070a5239ed286b32/4c509/roslynator.png" alt="Roslynator for VS 2017" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 August 2017</p><p style="width:100%;margin-top:2rem">Visual Studio 2017 15.3 was released this week, with support for .NET Core 2.0 (also released – download separately here). Over the years, Visual Studio has added more and more tools to increase productivity, slowly catching up to extensions like Resharper. With the availability of Roslyn, it’s never been easier to create your own custom code analyzers and refactorings. Roslynatoris an open source…</p><br/></li><li><a href="/logging-and-monitoring-are-requirements/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Logging and Monitoring are Requirements</h2><img src="/static/a1a461599a2a3ce2a6d05f84072efc91/4c509/logging-and-monitoring-are-requirements.png" alt="Logging and Monitoring are Requirements" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 August 2017</p><p style="width:100%;margin-top:2rem">It’s common in many applications to see logging and monitoring added into the code as an afterthought. It’s rarely included in the specification for a feature or product, and it’s rarely tested. Thus, it’s often inconsistently implemented. One approach to addressing this is to use techniques like AOP to broadly and consistently add logging via rules. However, this often falls short and doesn’t…</p><br/></li><li><a href="/testing-logging-in-aspnet-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Testing Logging in ASPNET Core</h2><img src="/static/efa96375e4593adb064285a67acc4238/4c509/testing-logging-in-aspnet-core.png" alt="Testing Logging in ASPNET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 August 2017</p><p style="width:100%;margin-top:2rem">When it’s important, logging should be considered a “real” requirement, not just a developer or operations afterthought. In many cases, especially diagnosis of production problems, logging has real business value. Thus, there are times when you’ll want to test that your logging works. Consider the following function: Let’s assume for a moment that when this exception occurs, it’s potentially…</p><br/></li><li><a href="/referencing-common-values-between-apps-projects/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Referencing Common Values Between Apps/Projects</h2><img src="/static/8d2ab7b0b706b1f08579a69a8ab03fae/4c509/referencing-common-values-between-apps-projects.png" alt="Referencing Common Values Between Apps/Projects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 July 2017</p><p style="width:100%;margin-top:2rem">A pretty common scenario in building real world business software is the need to share certain pieces of information between multiple projects or applications. Frequently these fall into the category of configuration settings, and might include things like: Resource or CDN URLs or base URLs Connection Strings Public/Private Keys and Tokens Some of these are more sensitive than others, obviously…</p><br/></li><li><a href="/switch-between-git-branches-easily/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Switch Between git Branches Easily</h2><img src="/static/e498156d52a4f32d85b09ca46ec03a04/4c509/switch-between-git-branches-easily.png" alt="Switch Between git Branches Easily" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 July 2017</p><p style="width:100%;margin-top:2rem">I recently ran across a great tip from Kevin Griffin for how to quickly switch from your current git branch to your previous one: Instead of typing out the full name of the branch when using git checkout, you can simply specify – (minus or dash) to refer to the previous branch. Now think about how you’re going to put all those saved keystrokes to good use.</p><br/></li><li><a href="/minimal-aspnet-core-web-api/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Minimal ASPNET Core Web API</h2><img src="/static/445c6b6390f31e009c2b4e87881ff9a4/4c509/minimal-aspnet-core-web-api.png" alt="Minimal ASPNET Core Web API" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 July 2017</p><p style="width:100%;margin-top:2rem">Inspired by a StackOverflow question, I’ve created a minimal ASP.NET Core Web API app as a learning exercise and aid to troubleshooting web API development. The goal of this app is to demonstrate how little code and how few files are required to build simple web apps and APIs using ASP.NET Core. You can also quickly clone and run the minimal ASP.NET Core Web API app to verify that your…</p><br/></li><li><a href="/show-all-github-issues-assigned-to-me/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Show All GitHub Issues Assigned to Me</h2><img src="/static/586a5294a109f921b2dad03d7053e514/4c509/octocat.png" alt="Show All GitHub Issues Assigned to Me" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 July 2017</p><p style="width:100%;margin-top:2rem">I’m a big fan of GitHub and the workflow it provides. I find it to be very productive and collaborative, as well as lightweight. I work on quite a few different GitHub repositories, either for my own projects, for open source projects, or for clients. It’s especially helpful in any project with more than a few issues to be able to view just the issues that pertain to me. That might be issues I’ve…</p><br/></li><li><a href="/installing-additional-app-templates-for-dotnet-new/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Installing Additional App Templates for dotnet new</h2><img src="/static/7ba8ff896193571ab48aac4a2258e874/4c509/dotnet-new-h.png" alt="Installing Additional App Templates for dotnet new" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 June 2017</p><p style="width:100%;margin-top:2rem">When you install the.NET Core SDK, you get the dotnet CLI (command line interface), which can be used for ahostofdifferentthings, including creating new projects. You can see which templates are already installed by running By default the SDK installs about 8 templates, with support for C# and F# (and blank solution files). However, there are quite a few additional templates available, and…</p><br/></li><li><a href="/why-delete-old-git-branches/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Why Delete Old Git Branches?</h2><img src="/static/ec6d643f63e697a946e9e71609a26fa7/53f65/git-logo.svg_.png" alt="Why Delete Old Git Branches?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 June 2017</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 It&#x27;s a common housekeeping practice to delete git branches once they&#x27;re no longer used, but this practice isn&#x27;t necessarily universal, or universally understood. Why should you delete old branches from your git repositories? There are two main reasons: They&#x27;re unnecessary. In most cases, branches, especially branches that were related to a pull request that has since…</p><br/></li><li><a href="/automate-testing-and-running-apps-with-dotnet-watch/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Automate Testing and Running Apps with dotnet watch</h2><img src="/static/aa281a79aaedf4a580549b4d7434e9d1/c5cb2/bitmap-medium_net-core-logo_2colors_square_boxed_rgb.png" alt="Automate Testing and Running Apps with dotnet watch" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 June 2017</p><p style="width:100%;margin-top:2rem">If you’re using the dotnet CLI tools to develop your .NET Core apps, you’re probably very familiar with typing dotnet run and/or dotnet test every time you make a change to your app. This kind of manual process, even if you’re a quick typist (or just use up-arrow, enter), can add friction to your process. Friction is bad, and can bring you out of the zone when you’re trying to focus on improving…</p><br/></li><li><a href="/an-asp-net-core-quick-start/"><h2 class="is-size-2" style="width:100%;word-break:break-word">An ASP.NET Core Quick Start</h2><img src="/static/eaf1f681c1ba7af4619624b885180bfc/f0719/aspnetcorequickstart.jpg" alt="An ASP.NET Core Quick Start" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2017</p><p style="width:100%;margin-top:2rem">Last month I published a short video course on ASP.NET Core that should help you or your team members get up to speed quickly on ASP.NET Core. This ASP.NET Core Quick Start demonstrates how to be productive using either Visual Studio or VS Code. I’ve been working on ASP.NET Core since the earliest days, and have been contributing to its official documentation for the last two years. My reason for…</p><br/></li><li><a href="/set-cmd-or-powershell-window-title/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Set cmd or PowerShell Window Title</h2><img src="/static/8f50ec730dc05f8c16e716b844ea9cec/9a8d7/PowerShellTitle.png" alt="Set cmd or PowerShell Window Title" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 June 2017</p><p style="width:100%;margin-top:2rem">As CLI tools become more and more popular, it&#x27;s not unusual that I find I have more than one command, bash, or PowerShell window open. Often, each window is serving a specific purpose. While I really like that I can integrate a command shell right into Visual Studio Code, when I&#x27;m not doing that it&#x27;s nice to be able to give each window a name that makes sense. Setting Window Title of Windows cmd…</p><br/></li><li><a href="/how-to-remove-untracked-local-files-from-git-working-tree/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to remove untracked local files from git working tree?</h2><img src="/static/ec6d643f63e697a946e9e71609a26fa7/53f65/git-logo.svg_.png" alt="How to remove untracked local files from git working tree?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 May 2017</p><p style="width:100%;margin-top:2rem">There are two ways to get rid of untracked files from your git working tree. The first one, which many of us have done, is to simply go to a new folder (or delete the current one) and perform a fresh git clone operation. This “burn it to the ground and start from scratch” approach works, but there is a more elegant solution: git clean. To use git clean, it’s a good idea to first run it with the -n…</p><br/></li><li><a href="/how-do-i-update-a-nuget-package-using-dotnet-cli/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How do I Update a Nuget Package using dotnet CLI</h2><img src="/static/a4a4746c517e10afc50fbb854a48f620/23c42/nuget.png" alt="How do I Update a Nuget Package using dotnet CLI" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 May 2017</p><p style="width:100%;margin-top:2rem">The current version of the dotnet command line interface provides features to add a nuget package, but doesn’t expose a separate command to update them. However, you can actually achieve this by simply running the dotnet add package command, for example: If you don’t provide a version flag, this will default to upgrading to the latest version. To specify a version, add the -v parameter: Here you…</p><br/></li><li><a href="/should-i-use-weblistener-or-kestrel-or-iis-on-windows/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Should I Use WebListener or Kestrel or IIS on Windows?</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="Should I Use WebListener or Kestrel or IIS on Windows?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 May 2017</p><p style="width:100%;margin-top:2rem">Someone recently asked this question on GitHub, and I thought it was worth spreading this information more widely: I’ve been doing some research to figure out the best option to self host ASP.NET Web Api on Windows. Some articles recommend using WebListener for client facing services and other state that Kestrel is faster and can be used behind an IIS proxy. What is the better option? I understand…</p><br/></li><li><a href="/science-of-great-ui-reviewed/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Science of Great UI Reviewed</h2><img src="/static/ead6d85f5230b26548dee47d4266a84d/0ff54/ios-1758352_1280.jpg" alt="Science of Great UI Reviewed" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 May 2017</p><p style="width:100%;margin-top:2rem">I’m reviewing Mark Miller‘s online course, The Science of Great UI. This course is the first in a series, with the forthcoming Design Like a Pro as the second, and several more planned after that. Mark’s pace in the course is very measured, so even if English isn’t your first language, you should have no trouble following along. For me, I was able to adjust the player speed to 1.5x and still…</p><br/></li><li><a href="/group-your-constants-and-enums/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Group Your Constants and Enums</h2><img src="/static/8dc3489c9b44062e265a2cb65b2edb29/4c509/constantsgroups-760x346.png" alt="Group Your Constants and Enums" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 May 2017</p><p style="width:100%;margin-top:2rem">It&#x27;s not unusual in applications to have a few constants defined for things you know are never going to change (so you don’t need to store them in the database, or if they are in the database, you don’t need to fetch them every time you need them). I usually like to keep these in a single file called Constants.cs in my .NET/.NET Core applications, so that anywhere I need a constant I can reference…</p><br/></li><li><a href="/developer-insights-from-stackoverflow-2017-survey/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Developer Insights from StackOverflow 2017 Survey</h2><img src="/static/de381e228d1aebdd9a1b801b5cc1f453/4c509/screenshot-2017-05-15-22.03.11.png" alt="Developer Insights from StackOverflow 2017 Survey" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 May 2017</p><p style="width:100%;margin-top:2rem">StackOverflow published the results of their 2017 Developer Survey. They been conducting this survey for some time now, and they obviously have access to a lot of data and developer demographics. 64,000 people took the survey, which makes it pretty accurate, statistically speaking. Here are a few insights I found interesting and worth sharing. Exponential Growth If you look at the section, Years…</p><br/></li><li><a href="/aspnet-core-2-preview-1/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASPNET Core 2 Preview 1</h2><img src="/static/46b97653b16b8e2dc63e636cff5c2064/02521/vs2017-previewlogo.png" alt="ASPNET Core 2 Preview 1" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 May 2017</p><p style="width:100%;margin-top:2rem">This week a public preview of ASP.NET Core 2 was made available at Microsoft’s /BUILD event. You can install it side-by-side with your existing ASP.NET Core install, and you can also install Visual Studio 2017 update 3 to go with it. Download both here: .NET Core 2.0 Preview 1 SDK Visual Studio 2017 Preview Version 15.3 Download Highlights of What’s New Packages for the framework have been…</p><br/></li><li><a href="/prefer-custom-exceptions-to-framework-exceptions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Prefer Custom Exceptions to Framework Exceptions</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="Prefer Custom Exceptions to Framework Exceptions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 May 2017</p><p style="width:100%;margin-top:2rem">An easy way to make your software easier to work with, both for your users and for developers, is to use higher level custom exceptions. Low level exceptions like NullReferenceException or ArgumentNullException should rarely be returned from business-level classes, where most of your custom logic should reside. By using custom exceptions, you make it much more clear to everybody involved what the…</p><br/></li><li><a href="/when-should-you-upgrade-to-asp-net-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">When Should You Upgrade to ASP.NET Core?</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="When Should You Upgrade to ASP.NET Core?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 May 2017</p><p style="width:100%;margin-top:2rem">ASP.NET Core 1.0 shipped last summer. Then ASP.NET Core 1.1 shipped last fall. Overall, the framework and server-side components have been pretty solid, with few major bugs reported, and a bunch of nice features added to both ASP.NET and Entity Framework Core in the 1.1 release. However, the tooling story lagged for a while (as is typical), and while normally this wouldn’t be such a big barrier to…</p><br/></li><li><a href="/registering-open-generics-in-aspnet-core-dependency-injection/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Registering Open Generics in ASPNET Core Dependency Injection</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="Registering Open Generics in ASPNET Core Dependency Injection" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 April 2017</p><p style="width:100%;margin-top:2rem">If you have a generic interface and implementation that you want to configure for dependency injection in ASP.NET Core startup, there is a simple way to do so. If you only use the generic methods for adding services, such as: then you will not find a way to do it. You can’t do this: Instead, you need to use the non-generic overload of the method, and use the keyword to specify your open…</p><br/></li><li><a href="/profit-center-or-cost-center/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Are You a Profit Center or a Cost Center?</h2><img src="/static/abf313dcbb4afd2de56a8669888b6c17/0ff54/ledger-1428230_1920.jpg" alt="Are You a Profit Center or a Cost Center?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 April 2017</p><p style="width:100%;margin-top:2rem">I recently was on a panel at the Hudson Ohio coworking space Tech Hub Hudson organized by the Akron Women in Technology group. There were four other panelists (I was a last minute addition) and the topic of the evening centered around advice for junior developers. There was a lot of great experience shared both by the panel and by audience members, and I&#x27;ll probably draw on some of it again in…</p><br/></li><li><a href="/a-year-of-tips/"><h2 class="is-size-2" style="width:100%;word-break:break-word">A Year of Tips</h2><img src="/static/6e8fbaf948ea350ef54a878c1898df85/26852/DevTipsWeekly.jpg" alt="A Year of Tips" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 April 2017</p><p style="width:100%;margin-top:2rem">I started my Developer Tips Weekly newsletter a year ago this week – today the 53rd tip is being sent. It hasn’t always been easy, even though often the tips are very short and simple. Publishing at exactly 10am every Wednesday without fail has taken some discipline. Along the way, I’ve learned a few things, which I thought I’d share. Numbering is Hard Apparently I’m not very good at incrementing…</p><br/></li><li><a href="/share-what-you-learn-even-if-youre-not-an-expert/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Share What You Learn (even if you&#x27;re not an expert)</h2><img src="/static/0ff151708a7d99836ac443d66f8ece25/c3638/person-apple-laptop-notebook_600x400.jpg" alt="Share What You Learn (even if you&#x27;re not an expert)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 April 2017</p><p style="width:100%;margin-top:2rem">A lot of people, myself included, suffer from imposter syndrome. That feeling that you&#x27;re really not good enough to be doing whatever it is you&#x27;re doing. Maybe it&#x27;s writing a blog. Maybe it&#x27;s public speaking. Maybe it&#x27;s just answering a question in front of a group, team, or class. Imposter syndrome is a real thing, and it&#x27;s incredibly common, so first off, realize that most people feel that way…</p><br/></li><li><a href="/avoid-lazy-loading-entities-in-asp-net-applications/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Lazy Loading Entities in ASP.NET Applications</h2><img src="/static/e2bc65b32d64240d0d53fc1445630e95/0a0f7/conferencesessionslazyloading.png" alt="Avoid Lazy Loading Entities in ASP.NET Applications" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 April 2017</p><p style="width:100%;margin-top:2rem">Lazy Loading is an Entity Framework feature that lets you worry less about the specific amount of data you need to fetch with a given query. Instead, you write simple queries, and Entity Framework (or other OR/M tools that support this feature) will load the minimal amount of data (which is a good thing), and then will only fetch additional data on an as-needed basis. That is, rather than eager…</p><br/></li><li><a href="/how-to-make-git-forget-tracked-files-now-in-gitignore/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Make Git Forget Tracked Files Now In gitignore</h2><img src="/static/5fe194eacd9a50952a0213d8dbca6e15/f7db6/github-gitignore.png" alt="How to Make Git Forget Tracked Files Now In gitignore" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 March 2017</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 When you set up a new git repository, if you don’t properly configure a .gitignore file at the start, it can bite you later if you’ve already committed and pushed files that you really wished you’d kept out of the repo. If you’re working with GitHub, and you’re starting the repository from GitHub (rather than locally), remember to choose an option from the Add…</p><br/></li><li><a href="/cloud-messaging-–-amazon-or-azure/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cloud Messaging – Amazon or Azure?</h2><img src="/static/d9166d00996d3236a31ba083663e3c52/4976a/singlecloudqueues.png" alt="Cloud Messaging – Amazon or Azure?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 March 2017</p><p style="width:100%;margin-top:2rem">When architecting solutions that need to communicate between separate services or applications,messages queues and services buses become increasingly important. Both Microsoft Azure and Amazon AWS offer products that support these operations, essentially allowing you to efficiently send text-based messages from one application to another. There are many benefits to this approach over directly…</p><br/></li><li><a href="/live-unit-testing-in-visual-studio-2017/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Live Unit Testing in Visual Studio 2017</h2><img src="/static/023d017f9e9df6f4f310895d26a803a3/4c509/vs2017-live-unit-testing-multiline-760x360.png" alt="Live Unit Testing in Visual Studio 2017" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 March 2017</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 Visual Studio 2017 has a new feature called Live Unit Testing. It’s currently not&gt; available for .NET Core projects, but you should see it as an option in your standard .NET projects. Live Unit Testing is currently only available in the Enterprise SKU (see feature comparison) – click here to grab a free trial if you want to check it out. Update: Live Unit Testing now…</p><br/></li><li><a href="/how-to-start-multiple-projects-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Start Multiple Projects in Visual Studio</h2><img src="/static/396359eee4e20ff24d9a2d3fa5dbc497/4c509/vslogo-760x360.png" alt="How to Start Multiple Projects in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 February 2017</p><p style="width:100%;margin-top:2rem">If you have multiple projects that need to interact with one another, you can configure Visual Studio to launch multiple projects whenever you press F5/ctrl+F5. To do so, right-click on the solution and go to Properties: By default the solution will typically be set to a Single startup project, such as if you were to right-click on a project and choose “Set as Startup Project”. However, from here…</p><br/></li><li><a href="/clean-up-unused-git-branches/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Clean up unused git branches</h2><img src="/static/ec6d643f63e697a946e9e71609a26fa7/53f65/git-logo.svg_.png" alt="Clean up unused git branches" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 February 2017</p><p style="width:100%;margin-top:2rem">If you’re using git and creating branches, then making pull requests, and ultimately merging them back into your main/master branch, you may end up with unused branches cluttering your repository. They don’t really hurt anything, but they can add some clutter and make it more difficult to find the branches that are actually in use. Wouldn’t it be nice if you could easily identify which ones were…</p><br/></li><li><a href="/ddd-with-aspnet-core-workshop-at-devintersections/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DDD with ASPNET Core Workshop at DevIntersections</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="DDD with ASPNET Core Workshop at DevIntersections" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 February 2017</p><p style="width:100%;margin-top:2rem">I’ll be teaching a one-day workshop at DevIntersections’ spring show on Domain-Driven Design with ASP.NET Core. I gave this workshop, which includes an interactive lab in which you’ll build a working app, in October to a sold-out crowd, so you may need to register early to make sure you get a spot (or to make sure they put me in a large enough room). When you register, at the bottom of the form…</p><br/></li><li><a href="/github-pull-request-checklist/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GitHub Pull Request Checklist</h2><img src="/static/bca5f09eb1f68a1913761b27ed44f540/6050d/git-pull-request-checklist.png" alt="GitHub Pull Request Checklist" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 February 2017</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 I really like the workflow that GitHub Pull Requests allow. It’s great even in tiny projects to be able to get a code review for a given set of changes, and the UI for GitHub’s Pull Requests is better than any other source control system I’ve used (and doesn’t require buying an expensive tool or client software). However, if you’re new to pull requests, there are a…</p><br/></li><li><a href="/how-to-manage-solution-projects-using-dotnet-cli/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Manage Solution Projects using dotnet CLI</h2><img src="/static/5b7949f6558e934e77fa1588eb652a6b/4c509/dotnet-sln-760x360.png" alt="How to Manage Solution Projects using dotnet CLI" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 February 2017</p><p style="width:100%;margin-top:2rem">You can use the latest version of the dotnet CLI (installed by default with the latest version of Visual Studio 2017, or available here) to manage the projects included in your solution file(s). The command line tool now exposes three new commands off of the ‘sln’ command: The command accepts the name of the solution file as an optional argument, but if it’s not specified it will use one from the…</p><br/></li><li><a href="/how-to-add-a-nuget-package-using-dotnet-add/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to add a Nuget Package Using dotnet add</h2><img src="/static/a4a4746c517e10afc50fbb854a48f620/23c42/nuget.png" alt="How to add a Nuget Package Using dotnet add" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2017</p><p style="width:100%;margin-top:2rem">A feature I’ve long wished for in .NET Core and its command line interface (CLI) is the ability to manage nuget references from the command line. This becomes increasingly important as the final version of the tooling for .NET Core (and Visual Studio 2017) moves from a JSON-based project file to an XML-based one (for compatibility with the hundreds of other projects Visual Studio supports in that…</p><br/></li><li><a href="/what’s-new-in-c-6/"><h2 class="is-size-2" style="width:100%;word-break:break-word">What’s New in C# 6</h2><img src="/static/965aa0759e799a77389138ba33c4143e/53f65/whatsnewincsharp6.png" alt="What’s New in C# 6" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2017</p><p style="width:100%;margin-top:2rem">Last month, Brendan Enrick published a short course on What’s New in C#6. He also presented a standing-room-only session on the subject at CodeMash (people were blocked from trying to get in from the hall, the room was so packed). Even though some of these features have been available for a while, a lot of developers aren’t yet familiar with all of them or haven’t yet upgraded to the latest…</p><br/></li><li><a href="/bus-or-queue/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Bus or Queue</h2><img src="/static/7bd0821fae71eb18036962577cf3e66f/4c509/message-bus-760x360.png" alt="Bus or Queue" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 January 2017</p><p style="width:100%;margin-top:2rem">A common question I encounter is, “what is the difference between a message bus (or service bus) and a message queue?” There has been some blurring of the lines between these two concepts, as some products now support features that previously belonged only to one or the other category (for instance Azure Service Bus supports both approaches). Message Queue A message queue receives messages from…</p><br/></li><li><a href="/force-nuget-to-reinstall-packages-without-updating/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Force Nuget to Reinstall Packages without Updating</h2><img src="/static/a4a4746c517e10afc50fbb854a48f620/23c42/nuget.png" alt="Force Nuget to Reinstall Packages without Updating" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 January 2017</p><p style="width:100%;margin-top:2rem">Occasionally I run into an issue where I’ll open a solution in Visual Studio, build it, and the build will fail because of dependent packages. I’ll try every way offered by Visual Studio to restore packages, but it will claim everything is up to date. Looking in Solution Explorer, you’ll see that some packages are clearly missing (icons on the packages showing they’re not there), but no amount of…</p><br/></li><li><a href="/encapsulated-collections-in-entity-framework-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Encapsulated Collections in Entity Framework Core</h2><img src="/static/6a1f9d4520a3828624e0e7c3aac87ba7/c5cb2/entity-framework-logo_2colors_square_rgb-591x360.png" alt="Encapsulated Collections in Entity Framework Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 January 2017</p><p style="width:100%;margin-top:2rem">Starting with Entity Framework Core 1.1, you can now have properly encapsulated collections in your classes that rely on EF for persistence. Previous versions of EF have required collection properties to support ICollection, which means any user of the class can add or remove items from its properties (or even Clear it). If you’re writing good code that encapsulates business behavior in an entity…</p><br/></li><li><a href="/xunit-test-discovery-error-with-aspnet-core-1-1/"><h2 class="is-size-2" style="width:100%;word-break:break-word">xUnit Test Discovery Error with ASPNET Core 1.1</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="xUnit Test Discovery Error with ASPNET Core 1.1" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 January 2017</p><p style="width:100%;margin-top:2rem">If you run into an error with test discovery using xUnit and ASP.NET Core 1.1 where there is a FileNotFoundException looking for Microsoft.DotNet.Internal.Abstractions version 1.0.0.0, there is a fairly simple fix. The problem is that one of the dependent packages in ASP.NET Core requires this package but for some reason it’s not being pulled in. You can get around the issue by explicitly…</p><br/></li><li><a href="/use-an-integrated-shell-console-terminal-in-vs-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Use an Integrated Shell Console Terminal in VS Code</h2><img src="/static/860f09a6f174e72bde5a733ca23b1926/4c509/vscode-760x360.png" alt="Use an Integrated Shell Console Terminal in VS Code" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 January 2017</p><p style="width:100%;margin-top:2rem">VS Code is a lightweight code editor available for free from Microsoft. It’s a great, open-source tool for quick edits, or even for all day coding. While I think most users of VS Code are comfortable having it open separately from their command line environment, you can also host an integrated shell (console or terminal) within VS Code itself. This can be nice if you want to use it in full screen…</p><br/></li><li><a href="/detect-git-conflict-markers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Detect git Conflict Markers</h2><img src="/static/ec6d643f63e697a946e9e71609a26fa7/53f65/git-logo.svg_.png" alt="Detect git Conflict Markers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 January 2017</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 This is post 2 of 2 in the series “Developer Tips” Check In Often Detect git Conflict Markers Tips for developers, archived from Dev Tips Weekly emails. If you’re using git, you’ve probably run into a problem at some point where you’ve had to perform a merge, and a merge conflict resulted. This happens when two different commits changed the same line in a file, and…</p><br/></li><li><a href="/avoid-referencing-infrastructure-in-visual-studio-solutions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Referencing Infrastructure in Visual Studio Solutions</h2><img src="/static/b34c469c2b705f46ab78f0477423839b/4c509/avoid-referencing-infrastructure-in-vs-solutions-760x360.png" alt="Avoid Referencing Infrastructure in Visual Studio Solutions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 December 2016</p><p style="width:100%;margin-top:2rem">The dependency inversion principle states that your application’s abstractions should not depend on implementation details, but rather implementation should depend on abstractions. In Clean DDD architected applications, you’ll typically have a class library called Core (or something similar) which houses the domain model, including the main abstractions. Your implementation libraries…</p><br/></li><li><a href="/the-minimal-aspnet-core-1-1-app/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The Minimal ASPNET Core 1.1 App</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="The Minimal ASPNET Core 1.1 App" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 December 2016</p><p style="width:100%;margin-top:2rem">In a previous article, I described how to create the minimal ASP.NET Core 1.0 app. That is, what’s the smallest amount of code you could write to produce an ASP.NET Core application? In this article, I’ll demonstrate how to do the same for ASP.NET Core 1.1. The main difference is in the project file, which has moved from project.json to a .csproj format. If you’re just getting started with .NET…</p><br/></li><li><a href="/developer-on-fire-interview/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Developer on Fire Interview</h2><img src="/static/dca6a7306aad297dc76f065ba532d247/4c509/developer-on-fire-logo_760x360.png" alt="Developer on Fire Interview" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 December 2016</p><p style="width:100%;margin-top:2rem">I recently spoke with David Rael of the Developer on Fire podcast. We talked about a lot of things in our 40 minute conversation. Here are some of the highlights: How I got into software development What excites me about building software My entrepreneurial experience My involvement in ASP.NET Core and .NET Core Personal stories of success and failure Book recommendations Mentoring and Parenting…</p><br/></li><li><a href="/open-command-or-powershell-window-from-explorer/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Open Command or Powershell Window From Explorer</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 December 2016</p><p style="width:100%;margin-top:2rem">Command line tools are becoming increasingly popular, so this tip may save you some time. On Windows, there are several ways to open up a command window. My typical method is to just hit the Start key and type &#x27;cmd&#x27; and then enter. This will open a window in my user folder, which is exactly where I want to be precisely 0% of the time. From there, it&#x27;s usually just a few dozen commands to change…</p><br/></li><li><a href="/usestatuscodepages-middleware-problem-resolved/"><h2 class="is-size-2" style="width:100%;word-break:break-word">UseStatusCodePages Middleware Problem Resolved</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="UseStatusCodePages Middleware Problem Resolved" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 December 2016</p><p style="width:100%;margin-top:2rem">If you’re trying to get the ASP.NET Core Status Code Pages middleware to work, but it just is ignored no matter what, one thing to check is the rest of your middleware pipeline. If you have middleware that is writing anything to the response, it will cause the status code pages middleware to be ignored. For example, the following middleware: I had this set up in front of some other middleware to…</p><br/></li><li><a href="/be-a-thankful-developer/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Be a Thankful Developer</h2><img src="/static/82c306dc9561b3e1fba64d0ef3536768/4c509/be-a-thankful-developer-760x360.png" alt="Be a Thankful Developer" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 November 2016</p><p style="width:100%;margin-top:2rem">It doesn’t cost much to acknowledge those who have helped you, and it can be very rewarding. Regardless of where you are in your career as a software developer (or most other careers, but this is mainly directed at developers), show appreciation for those who make your job easier or who help you improve. This might be a peer or mentor who takes the time to guide you, it could be your boss or your…</p><br/></li><li><a href="/now-shipping-2017-software-craftsmanship-calendars/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Now Shipping 2017 Software Craftsmanship Calendars</h2><img src="/static/4aca1b4dc9e42a4520a65940ab205d37/a84be/img_4515-760x360.jpg" alt="Now Shipping 2017 Software Craftsmanship Calendars" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 November 2016</p><p style="width:100%;margin-top:2rem">DevIQ‘s annual software craftsmanship wall calendar’s 2017 edition has arrived from the printer and is shipping now. If you didn’t back the Kickstarter campaign, you can still order one while supplies last from store.deviq.com. You can also pick up adigital image pack (available December 2016), suitable for PowerPoint presentations and desktop backgrounds. If you’re not familiar with the idea of…</p><br/></li><li><a href="/4-tips-to-integrate-teamcity-and-github/"><h2 class="is-size-2" style="width:100%;word-break:break-word">4 Tips to Integrate TeamCity and GitHub</h2><img src="/static/1c2cab1a4ad0986142596c27658dd26a/86c85/teamcity_github.jpg" alt="4 Tips to Integrate TeamCity and GitHub" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 November 2016</p><p style="width:100%;margin-top:2rem">Last updated: 13 October 2023 TeamCity Logo I&#x27;ve been a fan of JetBrains TeamCity for many years now. It&#x27;s a great continuous integration / build server product, with an extremely responsive web-based user interface that&#x27;s great to work with. What&#x27;s more, the basic version supports up to 20 projects for FREE, which is tough to beat. However, like peanut butter and chocolate, TeamCity gets even…</p><br/></li><li><a href="/avoid-storing-database-credentials-in-source-control/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Storing Database Credentials in Source Control</h2><img src="/static/c0ae588229ea6c11d879f92b3ab736d3/0ff54/storing-database-credentials.jpg" alt="Avoid Storing Database Credentials in Source Control" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 October 2016</p><p style="width:100%;margin-top:2rem">Your application probably needs to communicate with a database of some kind. Naturally, that database isn’t open to the world – it needs to be protected and secured. The typical solution to this is to create a username and password combination (ideally, specific to each application or user that requires access) and configure the application with these credentials. In many cases, they’re simply…</p><br/></li><li><a href="/dogfoodcon-2016-sessions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DogFoodCon 2016 Sessions</h2><img src="/static/d278b96693ae9808d3cc9d0c17c86227/ef794/dogfood-logo-324x901.png" alt="DogFoodCon 2016 Sessions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 October 2016</p><p style="width:100%;margin-top:2rem">I presented at DogFoodCon 2016 yesterday, which had 400+ attendees and wrapped up today. It’s a great 2-day event that’s been going strong for close to 10 years, and is just one of several developer conferences in Ohio that consistently offer great quality content for very reasonable prices, and which consequently sell out their venue (CodeMash and Stir Trek being two others). Thanks to everybody…</p><br/></li><li><a href="/your-recent-mentions-on-github/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Your Recent Mentions on GitHub</h2><img src="/static/586a5294a109f921b2dad03d7053e514/4c509/octocat.png" alt="Your Recent Mentions on GitHub" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 September 2016</p><p style="width:100%;margin-top:2rem">The other day I saw someone mention me in a pull request for a client’s GitHub repository (probably on my phone). When I had some time to look into the issue, I’d deleted the email notification, and I couldn’t remember which repository it was on (they have a few). So I checked my GitHub profile page, figuring it would show things that recently mentioned me. Unfortunately, not. I posted to twitter…</p><br/></li><li><a href="/configuring-aspnet-core-apps-with-webhostbuilder/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configuring ASPNET Core Apps with WebHostBuilder</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="Configuring ASPNET Core Apps with WebHostBuilder" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 September 2016</p><p style="width:100%;margin-top:2rem">In ASP.NET Core apps, you typically configure the application in Startup. However, the application itself runs inside of a host, which is configured separately using a WebHostBuilder. Although it’s not the default, recommended case (and thus isn’t shown in the official docs), you can actually configure the application directly from WebHostBuilder and avoid using a Startup class entirely (or…</p><br/></li><li><a href="/specifying-api-routes-in-aspnet-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Specifying API Routes in ASPNET Core</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="Specifying API Routes in ASPNET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 September 2016</p><p style="width:100%;margin-top:2rem">ASP.NET Core uses attribute routing to determine the behavior of web APIs. Its integrated support for MVC and Web API is one of my favorite features, since working with MVC 5 and Web API 2 was painful due to the similarities but separate implementations of the two stacks. When creating routes for your APIs, a common approach is to use something like this: When applied to a particular API…</p><br/></li><li><a href="/nuget-package-source-update-important/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Nuget Package Source Update Important</h2><img src="/static/b03de5206c67ec0dedf6426ef932c030/0a925/older-code.jpg" alt="Nuget Package Source Update Important" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 September 2016</p><p style="width:100%;margin-top:2rem">Today a client reported an issue with their build server, which was failing to locate version 4.4 of StructureMap. The build worked fine, locally, on more than one machine. After some investigation, we discovered that the build server’s Nuget task was configured to use several sources, including an internal feed the client uses, and this one: https://www.nuget.org/api/v2/ This is obviously a…</p><br/></li><li><a href="/msdn-–-feature-slices-for-aspnet-core-mvc/"><h2 class="is-size-2" style="width:100%;word-break:break-word">MSDN – Feature Slices for ASPNET Core MVC</h2><img src="/static/917413a41061684449308ddf77cfce36/31119/msdn-sep.png" alt="MSDN – Feature Slices for ASPNET Core MVC" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 September 2016</p><p style="width:100%;margin-top:2rem">My September article for MSDN Magazine is available online now. It’s on Feature Slices for ASPNET Core MVC, but also covers how to use the built-in Areas feature to achieve the same goal. Large Web apps require better organization than small ones. With large apps, the default organizational structure used by ASP.NET MVC (and Core MVC) starts to work against you. You can use two simple techniques…</p><br/></li><li><a href="/refactoring-static-file-system-access/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Refactoring Static File System Access</h2><img src="/static/d7d671850d92d92da14c38f6b1d01142/c3638/photo-1470114716159-e389f8712fda_600x400-600x360.jpg" alt="Refactoring Static File System Access" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 August 2016</p><p style="width:100%;margin-top:2rem">Years ago, I was trying to test an application I’d written, but couldn’t figure out how to remove a dependency it had on the file system. At the time, I was familiar with unit testing, and had bought into its value both as a developer and as a business owner (this was software that was central to my business at that time), but I was stymied by some code that looked something like this: `public…</p><br/></li><li><a href="/refactoring-static-system-clock-access/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Refactoring Static System Clock Access</h2><img src="/static/91116ba994716c9d7b7c4e4e1016f76f/4c509/refactoring-static-system-clock-access-760x360.png" alt="Refactoring Static System Clock Access" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 August 2016</p><p style="width:100%;margin-top:2rem">If you have logic that depends on dates and/or times, it can be difficult to test if it’s directly accessing the system clock (via DateTime.Now in .NET, for example). This is an example of an insidious dependency that can add unnecessary coupling to an application, making it harder to maintain. Fortunately, it’s pretty easy to refactor your code to address this issue. First, realize that you don’t…</p><br/></li><li><a href="/real-world-aspnet-core-mvc-filters/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Real World ASPNET Core MVC Filters</h2><img src="/static/d8bade7c69f4cb2cf1e6e8b009d2f20f/f1407/aspnetcore-1.png" alt="Real World ASPNET Core MVC Filters" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 August 2016</p><p style="width:100%;margin-top:2rem">Filters are a great, often underutilized feature of ASP.NET MVC and ASP.NET Core MVC. They provide a way to hook into the MVC action invocation pipeline, which makes them ideal for pulling common repetitive tasks out of your actions. Often, an app will have a standard policy that it applies to how it handles certain conditions, especially those that might generate particular HTTP status codes. Or…</p><br/></li><li><a href="/persisting-the-type-safe-enum-pattern-with-ef-6/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Persisting the Type Safe Enum Pattern with EF 6</h2><img src="/static/a65a8b93e3ee4a86107efb74cd8751d8/4c509/persisting-the-type-safe-enum-pattern-with-ef6-760x360.png" alt="Persisting the Type Safe Enum Pattern with EF 6" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 August 2016</p><p style="width:100%;margin-top:2rem">I’ve written about Enum Alternatives in C#, and a common problem developers encounter when they try to use such an approach is persistence. By default, ORM tools like Entity Framework don’t know what to do with these custom types. However, you can add support to let EF map these types to database columns as you would expect without too much effort. Here’s a quick example you can try yourself with…</p><br/></li><li><a href="/refactoring-static-config-access/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Refactoring Static Config Access</h2><img src="/static/ba3f6e51952b19b61d66c39225cb602c/79c6a/configuration.png" alt="Refactoring Static Config Access" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 August 2016</p><p style="width:100%;margin-top:2rem">A common but insidious dependency in many .NET applications is their use of configuration, including appSettings. The main issue is static access to config for values that affect the behavior of the application (values that are simply displayed, or used for things like email servers or addresses, aren’t usually an issue). Imagine you have some code like this: Imagine this method is used to gather…</p><br/></li><li><a href="/use-jquery-to-format-buttons-same-width/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Use jQuery to Format Buttons Same Width</h2><img src="/static/0b040aed4748316bf5de56903765157c/67cb8/buttons-differentsizesvertical.png" alt="Use jQuery to Format Buttons Same Width" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 July 2016</p><p style="width:100%;margin-top:2rem">Some (many) user interfaces work best when buttons are sized identically, so that instead of this: or this: You have something like this: This is pretty easy to do in JavaScript, and jQuery make it simple to apply the logic to a set of buttons with a common class. You can create a function, widest(), that, when applied to a set of buttons, sets its width to the widest button in the set. This is…</p><br/></li><li><a href="/enum-alternatives-in-c/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Enum Alternatives in C#</h2><img src="/static/64dc275db64ed0a8576c329c1ce9659f/acc81/enum.png" alt="Enum Alternatives in C#" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 July 2016</p><p style="width:100%;margin-top:2rem">Some time ago I wrote about Moving Beyond Enums and published an article on ASPAlliance by the same title. Unfortunately the latter article was largely screenshot-based, and those images seem to have disappeared, so I thought I’d revisit the topic here. Enums are simple value-type flags that provide very minimal protection from invalid values and no behavior. They’re helpful in that they’re an…</p><br/></li><li><a href="/logging-and-using-services-in-startup-in-aspnet-core-apps/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Logging and Using Services in Startup in ASPNET Core Apps</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="Logging and Using Services in Startup in ASPNET Core Apps" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 July 2016</p><p style="width:100%;margin-top:2rem">When you set up an ASP.NET Core app, most of the time you begin with the Startup.cs file, which provides essentially three places where you can add code: Constructor ConfigureServices Configure Naturally, the constructor fires first. Then, ConfigureServices is run, and finally the Configure method. You can learn more about this process in myApplication Startup Fundamentals article on docs.asp.net…</p><br/></li><li><a href="/how-to-list-all-services-available-to-an-asp-net-core-app/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to List All Services Available to an ASP.NET Core App</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="How to List All Services Available to an ASP.NET Core App" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 July 2016</p><p style="width:100%;margin-top:2rem">In a recent article, I showed how to configure logging for your Startup class in ASP.NET Core. With this configured, it’s easy to log all of the services that have been configured in ASP.NET Core services container. This can be very useful when diagnosing issues with ASP.NET Core’s support for dependency injection. Grab the code from the other post to get access to the logger in your…</p><br/></li><li><a href="/the-minimal-aspnet-core-app/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The Minimal ASPNET Core App</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="The Minimal ASPNET Core App" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 July 2016</p><p style="width:100%;margin-top:2rem">Now updated for ASP.NET Core 1.1 here. There’s no upper limit on how large an ASP.NET Core app can get, but what about how small you can make it? With the new .NET Core framework, the answer is pretty small. Let’s see just how small. First, make sure you have the dotnet CLI tools installed. You can get them from dot.net. This sample will work on Windows as well as Mac and Unix. Next, open a…</p><br/></li><li><a href="/flexible-deployments-using-teamcity/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Flexible Deployments Using TeamCity</h2><img src="/static/950ccd26c1ac547b801f0ce00745db63/63e25/teamcityparams.png" alt="Flexible Deployments Using TeamCity" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 July 2016</p><p style="width:100%;margin-top:2rem">I’m a big fan of JetBrains TeamCity for continuous integration (CI). It has a great web-based user interface, is extremely easy to set up and get running, and is also very flexible. What’s more, it’s free for up to 20 different build configurations, with multiple build agents (so your builds run in parallel). It’s an amazing deal and if you need more than 20 build configurations, you should be…</p><br/></li><li><a href="/check-in-often/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Check In Often</h2><img src="/static/d56b9fb58abf914702c00bd6f8b98bf3/ff087/copyfolderversioning.jpg" alt="Check In Often" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 July 2016</p><p style="width:100%;margin-top:2rem">This is post 1 of 2 in the series “Developer Tips” Tips for developers, archived from Dev Tips Weekly emails. Check in your code. Often. It doesn’t matter if you’re using Team Foundation Server, Git, Subversion, or another form of source control, you should be sure to check in your code frequently. Right now, do you have code that you’re working on (or were working on) and which isn’t checked in…</p><br/></li><li><a href="/static-code-analysis-and-quality-metrics/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Static Code Analysis and Quality Metrics</h2><img src="/static/dcdead1c9b0e61a5d793de19596efe5c/4c509/static-code-analysis-and-quality-metrics-760x360.png" alt="Static Code Analysis and Quality Metrics" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 July 2016</p><p style="width:100%;margin-top:2rem">This is post 1 of 1 in the series “Measuring and Managing Software Quality” Resources for measuring and assessing software quality. Assessing the quality of software can be a difficult, often subjective process. Having some heuristics and metrics that measure an application’s source code provides a useful starting point, and observing these metrics over time can identify important trends. Is the…</p><br/></li><li><a href="/multi-term-jquery-table-filter/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Multi-Term jQuery Table Filter</h2><img src="/static/5611a097fcd380e056f0180fc924870d/8cdf4/multitermfilter.png" alt="Multi-Term jQuery Table Filter" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 June 2016</p><p style="width:100%;margin-top:2rem">Recently I was mentoring a client who needed a simple filter for a table of data. In this case, they weren’t using a viewmodel-based framework, so it wasn’t an option to simply modify the collection to which the table was bound. We needed to use old school jQuery. Fortunately, a bit of searching yielded some code that mostly did the trick. We cleaned it up a bit and enhanced it. The source version…</p><br/></li><li><a href="/using-custom-middleware-to-record-and-fix-404s-in-aspnet-core-apps/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using Custom Middleware to Record and Fix 404s in ASPNET Core Apps</h2><img src="/static/0df0ecb82e2670d7ae78da62e3cd234e/31119/ic854853.png" alt="Using Custom Middleware to Record and Fix 404s in ASPNET Core Apps" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 June 2016</p><p style="width:100%;margin-top:2rem">My most recent article in MSDN Magazine is now available online: ASP.NET – Use Custom Middle Middleware to Detect and Fix 404s in ASP.NET Core Apps The article was written in the ASP.NET 5 RC1 timeframe, but the sample code has been updated to RC2 and is available on GitHub. From the introduction: If you’ve ever lost something at a school or an amusement park, you may have had the good fortune of…</p><br/></li><li><a href="/writing-clean-code-in-aspnet-core-with-di/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Writing Clean Code in ASPNET Core with DI</h2><img src="/static/c55e0ee3d0a365adf4fc9c5de1a2ea50/31119/may-msdn-cleancode.png" alt="Writing Clean Code in ASPNET Core with DI" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 May 2016</p><p style="width:100%;margin-top:2rem">I’ve started writing a series on ASP.NET Core for MSDN Magazine. If you’re not a subscriber to the dead trees version, you can read them online. My first article is on Writing Clean Code in ASP.NET Core with Dependency Injection, in the May 2016 issue. Here’s a brief intro: ASP.NET Core 1.0 is a complete rewrite of ASP.NET, and one of the main goals for this new framework is a more modular design…</p><br/></li><li><a href="/how-to-target-netcoreapp-and-net461-from-aspnet-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Target netcoreapp and net461 from ASPNET Core</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="How to Target netcoreapp and net461 from ASPNET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 May 2016</p><p style="width:100%;margin-top:2rem">The default templates for ASP.NET Core RC2 apps only target “netcoreapp1.0”. If you wish to have one app target multiple frameworks, you can do so by first adding the new framework to the list in project.json (e.g. “net461” for .NET Framework 4.6.1). However, once you do this you’ll get an error that Microsoft.NETCore.App is broken and perhaps an error like this one: error NU1002: The dependency…</p><br/></li><li><a href="/how-to-specify-framework-when-running-aspnet-core-apps/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How To Specify Framework When Running ASPNET Core Apps</h2><img src="/static/82af7f40f1798f8ee852dea1d292cc76/79b94/frameworkselectorvisualstudio.png" alt="How To Specify Framework When Running ASPNET Core Apps" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 May 2016</p><p style="width:100%;margin-top:2rem">In .NET Core, you can target multiple frameworks from the same application. Where there are incompatibilities, you can use precompiler directives, like so: However, if you have this in an application that also runs “netcoreapp1.0” it will probably run with that by default. To force it to run using .NET Framework 4.6.1 (or whatever version you’re using), you can switch it in Visual Studio using…</p><br/></li><li><a href="/upgrading-from-aspnet-core-rc1-to-rc2-guide/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Upgrading from ASPNET Core RC1 to RC2 Guide</h2><img src="/static/d8bade7c69f4cb2cf1e6e8b009d2f20f/f1407/aspnetcore-1.png" alt="Upgrading from ASPNET Core RC1 to RC2 Guide" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 May 2016</p><p style="width:100%;margin-top:2rem">There are a number of breaking changes between ASP.NET Core RC1 and RC2. If you have existing apps targeting RC1, here are some things you should expect to change in order to upgrade the apps to RC2. Consider this an “unofficial” guide. Update: Theofficial docs have a bunch of great content on this as well – this was just my own personal notes that worked for my projects. NuGet Sources Make sure…</p><br/></li><li><a href="/asp-net-core-training-–-june-2016/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Core Training – June 2016</h2><img src="/static/977c30f3ac4ef9b396b03743139846d1/37d5a/asp-mvc_grande.png" alt="ASP.NET Core Training – June 2016" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 May 2016</p><p style="width:100%;margin-top:2rem">If you’ve been wondering when the time would come for you to start learning about ASP.NET Core, it’s quickly approaching. ASP.NET Core RC2 should be available some time in the next few weeks, and I’m going to be teaching a 2-day online class on ASP.NET Core June 14-15 2016. The first day will cover ASP.NET Core fundamentals; the second day will offer an overview of ASP.NET Core MVC. Both sessions…</p><br/></li><li><a href="/code-quality-and-testing-–-devintersection-spring-presentations/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Code Quality and Testing – DevIntersection Spring Presentations</h2><img src="/static/ed5e075fbc31c88065cfcc72072cbe83/b5483/steve-microsoft-2015-11-970x450.jpg" alt="Code Quality and Testing – DevIntersection Spring Presentations" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 April 2016</p><p style="width:100%;margin-top:2rem">This week I presented at the sold-out DevIntersection spring conference, held at the Disney Swan hotel in Orlando, Florida. Overall this was a great show with more attendees than expected (always a good problem to have), and of course it was great to see many of my friends and colleagues. On Monday I sat in on Damian Edwards’ workshop on ASP.NET Core, which went well but was a bit rough due to the…</p><br/></li><li><a href="/thread-sleep-in-tests-is-evil/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Thread.Sleep in Tests Is Evil</h2><img src="/static/0aceae16ab75a3e33965b3b645ca488a/a84be/threadsleepintests-760x360.jpg" alt="Thread.Sleep in Tests Is Evil" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 April 2016</p><p style="width:100%;margin-top:2rem">Do you have calls to Thread.Sleep in your test code? If you’re not sure, you can easily find out by opening up the project in Visual Studio and running Find in Files (ctrl-shift F): Thread.Sleep will, not surprisingly, dramatically slow down your test suite. The primary reason is that it’s waiting longer than it has to, every time. Consider an example. You have an integration test that depends on…</p><br/></li><li><a href="/asp-net-shared-authentication-problem-solved/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Shared Authentication Problem Solved</h2><img src="/static/7021ac09df4eae204a40047cd5920b5a/0ff54/shared-security.jpg" alt="ASP.NET Shared Authentication Problem Solved" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 April 2016</p><p style="width:100%;margin-top:2rem">Last week I worked with a client to solve an issue they were having with a new ASP.NET 4.x application they had created using Visual Studio 2015. Their site is set up so that all of the authentication occurs through a shared, single-sign on, web site. Individual web projects are then hosted as subdomains which share the authentication cookie. It looks something like this: admin.foo.com (root…</p><br/></li><li><a href="/how-to-find-all-objects-in-a-sql-server-schema/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to find all objects in a SQL Server Schema</h2><img src="/static/5e2571174352abd206293691dcfafde5/4e530/how-to-find-all-objects-in-sql-server-schema.png" alt="How to find all objects in a SQL Server Schema" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 April 2016</p><p style="width:100%;margin-top:2rem">Sometimes I need to migrate some databases from one server to another. Sometimes the applications are quite old, and user accounts that were created for them belong to people who have long since left the project. As I delete the users, SQL Management Studio asks me if I want to delete the associated schema. My thought process is &quot;Yes… ? Wait, what will that delete, exactly?&quot; Unfortunately, it…</p><br/></li><li><a href="/logging-method-counts-and-durations/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Logging Method Counts and Durations</h2><img src="/static/8ab0a85a0fb6469c6d740df144d91bdc/48c8f/countloggeroutput.jpg" alt="Logging Method Counts and Durations" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 March 2016</p><p style="width:100%;margin-top:2rem">Remember the rules of optimization: Don’t do it! Don’t do it, yet. Avoid premature optmization. Profile before optimizing So, assuming you believe some optimization is warranted and you want to identify where it makes sense to do so, the important thing is to profile the current performance behavior of the application before you make any attempts at optimizing it. There are many tools available…</p><br/></li><li><a href="/custom-software-craftsmanship-workshop/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Custom Software Craftsmanship Workshop</h2><img src="/static/ed5e075fbc31c88065cfcc72072cbe83/b5483/steve-microsoft-2015-11-970x450.jpg" alt="Custom Software Craftsmanship Workshop" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 February 2016</p><p style="width:100%;margin-top:2rem">Last month I was invited to put on a customized workshop for one of my mentoring clients. The group included developers, testers, and technical management team members, totaling about a dozen people. I thought others might find some of what we discussed useful, so I’m posting some notes about the workshop here. If you think I could help your team or application improve, through remote mentoring or…</p><br/></li><li><a href="/configure-nlog-to-log-application-specific-data/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configure NLog to Log Application-Specific Data</h2><img src="/static/4b9adbef01078f394fbd20961e137ce9/0ff54/custom-logger.jpg" alt="Configure NLog to Log Application-Specific Data" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 February 2016</p><p style="width:100%;margin-top:2rem">NLog is one of my favorite .NET loggers. It has a bunch of great features, is easy to configure via a config file or programmatically, and is very extensible. Recently I had a customer who wanted to improve the logging in their web-based application. They wanted to log to a database, since that was what they had been doing successfully, and they wanted to be able to easily store the associated…</p><br/></li><li><a href="/configure-nlog-with-structuremap/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configure NLog with StructureMap</h2><img src="/static/8be30abb8975b64b6bab679f91f685c4/0ff54/subscribe-3534409_1280.jpg" alt="Configure NLog with StructureMap" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 February 2016</p><p style="width:100%;margin-top:2rem">In a couple of recent posts, I demonstratedhow to set up StructureMap 4 in a simple .NET console application, and how to configure NLog to capture and record some app-specific fields with each logged entry (well, to be able to do so if desired, anyway). If you’re using StructureMap already in your application, you may want to leverage it for your logging as well. Let’s consider that, and then show…</p><br/></li><li><a href="/using-structuremap-4-in-a-console-app/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using StructureMap 4 in a Console App</h2><img src="/static/e8b7e7e8dd28bc4023bd28e387bac2b4/0ff54/console-application.jpg" alt="Using StructureMap 4 in a Console App" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 February 2016</p><p style="width:100%;margin-top:2rem">If you’re using an older version of StructureMap or want more of an introduction, please read A Gentle Introduction to StructureMap, which includes a console application for StructureMap 2.x. StructureMap 4 is currently the latest version (v4.0.1.318) and is what I’m using for this example. The old ObjectFactory type is no more; instead you create instances of Container as needed. For a simple…</p><br/></li><li><a href="/speed-up-visual-studio-build-times/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speed Up Visual Studio Build Times</h2><img src="/static/110a98be966913907427784946427623/6ee12/task-manager.png" alt="Speed Up Visual Studio Build Times" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 February 2016</p><p style="width:100%;margin-top:2rem">Although compiling is still the #1 programmer excuse for slacking off, you still probably don’t want to spend more time on it than you absolutely have to. If your Visual Studio builds take longer than you would like, there are a couple of things you can do. First, if you’re still using a spinning-metal disk drive, upgrade to an SSD. You can get a 250GB SSD for under $100 these days on Amazon, and…</p><br/></li><li><a href="/asp-net-core-naming-history-and-reaction/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Core Naming History and Reaction</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="ASP.NET Core Naming History and Reaction" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 January 2016</p><p style="width:100%;margin-top:2rem">What was previously known as ASP.NET 5 will henceforth be called ASP.NET Core 1.0. You can read the official announcement for more details. Learn more about the platform itself. This is a very good thing because it will alleviate confusion about just what this version of Microsoft’s main server-side web framework is and how it relates to their previously released products – most importantly ASP…</p><br/></li><li><a href="/asp-net-5-migration-to-rc1-notes/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET 5 Migration to RC1 Notes</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="ASP.NET 5 Migration to RC1 Notes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 December 2015</p><p style="width:100%;margin-top:2rem">I’ve been migrating a number of articles from docs.asp.net to RC1 from beta8 (and earlier) and these are some of my notes. You may also find the following links helpful: Eric Anderson Migration from Beta 8 to RC1 DamienBod Updating to Beta8 from Older Beta Versions Shawn Wildermuth Upgrading ASP.NET 5 Beta 8 to RC1 View All Breaking Changes from Beta8 to RC1 on GitHub Get Latest Version The first…</p><br/></li><li><a href="/accepting-new-clients/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Accepting New Clients</h2><img src="/static/ed5e075fbc31c88065cfcc72072cbe83/b5483/steve-microsoft-2015-11-970x450.jpg" alt="Accepting New Clients" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 December 2015</p><p style="width:100%;margin-top:2rem">I’ve recently left my role as Chief Technology Officer at Falafel Software to focus more on what I really enjoy: mentoring teams and helping developers improve the quality of their skills and applications. Falafel is a great company and I continue to work with them, providing services to several clients, but I am now also making my services available directly (as well as working on several online…</p><br/></li><li><a href="/the-5-laws-of-software-estimates/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The 5 Laws of Software Estimates</h2><img src="/static/ac23baeb610b8911457849d3e98d11ce/4e530/5-laws-of-software-estimates.png" alt="The 5 Laws of Software Estimates" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 November 2015</p><p style="width:100%;margin-top:2rem">Estimates are typically a necessary evil in software development. Unfortunately, people tend to assume that writing new software is like building a house or fixing a car, and that as such the contractor or mechanic involved should be perfectly capable of providing a reliable estimate for the work to be done in advance of the customer approving the work. This is pretty attainable by building…</p><br/></li><li><a href="/builtwith-web-analytics/"><h2 class="is-size-2" style="width:100%;word-break:break-word">BuiltWith Web Analytics</h2><img src="/static/1e05fdfa4982217ff781620974cf1fbd/e8f36/screenshot-2015-11-07-14.21.38.png" alt="BuiltWith Web Analytics" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 November 2015</p><p style="width:100%;margin-top:2rem">If you’re looking for information on adoption of a given platform, framework, or JavaScript library,BuiltWithhas a nice site with tools and reports for that. You can view pie charts of current distribution: or view trends over the last year (or longer with a paid account). For instance,here’s the trend chart for ASP.NET. You can also use Builtwith to inspect how a given site is built, and what…</p><br/></li><li><a href="/troubleshooting-strongly-named-assembly-errors-in-asp-net-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Troubleshooting Strongly Named Assembly Errors in ASP.NET Core</h2><img src="/static/335786d803c1e0d676e7b36726c37fa4/37d5a/musicstore-beta8-issues-300x179.png" alt="Troubleshooting Strongly Named Assembly Errors in ASP.NET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 November 2015</p><p style="width:100%;margin-top:2rem">Last week I tried to work with the latest (beta 8) version of theMusic Store samplefor ASP.NET 5 (now ASP.NET Core). After pulling down the code via Git, I tried to build the solution the first time, and got a bunch of weird errors. I tried to troubleshoot the problem by rebuilding, cleaning, forcing Nuget to do an update, and trying to run the package restore and build from the command line, all…</p><br/></li><li><a href="/web-security-resources/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Web Security Resources</h2><img src="/static/b2a808d5d8e490e5dbc3c641d9fa1e92/4c509/screenshot-2015-11-07-12.32.25-760x360.png" alt="Web Security Resources" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 November 2015</p><p style="width:100%;margin-top:2rem">Last month I attended a workshop put on by none other than Troy Hunt. Try had a ton of great security tips, as well as some online resources. I took notes, and have been meaning to post some of the links here for my (and your) future reference. To get the full scoop on these and other tools and resources, check out Troy Hunt’s Pluralsight Courses. NeedADebitCard First, there are a lot of people…</p><br/></li><li><a href="/contributing-to-asp-net-core-documentation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Contributing to ASP.NET Core Documentation</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="Contributing to ASP.NET Core Documentation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 November 2015</p><p style="width:100%;margin-top:2rem">If you’re looking to learn ASP.NET 5, the best place to start today is the documentation site atdocs.asp.net. It’s hosted on ReadTheDocs and the source is all in GitHub (/aspnet/docs). Since it’s all open source, you can contribute to the documentation yourself, which is a great way to learn ASP.NET 5 and help your fellow developers. I’ve created a short video that walks you through the process…</p><br/></li><li><a href="/using-reverse-package-search-in-asp-net-core/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using Reverse Package Search in ASP.NET Core</h2><img src="/static/ba7fdc6815fd8c42ee5af7f377db384e/4c509/reverse-package-search.png" alt="Using Reverse Package Search in ASP.NET Core" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 November 2015</p><p style="width:100%;margin-top:2rem">ASP.NET 5 provides a much more granular way of specifying the dependencies your applications has. This is done in the project.json file, like so: But what happens if you can’t remember where some package is located? Maybe you’re building an ASP.NET 5 application and you want to add logging to it. You remember that Logging is located in the AspNet repository on GitHub, so naturally you figure it…</p><br/></li><li><a href="/devintersection-2015-sessions-on-code-quality/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DevIntersection 2015 Sessions On Code Quality</h2><img src="/static/6672e4b75a79d74a7af1fa09be0e7bc1/6050d/code-quality.png" alt="DevIntersection 2015 Sessions On Code Quality" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 October 2015</p><p style="width:100%;margin-top:2rem">This week I’m presenting in Las Vegas at DevIntersection. My session yesterday was on Improving the Quality of Existing Software, and touched on refactoring techniques,SOLID,code smells, and a call to action for developers to build their skills to the point where they can write what they consider quality code faster than poor quality code, imagine what that would mean (both individually as well as…</p><br/></li><li><a href="/nulls-break-polymorphism/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Nulls Break Polymorphism</h2><img src="/static/aad4ec7ec06ba67f7565f2e33d2db574/4c509/nulls-break-polymorphism-760x360.png" alt="Nulls Break Polymorphism" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2015</p><p style="width:100%;margin-top:2rem">Sir Charles Hoare has called it his “billion dollar mistake.” The .NET exception related to it is one of the most common, most hated, and often most useless exceptions the system provides (since the variable in question is never specified by the exception). Yes, I’m talking about null. One of the reasons null references are so problematic in object-oriented programming languages like C# is that…</p><br/></li><li><a href="/get-started-with-dnx-watch/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Get Started With dnx-watch</h2><img src="/static/06f6c815b82f796e3986d689baf4d858/a84be/dnvm-760x360.jpg" alt="Get Started With dnx-watch" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 October 2015</p><p style="width:100%;margin-top:2rem">With the release of ASP.NET 5 / DNX Beta 8, there is now a new command line tool, dnx-watch, that can be used to automatically re-run dnx commands in response to file changes. This can be useful when making quick updates to a web application or while practicing Test Driven Development. To get started, open a command prompt and first make sure you have dnvm, the .NET Version Manager utility…</p><br/></li><li><a href="/seamless-multi-computer-cpu-sharing/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Seamless Multi-Computer CPU Sharing</h2><img src="/static/2060ee2bc734a9270300d98e96fd0e54/4c509/computer-311339_1280-760x360.png" alt="Seamless Multi-Computer CPU Sharing" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 June 2015</p><p style="width:100%;margin-top:2rem">Something I’d love to see in a future version of Windows is a seamless way to use some of the extra computers I always tend to have on my network, whether at home or at the office. For CPU-intensive activities like video rendering, whether it’s video I’m producing for Pluralsight or something similar, or ripping my DVD collection to Plex, these activities take significant time on a single machine…</p><br/></li><li><a href="/exposing-private-collection-properties-to-entity-framework/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Exposing Private Collection Properties to Entity Framework</h2><img src="/static/7c87f4659bb6e7d2265f76326dbe5232/6050d/private-entity.png" alt="Exposing Private Collection Properties to Entity Framework" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 June 2015</p><p style="width:100%;margin-top:2rem">When following good object-oriented design principles and domain-driven design fundamentals, one should avoid exposing collection properties directly from the domain model. This can be a difficult goal to achieve with Entity Framework 6.x, since its collection properties generally must be of type ICollection, which includes methods that can manipulate the collection without the knowledge of the…</p><br/></li><li><a href="/software-craftsmanship-calendars/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Software Craftsmanship Calendars</h2><img src="/static/2df0d57e80b7f1529a4b6d22ae0a4950/37d5a/read-the-manual-mar-2013-300x300.png" alt="Software Craftsmanship Calendars" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 June 2015</p><p style="width:100%;margin-top:2rem">Recently, Brendan, Michelle, and I launched a Kickstarter campaign to fund the creation of a 2016 Software Craftsmanship motivational wall calendar. Our funding goal is pretty aggressive, so I appreciate any support you can offer. I’d especially like you to share this project with your fellow software developers. Think of it like this: If someone gets you one of these, what are they trying to say…</p><br/></li><li><a href="/configuring-asp-net-core-environment-variables/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configuring ASP.NET Core Environment Variables</h2><img src="/static/39075cfb21401f50fafd6833d3574c17/05b00/mac-terminal-environment-e1432142361365.png" alt="Configuring ASP.NET Core Environment Variables" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 May 2015</p><p style="width:100%;margin-top:2rem">Whether you’re developing on Windows or a Mac/Linux machine, you can control the behavior of your ASP.NET 5 application by setting environment variables. Learn more about how this works in the official docs on working with multiple environments in ASP.NET 5. The environment variable used to determine the application environment of an ASP.NET 5 application is . If you’re developing your application…</p><br/></li><li><a href="/developer-user-group-tips/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Developer User Group Tips</h2><img src="/static/c26a2503c85b03727405e609f8bae928/3bf7d/3724791747_6d8a51dd1e_z.jpg" alt="Developer User Group Tips" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 April 2015</p><p style="width:100%;margin-top:2rem">I&#x27;ve been a participant in a number of software developer user groups for many years, and an organizer of the Hudson Software Craftsmanship group since 2009. A few years ago, I was a member of the INETA Speaker Bureau, and would travel to a number of user groups around the country (and occasionally, the world - including Moscow in 2006). Recently I participated in a discussion about things to…</p><br/></li><li><a href="/github-spinoff-sites/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GitHub Spinoff Sites</h2><img src="/static/8a8a1ad1b4540e95f6b0995cf398bc97/4c509/huboard-760x360.png" alt="GitHub Spinoff Sites" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 April 2015</p><p style="width:100%;margin-top:2rem">Recently I’ve started using a couple of GitHub-related sites for collaboration. These are made possible by GitHub’s open API, and demonstrate how shipping an API allows a community to develop around your product, which in turn makes it more difficult for a competitor to displace your users. I’m sure there are many other sites out there, but the two I’m using at the moment are Huboard and Gitter.im…</p><br/></li><li><a href="/configure-grunt-in-visual-studio-2015/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configure Grunt in Visual Studio 2015</h2><img src="/static/13979831691ff25127fa77f9c146cb46/4c509/vs-grunt-760x339.png" alt="Configure Grunt in Visual Studio 2015" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 April 2015</p><p style="width:100%;margin-top:2rem">Configure Grunt in Visual Studio 2015 You can easily configure Grunt to perform client-side build tasks in Visual Studio 2015. Grunt is very similar to Gulp, and either one can be used with Visual Studio 2015 to perform a variety of tasks. Although it’s supported, you need to add it to the project as a dependency before you can start working with Grunt. In this example, we are going to configure…</p><br/></li><li><a href="/software-application-assessments/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Software Application Assessments</h2><img src="/static/c68096cfa134b54062d6f9115dd844c1/125bc/assessment.png" alt="Software Application Assessments" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 February 2015</p><p style="width:100%;margin-top:2rem">I just completed a Software Application Assessment for one of our clients, and will be presenting the report to them this week. We identified many parts of the application that were well-designed and were working as they should, as well as a number of areas that had room for improvement. An assessment is a lot like a home inspection report. If you’ve ever bought a house or building, you can…</p><br/></li><li><a href="/find-debug-assemblies-using-glimpse/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Find Debug Assemblies using Glimpse</h2><img src="/static/6e6b06a816c309112b6ebcfa240c226f/37d5a/glimpse_buildmode-300x96.png" alt="Find Debug Assemblies using Glimpse" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 November 2014</p><p style="width:100%;margin-top:2rem">A new feature inGlimpse.AspNet1.9.2 will display whether each assembly in your web site’s bin folder was compiled in Debug or Release mode. At development time, Debug mode is fine, but you want to avoid shipping Debug assemblies to production since there are performance costs associated with these assemblies. You candetermine for yourself whether a given assembly was compiled in debug mode using…</p><br/></li><li><a href="/dogfoodcon-session-on-ddd-with-asp-net-mvc/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DogFoodCon Session on DDD with ASP.NET MVC</h2><img src="/static/d278b96693ae9808d3cc9d0c17c86227/ef794/dogfood-logo-324x901.png" alt="DogFoodCon Session on DDD with ASP.NET MVC" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 September 2014</p><p style="width:100%;margin-top:2rem">Yesterday I presented atDogFoodCon, giving a slightly modified version of a talk I gave a week earlier atFalafelCONin San Francisco. The session provides those with little knowledge of Domain-Driven Design with a rapid overview of some key concepts and patterns used in DDD, and wraps up with a brief demo of a simple Guestbook application that begins as a monolithic everything-in-the-controller MVC…</p><br/></li><li><a href="/finding-copies-of-images-online/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Finding Copies of Images Online</h2><img src="/static/70aeb949baafbad5efeab70a8d1e7017/65aab/ladybug.png" alt="Finding Copies of Images Online" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 September 2014</p><p style="width:100%;margin-top:2rem">Obviously it’s very easy to download and reuse images on the Internet. However, if your business depends on such intellectual property, you may need to take steps to prevent unauthorized usage of your images. There are many ways you can mark your images to later prove they are yours – that’s a topic for another day – but you may not know there is also a very easy way to find other images and where…</p><br/></li><li><a href="/logging-in-entity-framework/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Logging in Entity Framework</h2><img src="/static/8a76a79242542c62cbdbd9e00f15ed2c/6de51/debugview_ef.png" alt="Logging in Entity Framework" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 August 2014</p><p style="width:100%;margin-top:2rem">When working with any ORM tool, it can sometimes be helpful to see just what, exactly, is being sent to the underlying data store. This can help identify bugs as well as performance issues in how the query is being performed (or how many queries are being performed, in the case of SELECT N+1 problems). There are several existing tools available that provide assistance with this: SQL Server…</p><br/></li><li><a href="/rgrc-is-the-new-red-green-refactor-for-test-first-development/"><h2 class="is-size-2" style="width:100%;word-break:break-word">RGRC is the new Red Green Refactor for Test First Development</h2><img src="/static/d6ec8c041a7e7317e895aabbfecef9d9/4c509/red-green-refactor-commit_760x360-760x360.png" alt="RGRC is the new Red Green Refactor for Test First Development" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 August 2014</p><p style="width:100%;margin-top:2rem">Test Driven Development (TDD), aka Test Driven Design, aka Test First Development, has long had a simple, virtuous cycle at the heart of its workflow: Write a failing test (run the test(s) – they should be RED) Make it pass in the simplest way possible (tests are GREEN) Now clean up the code (eliminate duplication and other code smells) (REFACTOR) When following this workflow, one can make steady…</p><br/></li><li><a href="/getting-started-with-castle-windsor/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Started with Castle Windsor</h2><img src="/static/8c9fc4b37944245b2fa29473d3457885/a84be/windsorcastle_760x360-760x359.jpg" alt="Getting Started with Castle Windsor" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 July 2014</p><p style="width:100%;margin-top:2rem">My preferred IoC container is StructureMap, but I’m going to be working with a client who uses Castle Windsor as their standard container, so I decided to learn a bit about it this week. I created a simple console application and included some interfaces and implementations to see how things work. Registering individual interfaces and wiring them up to their implementations is pretty…</p><br/></li><li><a href="/javascript-date-tips/"><h2 class="is-size-2" style="width:100%;word-break:break-word">JavaScript Date Tips</h2><img src="/static/69eceb12d005877cb91cc2af4543e6c9/6050d/java-script.png" alt="JavaScript Date Tips" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 July 2014</p><p style="width:100%;margin-top:2rem">The other night at the Hudson Software Craftsmanship meeting at the Falafel Software training center in Hudson, Ohio, I did the Red Pencil Kata using JavaScript. Although I’ve run into it in the past, I was stuck for a little while (I was the odd man out without a pairing partner to help find these things faster) due to one of JavaScript’s “fun” date conventions. Being a C# developer primarily…</p><br/></li><li><a href="/where-to-declare-variables-in-c-and-javascript/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Where to Declare Variables in C# and JavaScript</h2><img src="/static/87d8d95fe7907703916f3c7ec51d8045/fbe0e/deathtostock_desk1_3.jpg" alt="Where to Declare Variables in C# and JavaScript" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 July 2014</p><p style="width:100%;margin-top:2rem">Both JavaScript and C# belong to the C family of languages. They share curly braces and semi-colons, and in fact there are many cases where the exact same code will execute (correctly, in most cases) as either language. However, there are certain best practices that are unique to each language, and where variables should be declared is one of them. Declaring Variables in C# In C#, it’s generally…</p><br/></li><li><a href="/ensure-you-are-not-adding-to-global-scope-in-javascript/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Ensure You Are Not Adding To Global Scope in JavaScript</h2><img src="/static/69eceb12d005877cb91cc2af4543e6c9/6050d/java-script.png" alt="Ensure You Are Not Adding To Global Scope in JavaScript" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 July 2014</p><p style="width:100%;margin-top:2rem">A key best practice if you’re writing JavaScript code is to avoid adding objects to the global scope. There are several good reasons for this – globals add coupling, it makes it easier for disparate libraries to break one another, etc. A general rule of programming is to avoid global scope, in fact. Unfortunately, JavaScript makes adding things to global scope very easy. Consider this bit ofcode…</p><br/></li><li><a href="/resolving-dependencies-in-asp-net-mvc-5-with-structuremap/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Resolving Dependencies in ASP.NET MVC 5 with StructureMap</h2><img src="/static/97b3aeac75feed5884e4773580afc658/4c509/dependency-injection-760x360.png" alt="Resolving Dependencies in ASP.NET MVC 5 with StructureMap" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 June 2014</p><p style="width:100%;margin-top:2rem">In a previous post I showed how to use StructureMap with ASP.NET MVC 3. It’s been a couple of years, so I figured it was time to update that article with the steps for getting StructureMap working in ASP.NET MVC 5. If you’re interested in learning more about how to develop applications in a loosely coupled fashion, I highly recommend my course on SOLID Principles of Object Oriented Design to learn…</p><br/></li><li><a href="/how-do-i-use-structuremap-with-asp-net-mvc-3/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How Do I Use StructureMap with ASP.NET MVC 3</h2><img src="/static/977c30f3ac4ef9b396b03743139846d1/37d5a/asp-mvc_grande.png" alt="How Do I Use StructureMap with ASP.NET MVC 3" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 June 2014</p><p style="width:100%;margin-top:2rem">Update: If you want to use StructureMap with ASP.NET MVC 5, I have a walkthrough on this now as well. As I write this, the best resource for official documentation on ASP.NET MVC 3 is of course MSDN. You can also learn more about ASP.NET MVC 3 here. However, neither of those mention how to properly set up an IOC Container (like StructureMap) with ASP.NET MVC 3. After some searching, I was able to…</p><br/></li><li><a href="/rename-elements-in-powerpoint/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Rename Elements in PowerPoint</h2><img src="/static/42d31abc7b34fff9c45feebdface5949/5b766/image_14_animation.png" alt="Rename Elements in PowerPoint" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 June 2014</p><p style="width:100%;margin-top:2rem">In PowerPoint, especially if you’re working with a complex slide with a lot of animations, it can be difficult to easily determine which named element corresponds with which visual element on the slide. By default, when you add pictures and other assets to a slide, they get names like ‘Picture 5’. It would be great if there were an easy way to rename these elements, especially from the Animation…</p><br/></li><li><a href="/tip-–-override-tostring-in-objects/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tip – Override ToString() in Objects</h2><img src="/static/69eceb12d005877cb91cc2af4543e6c9/6050d/java-script.png" alt="Tip – Override ToString() in Objects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2014</p><p style="width:100%;margin-top:2rem">Most of your domain objects should override ToString() for the simple reason that if you ever want to simply display the object’s state, you shouldn’t need to implement a custom formatter for it. Furthermore, it’s well-known that the default System.Object implementation of .ToString(), which outputs the type’s name, is useless 99% of the time. Thus, it’s generally a good idea to implement…</p><br/></li><li><a href="/stir-trek-2-iron-man-edition/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Stir Trek 2: Iron Man Edition</h2><img src="/static/1c359d8546d9954e1ae1f0aabd5be6f6/faed2/stirtrek_thumb.png" alt="Stir Trek 2: Iron Man Edition" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2014</p><p style="width:100%;margin-top:2rem">Next month (7 May 2010) I’ll be presenting at the second annual Stir Trek event in Columbus, Ohio. Stir Trek (so named because last year its themes mixed MIX and the opening of the Star Trek movie) is a very cool local event. It’s a lot of fun to present at and to attend, because of its unique venue: a movie theater. And what’s more, the cost of admission includes a private showing of a new movie…</p><br/></li><li><a href="/how-to-automatically-remove-www-from-a-domain-in-iis7/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How To: Automatically Remove www from a Domain in IIS7</h2><img src="/static/8d36b3988ecd1d44111ee00982ba9216/ef502/iis-manager.png" alt="How To: Automatically Remove www from a Domain in IIS7" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2014</p><p style="width:100%;margin-top:2rem">I recently moved the DevMavens.com site from one server to another and needed to ensure that the www.devmavens.com domain correctly redirected to simply devmavens.com. This is important for SEO reasons (you don’t want multiple domains to refer to the same content) and it’s generally better to use the shorter URL (www is so 20th century) rather than wasting 4 characters for zero gain. My friend and…</p><br/></li><li><a href="/microsoft-version-number-integer-type/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Microsoft Version Number Integer Type</h2><img src="/static/396359eee4e20ff24d9a2d3fa5dbc497/4c509/vslogo-760x360.png" alt="Microsoft Version Number Integer Type" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 June 2014</p><p style="width:100%;margin-top:2rem">Microsoft made some headlines a few years ago when they decided to skip Office 13 and jump straight from Office 12 to Office 14. Recently, they’ve announced Visual Studio “14” CTP, which appears to be doing the same thing: Current Version (Visual Studio 2013): Next Version: I actually wrote about Microsoft’s apparent triskaidekaphobia back in 2008 with the Office naming, and suggested that they…</p><br/></li><li><a href="/working-with-kendo-ui-templates/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working with Kendo UI Templates</h2><img src="/static/520188d45171a589284432ce56f58f9b/cb0dc/image_thumb_3_todo.png" alt="Working with Kendo UI Templates" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 February 2014</p><p style="width:100%;margin-top:2rem">I’m watching the Introduction to Kendo UI course by Keith Burnell on Pluralsight and decided to play around a little bit with templates, which are a pretty powerful feature. If you’re a server-side web developers, templates should seem pretty familiar to you. Any ASP or ASP.NET page can be thought of like a template, in which you mix markup and dynamic data expressions. In this case, the templates…</p><br/></li><li><a href="/passing-default-parameter-objects-in-javascript/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Passing Default Parameter Objects in JavaScript</h2><img src="/static/63a8d0e9508e18ee4aa31337e9d8dd09/5b766/image_thumb_3_jquery.png" alt="Passing Default Parameter Objects in JavaScript" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 January 2014</p><p style="width:100%;margin-top:2rem">You can use the jQuery extend() functionto elegantly configure your functions to accept a single parameter object, while providing default behavior for any options that are not set. For instance, imagine you have a simple function that simply says “Hello, World”. You could code it like this: Now, if you want to start passing in parameters, you can easily do so by parameterizing the method, but…</p><br/></li><li><a href="/when-should-you-refactor/"><h2 class="is-size-2" style="width:100%;word-break:break-word">When Should You Refactor</h2><img src="/static/7759d7301d783645da9c452a477c9a76/dadfe/restaurant-638x360.jpg" alt="When Should You Refactor" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 January 2014</p><p style="width:100%;margin-top:2rem">A common question teams face is, when should we take the time to refactor our code? Refactoring is defined as improving the design or quality of code, without changing its external functionality. Most teams face constant pressure to release features and/or fix bugs as quickly as possible, so it’s not uncommon for problems discovered in the codebase to be put on the back burner to be fixed “later…</p><br/></li><li><a href="/configuring-performance-counters-to-run-over-time/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configuring Performance Counters to Run Over Time</h2><img src="/static/5d181bfe5e80150b8818099555415142/5b766/image_thumb_8_graph.png" alt="Configuring Performance Counters to Run Over Time" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 December 2013</p><p style="width:100%;margin-top:2rem">Whether you’re looking to diagnose performance problems, or just to keep an eye on the health of a server you rely on, knowing how to configure performance counters so they run constantly in the background can be a huge help. The first step in getting to performance counters is to run perfmon (just hit Start and type perfmon): Once you’re in Perfmon, you may have questions like: What should I…</p><br/></li><li><a href="/moores-law-and-the-hybrid-mobile-application/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Moores Law and the Hybrid Mobile Application</h2><img src="/static/3a88c49318828c2f2c93961bf57c00a9/0ff54/mobile-app.jpg" alt="Moores Law and the Hybrid Mobile Application" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 December 2013</p><p style="width:100%;margin-top:2rem">If you’re building software today, you’ve probably faced the question of whether or not you need to build a mobile version of your application. In that case, or in the case where you’re decided from the outset you’re building a mobile app, the next question is, which mobile platform do you target? Here there are several options: Target Android. It’s got the biggest market share. (69% in 201…</p><br/></li><li><a href="/final-verdict-on-haswell-ultrabook/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Final Verdict on Haswell Ultrabook</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 October 2013</p><p style="width:100%;margin-top:2rem">I’ve had a pre-release Intel Ultrabook with the new Haswell processor in it for about two months now, so it’s time for one last review of the device. You can read my previous reviews: First Impressions of the Intel Haswell Ultrabook Intel Haswell Ultrabook Preview Unit Experience Overview This device has met or exceeded my expectations for performance, power use, and overall fit and finish. The…</p><br/></li><li><a href="/devreach-2013-recap-and-slides/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DevReach 2013 Recap and Slides</h2><img src="/static/d8469002c77f33a4a46a112434fb7b22/18f0b/dsc01699_thumb.jpg" alt="DevReach 2013 Recap and Slides" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 October 2013</p><p style="width:100%;margin-top:2rem">Last week I had the opportunity to visit Sofia, Bulgaria for the DevReach 2013 conference at which I was once more a presenter. DevReach is always one of my favorite conferences to speak at, because the food and culture of Bulgaria is great, the attendees come from diverse backgrounds, and the conference planning always goes above and beyond to take care of the speakers. I found this to be true my…</p><br/></li><li><a href="/3-places-you-should-deploy-your-important-web-site-to/"><h2 class="is-size-2" style="width:100%;word-break:break-word">3 Places You Should Deploy Your Important Web Site To</h2><img src="/static/d87fe7ae9ed9a1ae4f827af7eec945e9/0ff54/deployment.jpg" alt="3 Places You Should Deploy Your Important Web Site To" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 September 2013</p><p style="width:100%;margin-top:2rem">You’ve got a web site, and you think it’s important. Or your boss does. Or your customers do. In any case, someone will notice when that thing goes down. So it’d be nice if that didn’t happen too often, especially during relatively mundane activities like deploying a simple update to the site. Let’s talk about the three places you should be deploying your site to in order to achieve this simple…</p><br/></li><li><a href="/wiring-up-timeago-and-aspnet-mvc/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Wiring Up TimeAgo and ASPNET MVC</h2><img src="/static/b6669835386c04efea243c6cfcec6e06/1cf3f/timeago.png" alt="Wiring Up TimeAgo and ASPNET MVC" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 August 2013</p><p style="width:100%;margin-top:2rem">Imagine you want to display something on a page so that instead of raw dates, the user is shown something more relative to the current time. You’ve probably seen this in some of the applications you use. “Last Updated: A moment ago” or “about an hour ago”. There are a variety of ways you can implement this, and it’s been done inmanydifferentlanguages. In my case, which is an ASP.NET MVC C…</p><br/></li><li><a href="/refactoring-with-solid-at-falafelcon/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Refactoring with SOLID at FalafelCon</h2><img src="/static/9f328582e01c6e5321dad8dac0f85b85/0ff54/conference.jpg" alt="Refactoring with SOLID at FalafelCon" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 June 2013</p><p style="width:100%;margin-top:2rem">Yesterday I presented at the first ever FalafelCon conference in Mountain View, California. My session Refactoring with SOLID Principles is now available on SlideShare. I was a little pressed for time, so I had to cover some of the material quickly. For more information, I encourage you to check out my SOLID Principles of Object Oriented Design course. There were a couple of questions from the…</p><br/></li><li><a href="/moving-a-site-to-windows-azure-in-5-easy-steps/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Moving a Site to Windows Azure in 5 Easy Steps</h2><img src="/static/b92c5d2f36f8ddb2639b3fc0e712b8b5/5b766/sql-db-win.png" alt="Moving a Site to Windows Azure in 5 Easy Steps" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 May 2013</p><p style="width:100%;margin-top:2rem">One of my sites is currently having issues where it’s currently hosted. They’re resolved by restarting the application, but that’s gotten tedious and I simply don’t have time to invest in troubleshooting this particular site. And, oh hey, those MSDN Windows Azure benefits keep looking shiny like I should play with them. So, I figure I’ll try moving the site to Azure and see if miraculously that…</p><br/></li><li><a href="/regional-differences/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Regional Differences</h2><img src="/static/1f672472618d7f729867115cd2d72d08/0ff54/app-1013616_1280.jpg" alt="Regional Differences" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 May 2013</p><p style="width:100%;margin-top:2rem">A while ago I ran a poll on twitter asking how developers recommend regions be used. About 15% of the respondents chose Other and/or chose to leave a comment. The comments are useful because they often highlight answer categories that I overlooked when I set up the poll. In this case, there were a lot of comments, I think because there are a lot of different opinions about regions in general, some…</p><br/></li><li><a href="/when-to-comment-your-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">When To Comment Your Code</h2><img src="/static/db30eab91a9e7e65d7d444ec2e6c714a/4c509/when-to-comment-your-code-760x360.png" alt="When To Comment Your Code" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 May 2013</p><p style="width:100%;margin-top:2rem">My opinions on comments in software code have evolved with my experience. When I was a teenager first learning to program for real, I rarely used comments unless the code was for an assignment, in which case it was a forced exercise every bit as much as teachers’ requests to “show your work” added verbosity to my math and science problems’ solutions. Of course, the programs themselves were quite…</p><br/></li><li><a href="/speaking-at-falafelcon/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking at FalafelCon</h2><img src="/static/bea76a1a287e03efda9665a0a4e33abd/0dfe6/clip_image001_3.png" alt="Speaking at FalafelCon" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 May 2013</p><p style="width:100%;margin-top:2rem">Hey, California people, I’m coming your way. I’ll be speaking at FalafelCon 2013 next month about Refactoring with SOLID Principles. The event is taking place 10-11 June 2013 at Microsoft’s Silicon Valley campus. The speaker lineup looks pretty awesome, with keynotes from Scott Hanselman, Stephen Forte, Michele Bustamante, and Tim Huckaby, and tracks covering Web, Mobile, Sitefinity, and…</p><br/></li><li><a href="/march-2013-pluralsight-experiment/"><h2 class="is-size-2" style="width:100%;word-break:break-word">March 2013 Pluralsight Experiment</h2><img src="/static/269aab8252a9ac36fa9c8fa05ecbc7af/0ff54/winner.jpg" alt="March 2013 Pluralsight Experiment" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 April 2013</p><p style="width:100%;margin-top:2rem">Update: Winner and Results The winner of the experiment’s prize is Martin Frey (@tinfrey). You can watch a video of the random drawing here (I’ll keep the file up until at least 1 May 2013). In terms of the results of the experiment, I would say they were somewhat inconclusive. I noted in the initial post below that my SOLID course averaged just 78 minutes per unique subscriber in February…</p><br/></li><li><a href="/when-should-you-arrive-for-an-interview/"><h2 class="is-size-2" style="width:100%;word-break:break-word">When Should You Arrive for an Interview</h2><img src="/static/dc2275b9a50200f9d30ad6e1f6878347/4c509/when-should-you-arrive-for-an-interview.png" alt="When Should You Arrive for an Interview" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 March 2013</p><p style="width:100%;margin-top:2rem">We’ve been doing a lot of interviewing as we grow our team in Hudson, Ohio for Telerik Services. We have a fairly small office in a suburban environment, where you can basically park right outside the building and walk right in – no elevators, reception area, parking decks, or other hassles you might find in a more urban location. As a result, we’ve learned that if we schedule an interview, we…</p><br/></li><li><a href="/how-to-contribute-to-aspnet-yourself/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How To Contribute to ASPNET Yourself</h2><img src="/static/247c87faa8a300d2be8a83bf8ea5fdc3/5b766/codeplex.png" alt="How To Contribute to ASPNET Yourself" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 February 2013</p><p style="width:100%;margin-top:2rem">Recently I upgraded the Stir Trek conference site’s web code from ASP.NET MVC 2 to 4. When I did, I ran into an issue where the [OutputCache] attribute’s behavior changed for RenderAction code. Specifically, if you had code like this: it would stop working. You would get an error message like this: Now, this error will make no sense to you if, like me, it used to work just fine in MVC 2, and you…</p><br/></li><li><a href="/presenting-at-telerik-software-pros-conference-in-new-delhi-india/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Presenting at Telerik Software Pros Conference in New Delhi India</h2><img src="/static/0ff151708a7d99836ac443d66f8ece25/c3638/person-apple-laptop-notebook_600x400.jpg" alt="Presenting at Telerik Software Pros Conference in New Delhi India" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 January 2013</p><p style="width:100%;margin-top:2rem">Today I gave two sessions at the Telerik Software Professionals Conference in New Delhi, India. The event is still ongoing (Chris Sells is wrapping up a great talk on building Windows 8 apps with HTML5 and JavaScript), but I wanted to get my talks posted here for attendees to download and review. I’ve loaded them on Slideshare, so you should be able to view them here, or navigate to Slideshare to…</p><br/></li><li><a href="/intellicommand-and-justcode/"><h2 class="is-size-2" style="width:100%;word-break:break-word">IntelliCommand and JustCode</h2><img src="/static/84e8e19a3dfb1ce0c4dcfc742e595947/5b766/intelli.png" alt="IntelliCommand and JustCode" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 January 2013</p><p style="width:100%;margin-top:2rem">I’ve been using JustCode regularly, lately, but I’m still learning some of the keyboard shortcuts and features (and probably always will be). JustCode features a nice view showing all of the common commands that you can access at any time (from the menu, or via ctrl+shift+alt+/): And of course, you can also change these, or even jump to another common set of shortcuts, in the JustCode options…</p><br/></li><li><a href="/presenting-in-new-delhi-india/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Presenting in New Delhi, India</h2><img src="/static/a71c4508e18dcca515b11d2addf29e97/0c87d/new-dehli-1.png" alt="Presenting in New Delhi, India" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 January 2013</p><p style="width:100%;margin-top:2rem">This Saturday (12 January 2013), I’ll be presenting at theTelerik Developers’ Conferencein New Delhi, India. The event kicks off at 9am – here’s the current plan for the agenda: I’m giving two presentations in the afternoon. The abstracts are as follows: Refactoring Applications using SOLID Principles We’ve all heard about well-designed software projects, where things aren’t (yet) a big ball of…</p><br/></li><li><a href="/working-with-ivy-bridge-ultrabook-sensors/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working with Ivy Bridge Ultrabook Sensors</h2><img src="/static/572594371eeae194d569d6bb6b94ec75/fe506/inclinometer.png" alt="Working with Ivy Bridge Ultrabook Sensors" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 December 2012</p><p style="width:100%;margin-top:2rem">I’ve had Intel’s preview Ivy Bridge Ultrabook for a little over two months now. It’s a preview device with a few pre-production quirks, but it’s also a powerful developer machine in a small, lightweight package, complete with a very responsive touch screen that works great with Windows 8. You can readmy first impressions of the device, as well as my first follow-up review. In this last write-up…</p><br/></li><li><a href="/dont-forget-block-selection-using-alt-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Dont Forget Block Selection Using Alt in Visual Studio</h2><img src="/static/09ad99c9d16957d33152c99b8b060c4c/2b47e/testclass.png" alt="Dont Forget Block Selection Using Alt in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 November 2012</p><p style="width:100%;margin-top:2rem">So do you ever find yourself wanting to try out some code you found on the Internet (via Copy Paste Programming, but in a spike or test project, naturally!), and unfortunately when you copy the code it includes a bunch of line numbers? Like the code from this sample on testing Entity Framework stuff? Of course, some code highlighting tools make this a little easier for you, and Scott Hanselman…</p><br/></li><li><a href="/2013-software-craftsmanship-calendar/"><h2 class="is-size-2" style="width:100%;word-break:break-word">2013 Software Craftsmanship Calendar</h2><img src="/static/bf50e07db0163de4a93e41b92db32b28/0dfe6/separation-of-concerns-feb-2013_3.png" alt="2013 Software Craftsmanship Calendar" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 November 2012</p><p style="width:100%;margin-top:2rem">It’s that time of year again when Software Craftsmanship wall calendars are shipping out of our Hudson office. A few things are different this year. The small NimblePros logo on the calendars has been replaced with a small Telerik logo. The boxes of calendars from the printer now come with 60 calendars per box, instead of 55. And the calendars themselves have an extra page in them (you’ll have to…</p><br/></li><li><a href="/javascript-the-good-parts-reviewed/"><h2 class="is-size-2" style="width:100%;word-break:break-word">JavaScript The Good Parts Reviewed</h2><img src="/static/ed959c3560829bde80944e79cac610de/f0719/javascript-the-good-parts-500x360.jpg" alt="JavaScript The Good Parts Reviewed" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 November 2012</p><p style="width:100%;margin-top:2rem">Finished up Douglas Crockford’s JavaScript: The Good Parts this week. It definitely helped me improve my understanding of JavaScript, which I’ve been using since it was new, but always like a C programmer, and only recently like a JavaScript programmer. I really appreciated Crockford’s honest, no-holds-barred analysis of JavaScript’s design and language choices. It had me chuckling more than once…</p><br/></li><li><a href="/limit-sql-server-memory-use-on-dev-machine/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Limit SQL Server Memory Use on Dev Machine</h2><img src="/static/552991b78e4fb9f7d3eeb807f6c5886e/4e530/limit-sql-server-memory-use-on-dev-machines.png" alt="Limit SQL Server Memory Use on Dev Machine" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 November 2012</p><p style="width:100%;margin-top:2rem">If you’re a developer running SQL Server locally, you may sometimes need to limit how much memory the database is consuming. Under normal conditions, SQL Server likes to use as much memory as it can get, since keeping results in memory improves the database’s performance. In typical production scenarios, this is the ideal behavior, but on a dev machine you probably want your RAM for other things…</p><br/></li><li><a href="/justcode-justrocks/"><h2 class="is-size-2" style="width:100%;word-break:break-word">JustCode JustRocks</h2><img src="/static/308feb9dc204c57fc7b364e92be5a17c/e86a8/image_thumb_12_keyboard.png" alt="JustCode JustRocks" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2012</p><p style="width:100%;margin-top:2rem">I have been a ReSharper fanboy for a long, long time. I have recommended it in user group and conference talks and on my blog. It was one of my favorite tools for a long time, and it remains a great product. However, I’m happy to say with all honesty that I now prefer JustCode. This is fortunate, as I now work for the company that makes JustCode, but I’ve held off on endorsing it (or completely…</p><br/></li><li><a href="/a-review-of-the-clean-coder/"><h2 class="is-size-2" style="width:100%;word-break:break-word">A Review of The Clean Coder</h2><img src="/static/e98e9db44f1442dc540b9cf826fd6b00/0ff54/clean.jpg" alt="A Review of The Clean Coder" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 October 2012</p><p style="width:100%;margin-top:2rem">I’m generally a fan of Robert C. “Uncle Bob” Martin’s books, so realize I’m going into this book with something of a positive bias. While is previous books, Agile Principles, Patterns and Practices in C# and Clean Code, have been specifically about programming techniques, this latest title, The Clean Coder, is more philosophical in nature. It seeks to present Martin’s philosophy of how software…</p><br/></li><li><a href="/devreach-2012-sessions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DevReach 2012 Sessions</h2><img src="/static/00ba31e1fd7716e466ce05dbf626b028/6050d/sessions.png" alt="DevReach 2012 Sessions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 October 2012</p><p style="width:100%;margin-top:2rem">Thanks to everybody who attended my DevReach sessions. I had two talks and two panels, and both of the talks were standing room only (in the smaller theater), which was great to see. The panels were both recorded on DotNetRocks and should be published later in October 2012. I also did a software craftsmanship hands-on workshop before DevReach began, which drew about 20 students who learned via…</p><br/></li><li><a href="/the-art-of-unit-testing-reviewed/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The Art of Unit Testing Reviewed</h2><img src="/static/881d1d9d24580bf40b50703af28e8c01/0ff54/test-13394.jpg" alt="The Art of Unit Testing Reviewed" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 September 2012</p><p style="width:100%;margin-top:2rem">I recently finished reading Roy Osherove’s The Art of Unit Testing. I was kind of splitting my time reading it and Growing Object Oriented Software Guided by Tests, which I just recently reviewed as well. One nice thing about this book is that it comes with an eBook once you register it with Manning. Overall, I think this is a great book on unit testing. Roy is certainly well-qualified to write…</p><br/></li><li><a href="/webs-of-trust-versus-certifications/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Webs of Trust versus Certifications</h2><img src="/static/063ace0f6dd4c507269b383c87375f67/0ff54/handshake-3382504_1280.jpg" alt="Webs of Trust versus Certifications" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 September 2012</p><p style="width:100%;margin-top:2rem">In the software development industry, as in many others, it’s important or at least helpful to be able to identify individuals and companies who are competent at their craft. Finding those who are excellent is nice, too, but honestly I’m amazed at how many “professionals” out there don’t even measure up to the much lower bar of merely competent (to be fair, I find this to be true of accountants…</p><br/></li><li><a href="/unboxing-and-first-impressions-of-new-intel-ultrabook/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Unboxing and First Impressions of New Intel Ultrabook</h2><img src="/static/897bd3b50efea6abc2c70ec6fba954c9/23495/IMG_3556_thumb.png" alt="Unboxing and First Impressions of New Intel Ultrabook" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 September 2012</p><p style="width:100%;margin-top:2rem">I recently received a preview-hardware next generation Ivy Bridge Ultrabook from Intel, optimized for and pre-installed with Windows 8. I suspect we’ll be seeing these available in stores and via online outlets soon. I’m a fan of the Ultrabook brand and concept – thin, sleek, and light, with powerful hardware capable of running developer tools. I’ve already happily switched away from much heavier…</p><br/></li><li><a href="/growing-object-oriented-software-guided-by-tests-book-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Growing Object-Oriented Software Guided By Tests Book Review</h2><img src="/static/62fa92970e6288c4887fbfce43c94bd5/0ff54/phone-1052023_1280.jpg" alt="Growing Object-Oriented Software Guided By Tests Book Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 September 2012</p><p style="width:100%;margin-top:2rem">I finished this book a while back and just haven’t had a chance to write about it until now. Growing Object-Oriented Software, Guided by Tests is a bit of a mouthful of a title, but it does describe the subject matter of the book pretty well. I noted a few points of interest as I read the book, as I tend to do, that I’d like to share here along with my overall thoughts. I’ve read quite a few books…</p><br/></li><li><a href="/a-gentle-introduction-to-structuremap/"><h2 class="is-size-2" style="width:100%;word-break:break-word">A Gentle Introduction to StructureMap</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="A Gentle Introduction to StructureMap" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 September 2012</p><p style="width:100%;margin-top:2rem">I found myself explaining inversion of control containers and their benefits to someone today, and so I created a very simple console application that makes use of StructureMap (my favorite such container). You can view the whole file in this Gist. Here I’ll just briefly explain what’s going on. The main benefit of a tool like StructureMap is to decouple your classes from their collaborators…</p><br/></li><li><a href="/how-to-disable-resharper-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How To Disable ReSharper in Visual Studio</h2><img src="/static/4cac1374575b46b401d813cdef89caec/5b766/SNAGHTML1ff3360d_1.png" alt="How To Disable ReSharper in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 July 2012</p><p style="width:100%;margin-top:2rem">Something I’ve had to do from time to time is disable a plug-in in Visual Studio, either permanently or temporarily, such as ReSharper. Just now was one of those times, and as in the past I had to hunt through a variety of Visual Studio menus in order to find it. Personally, I think Visual Studio has some work to do on how many kinds of plug-ins, add-ons, and extensions it supports, which I hope I…</p><br/></li><li><a href="/aspconf-2012-sessions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">aspConf 2012 Sessions</h2><img src="/static/9f328582e01c6e5321dad8dac0f85b85/0ff54/conference.jpg" alt="aspConf 2012 Sessions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 July 2012</p><p style="width:100%;margin-top:2rem">Yesterday I presented two sessions foraspConf 2012. The first was a new talk I haven’t given before on ASP.NET MVC Solution Best Practices (which I dubbed the Solution to the Solution Problem). The second one was a talk on Common ASP.NET Design Patterns, which is basically I talk I’ve given for at least a year now on Common Design Patterns, adapted slightly for ASP.NET (mainly MVC). The slides are…</p><br/></li><li><a href="/getting-structuremap-to-work-with-mvc4-rc-and-web-api/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting StructureMap to Work with MVC4 RC and Web API</h2><img src="/static/d3ccc9290dc402d1dcc8e68e5d7f99ba/0ff54/webdesign-3411373_1280.jpg" alt="Getting StructureMap to Work with MVC4 RC and Web API" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 July 2012</p><p style="width:100%;margin-top:2rem">At the moment (18 July 2012) if you install the NuGet package structuremap.MVC4, it will not compile due to breaking changes in the ASP.NET MVC4 RC distribution. You have to jump through some extra hoops to get this working. Here are two posts that help: Configuring MVC4 with StructureMap Using the Web API Dependency Resolver However, even with both of these getting things working wasn’t quite as…</p><br/></li><li><a href="/how-can-i-view-msmq-messages-and-queues/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How Can I View MSMQ Messages and Queues?</h2><img src="/static/c5f453bc2934b72e78afd1c55530f42c/0ff54/nature-2616213_1280.jpg" alt="How Can I View MSMQ Messages and Queues?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 June 2012</p><p style="width:100%;margin-top:2rem">I’m working with NServiceBus to send messages to and from different parts of my application. NServiceBus is a mature tool that sits on top of MSMQ and provides a great developer experience for working with a number of different scenarios. One thing that’s challenging when working with queues is figuring out where a message went when it doesn’t show up at the other end of the message bus. Where did…</p><br/></li><li><a href="/windows-azure-june-2012-update-required-reading/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Windows Azure June 2012 Update Required Reading</h2><img src="/static/3360ab85f842bdd9dfc577e6a9836c39/94ec9/azure.png" alt="Windows Azure June 2012 Update Required Reading" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 June 2012</p><p style="width:100%;margin-top:2rem">Today (right now as I type this) Microsoft has unveiled a TON of new features that are launching as part of Windows Azure. If you’d like to learn more about these announcements and services, here’s the short list of blog posts you’ll want to read/skim: Scott Hanselman – Windows Azure – No Kidding Scott Guthrie – Meet the New Windows Azure Bill Laing – Announcing New Windows Azure Services to…</p><br/></li><li><a href="/view-network-status-and-listening-ports-on-windows-with-netstat/"><h2 class="is-size-2" style="width:100%;word-break:break-word">View Network Status and Listening Ports on Windows with Netstat</h2><img src="/static/36b415379ff3e57a428518c40ff7d094/5b766/network-6.png" alt="View Network Status and Listening Ports on Windows with Netstat" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 June 2012</p><p style="width:100%;margin-top:2rem">There are plenty of times when you may need to know which applications are running on which ports on your machine. Some examples of questions this might answer include: How can I see which port my application is running on, so I can forward or open that port in my firewall? How can I see which applications are actively using my network connection? How can I see where applications on my machine are…</p><br/></li><li><a href="/favor-privileges-over-role-checks/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Favor Privileges over Role Checks</h2><img src="/static/aead822cba2ec5b63a7fb4ad94d15119/4e530/favor-privileges-over-role-checks.png" alt="Favor Privileges over Role Checks" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 June 2012</p><p style="width:100%;margin-top:2rem">A very common practice in web applications, especially those written using the ASP.NET built-in Role provider (circa ASP.NET 2.0 / 2005), is to perform role checks throughout the code to determine whether a user should have access to a particular page or control or command. For instance, you might see something like this: The problems with the maintainability of this approach become apparent after…</p><br/></li><li><a href="/economics-of-software-quality/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Economics of Software Quality</h2><img src="/static/6672e4b75a79d74a7af1fa09be0e7bc1/6050d/code-quality.png" alt="Economics of Software Quality" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 June 2012</p><p style="width:100%;margin-top:2rem">When we talk about the quality of software, we must refine the discussion to make it clear whether we are talking about internal or external quality. External quality refers to the software’s presentation and behavior from a user or customer’s perspective. Internal quality refers to how the software was constructed, and how easy it might be to maintain or extend. External quality is often under…</p><br/></li><li><a href="/telerik-hudson-office-signs/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Telerik Hudson Office Signs</h2><img src="/static/e19a356ed74bbfdea518527d47e377d7/88b18/img_3049_1.jpg" alt="Telerik Hudson Office Signs" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 May 2012</p><p style="width:100%;margin-top:2rem">The new signs went in earlier this week, replacing the NimblePros signage with Telerik in the new Hudson office location. You’ll find our office at the corner of Stoney Hill Drive and Darrow Road (SR 91) in Hudson, Ohio. This is the second company Michelle and I have run at this office location and later sold, and it feels good to have the transition mostly behind us. Telerik’s Hudson office…</p><br/></li><li><a href="/common-design-patterns-presentations/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Common Design Patterns Presentations</h2><img src="/static/9afaf23b0e6d2ef2a682930380f7a2ac/0ff54/surface-945444_1280.jpg" alt="Common Design Patterns Presentations" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 May 2012</p><p style="width:100%;margin-top:2rem">This month I presented on Common Design Patterns at two regional events. I’ve given this talk a few times before, and it continues to evolve. The first one was on 4 May at Stir Trek, as a replacement talk for a cancellation. I only had about 24 hours’ notice so I didn’t spend much time updating the talk, and in fact I had to rip out a bunch of stuff that was specific to the last event I gave it at…</p><br/></li><li><a href="/joining-telerik/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Joining Telerik</h2><img src="/static/5371ea85044ba63951a3c0fe37deb185/0ff54/dev-tips.jpg" alt="Joining Telerik" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 April 2012</p><p style="width:100%;margin-top:2rem">Earlier this year, I wrapped up my work with The Code Project and Lake Quincy Media and returned to NimblePros, the consulting company Michelle and I started a few years ago and which she’s run quite successfully the last few years. NimblePros has been doing some great things the last couple of years, with revenues in 2011 doubling those of 2010. At the same time, we’ve been watching Telerik…</p><br/></li><li><a href="/principles-of-product-development-flow-book-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Principles of Product Development Flow Book Review</h2><img src="/static/eef58e2994af8c22edc120f541dc74a6/6050d/economic-batch.png" alt="Principles of Product Development Flow Book Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 April 2012</p><p style="width:100%;margin-top:2rem">One of the more advanced books I’ve read relating to the subjects of Software Development and Lean is The Principles of Product Development Flow: Second Generation Lean Product Development by Donald G. Reinertsen. I recently published a Pluralsight course on Kanban Fundamentals, and as part of my research for that introductory-level course I read a few related titles, including this one. I…</p><br/></li><li><a href="/modifying-and-disabling-hyperlinks-using-jquery/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Modifying and Disabling Hyperlinks using jQuery</h2><img src="/static/1b48364f247ee84d03227c09110add7f/bc29a/jquery.png" alt="Modifying and Disabling Hyperlinks using jQuery" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 April 2012</p><p style="width:100%;margin-top:2rem">I have a simple menu in an ASP.NET MVC application allows a user to take one of several actions after first selecting a resource to work with from a drop down list / select box or textbox. In the case where the user hasn’t yet selected anything (or entered any text), I want the links to be disabled, as I’d rather let the user know the issue on the current dashboard page than have them go to a page…</p><br/></li><li><a href="/new-is-glue/"><h2 class="is-size-2" style="width:100%;word-break:break-word">New is Glue</h2><img src="/static/371d59ecbc2f332193edd7aa779450d7/6a01a/new-glue.png" alt="New is Glue" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 April 2012</p><p style="width:100%;margin-top:2rem">When you’re working in a strongly typed language like C# or Visual Basic, instantiating an object is done with the new keyword. It’s important that we recognize the significance of using this keyword in our code, because I would venture to say that well over 90% of developers don’t give it a second thought. Most developers have, at one time or another, heard the practice of building software…</p><br/></li><li><a href="/beyond-role-based-authorization-in-aspnet-mvc/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Beyond Role Based Authorization in ASPNET MVC</h2><img src="/static/977c30f3ac4ef9b396b03743139846d1/37d5a/asp-mvc_grande.png" alt="Beyond Role Based Authorization in ASPNET MVC" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 April 2012</p><p style="width:100%;margin-top:2rem">A fairly frequent requirement in applications is to check for authorization to perform an action. At the most basic level, this might just involve seeing if the user is authenticated (at all) or checking a flag to see if they are an Admin. However, more complex requirements frequently include a variety of roles, and it’s quite common for the notion of ownership to be involved as well, with some…</p><br/></li><li><a href="/configuring-web-apps-to-behave-like-native-apps-on-ios/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configuring Web Apps To Behave Like Native Apps on iOS</h2><img src="/static/a4b769fd439d0783cb3f7246aef7d060/0ff54/ios.jpg" alt="Configuring Web Apps To Behave Like Native Apps on iOS" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 March 2012</p><p style="width:100%;margin-top:2rem">There are a number of things you can do with your web-based application to have it behave like a native iOS application. One of these I mentioned previously, which is to disable the user’s ability to zoom in and out using pinch gestures. In addition, you can hide the Safari user interface “chrome” so that the user is unaware they’re in a browser. You can also add splash screens and customize the…</p><br/></li><li><a href="/asus-zen-ultrabook-revisited/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Asus Zen Ultrabook Revisited</h2><img src="/static/1e8d7b0a7da86c9b8436585e94e18cd0/0ff54/asus.jpg" alt="Asus Zen Ultrabook Revisited" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 March 2012</p><p style="width:100%;margin-top:2rem">A couple of months ago I got an Asus Zen ultrabook, which I posted about when I first got it, and a month or so later. Now that I’ve had it a while, I thought I’d post one more time with how it’s continued to work for me. I’m still very happy with its look, feel, and speed. It’s very responsive both while up and running and when waking up or shutting down. One thing I wish it came with is an HDMI…</p><br/></li><li><a href="/how-do-i-disable-zoom-in-an-ipad-iphone-mobile-web-app/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How Do I Disable Zoom in an iPad iPhone Mobile Web App?</h2><img src="/static/3a88c49318828c2f2c93961bf57c00a9/0ff54/mobile-app.jpg" alt="How Do I Disable Zoom in an iPad iPhone Mobile Web App?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 March 2012</p><p style="width:100%;margin-top:2rem">If you’re building web-based applications for mobile devices like the iPad/iPhone and you want to mimic native applications’ look and feel and experience, one thing you may want to do is disable the pinch zoom gesture. Most native applications don’t offer support for this, but of course most mobile browsers currently do, so a sure way for users to tell that they’re actually viewing a web page is…</p><br/></li><li><a href="/getting-started-with-single-page-applications-in-asp-net/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Started with Single Page Applications in ASP.NET</h2><img src="/static/390d3d64cb027e45f35239ad3ef71753/5b766/single-page-1.png" alt="Getting Started with Single Page Applications in ASP.NET" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 March 2012</p><p style="width:100%;margin-top:2rem">One of the new features in ASP.NET MVC 4 (Beta) is a new project template for Single Page Applications (SPA). You can download the latest version of MVC4 from http://asp.net/mvc/mvc4. Once you have that installed, get started by creating a new ASP.NET MVC 4 project: You’ll immediately be asked another question about exactly what kind of project you’re looking to create. This is only asked on…</p><br/></li><li><a href="/make-iis-express-the-default-for-vs2010-web-projects/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Make IIS Express the Default for VS2010 Web Projects</h2><img src="/static/0ee0223bec1a40bb9ad5d55be83178ab/5b766/iis_2.png" alt="Make IIS Express the Default for VS2010 Web Projects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 March 2012</p><p style="width:100%;margin-top:2rem">Here’s a quick tip that will help you leave Cassini in the past where it belongs. If you’re using VS2010 SP1, you can configure your IDE so that it will automatically choose IIS Express out of the box for new web sites and projects. There are a lot of good reasons why you should be using IIS Express instead of Cassini / WebDevServer – you can learn more about IIS Express here. Unfortunately…</p><br/></li><li><a href="/how-to-use-system-web-in-a-console-application/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to use System.Web in a Console Application</h2><img src="/static/dd3f4366efba5efede021cef5cc80228/5b766/snaghtml59c784_thumb.png" alt="How to use System.Web in a Console Application" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 March 2012</p><p style="width:100%;margin-top:2rem">I’ve been bitten by this and have seen others run into it enough times that I thought I’d blog about it. Let’s say you’re creating a new Console, WPF, or Windows Forms application in .NET 4. You’re using Visual Studio 2010, and everything is going great until you get to the part where you wanted to make an HTTP request. You know you can do this, you’ve done it before, heck, you might even be…</p><br/></li><li><a href="/kanban-book-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Kanban Book Review</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 March 2012</p><p style="width:100%;margin-top:2rem">While researching material for my Kanban Fundamentals video training course on Pluralsight, I read Kanban: Successful Evolutionary Change for Your Technology Business, by David J. Anderson. I’ve previously reviewed a couple of other related books, including Personal Kanban and Scrumban, if you’re interested in learning more about this topic. I would recommend Personal Kanban as the most…</p><br/></li><li><a href="/personal-kanban-book-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Personal Kanban Book Review</h2><img src="/static/ddedb4b2bd43acbcec4690c2318c6290/34532/personal-kanban.png" alt="Personal Kanban Book Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 March 2012</p><p style="width:100%;margin-top:2rem">Not long ago, while preparing my Kanban Fundamentals video training class for Pluralsight, I read Personal Kanban, by Jim Benson and Tonianne DeMaria Barry. If you’re new to the concept of kanban, this book is a good place to get started (along with my course, which is about 90 minutes long, and shorter if you speed it up). I read the kindle edition of Personal Kanban, even though I don’t own a…</p><br/></li><li><a href="/how-to-give-feedback-on-microsoft-developer-products/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Give Feedback on Microsoft Developer Products</h2><img src="/static/8f42821ba4fd8318dfb972520b1cae96/6050d/microsoft-developer.png" alt="How to Give Feedback on Microsoft Developer Products" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 March 2012</p><p style="width:100%;margin-top:2rem">In the last few years, a number of Microsoft dev teams have started using online tools to manage how the community can offer feedback. If you’re a Microsoft developer, and especially if you’re a web developer, you should know about these tools and offer your feedback through these channels if you’d like Microsoft to respond to your needs. There are several ways you can offer this feedback, and…</p><br/></li><li><a href="/sending-email-from-a-sitefinity-module-with-attachments/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Sending Email from a Sitefinity Module with Attachments</h2><img src="/static/0666f4f098548c08d34108a9f41497e3/0dfe6/newsletter.png" alt="Sending Email from a Sitefinity Module with Attachments" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 February 2012</p><p style="width:100%;margin-top:2rem">A fairly common use case in web applications is the need to send an email, and applications built on top of Telerik Sitefinity are no different. Since modules are simply .NET DLLs, you’re free to write whatever code you like, so it’s certainly possible for you to write a module that sends emails in a way that knows nothing about Sitefinity. However, if you want to interact with Sitefinity, for…</p><br/></li><li><a href="/reviewing-scrumban-the-book/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Reviewing Scrumban the Book</h2><img src="/static/8f42821ba4fd8318dfb972520b1cae96/6050d/microsoft-developer.png" alt="Reviewing Scrumban the Book" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 February 2012</p><p style="width:100%;margin-top:2rem">imageI’ve been reading a bunch of kanban and lean books recently as I work on my Pluralsight course on Introducing Kanban. The most recent one I’ve finished is Scrumban, Essays on Kanban Systems for Lean Software Development, by Corey Ladas (I’m doing the reviews in LIFO order). I made a bunch of notes while reading this book, and it has a great deal of useful information. I read David Anderson’s…</p><br/></li><li><a href="/excel-cumulative-flow-diagram/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Excel Cumulative Flow Diagram</h2><img src="/static/0be064a818c19e870aac03c269501cd4/91749/image_5_excel.png" alt="Excel Cumulative Flow Diagram" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 February 2012</p><p style="width:100%;margin-top:2rem">I’m working on a Kanban Fundamentals course that should go live soon on Pluralsight. One of the topics I’m touching on is Cumulative Flow Diagrams, and how these can be used to analyze flow of a process. Some electronic kanban tools like AgileZen have some built-in support for CFD-style reports, but for instructional purposes it’s nice to be able to create one on-the-fly with whatever data one…</p><br/></li><li><a href="/fixing-floating-rectangles-in-asp-net-stackedbar-chart/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Fixing Floating Rectangles in ASP.NET StackedBar Chart</h2><img src="/static/712c73ab8f0964d03aaea0cf72f5f9a0/5b766/xml-1.png" alt="Fixing Floating Rectangles in ASP.NET StackedBar Chart" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 February 2012</p><p style="width:100%;margin-top:2rem">In working on a client’s reporting system, I ran across some StackedBar charts that were using the System.Web.DataVisualization.Chart control that were having some problems. The biggest one was that the rendered bars had gaps and floating rectangles in it. This turned out to take about an hour to solve, using my best Google-fu, so I’m posting my solution and notes here, in case I run into it again…</p><br/></li><li><a href="/team-workspace-reflections/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Team Workspace Reflections</h2><img src="/static/36d2ae7af7dec132c8f3902cc7f6ee4f/b9902/image_3_workspace.png" alt="Team Workspace Reflections" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 February 2012</p><p style="width:100%;margin-top:2rem">imageWe’ve been fans of team rooms and collaborative work environments at NimblePros for some time. In building out our new building, we took care to create several large open spaces to be used as team rooms, with plenty of room in the middle for workstations (configured for pair programming) and lots of open wall space around the outside for whiteboards and information radiators. You can see one…</p><br/></li><li><a href="/code-review-singleton-pattern-issues/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Code Review Singleton Pattern Issues</h2><img src="/static/6672e4b75a79d74a7af1fa09be0e7bc1/6050d/code-quality.png" alt="Code Review Singleton Pattern Issues" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 February 2012</p><p style="width:100%;margin-top:2rem">One of my applications relies on a singleton pattern to create a single instance of a server which processes requests from many different ASP.NET handlers. It is created using pretty much standard Singleton code: Recently, this server needed to be made aware of whether requests were coming into it via SSL or standard HTTP. The solution that was checked in (and which worked and passes local tests…</p><br/></li><li><a href="/devreach-online-2010-–-software-fundamentals/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DevReach Online 2010 – Software Fundamentals</h2><img src="/static/76eed847760ab7922b66f3be178268bf/67196/dev-reach-1.png" alt="DevReach Online 2010 – Software Fundamentals" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 February 2012</p><p style="width:100%;margin-top:2rem">I just finished my DevReach Online presentation, A Whirlwind Tour of Software Development Fundamentals. In this 45-minute talk, I covered what I consider to be fundamental principles, patterns, and practices of software development, with a little bit of time for a demo at the end. The session was recorded and will be available on the DevReach Online web site soon. You can get my slides and demos…</p><br/></li><li><a href="/learning-to-code-with-the-azure-sdk-–-show-me-the-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Learning To Code with the Azure SDK Ndash Show Me The Code</h2><img src="/static/69eceb12d005877cb91cc2af4543e6c9/6050d/java-script.png" alt="Learning To Code with the Azure SDK Ndash Show Me The Code" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 February 2012</p><p style="width:100%;margin-top:2rem">I’ve been working with Azure off and on since last summer, and like any new API or platform, there are hurdles involved with the learning curve. This is especially true for pre-release software that is rapidly changing and of course has neither official documentation nor much in the way of info on blogs or developer community sites like ASPAlliance.com. One of the ways I like to learn about…</p><br/></li><li><a href="/stories-too-big-–-vertical-slices/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Stories Too Big – Vertical Slices</h2><img src="/static/f55897b6d47808642e69a1b7c3fa6634/7697c/apparchitecture-horizontalstories_thumb.png" alt="Stories Too Big – Vertical Slices" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 February 2012</p><p style="width:100%;margin-top:2rem">I have a client who lists as one of the key challenges with implementing agile practices with their teams as managing to define user stories that are ***valuable but not too big.***This is actually a very common challenge, and one that we run into frequently ourselves at Lake Quincy Media and with other clients of NimblePros. Naturally there are many books available on the subjects of extreme…</p><br/></li><li><a href="/laptop-rebuild-ndash-essential-apps/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Laptop Rebuild - Essential Apps</h2><img src="/static/d6836f2a309a8526afac1522b6fb1c12/0ff54/laptop-rebuild.jpg" alt="Laptop Rebuild - Essential Apps" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 February 2012</p><p style="width:100%;margin-top:2rem">When we last saw our hero, he had fallen victim to an evil plot to disable his computer’s ability to boot up. After great efforts at recovery, eventually he was forced to concede defeat to Vista and reinstall everything from scratch. Let’s return now to see what’s in store in the next chapter of our story, already in progress… So, day 2 after my issue with Vista and I’m now at least able to use my…</p><br/></li><li><a href="/unit-test-or-integration-test-and-why-you-should-care/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Unit Test or Integration Test and Why You Should Care</h2><img src="/static/dbfd4d5b8049059b8df417fa76c19950/4c509/unit-test-or-integration-test-760x360.png" alt="Unit Test or Integration Test and Why You Should Care" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 January 2012</p><p style="width:100%;margin-top:2rem">There remains a fair bit of confusion about what constitutes which kind of test. Many developers are fairly new to testing, and tend to call any tests of their code “unit tests” even when they’re dealing with something substantially larger than a unit. The tools don’t really help much here, since the various test runner frameworks all call themselves unit test frameworks, and the various test…</p><br/></li><li><a href="/run-your-unit-tests-in-parallel-to-maximize-performance/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Run Your Unit Tests in Parallel to Maximize Performance</h2><img src="/static/db74db65986f7127e4cf7f0590d55de6/0dfe6/programmer.png" alt="Run Your Unit Tests in Parallel to Maximize Performance" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 January 2012</p><p style="width:100%;margin-top:2rem">If you’re at all serious about testing, at some point you’re going to have a rather large suite of tests that need to run, and you’ll find that your builds are taking longer than you would like because of how long the tests run. For example, consider this suite of 24 tests, each one of which looks like this one: If you run 24 of these, it’s going to take about 24 seconds, by default: Now of…</p><br/></li><li><a href="/codemash-2012-sessions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeMash 2012 Sessions</h2><img src="/static/88dbb71cf70be49ad48d5cff7e423655/0ff54/software-craftmanship.jpg" alt="CodeMash 2012 Sessions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 January 2012</p><p style="width:100%;margin-top:2rem">Last week I presented two half-day workshops at CodeMash’s PreCompiler on Wednesday (with Brendan Enrick), and a session on ASP.NET MVC 4 on Thursday. CodeMash 2012 was an amazing conference and I’d like to personally thank the organizers as well as the attendees of my own events for making it such a great event. I’ll post a separate write-up with my experiences shortly – for now I just need to…</p><br/></li><li><a href="/silverlight-5/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Silverlight 5</h2><img src="/static/e628628dd6861d61077d8ec695396e45/6050d/silverlight.png" alt="Silverlight 5" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 December 2011</p><p style="width:100%;margin-top:2rem">“The reports of my death have been greatly exaggerated.” – Mark Twain Today, Silverlight 5 is released and available for download! The Release Candidate has been around for some time, and many of us were expecting the release in November. Well, here it is, November 39th, and it’s here! Here are some of the things that are New or Improved in Silverlight 5: Binding Improvements, including…</p><br/></li><li><a href="/getting-started-with-kanban/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Started with Kanban</h2><img src="/static/dffc2e5ee7bcda30d3f8d197b7c1b49a/4e530/getting-started-with-kanban.png" alt="Getting Started with Kanban" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 November 2011</p><p style="width:100%;margin-top:2rem">Kanban can mean a number of things. In Japanese, the literal translation is “signboard,” but it also refers to a system of lean manufacturing, or in fact to a process for eliminating waste from a production system of any kind. In this article, I’ll quickly describe how kanban cards are used, and how the Kanban with a capital K system can be used to improve existing systems. Examples of Kanban If…</p><br/></li><li><a href="/represent-behavior-with-classes-not-flags/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Represent Behavior with Classes not Flags</h2><img src="/static/6358b02d375e54c630c8d2133e4d88be/4e530/represent-behavior-with-classes.png" alt="Represent Behavior with Classes not Flags" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 November 2011</p><p style="width:100%;margin-top:2rem">In any non-trivial software applications, there will be different kinds of behavior attributed to different kinds of objects. For instance, maybe a discount is only applied to some products, but not others. Or a validation rule is applied in most cases, but not for this particular class of item. Perhaps an email-sending application should perform some checks to insure it has certain elements…</p><br/></li><li><a href="/handy-enumerableextensions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Handy EnumerableExtensions</h2><img src="/static/69eceb12d005877cb91cc2af4543e6c9/6050d/java-script.png" alt="Handy EnumerableExtensions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 November 2011</p><p style="width:100%;margin-top:2rem">There’s a great site for finding extension methods, ExtensionMethod.net. I don’t believe either of these came from there, and I’ve not (yet) submitted them there, but here are a couple of extensions on IEnumerable that I’ve found useful recently. ForEach The first one is simply a method that allows you to easily iterate over a sequence and perform an action on it. This is a pretty commonly useful…</p><br/></li><li><a href="/msmq-queue-counts/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Get MSMQ Queue Counts in C#</h2><img src="/static/1e50eadd31fb8c728c1a9262ef756435/4e530/msmq-queue-counts.png" alt="Get MSMQ Queue Counts in C#" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 November 2011</p><p style="width:100%;margin-top:2rem">I’m working with NServiceBus and MSMQ for one of my projects, and I wanted to be able to show a simple dashboard with the numbers of messages in each of the relevant queues for the application. Unfortunately, there isn’t a simple &quot;.Count()” method or property in the built-in System.Messaging namespace for MSMQ queues, so if you want to get the message count there are a few ways to go about it…</p><br/></li><li><a href="/inner-fields-and-lazy-initialization-in-c/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Inner Fields and Lazy Initialization in C#</h2><img src="/static/20521217ebfb06f5ae8b887bf45c946f/4c509/csharp-760x360.png" alt="Inner Fields and Lazy Initialization in C#" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 October 2011</p><p style="width:100%;margin-top:2rem">Using lazy initialization in C#, a class’s state is set up such that each property’s get method performs a check to see if the underlying field is null. If it is, then it calculates or populates the field before returning it. This is a very simple and common approach, but it requires that the class follows a convention of only accessing the field via the property. Unfortunately, there are no…</p><br/></li><li><a href="/razorengine-performance-and-template-caching/"><h2 class="is-size-2" style="width:100%;word-break:break-word">RazorEngine Performance and Template Caching</h2><img src="/static/5592f6f02a7f9d6a266e000dc6c68d9a/0ff54/razor.jpg" alt="RazorEngine Performance and Template Caching" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2011</p><p style="width:100%;margin-top:2rem">I’ve been using RazorEngine on a project and have been impressed with its simplicity and ease-of-use. However, the performance of the application isn’t quite where I need it to be, and I was pretty sure the issue was with how I was using RazorEngine, especially since I could anecdotally see that the processor consumption on the machine running the app was quite high, and looking at the running…</p><br/></li><li><a href="/install-application-as-service-on-windows-server-2008/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Install Application as Service on Windows Server 2008</h2><img src="/static/733bceceb0eda78ec200d0d215d6957e/67015/install-application-as-service.png" alt="Install Application as Service on Windows Server 2008" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 October 2011</p><p style="width:100%;margin-top:2rem">You can use the sc.exe command to install an EXE as a service on Windows Server 2008. There’s a good article on creating an application that can easily run as either a console app or as a service here. From an administrator command prompt, the syntax is something like this: scservernamecreate MyService.ServiceName binpath= d:servicesFooFoo.exe displayname= MyService.ServiceName Note that for this…</p><br/></li><li><a href="/getting-started-webmatrix2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Started with WebMatrix 2</h2><img src="/static/5cd37b88d9399d38cdfcabd523d9c84a/4e530/webmatrix-2.png" alt="Getting Started with WebMatrix 2" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 October 2011</p><p style="width:100%;margin-top:2rem">Note: WebMatrix was discontinued after its final release in 2013. Introduction WebMatrix is a lightweight, easy-to-use tool for creating web applications. In this article, we&#x27;ll look at where to find the latest version and how to get started with using the tool. Installing WebMatrix To get started, you just need to go to http://www.microsoft.com/web/webmatrix/next/ to download the latest version…</p><br/></li><li><a href="/working-with-lazy-loading-in-entity-framework-code-first/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working with Lazy Loading in Entity Framework Code First</h2><img src="/static/9884d41746e624fa7a09b060e9a58acc/0ff54/computer-2157100_1280.jpg" alt="Working with Lazy Loading in Entity Framework Code First" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 October 2011</p><p style="width:100%;margin-top:2rem">Entity Framework 4 has Lazy Loading built-in and enabled by default. Here’s a quick bit of code to show you how to work with this feature. To get started with this, simply create a new Console Application and in nuget (Package Manager Console), run this command: install-package EntityFramework.Sample This will install a simple blog post example. Copy and paste the following into your Program.cs…</p><br/></li><li><a href="/3-tips-to-improve-your-connection-strings/"><h2 class="is-size-2" style="width:100%;word-break:break-word">3 Tips to Improve Your Connection Strings</h2><img src="/static/61b923a6019a9945322a2f096aefbe02/fe506/connection-string-2.png" alt="3 Tips to Improve Your Connection Strings" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 September 2011</p><p style="width:100%;margin-top:2rem">Due to some database moves, I’ve recently been touching a lot of connection strings, which has me thinking about the topic. In fact, I put togethera short surveyon twitter, and invited a bunch of developers and DBAs to share their thoughts, both on twitter and in the survey, on some issues relating to connection strings. Here are three tips you should know about that, if you’re not already using…</p><br/></li><li><a href="/cleveland-2011-software-engineering-101/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cleveland 2011 Software Engineering 101</h2><img src="/static/8f42821ba4fd8318dfb972520b1cae96/6050d/microsoft-developer.png" alt="Cleveland 2011 Software Engineering 101" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 September 2011</p><p style="width:100%;margin-top:2rem">Next Friday, 7 October 2011, Microsoft in Cleveland is hosting a free one-day event focused on the basics of Software Engineering. There are a handful of seats left before the event sells out. You can learn more and RSVP for Software Engineering 101 here (until tickets run out). The event is being held at the Microsoft office here: Microsoft Corporation\ 6050 Oak Tree Blvd Independence, OH 4413…</p><br/></li><li><a href="/speaking-at-devreach-2011/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking at DevReach 2011</h2><img src="/static/4d13cd24718d252e09e6dd589d460d68/96037/dev-reach-logo.png" alt="Speaking at DevReach 2011" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 September 2011</p><p style="width:100%;margin-top:2rem">’m very pleased to be speaking again at DevReach in Sofia, Bulgaria next month. As usual, the conference has an amazing list of speakers (which I’m still somewhat amazed includes me), with Scott Hanselman making the trip out this year to give several sessions. If you have the opportunity to attend, I highly recommend it. There’s certainly no other conference in Eastern Europe that comes close…</p><br/></li><li><a href="/set-jsonrequestbehavior-to-allowget/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Set JsonRequestBehavior to AllowGet</h2><img src="/static/cf564f00fcfcdf46dc10972a4c759cec/0ff54/error-261887_1280.jpg" alt="Set JsonRequestBehavior to AllowGet" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 September 2011</p><p style="width:100%;margin-top:2rem">If you’re working with ASP.NET MVC and JsonResult, you may encounter this error: This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack…</p><br/></li><li><a href="/wiring-up-an-autocompletebox-to-a-json-service-in-silverlight/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Wiring up an AutoCompleteBox to a JSON Service in Silverlight</h2><img src="/static/e628628dd6861d61077d8ec695396e45/6050d/silverlight.png" alt="Wiring up an AutoCompleteBox to a JSON Service in Silverlight" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 September 2011</p><p style="width:100%;margin-top:2rem">I’m currently building an internal application for The Code Project that needs to be able to transfer the contents of some potentially very large files over the wire. After considering various ways to get the data from point A to point B, we decided the easiest thing would be to process the text file on the client, and send batches of rows up to the server for processing. Initially we looked at…</p><br/></li><li><a href="/bidirectional-entity-foreign-key-names-in-ef-code-first/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Bidirectional Entity Foreign Key Names in EF Code First</h2><img src="/static/bbbe2632c2fa4e9cd0b889ed989ac496/0ff54/arrows-1834859_1280.jpg" alt="Bidirectional Entity Foreign Key Names in EF Code First" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 September 2011</p><p style="width:100%;margin-top:2rem">Ran into a small problem today, where I had two classes referring to one another using EF 4.1 Code First. Let’s say I had a class Item and another class ItemHistory. ItemHistory has a property of type Item that refers to the Item class. Item, in turn, has an ICollection Histories property: In my DbContext OnModelCreating() I have some code like this to set the foreign key names according to the…</p><br/></li><li><a href="/winrt-and-the-paradox-of-choice/"><h2 class="is-size-2" style="width:100%;word-break:break-word">WinRT and the Paradox of Choice</h2><img src="/static/fcb2bbdb5cf29b1e77511999c008f552/5d87c/winrt.png" alt="WinRT and the Paradox of Choice" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 September 2011</p><p style="width:100%;margin-top:2rem">In my recent analysis of the Windows 8 / WinRT options for building Metro style Apps, I mentioned the many choices Microsoft is offering for building these applications. While I agree with Microsoft’s decision to support C++, .NET, and HTML5/JS developers when building these applications, it does still represent a Paradox of Choice for many developers, myself included. If we consider only native…</p><br/></li><li><a href="/analyzing-windows-8-and-winrt/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Analyzing Windows 8 and WinRT</h2><img src="/static/fcb2bbdb5cf29b1e77511999c008f552/5d87c/winrt.png" alt="Analyzing Windows 8 and WinRT" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 September 2011</p><p style="width:100%;margin-top:2rem">Last week at BUILD, Microsoft introduced their vision for the next generation of Windows devices with announcements and previews of Windows 8, Metro style applications, and WinRT. The BUILD conference was the most secretive event I’ve ever known Microsoft to hold, with very few leaks prior to the keynotes that began on Tuesday, September 13th. Now that the event has come and gone, you can watch…</p><br/></li><li><a href="/moving-beyond-enums/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Moving Beyond Enums</h2><img src="/static/20521217ebfb06f5ae8b887bf45c946f/4c509/csharp-760x360.png" alt="Moving Beyond Enums" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 August 2011</p><p style="width:100%;margin-top:2rem">I just published an article on ASPAlliance on Moving Beyond Enums, describing when and how to move from enums to classes in your code when you start demanding more from your enums than they were designed to give. Check it out and let me know what you think. I also thought I’d post an alternate LINQ-ified version of the DisplayFriendlyNames() method I used in the article. Original, non-LINQ version…</p><br/></li><li><a href="/working-with-simplemembership-outside-of-asp-net/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working with SimpleMembership outside of ASP.NET</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="Working with SimpleMembership outside of ASP.NET" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 August 2011</p><p style="width:100%;margin-top:2rem">I’m using SimpleMembership, from WebMatrix’s distribution(WebMatrix.WebData), with an ASP.NET MVC 3 application. You can find the NuGet Package for SimpleMembership.Mvc3 here, and installing it is just a matter of running “Install-Package SimpleMembership.Mvc3” from the Package Manager Console in Visual Studio. Unlike the built-in Membership and Role providers for ASP.NET, SimpleMembership doesn’t…</p><br/></li><li><a href="/validating-emails-for-system-net-mail/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Validating Emails for System.Net.Mail</h2><img src="/static/b6703bce61b1a559a5dba27a7ffcb55c/0ff54/email-3597088_1280.jpg" alt="Validating Emails for System.Net.Mail" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 August 2011</p><p style="width:100%;margin-top:2rem">If you’ve worked with the System.Net.Mail API to send out messages, you may have run into the fact that when you add an email address to a message, it will sometimes throw an exception if the email doesn’t appear to be valid: Result: FormatException – The specified string is not in the form required for an e-mail address. This is handy since it’s usually better to fail early rather than wait until…</p><br/></li><li><a href="/installing-visual-studio-load-test-agents-and-controllers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Installing Visual Studio Load Test Agents and Controllers</h2><img src="/static/881d1d9d24580bf40b50703af28e8c01/0ff54/test-13394.jpg" alt="Installing Visual Studio Load Test Agents and Controllers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 July 2011</p><p style="width:100%;margin-top:2rem">Visual Studio includes support for distributed load testing through the use of Test Agents and Controllers. For reference, there are a couple of MSDN Walkthroughs on Installing and Configuring Visual Studio Agents and Test and Build Controllers and Using a Test Controller and Test Agents in a Load Test. However, they lack pretty pictures, so if a screenshot walkthrough is more your speed, read on…</p><br/></li><li><a href="/common-design-patterns-resources/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Common Design Patterns Resources</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="Common Design Patterns Resources" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 July 2011</p><p style="width:100%;margin-top:2rem">Last night I gave a presentation at the Cleveland .NET SIG on Common Design Patterns. The turnout was great, so much so that the group ran out of pizza and chairs, so thanks to everyone for taking the time to come out! Thankfully the A/C held up pretty well (in years’ past, it’s been an issue there), and I hope everybody enjoyed the topic and discussion. I promised that I would post the slides and…</p><br/></li><li><a href="/how-to-find-conference-and-user-group-presenters/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Find Conference and User Group Presenters</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 July 2011</p><p style="width:100%;margin-top:2rem">5451873949_d43dbb8c2dIf you’re a user group leader or event organizer and are looking for quality presenters for your event, here are some resources that should help get you started.  This is not meant to be an all-inclusive or exhaustive list, of course, and to that end I fully expect that there will be great resources left as an exercise for you, the reader, to add via the comments.  Thanks for…</p><br/></li><li><a href="/working-with-value-objects/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working with Value Objects</h2><img src="/static/a6a3866fe4a56b81633ac0d712eabe93/4e530/working-with-value-objects.png" alt="Working with Value Objects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 July 2011</p><p style="width:100%;margin-top:2rem">Introduction A Value Object is an object that has no unique identity, but rather represents a characteristic of something else. For instance, the integer 7 can be used anywhere and always means the same thing - we don&#x27;t think about this or that particular instance of the integer 7. Likewise, a given date like 11 July 2011 (GMT) is the same everywhere - it has no additional identity. In…</p><br/></li><li><a href="/sql-server-sa-password-reset/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How to Reset a SQL Server SA Password</h2><img src="/static/2eeb66cab21ff5feef8dd2b8b43a7188/4e530/reset-sql-sa-password.png" alt="How to Reset a SQL Server SA Password" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 June 2011</p><p style="width:100%;margin-top:2rem">Introduction If you need to reset the SA (system administrator) password on a MS SQL Server database because you&#x27;ve lost or forgotten the old password or you&#x27;ve change your active directory domain, you can do so provided that you can access the server with an account that has local administrator permissions. This article describes the steps required to do so. Step by Step First off, you need to…</p><br/></li><li><a href="/everything-you-need-to-get-started-with-specflow-and-watin/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Everything You Need to Get Started with SpecFlow and WatiN</h2><img src="/static/4bfda696ad895b177897b5ce13b6a07b/0ff54/get-start.jpg" alt="Everything You Need to Get Started with SpecFlow and WatiN" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 June 2011</p><p style="width:100%;margin-top:2rem">I’m adding SpecFlow to an application I’m working on so that I can add some acceptance tests that actually exercise the user interface. I’ve only spent a couple of hours on it thus far, but I have it working with a single specification running through the tests via WatiN. I found the following resources helpful as I was going through this exercise: Getting Started with SpecFlow and ASP.NET BDD…</p><br/></li><li><a href="/dayton-net-user-group-talk-on-anti-patterns-and-worst-practices/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Dayton .NET User Group Talk on Anti-Patterns and Worst Practices</h2><img src="/static/eebf55c9354fa3ce087dfc2bdba92465/0ff54/talk.jpg" alt="Dayton .NET User Group Talk on Anti-Patterns and Worst Practices" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 June 2011</p><p style="width:100%;margin-top:2rem">Last night I spoke at the Dayton .NET User Group on the topic of Anti-Patterns and Worst Practices. It was a pretty good-sized group, albeit rather subdued. You’ll find some of the inspiration for the talk in my Principles, Patterns, and Practices of Mediocre Programming post, and others in the 97 Things Every Programmer Should Know book(or onlinehere). The slides and demos are available for…</p><br/></li><li><a href="/copy-a-table-with-data-in-sql-server/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Copy a Table with data in SQL Server</h2><img src="/static/53f261aef62d142c37e2078f20ca20d6/0ff54/database.jpg" alt="Copy a Table with data in SQL Server" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 June 2011</p><p style="width:100%;margin-top:2rem">Sometimes when you’re about to do some major surgery on your database, you want the comfort of knowing that you can always rollback if there’s a problem. And it’s not always the case that you’ll immediately know there was a problem. Sometimes, you just want a copy of the original data so that you can go back to it, or use it to analyze where you went wrong. Of course, you can backup the whole…</p><br/></li><li><a href="/how-developers-are-using-var-in-c/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How Developers Are Using var in C#</h2><img src="/static/e7b8fcd4ceb430ffc60ed55e5ab98fa5/6ba37/csharp_logo.png" alt="How Developers Are Using var in C#" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 June 2011</p><p style="width:100%;margin-top:2rem">The var keyword was introduced in C# 3.0, and has since gained quite a bit of popularity. There is also a fair bit of contention over how it should be used, with posts like this one (with which I happen to agree) being not uncommon. Over the last week I posted a couple of polls on twitter that asked about specific scenarios in which one might use var, trying to address the two scenarios outlined…</p><br/></li><li><a href="/creating-solid-vs-solution/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Creating a SOLID Visual Studio Solution</h2><img src="/static/f3eae0cb5a39d712f73a90167a3ee70d/4e530/solid-vs-solution.png" alt="Creating a SOLID Visual Studio Solution" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 June 2011</p><p style="width:100%;margin-top:2rem">Introduction The SOLID acronym describes five object-oriented design principles that, when followed, produce code that is cleaner and more maintainable. The last principle, the Dependency Inversion Principle, suggests that details depend upon abstractions. Unfortunately, typical project relationships in .NET applications can make this principle difficult to follow. In this article, I&#x27;ll…</p><br/></li><li><a href="/on-the-usefulness-of-xml-summary-comments-with-poll-results/"><h2 class="is-size-2" style="width:100%;word-break:break-word">On the Usefulness of Xml Summary Comments with Poll Results</h2><img src="/static/0bfd256e3e63445c6c6bbb223f786c0c/6050d/vote.png" alt="On the Usefulness of Xml Summary Comments with Poll Results" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 June 2011</p><p style="width:100%;margin-top:2rem">Last week I hosted a quick poll on Twitter about how useful a particular XML comment was for a particular class. The code looked like this: The poll actually got 355 votes, which is pretty impressive. In hindsight I should have added an option relating to generating documentation, or updated the “necessary evil” option to include documentation as a valid reason for having these, since a large…</p><br/></li><li><a href="/entity-framework-error-–-model-compatibility-cannot-be-checked/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Entity Framework Error – Model compatibility cannot be checked</h2><img src="/static/e2f0998b6c15f649fdcf24a42844178b/47974/sql-server-sql-server-management.png" alt="Entity Framework Error – Model compatibility cannot be checked" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 June 2011</p><p style="width:100%;margin-top:2rem">If you’re using Entity Framework Code First and you have everything working with, for instance, a SQL CE database, but then you want to move to a full SQL Server database, you may encounter this message if you don’t do things in the right order. In my case, what I did was open SQL Management Studio, Create my new database, then popped into Visual Studio, Server Manager, added a connection to it…</p><br/></li><li><a href="/record-visual-studio-web-test-using-fiddler/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Record Visual Studio Web Test Using Fiddler</h2><img src="/static/ecb5c9717be1e454b5d255f1dd7d2144/5b766/record-vs-1.png" alt="Record Visual Studio Web Test Using Fiddler" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 May 2011</p><p style="width:100%;margin-top:2rem">Fiddler is a great tool for examining and working with HTTP requests. If you’re a web developer, it’s one of those tools that you should definitely be at least aware of. The most recent version has some nice new features, like being able to very easily isolate which window or process it’s recording, so you don’t end up with a lot of noise from messengers and other background HTTP requests. The…</p><br/></li><li><a href="/log-method-name-helper/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Log Method Name Helper</h2><img src="/static/64f7e0fdf3d441465c103d572ce67726/6050d/tips.png" alt="Log Method Name Helper" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 May 2011</p><p style="width:100%;margin-top:2rem">Sometimes it’s handy to see the order in which methods are firing, or how long they’re taking, without having to attach a debugger. Typically, you might write some code like this: This of course gets tedious after a while. There are all kinds of things wrong with this approach. It isn’tDRY. It includes magic strings. You’d almost never need it if you were following TDD. Etc. If you really need…</p><br/></li><li><a href="/run-batch-file-as-scheduled-task/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Run Batch File as Scheduled Task</h2><img src="/static/2b968919b004e568e55b64d1edb8d7a2/0ff54/schedule.jpg" alt="Run Batch File as Scheduled Task" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 May 2011</p><p style="width:100%;margin-top:2rem">I’ve had problems running batch files as scheduled tasks. I’m not alone – over the past couple of weeks, while I’ve been trying to get a scheduled job to work on a new server (when it worked fine on the old one), I’ve done a fair bit of searching on this topic. I’ve found long threads on how some folks cannot run batch file as a scheduled task, with suggestions such as using full UNC paths for all…</p><br/></li><li><a href="/the-4-stages-of-learning-design-patterns/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The 4 Stages of Learning Design Patterns</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="The 4 Stages of Learning Design Patterns" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 May 2011</p><p style="width:100%;margin-top:2rem">Design patterns are general, reusable solutions that occur in software design, which can usually be adapted to fit into a number of different situations and applications. Recently, I recorded a screencast interview with Carl Franklin on Commonly Used Design Patterns for dnrTV, and one of the things we discussed was the stages of learning design patterns. I noted that, at least for myself, I’d…</p><br/></li><li><a href="/deploy-test-azure-platform-ready/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Deploy and Test an Azure App with Platform Ready</h2><img src="/static/2d63599e08c230fd18504b6970ebddc4/4e530/azure-app-platform-ready.png" alt="Deploy and Test an Azure App with Platform Ready" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 May 2011</p><p style="width:100%;margin-top:2rem">Introduction Microsoft Platform Ready provides technical and marketing resources for companies building applications for the Microsoft platform. Currently they are working with The Code Project on a promotion that will pay $250 USD to companies for their FIRST Windows Azure Application that is verified compatible using the Microsoft Platform Ready testing tools. The contest is valid only through…</p><br/></li><li><a href="/binding-data-web-performance-tests/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Binding Data to Web Performance Tests</h2><img src="/static/397c7beb22649fd83dface45bb2beadd/4e530/binding-data-performance-tests.png" alt="Binding Data to Web Performance Tests" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 May 2011</p><p style="width:100%;margin-top:2rem">Introduction Visual Studio&#x27;s Web Performance Tests can be used to test whether web pages return the correct results and/or whether they respond quickly enough. You can record these tests manually, but if you have a large number of scenarios you need to test for using the same set of pages, it&#x27;s much more efficient to use the built in data source and data binding tools to do so. This article…</p><br/></li><li><a href="/fixing-maxitemsinobjectgraph-quota-error-in-wcf-service/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Fixing MaxItemsInObjectGraph quota Error in WCF Service</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="Fixing MaxItemsInObjectGraph quota Error in WCF Service" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 April 2011</p><p style="width:100%;margin-top:2rem">I have a WCF Service that occasionally yields a message like this one: Maximum number of items that can be serialized or deserialized in an object graph is ‘65536’. Change the object graph or increase the MaxItemsInObjectGraph quota. Today isn’t the first time I’ve run into this message – I’ve fixed this issue before – but since this is the 2nd or more time I’ve run into it, I thought I’d post a…</p><br/></li><li><a href="/exporting-blog-content-from-community-server/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Exporting Blog Content from Community Server</h2><img src="/static/76226c6abe0cc7c94a99962daa12cfb3/0ff54/wordpress-589121_1280.jpg" alt="Exporting Blog Content from Community Server" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 April 2011</p><p style="width:100%;margin-top:2rem">I have some old blog content scattered around a few different sites, and it’s on my list for the near future to consolidate it as much as possible onto a single blog engine and domain – one blog to rule them all – at least for my own stuff. I wasn’t sure how to get my content out of http://weblogs.asp.net/ but a quick email got me the answer, which I thought I’d share. To export your content from…</p><br/></li><li><a href="/aspnet-mvc3-scaffolding/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET MVC 3 Scaffolding Quick Start</h2><img src="/static/63b1860c0b744cc90b46b7588094ccb7/4e530/mvc-3-scaffolding.png" alt="ASP.NET MVC 3 Scaffolding Quick Start" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 April 2011</p><p style="width:100%;margin-top:2rem">Introduction One of the new features in ASP.NET MVC 3 is its scaffolding feature, which basically lets you very quickly produce data entry controllers and views based on a particular model, even if you don&#x27;t yet have a database in place. This can let you very quickly produce a proof-of-concept, or iterate through some design options, without the need to go through a big process of setting up a…</p><br/></li><li><a href="/optimizing-data-feeds-for-stir-trek/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Optimizing Data Feeds for Stir Trek</h2><img src="/static/a59bd08f9e92d7884fd5880301102350/0ff54/cloud-native.jpg" alt="Optimizing Data Feeds for Stir Trek" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 April 2011</p><p style="width:100%;margin-top:2rem">I wrote a couple of weeks ago about using Visual Studio 2010’s Performance and Load Testing tools to analyze and correct some performance concerns with the Stir Trek Conference web site (which, by the way, is 2 weeks from today!). I realized, though, that there are a bunch of mobile applications that are set up to use the site’s XML and JSON data feeds, and I hadn’t measured or tuned these at all…</p><br/></li><li><a href="/configuring-a-wcf-service-to-run-via-https/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Configuring a WCF Service to Run Via HTTPS</h2><img src="/static/18e6ffa426ef8a19c5a6c2c75fc61451/a84be/blank-color-colorful-209678-760x360.jpg" alt="Configuring a WCF Service to Run Via HTTPS" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 April 2011</p><p style="width:100%;margin-top:2rem">Yesterday I wrote about how to wire up jQuery UI’s AutoComplete add-in to a WCF Service to create an autocomplete search/navigation control. Today I deployed the resulting code to production but initially had some trouble getting things to work. The only real difference between the two environments is that in production everything goes through HTTPS/SSL, so I figured that had to be the culprit. A…</p><br/></li><li><a href="/creating-an-autocomplete-redirect-navigation-control-using-jquery-ui/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Creating an Autocomplete Redirect Navigation Control using jQuery UI</h2><img src="/static/a59bd08f9e92d7884fd5880301102350/0ff54/cloud-native.jpg" alt="Creating an Autocomplete Redirect Navigation Control using jQuery UI" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 April 2011</p><p style="width:100%;margin-top:2rem">On an application I’m working on, there’s was an ASP.NET DropDownList used for jumping to a particular account. This, when enhanced with the AJAX Control Toolkit’s ListSearchExtender, provided an awesome user experience for quickly navigating to a particular account. Just click the control, and either scroll, or better, type in the first few characters of the name of the account, and it was…</p><br/></li><li><a href="/simple-aspnet-report-export-excel/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Creating a Simple ASP.NET Report with Export to Excel</h2><img src="/static/f2ac6959636c297362b4adb9a683e8fd/4e530/aspnet-report-excel.png" alt="Creating a Simple ASP.NET Report with Export to Excel" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 April 2011</p><p style="width:100%;margin-top:2rem">Introduction One of my very first articles was on exporting reports to Excel using Active Server Pages, and this article still gets over a thousand views per month. Today I had to create a quick report for internal use and I thought it would be helpful for the user to be able to quickly export the results to Excel. Thus I found myself, over a decade later, going through much the same process as…</p><br/></li><li><a href="/creating-a-bot-for-the-rock-paper-azure-contest/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Creating a Bot for the Rock Paper Azure Contest</h2><img src="/static/7c1b89c0c392c5b7c983e4b456918f71/05b00/azure-logo.png" alt="Creating a Bot for the Rock Paper Azure Contest" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 April 2011</p><p style="width:100%;margin-top:2rem">The Windows Azure team is holding a contest, and The Code Project is helping to support it. As part of this contest, you can get free Azure compute time by signing up with the code CP001 here. The contest is simple – Rock, Paper, Scissors, with bots, and with 2 new moves: Dynamite, which beats Rock, Paper, or Scissors, and Water Balloon, which beats Dynamite. The catch: you only have a limited…</p><br/></li><li><a href="/create-a-windows-service-in-net-that-can-also-run-as-console-application/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Create a Windows Service in .NET That Can Also Run as Console Application</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="Create a Windows Service in .NET That Can Also Run as Console Application" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 April 2011</p><p style="width:100%;margin-top:2rem">I’m creating a simple windows service using Visual Studio 2010 and .NET 4. I want to be able to easily test it by simply running the resulting exe without the need to install the service. I did some research on this topic and found three helpful articles: HybridService: Easily Switch between Console Application and Service (on CodeProject) Run Windows Service as a console program Creating a…</p><br/></li><li><a href="/installing-asp-net-mvc-3-tools-update/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Installing ASP.NET MVC 3 Tools Update</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="Installing ASP.NET MVC 3 Tools Update" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 April 2011</p><p style="width:100%;margin-top:2rem">Phil Haack has a post introducing the ASP.NET MVC 3 Tools Update that you probably should read. This is my own experience installing the update and upgrading an existing MVC 3 project to use the new tooling. First, you’ll want to install the MVC 3 Tools Update, using one of these options: Web Platform Installer for ASP.NET MVC 3 Tools Update Download Page for ASP.NET MVC 3 Tools Update And then…</p><br/></li><li><a href="/real-world-performance-and-the-stir-trek-web-site/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Real World Performance and the Stir Trek Web Site</h2><img src="/static/b691adb7589bf127c805bdaea867d186/0ff54/digitization-5140055_1280.jpg" alt="Real World Performance and the Stir Trek Web Site" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 April 2011</p><p style="width:100%;margin-top:2rem">I recently joined the board responsible for organizing the Stir Trek conference in Columbus, Ohio. This is a great conference I’ve spoken at the last couple of years that’s held in a movie theater on opening day of a new great movie. The first one, two years ago, was held for the opening day of Star Trek (hence the name), and last year was Iron Man II. This year’s movie is Thor, which looks to be…</p><br/></li><li><a href="/introducing-pair-programming-at-cinci-day-of-agile/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Introducing Pair Programming at Cinci Day Of Agile</h2><img src="/static/1e8d7b0a7da86c9b8436585e94e18cd0/0ff54/asus.jpg" alt="Introducing Pair Programming at Cinci Day Of Agile" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 March 2011</p><p style="width:100%;margin-top:2rem">Last weekend I presented at the Cincinnati Day of Agile event on Introducing Pair Programming (see on slideshare).  The event was nearly sold out with about 240 people in attendance, a mix of devs and PMs.  The content and (other) speakers I thought were great – Phil and his team did a great job.  I took a few pictures during the event, which you can see below: Phil and Joel Semeniuk DSC_001…</p><br/></li><li><a href="/orchard-content-management/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Installing Orchard Content Management System</h2><img src="/static/123f5a1fb745447aa399cba447edb7b0/4e530/orchard-content-management.png" alt="Installing Orchard Content Management System" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 March 2011</p><p style="width:100%;margin-top:2rem">Introduction Orchard is a free, open source, community-focused content management system built on the ASP.NET platform. It uses ASP.NET MVC 3, the Razor view engine, and is an Outercurve Foundation project. In this article, we&#x27;ll look at how to get started with Orchard 1.0 by installing it. Installing Orchard There are a few different ways you can install Orchard. Probably the simplest if you…</p><br/></li><li><a href="/how-to-fix-visual-studio-file-templates/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How To Fix Visual Studio File Templates</h2><img src="/static/fa3829709d039ed7a35db83e317d18bc/6050d/fix.png" alt="How To Fix Visual Studio File Templates" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 March 2011</p><p style="width:100%;margin-top:2rem">When you create a new project in Visual Studio, it will usually include some files as part of the project. Most of the time, these are pretty useless, but if it’s your first time working with said template, they may help you get going. In VS2010, the Test Project, for example, has been improved over prior versions by eliminating a useless text file describing tests and a useless Manual Test file…</p><br/></li><li><a href="/handling-errors-mvc/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Handling Errors with ASP.NET MVC</h2><img src="/static/c81a302fa3322deec11cd504cc37e6e1/4e530/handling-errors-mvc.png" alt="Handling Errors with ASP.NET MVC" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 March 2011</p><p style="width:100%;margin-top:2rem">Introduction Nobody likes to talk about it, but sometimes your web application is going to fail. When it does, you want to make sure your users still get the best possible experience, and ideally that you as the developer get what you need to fix the problem. In this article, you&#x27;ll learn how to configure error handling in your ASP.NET MVC 3 applications. In the beginning... When you first…</p><br/></li><li><a href="/visual-studio-2010-unlimited-load-test-virtual-users/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Studio 2010 Unlimited Load Test Virtual Users</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="Visual Studio 2010 Unlimited Load Test Virtual Users" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 March 2011</p><p style="width:100%;margin-top:2rem">You may have heard the recent announcement that Visual Studio 2010 Ultimate and MSDN subscribers now have access to the Visual Studio 2010 Load Test Feature Pack, which enables load testing of applications with unlimited virtual users. Unfortunately, it’s not entirely clear at first, at least to me, how to get this to work if you’ve simply installed VS2010 Ultimate and now want to take advantage…</p><br/></li><li><a href="/code-analysis-atomiq/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Code Analysis Using Atomiq</h2><img src="/static/e247ac75856d5364c9ab880d47f9277f/4e530/atomiq.png" alt="Code Analysis Using Atomiq" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 March 2011</p><p style="width:100%;margin-top:2rem">Introduction Atomiq is a code analysis tool that quickly locates duplicate code within software applications by analyzing the source code. It works at the source, not binary, level, and so can be applied to applications written in a variety of languages. Although it doesn&#x27;t support auto-correction or refactoring within the application, it can quickly locate problems which can then be addressed…</p><br/></li><li><a href="/complex-technical-demos-using-local-source-control/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Complex Technical Demos Using Local Source Control</h2><img src="/static/2060ee2bc734a9270300d98e96fd0e54/4c509/computer-311339_1280-760x360.png" alt="Complex Technical Demos Using Local Source Control" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 March 2011</p><p style="width:100%;margin-top:2rem">Last summer at the Software Engineering 101 event put on by NimblePros in Cleveland, I saw Kevin Kuebler do a demo using git or Mercurial to iterate from phase of the project he was building to the next. It worked amazingly well and I thought I would document how to set this up yourself, so that when you’re giving a technical presentation that involves a somewhat complex set of changes to a…</p><br/></li><li><a href="/avoid-collections-as-properties/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Exposing Collections Directly as Properties</h2><img src="/static/939dc30767b102ced84c1f46db369c47/4e530/avoid-collections-as-properties.png" alt="Avoid Exposing Collections Directly as Properties" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 February 2011</p><p style="width:100%;margin-top:2rem">Introduction Sometimes your domain objects have one-to-many or many-to-many relationships with other objects. For instance, your Customers might have collections of Orders associated with them. The simplest way to model this is to expose a field or property off of your Customer class. Unfortunately, this has a number of negative consequences because of how it breaks encapsulation. Fortunately…</p><br/></li><li><a href="/asp-net-tips-and-tricks-on-dnrtv/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Tips and Tricks on dnrTV</h2><img src="/static/64f7e0fdf3d441465c103d572ce67726/6050d/tips.png" alt="ASP.NET Tips and Tricks on dnrTV" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 February 2011</p><p style="width:100%;margin-top:2rem">I recently did a show with Carl Franklin on ASP.NET Tips and Tricks, recorded for dnrTV.com. In it, I go through a bunch of ASP.NET tips, from the oldies but goodies like Tracing and Caching, to some new ones like optimizing the performance of your ASP.NET MVC 3 applications. The samples from the presentation are available for download here.</p><br/></li><li><a href="/what-are-you-working-on-what-test-are-you-trying-to-make-pass/"><h2 class="is-size-2" style="width:100%;word-break:break-word">What are you working on? (What Test Are You Trying To Make Pass)</h2><img src="/static/881d1d9d24580bf40b50703af28e8c01/0ff54/test-13394.jpg" alt="What are you working on? (What Test Are You Trying To Make Pass)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 February 2011</p><p style="width:100%;margin-top:2rem">If you ask a newly-hired developer this question while they are busy coding away on something, you’ll usually get an answer like “the Acme project.” If that’s too obvious (after all, maybe that’s the only project this dev works on), then the answer might be “the new xyz feature” or “that abc bug.” All of these are more-or-less valid responses, and depending on the scope of the response, they might…</p><br/></li><li><a href="/building-a-cachedrepository-via-strategy-pattern/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Building a CachedRepository via Strategy Pattern</h2><img src="/static/18e6ffa426ef8a19c5a6c2c75fc61451/a84be/blank-color-colorful-209678-760x360.jpg" alt="Building a CachedRepository via Strategy Pattern" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 February 2011</p><p style="width:100%;margin-top:2rem">In part one of this series, I introduced the CachedRepository pattern, and demonstrated how it can be applied through the use of simple inheritance to an existing Repository class. This allows us to easily configure whether or not we want to use caching at the repository level through the use of an IOC Container like StructureMap. However, using inheritance to achieve the behavior isn’t always…</p><br/></li><li><a href="/introducing-the-cachedrepository-pattern/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Introducing the CachedRepository Pattern</h2><img src="/static/012864b5ce5b6414d848ed05eb4dab4a/7da39/steve-desktop.png" alt="Introducing the CachedRepository Pattern" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 February 2011</p><p style="width:100%;margin-top:2rem">UPDATE (Nov 2021): Read the article below for background/theory, but for a more modern implementation (with GitHub source) see Building a CachedRepository in ASP.NET Core In this first part of a series on adding support for caching to the Repository Pattern, I’d like to show how to very simply control whether or not caching is performed on a per-repository basis through the use of an Inversion of…</p><br/></li><li><a href="/improving-asp-net-mvc-application-performance-at-mvcconf/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Improving ASP.NET MVC Application Performance at MVCConf</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="Improving ASP.NET MVC Application Performance at MVCConf" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 February 2011</p><p style="width:100%;margin-top:2rem">Yesterday I gave a presentation to a little over 300 attendees of MVCConf on Improving ASP.NET MVC Application Performance. There were some great responses on twitter and generally the ratings on SpeakerRate were positive, which was great because I was a bit worried going into the presentation, since I’d only committed to giving a talk at the conference a few day earlier. I’m uploading the…</p><br/></li><li><a href="/list-services-running-on-remote-servers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">List Services Running on Remote Servers</h2><img src="/static/071081e4ca39be0206cdb552e5a0f527/0ff54/network-2402637_1280.jpg" alt="List Services Running on Remote Servers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 February 2011</p><p style="width:100%;margin-top:2rem">As I wrote earlier, Lake Quincy Media’s AdSignia ad platform is utilizing services and a message-based architecture to decouple the system from the database and improve performance and reliability of the servers. It’s proven useful to quickly work with the services across multiple nodes in the web cluster, and PowerShell is the obvious choice for automating some of these tasks. When building up a…</p><br/></li><li><a href="/starting-and-stopping-services-on-remote-servers-using-powershell/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Starting and Stopping Services on Remote Servers using PowerShell</h2><img src="/static/4bfda696ad895b177897b5ce13b6a07b/0ff54/get-start.jpg" alt="Starting and Stopping Services on Remote Servers using PowerShell" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 February 2011</p><p style="width:100%;margin-top:2rem">This wraps up my mini-series on using PowerShell to help manage services running on multiple remote servers. In my case, these scripts exist to make it easy for me to globally start and stop services on a number of web servers that are part of Lake Quincy Media’s AdSignia ad platform – you can read more about the message-based architecture we’re using here. I learned the basics of starting and…</p><br/></li><li><a href="/pass-results-from-one-powershell-script-to-another/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Pass Results from One PowerShell Script To Another</h2><img src="/static/6672e4b75a79d74a7af1fa09be0e7bc1/6050d/code-quality.png" alt="Pass Results from One PowerShell Script To Another" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 February 2011</p><p style="width:100%;margin-top:2rem">If you’re using PowerShell but want to keep your scripts DRY, you may want to factor common functions into their own scripts, and then call these scripts from multiple other scripts. This is pretty easy to do. For instance, if you have an array of values that you want to use as inputs for several scripts, you could create a file like this one: Colors.ps1 Now, to use this in another PowerShell…</p><br/></li><li><a href="/message-based-architecture-goodness/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Message-Based Architecture Goodness</h2><img src="/static/53f261aef62d142c37e2078f20ca20d6/0ff54/database.jpg" alt="Message-Based Architecture Goodness" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 February 2011</p><p style="width:100%;margin-top:2rem">Recently at Lake Quincy Media we upgraded our logging system for the AdSignia ad platform so that it uses messaging rather than direct SQL database access. This allows us to log much more detailed data, which we can then analyze, and also improves the performance of every ad request, since it eliminates a database call and replaces it with a local queue operation, which is much faster and less…</p><br/></li><li><a href="/msbuild-invalid-character-in-connection-string-with-dbproj/"><h2 class="is-size-2" style="width:100%;word-break:break-word">MSBuild Invalid Character in Connection String with dbproj</h2><img src="/static/a59bd08f9e92d7884fd5880301102350/0ff54/cloud-native.jpg" alt="MSBuild Invalid Character in Connection String with dbproj" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 February 2011</p><p style="width:100%;margin-top:2rem">If you get this error: error MSB5016: The name “Intitial Catalog” contains an invalid character “ “. or something similar when trying to specify a connection string within an MSBuild task, like this one: The issue is with the semicolons in the querystring. If you replace them with %3B then the error goes away: Hope this helps! You can also escape the spaces with but I don’t believe that’s required…</p><br/></li><li><a href="/670/"><h2 class="is-size-2" style="width:100%;word-break:break-word">If Writing An Object That Is IDisposable, Dont Fail During Construction</h2><img src="/static/69eceb12d005877cb91cc2af4543e6c9/6050d/java-script.png" alt="If Writing An Object That Is IDisposable, Dont Fail During Construction" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 February 2011</p><p style="width:100%;margin-top:2rem">There’s a great pattern for ensuring that unmanaged resources are cleaned up in the .NET world. It’s called the Disposable pattern and it applies to any resource that implements the IDisposable interface. If you are writing an object that directly deals with unmanaged resources, such as files, database connections, network sockets, fonts, etc., then you are well advised to implement IDisposable…</p><br/></li><li><a href="/getting-next-month-in-msbuild/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Next Month in MSBuild</h2><img src="/static/a59bd08f9e92d7884fd5880301102350/0ff54/cloud-native.jpg" alt="Getting Next Month in MSBuild" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2011</p><p style="width:100%;margin-top:2rem">I’m working on an application that needs to deploy a new database each month, in order to manage the large amount of data involved. We’d like to automate this as much as possible, and since we already have the database schema in a Visual Studio 2010 database project, we figured the simplest thing would be to create an MSBuild task to do this, and then schedule it as part of our build server. The…</p><br/></li><li><a href="/viewbag-does-not-exist-in-current-context/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ViewBag does not exist in current context</h2><img src="/static/cf564f00fcfcdf46dc10972a4c759cec/0ff54/error-261887_1280.jpg" alt="ViewBag does not exist in current context" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 January 2011</p><p style="width:100%;margin-top:2rem">If you’re working with the ASP.NET MVC 3 MvcMusicStore demo and you run into the error message: The name ‘ViewBag’ does not exist in the current context It’s probably a sign that you are running on an older version of ASP.NET MVC (or a pre-release of MVC 3). You can download the latest version of ASP.NET MVC 3 here. This will install the Web Platform Installer (version 3) and will install ASP.NET…</p><br/></li><li><a href="/database-cannot-be-opened-–-version-655/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Database cannot be opened – version 655</h2><img src="/static/480d8cf7f491267e7c3cba4f4d32c7c0/0ff54/error.jpg" alt="Database cannot be opened – version 655" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 January 2011</p><p style="width:100%;margin-top:2rem">I’m working with the new MvcMusicStore sample application, and immediately I’m having trouble with the database. When I try and open the .mdf file that’s in my App_Data, I’m presented with this error message: The database ‘C:DEVSCRATCHMVCMUSICSTORE-V2.0MVCMUSICSTORE-COMPLETEDMVCMUSICSTOREAPP_DATAMVCMUSICSTORE.MDF’ cannot be opened because it is version 655. This server supports version 612 and…</p><br/></li><li><a href="/entity-framework-invalid-object-name-dbo-albums/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Entity Framework Invalid Object Name dbo.Albums</h2><img src="/static/6248d5fb2ec55bcf2c319694a714cc39/0ff54/music-store.jpg" alt="Entity Framework Invalid Object Name dbo.Albums" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 January 2011</p><p style="width:100%;margin-top:2rem">Continuing in working with the MVC Music Store sample application, the next thing I ran into after installing the SQL database by hand, was an error on the home page saying: Invalid object name ‘dbo.Albums’. **Description:**An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in…</p><br/></li><li><a href="/creating-a-where-not-exists-or-where-not-in-query-using-llblgen/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Creating a WHERE NOT EXISTS or WHERE NOT IN Query Using LLBLGen</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Creating a WHERE NOT EXISTS or WHERE NOT IN Query Using LLBLGen" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 January 2011</p><p style="width:100%;margin-top:2rem">Consider a scenario where you have a many-to-many relationship, but it’s nullable. For instance, maybe you have Articles and Categories (or Tags), and an Article can have 0 to N Categories/Tags. Now, you want to pull in a set of Articles that are uncategorized. Using SQL, you might write a query like this: If you needed to do this using LLBLGen, and you didn’t know a better way, you could achieve…</p><br/></li><li><a href="/lessons-learned-performing-harry-potter-book-kata/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Lessons Learned Performing Harry Potter Book Kata</h2><img src="/static/a6895bc47acc7c3608f95b068506310a/6050d/code-geek-2680204_1280.png" alt="Lessons Learned Performing Harry Potter Book Kata" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 January 2011</p><p style="width:100%;margin-top:2rem">Last week at CodeMash I went through the Harry Potter Book Kata with Steve (@underwhelmed). This is an interesting kata because it pretty much starts out very straightforward and things progress very quickly, and then you are faced with a brick wall in terms of how to proceed with the algorithm. I recommend you give the exercise a try yourself before reading my tips, since they may be something of…</p><br/></li><li><a href="/how-do-i-change-where-msmq-messages-are-stored-or-persisted/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How do I Change Where MSMQ Messages are Stored or Persisted?</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="How do I Change Where MSMQ Messages are Stored or Persisted?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 January 2011</p><p style="width:100%;margin-top:2rem">If you are using MSMQ, either directly or with the help of a package like NServiceBus, you may encounter errors if your server becomes overloaded with messages either due to high load or as a result of a failure in your message handling process. If this happens, you may see exceptions like this one (ask me how I know this…): The Insufficient resources to perform operation MessageQueueException…</p><br/></li><li><a href="/command-query-responsibility-separation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Introducing Command Query Responsibility Separation (CQRS)</h2><img src="/static/eb83eee933e7067b644de019d19546bc/4e530/cqrs.png" alt="Introducing Command Query Responsibility Separation (CQRS)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 January 2011</p><p style="width:100%;margin-top:2rem">Introduction The Command Query Responsibility Separation (CQRS) pattern is an enterprise pattern that can be used to increase the performance, scalability, and reliability of distributed applications that may experience heavy load. It is especially effective in situations where an immediate response is not required, or often even expected, by the user, or to offload processing that need not occur…</p><br/></li><li><a href="/unit-test-naming-convention/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Unit Test Naming Convention</h2><img src="/static/c44f7d411ab589b5f84ca0aba8a70805/a1066/naming-1.png" alt="Unit Test Naming Convention" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 January 2011</p><p style="width:100%;margin-top:2rem">I’ve been writing tests and unit tests for quite a while, and naturally my personal preference for naming them has evolved somewhat with time. Initially, I didn’t really know what I was doing and the default organization tended to be something like “given a class, Customer, all of the tests will go into a class called CustomerTests.” This turned out, for me at least, to be less than ideal. Later I…</p><br/></li><li><a href="/type-was-not-registered-in-the-serializer-exception-with-nservicebus/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Type was not registered in the serializer exception with NServiceBus</h2><img src="/static/c9fa216a0fe63bbedcd1e7e72fa75fcf/0ff54/bus-2523410_1280.jpg" alt="Type was not registered in the serializer exception with NServiceBus" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 January 2011</p><p style="width:100%;margin-top:2rem">If you encounter this error in your ASP.NET application after updating it while using NServiceBus: Server Error in ‘/’ Application. Type DataPump.Infrastructure.Messages.MyMessage was not registered in the serializer. Check that it appears in the list of configured assemblies/types to scan. Description: An unhandled exception occurred during the execution of the current web request. Please review…</p><br/></li><li><a href="/attempt-was-made-to-load-an-assembly-from-a-network-location/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Attempt was made to load an assembly from a network location</h2><img src="/static/2060ee2bc734a9270300d98e96fd0e54/4c509/computer-311339_1280-760x360.png" alt="Attempt was made to load an assembly from a network location" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 January 2011</p><p style="width:100%;margin-top:2rem">If you see this bug while running an application that is referencing some third-party DLLs that you recently downloaded, your first thought should be “I need to Unblock the assembly I’m referencing!” …an attempt was made to load an assembly from a network location… Windows, while trying to be helpful, will block downloaded files, causing .NET to fail when trying to load such DLLs. The best way to…</p><br/></li><li><a href="/abstract-to-privileges-not-roles/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Abstract to Privileges rather than to Roles in ASP.NET Applications</h2><img src="/static/d9b32301b083af15660523e6da6d983e/4e530/privileges-not-roles.png" alt="Abstract to Privileges rather than to Roles in ASP.NET Applications" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 December 2010</p><p style="width:100%;margin-top:2rem">The Problem If you&#x27;ve written much ASP.NET code since 2005, you&#x27;ve probably used the built-in role provider, or rolled your own, and written code that checks whether the current user belongs to a particular role. For instance, for an article site like ASPAlliance.com, you might choose to show an Edit link to editors with some code like this: Of course, it might also be true that authors should be…</p><br/></li><li><a href="/singleton-pattern/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Singleton Pattern</h2><img src="/static/9afaf23b0e6d2ef2a682930380f7a2ac/0ff54/surface-945444_1280.jpg" alt="Singleton Pattern" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 December 2010</p><p style="width:100%;margin-top:2rem">I recently published an article on Alternatives to the Singleton Design Pattern on AspAlliance.com. If you’re a fan of the Singleton pattern, I would encourage you to have a read and feel free to comment (here or there) if you agree or disagree with my position. You can also learn more about the Singleton in the Patterns Library at Pluralsight. Finally, if you haven’t read it, I definitely…</p><br/></li><li><a href="/134/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Get the Batch Files Path in a Batch File</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 December 2010</p><p style="width:100%;margin-top:2rem">I’m a huge fan of build automation, and all of my dev projects include scripts to build, test, deploy, run etc.  Sometimes these use PowerShell and quite often they use MSBuild (or occasionally NAnt) but batch files remain a very simple and powerful way to take care of automation business.  Today I’m trying to wrap up my use of NServiceBus on a project that’s going live with some CQRS goodness…</p><br/></li><li><a href="/alternatives-to-singleton/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Alternatives to the Singleton Design Pattern</h2><img src="/static/247557f9deb122e51c2c6fb2901706bf/4e530/alternatives-to-singleton.png" alt="Alternatives to the Singleton Design Pattern" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 November 2010</p><p style="width:100%;margin-top:2rem">Introduction The Singleton Design Pattern is one of the simplest design patterns in software development, yet one of the easiest to misuse as well. In this article, we&#x27;ll examine some alternatives to the Singleton pattern in its most naïve implementation, as well as consider an alternative to making classes themselves responsible for managing their instances. The Singleton Pattern The Singleton…</p><br/></li><li><a href="/9-ways-contract-lawyers-are-like-software-developers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">9 Ways Contract Lawyers are Like Software Developers</h2><img src="/static/865028acae9d5dd98b98e30562ef55db/4c509/9-ways-contract-lawyers-are-like-software-developers-760x360.png" alt="9 Ways Contract Lawyers are Like Software Developers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 November 2010</p><p style="width:100%;margin-top:2rem">Lawyers. We love to hate them. But they’ve been writing code since long before Ada Lovelace wrote the first computer program. Here are 9 ways that Contract Lawyers are like Software Developers. Reason One: They Use a Language That Barely Resembles English Let’s face it, most attorneys writing contracts use language that one would be hard-pressed to find used anywhere on the planet in the last 10…</p><br/></li><li><a href="/software-craftsmanship-2011-calendar/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Software Craftsmanship 2011 Calendar</h2><img src="/static/ef653a7b222734d9f391fe7c27a49b98/0ff54/calendar-1990453_1280.jpg" alt="Software Craftsmanship 2011 Calendar" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 November 2010</p><p style="width:100%;margin-top:2rem">The folks at NimblePros have put together a pretty sweet 2011 calendar showcasing principles of software craftsmanship and agile software development. The calendars are arriving from the printer today and should start shipping out over the next week or so to those who have pre-ordered them (or won them in the twitter contest, which lasts until 8 December 2010). Here’s my review of the calendar…</p><br/></li><li><a href="/zen-and-the-art-of-software-craftsmanship/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Zen and the Art of Software Craftsmanship</h2><img src="/static/9993bf94b0d410edfac0416e19c84c3f/0ff54/book-4600757_1280.jpg" alt="Zen and the Art of Software Craftsmanship" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 November 2010</p><p style="width:100%;margin-top:2rem">Not long ago, I (finally) read Zen and the Art of Motorcycle Maintenance, which I’d had recommended to me since I was a teenager. It’s a very interesting book and one I would certainly recommend to anyone, but especially to anyone with an interest in quality. Quality is one of the recurring themes of the book, and there are a number of sections of the book that resonate with me as a software…</p><br/></li><li><a href="/verify-a-list-of-urls-in-c-asynchronously/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Verify a List of URLs in C# Asynchronously</h2><img src="/static/5c3aca94b6d4188596a7aaae503cd8a9/0ff54/web-address.jpg" alt="Verify a List of URLs in C# Asynchronously" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 November 2010</p><p style="width:100%;margin-top:2rem">Recently I wanted to test a bunch of URLs to see whether they were broken/valid. In my scenario, I was checking on URLs for advertisements that are served by Lake Quincy Media’s ad server (LQM is the largest Microsoft developer focused advertising network/agency). However, this kind of thing is an extremely common task that should be very easy for any web developer or even just website…</p><br/></li><li><a href="/on-software-quality-at-cleveland-net-sig/"><h2 class="is-size-2" style="width:100%;word-break:break-word">On Software Quality at Cleveland .NET SIG</h2><img src="/static/6672e4b75a79d74a7af1fa09be0e7bc1/6050d/code-quality.png" alt="On Software Quality at Cleveland .NET SIG" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 November 2010</p><p style="width:100%;margin-top:2rem">Last night I led a discussion on software quality at the Cleveland area .NET SIG. Thanks to everyone who came and especially to those of you who shared your thoughts and opinions. I enjoyed the discussion and I hope you did as well. This was the first time I’ve done such a talk at this style of group, which typically just has a speaker lecturing for 90 minutes or so, and I thought it went well but…</p><br/></li><li><a href="/time-spent-green/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Time Spent Green</h2><img src="/static/88c20428d727d8c97624e8dfbadfe8d8/6050d/run-and-build.png" alt="Time Spent Green" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 October 2010</p><p style="width:100%;margin-top:2rem">I’ve been a fan of continuous integration for what seems like forever. It’s an amazing way to boost the quality of your code and ensure that what gets checked into your repository is working code. It also does a great job of eliminating the “it works on my machine” syndrome that is so common without such a tool. If nothing else, having a separate machine run your build directly from what’s in…</p><br/></li><li><a href="/use-interfaces-for-metadata-and-comments/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Use Interfaces for Metadata and Comments</h2><img src="/static/f0cd17a55c9defa4cfcf252f4bd918ce/0ff54/user-interface.jpg" alt="Use Interfaces for Metadata and Comments" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2010</p><p style="width:100%;margin-top:2rem">If you’re using XML Comments for intellisense purposes, or are making heavy use of attribute-based metadata in your classes, you’ve likely found that these have a tendency to bloat your code and make it more difficult to follow. For example, consider this simple configuration section handler: This is an example of a custom configuration section handler which I’ve written about previously. I highly…</p><br/></li><li><a href="/devreach-2010/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DevReach 2010</h2><img src="/static/d0dc8b494048d8e53e62af76741204d9/6f6c6/trip2.jpg" alt="DevReach 2010" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 October 2010</p><p style="width:100%;margin-top:2rem">This past week I had the good fortune of traveling to Sofia, Bulgaria to speak at DevReach for the second time (the first was 2 years ago in 2008). This is a great conference and was held for the second year in a row at a movie theater, which worked very well (similar to StirTrek in Ohio each year). The event included a great list of speakers, including Scott Stanfield, Beth Massie, Andrew Brust…</p><br/></li><li><a href="/sql-table-cleanup-job/"><h2 class="is-size-2" style="width:100%;word-break:break-word">SQL Table Cleanup Job</h2><img src="/static/e2f0998b6c15f649fdcf24a42844178b/47974/sql-server-sql-server-management.png" alt="SQL Table Cleanup Job" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 October 2010</p><p style="width:100%;margin-top:2rem">It’s pretty straightforward to create a job in SQL Server that will clean up a table. For instance, for AspAlliance.com I use ELMAH to record errors, and it’s set up to go to a database table (called ELMAH_Error – see image at right). While doing some maintenance, I noticed that this table had several months’ worth of data in it and over 400k records (many of which were simply 404s). This was…</p><br/></li><li><a href="/the-check_policy-and-check_expiration-options-cannot-be-turned-off-when-must_change-is-on/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON</h2><img src="/static/e2f0998b6c15f649fdcf24a42844178b/47974/sql-server-sql-server-management.png" alt="The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 October 2010</p><p style="width:100%;margin-top:2rem">In addition to the dreaded SQL Server Error: User Group or Role Already Exists in the Current Database error, you may also get this error when creating new logins after a database move: Alter failed for login ‘somelogin’. An exception occurred while executing a Transact-SQL statement or batch. The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON. (Microsoft SQL…</p><br/></li><li><a href="/linq-range-variable-problem/"><h2 class="is-size-2" style="width:100%;word-break:break-word">LINQ Range Variable Problem</h2><img src="/static/860f09a6f174e72bde5a733ca23b1926/4c509/vscode-760x360.png" alt="LINQ Range Variable Problem" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 October 2010</p><p style="width:100%;margin-top:2rem">Ran into this issue last night and just figured it out. I have this code for a demo: Now, in Visual Studio, it looks like this: image Hovering over freightSummary in the above LINQ query would reveal just (range variable) ? freightSummary image A bunch of searching later didn’t much help, although this thread did put me on the right track just a moment ago. The trick, it turns out, is that I didn…</p><br/></li><li><a href="/build-automation-for-your-application-using-msbuild/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Build Automation for your Application using MSBuild</h2><img src="/static/dfedabef6d3c3e49f0f27315466efcb5/5b766/build-automation-2.png" alt="Build Automation for your Application using MSBuild" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 September 2010</p><p style="width:100%;margin-top:2rem">Over the past few years, I’ve established something of a standard for how I like to organize my projects, and this includes having a one-click build-and-test script for each project. This is a quick description of my current thoughts on this, along with some details of how to get the MSBuild scripts working for your project as well. The ultimate goal is that you, a new developer who just pulled…</p><br/></li><li><a href="/the-check-in-dance/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The Check In Dance</h2><img src="/static/c19199fbf2ffe959065b99329cb6ed8b/0ff54/shared.jpg" alt="The Check In Dance" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 September 2010</p><p style="width:100%;margin-top:2rem">When developing software and working with a build or integration server, there are certain conventions that one should follow when making updates to the shared codebase. Somewhere I picked up the term “the check in dance” (not to be confused with “the chicken dance”) for this process, which is very straightforward and, if followed, can ensure that build failures on the continuous integration (CI…</p><br/></li><li><a href="/real-world-monitoring-and-tuning-asp-net-caching-part-2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Real World Monitoring and Tuning ASP.NET Caching Part 2</h2><img src="/static/8039560c0df89e4b36ff6ab9105aa695/8af9c/snaghtml1977d944_1.png" alt="Real World Monitoring and Tuning ASP.NET Caching Part 2" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 September 2010</p><p style="width:100%;margin-top:2rem">In Real World Monitoring and Tuning ASP.NET Caching Part 1, I showed the behavior of a certain ASP.NET application under load. We resolved the issue today, which turned out to be a result of two related issues that, thankfully in our case, were limited to a single class in our application that was responsible for interacting with our cache. Here’s the old behavior: The new version of the same…</p><br/></li><li><a href="/how-do-i-save-performance-counters-in-windows-server-2008-or-windows-7/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How Do I Save Performance Counters in Windows Server 2008 or Windows 7</h2><img src="/static/ab11059aee03beeb6d7d383e91cb5fb8/0ff54/counter.jpg" alt="How Do I Save Performance Counters in Windows Server 2008 or Windows 7" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 September 2010</p><p style="width:100%;margin-top:2rem">If you’re writing multi-user applications like just about any ASP.NET application, it’s probably worth your time to get familiar with performance counters. Performance Monitor, or perfmon for short, is the tool you use to view these counters on your computer or server. You can add it to an MMC instance (run MMC and add the performance snap-in) or you can just run perfmon. (Sidenote – I once got…</p><br/></li><li><a href="/asp-net-custom-errors-security-flaw/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Custom Errors Security Flaw</h2><img src="/static/27f22c718c2156605ccdc5d58437bc54/a84be/security.jpg" alt="ASP.NET Custom Errors Security Flaw" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 September 2010</p><p style="width:100%;margin-top:2rem">Updated 5 October 2010: There is now a patch available via Windows Update. Read more about it here, and ensure all ASP.NET web servers have been patched ASAP. Microsoft just released some details on a security flaw that was publicized a few hours ago. On this post, you can learn more about the ASP.NET vulnerability and how to detect whether your web sites might be affected by them. This is a…</p><br/></li><li><a href="/using-dynamic-parameters-in-a-webtest-or-loadtest/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using Dynamic Parameters in a WebTest or LoadTest</h2><img src="/static/0aa5422b79c6d04ec39251457d76728e/25182/snaghtml3e5239_1.png" alt="Using Dynamic Parameters in a WebTest or LoadTest" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 September 2010</p><p style="width:100%;margin-top:2rem">Using Visual Studio 2010 (and some earlier versions), it’s very easy to create a WebTest by recording one or more web requests to the system under test (SUT). To get started, open Visual Studio 2010 and create a New Project. Then select Test Project like so: Next, add a Web Test to the project, and hit the URL you want to test (the one that accepts multiple different parameters that you want to…</p><br/></li><li><a href="/an-iis-crash-analysis-story/"><h2 class="is-size-2" style="width:100%;word-break:break-word">An IIS Crash Analysis Story</h2><img src="/static/f60f0b9bf7364e55287068d43e3fbee4/5d52e/snaghtml79db40_thumb.png" alt="An IIS Crash Analysis Story" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 September 2010</p><p style="width:100%;margin-top:2rem">Last week I attempted to update a high-traffic production ASP.NET application to ASP.NET 4. In the course of doing so, I was surprised, despite having tested everything thoroughly in a staging environment, to find that under production loads, the system was erratic and slow to respond to requests. Further inspection revealed that IIS was actually crashing under load, leaving a cryptic message in…</p><br/></li><li><a href="/principles-of-software-design/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Principles of Software Design</h2><img src="/static/d3ccc9290dc402d1dcc8e68e5d7f99ba/0ff54/webdesign-3411373_1280.jpg" alt="Principles of Software Design" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 September 2010</p><p style="width:100%;margin-top:2rem">Recently I did a webcast on Principles of Software Design in which I very quickly covered several important principles, as well as a few patterns and practices, that lead to better software quality. If you’re interested, you canview a recording of the webcast(click the wmv link beside the 16 Sep 2010 webcast), ordownload the slides and demos.</p><br/></li><li><a href="/real-world-monitoring-and-tuning-asp-net-caching/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Real World Monitoring and Tuning ASP.NET Caching</h2><img src="/static/0050b516ea6e961653b618660e331c5a/0dfe6/processor-time.png" alt="Real World Monitoring and Tuning ASP.NET Caching" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 September 2010</p><p style="width:100%;margin-top:2rem">First off, let me direct you to a great article on monitoring your ASP.NET cache API behavior. Go read that first, then come back here. Done? Good, so let’s make the advice from Simon’s blog a bit more concrete with some real-world examples. Consider this fairly high-traffic web server’s behavior (avg. 55 ASP.NET requests/sec, 110 max, at the moment): Notice how the RAM sort of falls off a cliff…</p><br/></li><li><a href="/perform-rolling-upgrade-of-web-farm-using-windows-network-load-balancer/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Perform Rolling Upgrade of Web Farm using Windows Network Load Balancer</h2><img src="/static/2060ee2bc734a9270300d98e96fd0e54/4c509/computer-311339_1280-760x360.png" alt="Perform Rolling Upgrade of Web Farm using Windows Network Load Balancer" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 September 2010</p><p style="width:100%;margin-top:2rem">Once you’ve set up a web farm / cluster using Windows Network Load Balancing, one of the benefits you have is the ability to perform a rolling upgrade. A rolling upgrade is a process by which you perform updates to individual servers within the cluster while they are not actively serving requests. This process is repeated so that eventually all servers have been updated, but users have not…</p><br/></li><li><a href="/applying-interface-segregation-to-configuration-files/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Applying Interface Segregation to Configuration Files</h2><img src="/static/a59bd08f9e92d7884fd5880301102350/0ff54/cloud-native.jpg" alt="Applying Interface Segregation to Configuration Files" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 August 2010</p><p style="width:100%;margin-top:2rem">In .NET, it’s very easy to set up custom configuration section handlers to handle your application or component’s configuration needs. As my previous post shows, it’s also very easy to configure these with attributes that enforce required fields and other validation. However, over time it’s very easy to create fairly large configuration sections that violate the Interface Segregation Principle…</p><br/></li><li><a href="/system-core-in-vs2010-projects/"><h2 class="is-size-2" style="width:100%;word-break:break-word">System.Core in VS2010 Projects</h2><img src="/static/396359eee4e20ff24d9a2d3fa5dbc497/4c509/vslogo-760x360.png" alt="System.Core in VS2010 Projects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 August 2010</p><p style="width:100%;margin-top:2rem">I just ran into an odd issue with a VS2010 project. In my case it was an MVC 2 application I was upgrading from VS2008. One of the built-in controllers (ProfileController) was failing to compile because it could not resolve the Linq extension method symbols Single() and Matches(). These are located in the System.Core assembly. I checked my project references in Solution Explorer, and System.Core…</p><br/></li><li><a href="/using-cctray-with-jetbrains-teamcity/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using CCTray with JetBrains TeamCity</h2><img src="/static/860f09a6f174e72bde5a733ca23b1926/4c509/vscode-760x360.png" alt="Using CCTray with JetBrains TeamCity" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 August 2010</p><p style="width:100%;margin-top:2rem">TeamCity is a great build server tool from JetBrains (makers of the awesome Visual Studio add-in, ReSharper). The user-interface and features of the TeamCity web front-end are wonderful and are leaps and bounds easier to use for new users than my previous favorite, CruiseControl.Net, which required much XMLness to configure. However, one of my favorite tools from CruiseControl, CCTray, still has…</p><br/></li><li><a href="/code-analysis-techniques/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Code Analysis Techniques</h2><img src="/static/36879138231066ce336ffa18e2211ef3/6b288/pie-chart-1.png" alt="Code Analysis Techniques" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 August 2010</p><p style="width:100%;margin-top:2rem">There are a number of code analysis tools available for .NET developers, including some stats that are built into the pricier SKUs of Visual Studio. Recently, I’ve been playing with a relatively new product (released earlier this year by Microsoft agile consulting shop NimblePros.com) called Nitriq. Nitriq is a bit like LINQPad for your code. If you’re not familiar with it, go download LINQPad now…</p><br/></li><li><a href="/getting-started-with-code-contracts-in-vs2010/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Started with Code Contracts in VS2010</h2><img src="/static/5187de500b0ff7bcbda01d3dc78e95cb/5ea86/snaghtml85dce90_thumb.png" alt="Getting Started with Code Contracts in VS2010" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 August 2010</p><p style="width:100%;margin-top:2rem">The idea of Design By Contract has been around for quite a while, and Microsoft Research has had a project focused on this topic for several years now, called Spec#. With Visual Studio 2010, there is now support for Code Contracts which are a DevLabs project based on the Spec# project. You can read more about and download Code Contracts for VS2010 here. Once you’ve downloaded and installed Code…</p><br/></li><li><a href="/book-recommendations-2010/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Books</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 July 2010</p><p style="width:100%;margin-top:2rem">Sadukie tagged me with her books post a couple of weeks ago and I’ve been meaning to respond with a post of my own. I have a post I update periodically that includes some of my most recommended developer books(where I’ve been meaning to add Agile Principles, Patterns, and Practices in C# by Robert and Micah Martin) – if you’re looking for ways to improve yourself as a software developer I would…</p><br/></li><li><a href="/working-with-application-pool-identities/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working with Application Pool Identities</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Working with Application Pool Identities" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 July 2010</p><p style="width:100%;margin-top:2rem">There a new feature of IIS called Application Pool Identities that was apparently introduced with SP2 of Windows Server 2008. There&#x27;s a nice overview of Application Pool Identities here, which is the basis for this post, which is just my notes on the feature. If you&#x27;re setting up new web sites and application pools in IIS on Windows Server 2008, it&#x27;s likely they&#x27;ll default to…</p><br/></li><li><a href="/set-up-build-agents-by-project-in-teamcity/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Set Up Build Agents By Project in TeamCity</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Set Up Build Agents By Project in TeamCity" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 July 2010</p><p style="width:100%;margin-top:2rem">We’re using TeamCity to manage our continous integration builds for CodeProject.com and LakeQuincy.com. Before TeamCity, I was using CruiseControl.net, and TeamCity is much easier to get working (and requires far less XML manipulation). I do miss CCTray, which I found to be much nicer than the TeamCity tray notifier (which if you click on it never shows anything immediately – it has to go and get…</p><br/></li><li><a href="/how-can-i-determine-the-current-controller-or-action-in-an-html-helper/"><h2 class="is-size-2" style="width:100%;word-break:break-word">How Can I Determine The Current Controller or Action in an Html Helper</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="How Can I Determine The Current Controller or Action in an Html Helper" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 July 2010</p><p style="width:100%;margin-top:2rem">If you’re writing an HTML Helper for ASP.NET MVC you may want to do something different based on whether the page that is to be rendered was arrived at via a particular controller or controller action. I found the following code which does just this in one of the ASP.NET MVC Themes available from the www.asp.net web site (the Dark theme, I believe it’s called). Note that I’ve already modified this…</p><br/></li><li><a href="/budding-versus-festering-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Budding Versus Festering Code</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 June 2010</p><p style="width:100%;margin-top:2rem">This is in response to Michael Feathers’ recent post on Festering Code Bases and Budding Code Bases. Certainly the default tooling in the Visual Studio space has, until recently, made it dramatically easier to add code to an existing class than to create a new class. However, tools like ReSharper have a large impact on this, and can make it extremely easy to create new classes, put them in their…</p><br/></li><li><a href="/tagging-releases-in-source-control/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tagging Releases in Source Control</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Tagging Releases in Source Control" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 June 2010</p><p style="width:100%;margin-top:2rem">A best practice when you&#x27;re using source control is to tag your releases. What does this mean, exactly? If you&#x27;re following the relatively standard non-distributed source control repository folder structure of having root folders for: branches tags trunk then it means simply making a copy of the current state of the system when you did your release. Here&#x27;s how to do it using Subversion (SVN) and…</p><br/></li><li><a href="/great-uses-of-using-statement-in-c/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Great Uses of Using Statement in C#</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Great Uses of Using Statement in C#" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 June 2010</p><p style="width:100%;margin-top:2rem">In my last post about testing emails in .NET, I noted the use of the using statement to ensure safe usage of the IDisposable SmtpClient and MailMessage objects. This is the typical usage of the using statement, but you can take advantage of this statement’s behavior for other scenarios as well, resulting in cleaner code. Consider the scenario where you want to perform some kind of pre- and post…</p><br/></li><li><a href="/moving-a-certificate-between-web-servers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Moving a Certificate Between Web Servers</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Moving a Certificate Between Web Servers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 June 2010</p><p style="width:100%;margin-top:2rem">I&#x27;m in the process of moving Lake Quincy Media&#x27;s web site from one server to another, and since it uses SSL to secure users&#x27; data, I had to move the certificate to the new server as part of the server move. Fortunately, this process is quite painless. First, you need to export the certificate to a .pfx file and give it a password, using these steps: Start, Run, MMC (I did it as administrator) Go…</p><br/></li><li><a href="/testing-email-sending/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Testing Email Sending</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Testing Email Sending" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 June 2010</p><p style="width:100%;margin-top:2rem">Recently I learned a couple of interesting things related to sending emails. One doesn&#x27;t relate to .NET at all, so if you&#x27;re a developer and you want to easily be able to test whether or not emails are working correctly in your application without actually sending them and/or installing a real SMTP server on your machine, pay attention. You can grab the smtp4dev application from codeplex, which…</p><br/></li><li><a href="/630/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Dont Throw Duplicate Exceptions</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Dont Throw Duplicate Exceptions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 May 2010</p><p style="width:100%;margin-top:2rem">In your code, you’ll sometimes have write code that validates input using a variety of checks. Assuming you haven’t embraced AOP and done everything with attributes, it’s likely that your defensive coding is going to look something like this: Do you see a problem here? Here’s the deal – Exceptions should be meaningful. They have value at a number of levels: In the code, throwing an exception lets…</p><br/></li><li><a href="/rest-to-objects-in-c/"><h2 class="is-size-2" style="width:100%;word-break:break-word">REST to Objects in C#</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="REST to Objects in C#" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 May 2010</p><p style="width:100%;margin-top:2rem">RESTful interfaces for web services are all the rage for many Web 2.0 sites. If you want to consume these in a very simple fashion, LINQ to XML can do the job pretty easily in C#. If you go searching for help on this, you’ll find a lot of incomplete solutions and fairly large toolkits and frameworks (guess how I know this) – this quick article is meant to be a no fluff just stuff approach to…</p><br/></li><li><a href="/sql-table-refactoring-challenge/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Sql Table Refactoring Challenge</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Sql Table Refactoring Challenge" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 April 2010</p><p style="width:100%;margin-top:2rem">I&#x27;ve been working a bit on cleaning up a large table to make it more efficient. I pretty much know what I need to do at this point, but I figured I&#x27;d offer up a challenge for my readers, to see if they can catch everything I have as well as to see if I&#x27;ve missed anything. So to that end, I give you my table: And now some assumptions and additional information: The table has 200,000,000 rows…</p><br/></li><li><a href="/detect-unicode-usage-in-sql-column/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Detect Unicode Usage in SQL Column and Optimize Storage</h2><img src="/static/d5221047cc510833a4c316a4eafbaf1d/4e530/detect-unicode-usage-in-sql-column.png" alt="Detect Unicode Usage in SQL Column and Optimize Storage" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 April 2010</p><p style="width:100%;margin-top:2rem">Last Updated: May 2024 One optimization you can make to a SQL table that is overly large is to change from nvarchar (or nchar) to varchar (or char). Doing so will cut the size used by the data in half, from 2 bytes per character (+ 2 bytes of overhead for varchar) to only 1 byte per character. However, you will lose the ability to store Unicode characters, such as those used by many non-English…</p><br/></li><li><a href="/sql-server-prevent-saving-changes-that-require-table-to-be-re-created/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Sql Server Prevent Saving Changes That Require Table to be Re-created</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Sql Server Prevent Saving Changes That Require Table to be Re-created" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 April 2010</p><p style="width:100%;margin-top:2rem">When working with SQL Server Management studio, if you use the Design view of a table and attempt to make a change that will require the table to be dropped and re-added, you may receive an error message like this one: sql error drop and recreate table Saving changes is not permitted. The changes you have made require the following tables to be dropped and re-created. You have either made changes…</p><br/></li><li><a href="/clone-a-virtualbox-machine/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Clone a VirtualBox Machine</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 April 2010</p><p style="width:100%;margin-top:2rem">I just installed VirtualBox, which I want to try out based on recommendations from peers for running a server from within my Windows 7 x64 OS. I’ve never used VirtualBox, so I’m certainly no expert at it, but I did want to share my experience with it thus far. Specifically, my intention is to create a couple of virtual machines. One I intend to use as a build server, for which a virtual machine…</p><br/></li><li><a href="/vs2010-launch-presentations/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VS2010 Launch Presentations</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="VS2010 Launch Presentations" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 April 2010</p><p style="width:100%;margin-top:2rem">Last week I was in Vegas to present at the DevConnections/ VS2010 Launch event. The show was well-attended and everybody I spoke to agreed it was educational and enjoyable. My three talks were all on Wednesday, 14 April 2010, including one at 8am for which I was impressed to see a large turnout in attendance. webforms Pragmatic ASP.NET Tips, Tricks, and Tools My first session was on tips, tricks…</p><br/></li><li><a href="/asp-net-mvc-2-and-windows-azure/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET MVC 2 and Windows Azure</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET MVC 2 and Windows Azure" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 April 2010</p><p style="width:100%;margin-top:2rem">If you upgrade an Azure web instance to use ASP.NET MVC 2, make sure you mark the System.Web.Mvc reference as Copy Local = true. Otherwise, your deployment will fail. And you won’t get any good feedback from Windows Azure as to the cause of the problem. So you’ll start searching the web for help, and perhaps you’ll stumble on this post, and you’ll realize that you didn’t set Copy Local = true on…</p><br/></li><li><a href="/adding-attributes-to-generated-classes/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Adding Attributes to Generated Classes</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Adding Attributes to Generated Classes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 April 2010</p><p style="width:100%;margin-top:2rem">ASP.NET MVC 2 adds support for data annotations, implemented via attributes on your model classes. Depending on your design, you may be using an OR/M tool like Entity Framework or LINQ-to-SQL to generate your entity classes, and you may further be using these entities directly as your Model. This is fairly common, and alleviates the need to do mapping between POCO domain objects and such entities…</p><br/></li><li><a href="/997/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Fix: Cant Change or Remove Visual Studio 2008 from DVD</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Fix: Cant Change or Remove Visual Studio 2008 from DVD" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 March 2010</p><p style="width:100%;margin-top:2rem">If you installed Visual Studio 2008 on a 64-bit operating system, you may have trouble when you try ad add or remove functionality by inserting the disk (or remounting the ISO image). I believe this is because of the path used to install the 32-bit Visual Studio program. When you run the setup.exe off of the disk, you get this: Clicking on Change or Remove Visual Studio 2008 brings up this dialog…</p><br/></li><li><a href="/open-visual-studio-files-as-administrator/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Open Visual Studio Files As Administrator</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Open Visual Studio Files As Administrator" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 March 2010</p><p style="width:100%;margin-top:2rem">Working with IIS as your web server, or working with Azure projects, are two examples of situations in which Visual Studio (2008+) needs to be running as Administrator (on Windows Vista or Windows 7). If you don&#x27;t run it as such, you may be faced with a dialog like this one (for Azure): azure tools for visual studio Now of course if you have Visual Studio pinned to your taskbar or start menu, you…</p><br/></li><li><a href="/612/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Eliminate Repetition with Action&lt;T&gt;</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Eliminate Repetition with Action&lt;T&gt;" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 March 2010</p><p style="width:100%;margin-top:2rem">Yesterday I was looking at some old code and refactoring it to clean it up (in this case I wasn’t the original author, but I’ve written code just like this). The application in question was a simple process that had to run once per month, on demand, and so was coded up as an EXE application. As it ran, it provided updates on its progress, so it looked something like this: In reviewing this simple…</p><br/></li><li><a href="/select-from-a-stored-procedure/"><h2 class="is-size-2" style="width:100%;word-break:break-word">SELECT from a Stored Procedure</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="SELECT from a Stored Procedure" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 February 2010</p><p style="width:100%;margin-top:2rem">Occasionally I find myself wanting to SELECT from a SPROC in SQL Server. Usually this is because I want to ORDER the results or filter them further with a WHERE clause. Unfortunately, you can’t just do this: There are several workarounds here, and the appropriate one depends mostly on whether you have any control over the use of the stored procedure, or how it works. For example, you could choose…</p><br/></li><li><a href="/avoid-regions-for-interfaces-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Regions for Interfaces in Visual Studio</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Avoid Regions for Interfaces in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 February 2010</p><p style="width:100%;margin-top:2rem">Another quick tip related to the use of regions in your C# code – you can turn off the default behavior of wrapping interface implementations in regions via the options dialog. Simply go to Tools –&gt; Options –&gt; Text Editor –&gt; C# –&gt; Advanced as shown in the screenshot below, and uncheck the “Surround generated code with #region” checkbox.</p><br/></li><li><a href="/tight-coupling-legos-and-super-glue/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tight Coupling, Legos, and Super Glue</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Tight Coupling, Legos, and Super Glue" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 February 2010</p><p style="width:100%;margin-top:2rem">Building software applications is sometimes compared with building structures out of smaller components. The children&#x27;s toys, Legos (and their generic brethren), come to mind and in fact make for a good analogy. Given a set of components with varying characteristics (shape, color, etc, or in the case of software, objects with different behavior and state), it is possible to connect the components…</p><br/></li><li><a href="/prevent-resharper-from-adding-regions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Prevent Resharper From Adding Regions</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Prevent Resharper From Adding Regions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 February 2010</p><p style="width:100%;margin-top:2rem">A couple of days ago I was annoyed that Resharper was insisting on turning my abstract base NUnit test class with nothing in it but a shared [SetUp] method into a one line class with a collapsed Setup / Teardown region in it. While I didn&#x27;t always feel this way, my experience has taught me that regions are a smell in your code. They are a way to hide things you don&#x27;t want to deal with or look at…</p><br/></li><li><a href="/azure-tip-how-to-deploy-a-zip-file-to-windows-azure/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Azure Tip: How To Deploy a ZIP File to Windows Azure</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Azure Tip: How To Deploy a ZIP File to Windows Azure" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 January 2010</p><p style="width:100%;margin-top:2rem">Last month,The Code Project ran an Azure contest and gave away several Amazon Kindles. As part of the contest, which we hosted on Azure, we deployed a sample project with all of the necessary install files for getting started with Windows Azure. It turned out to be slightly more difficult than expected to actually get the zip file deployed to the cloud, so I thought I’d post here in case others…</p><br/></li><li><a href="/axosoft-ontime-and-queues/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Axosoft OnTime and Queues</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Axosoft OnTime and Queues" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 January 2010</p><p style="width:100%;margin-top:2rem">At CodeProject we’ve recently adopted Axosoft OnTime for our task, feature, and bug tracking needs. We had tried a number of different solutions, and there was even some discussion of building our own (naturally), but in the end we’ve settled on OnTime, at least for the time being. OnTime breaks up items into Defects, Tasks, and Features by default, and you can establish fairly rich workflow rules…</p><br/></li><li><a href="/windows-azure-pricing-and-shared-hosting/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Windows Azure Pricing and Shared Hosting</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Windows Azure Pricing and Shared Hosting" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 January 2010</p><p style="width:100%;margin-top:2rem">Windows Azure, Microsoft&#x27;s cloud computing platform, has recently gone into production and will begin charging customers next month. You can keep up on Azure news and blogs at AzureFeeds.com, a community moderated resource. One of the promises of Azure is to treat application hosting like a utility service, through which one pays for what one uses, just as with electricity or telephone usage. In…</p><br/></li><li><a href="/coding-katas/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Coding Katas</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 January 2010</p><p style="width:100%;margin-top:2rem">Last week at CodeMash I helped host a Software Craftsmanship PreCompiler on Wednesday afternoon. I also helped organize a coding dojo for the event, but it was very last minute and didn’t have a lot of instructions for developers new to performing katas. Having a room where people could get together and work through a problem together, perhaps in a new language, was still very worthwhile and…</p><br/></li><li><a href="/most-popular-2009-posts/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Most Popular 2009 Posts</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Most Popular 2009 Posts" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 January 2010</p><p style="width:100%;margin-top:2rem">If you&#x27;re one of my subscribers, you&#x27;re probably a software developer, or perhaps someone I know personally. You might be surprised to find that many of the most popular posts on my blog in 2009 were not particularly developer-oriented. According to Google Analytics, my blog had the following stats for 2009: image 1.Codebehind Files in ASP.NET MVC Are Evil (8,320 page views) – Yes, I know it&#x27;s a…</p><br/></li><li><a href="/view-binary-encoded-wcf-messages/"><h2 class="is-size-2" style="width:100%;word-break:break-word">View Binary Encoded WCF Messages</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="View Binary Encoded WCF Messages" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 December 2009</p><p style="width:100%;margin-top:2rem">If you’re doing any work with WCF (and perhaps Silverlight, for example, but any client will do) and you’d like to maximize the performance of your messages, you’re probably using binary encoding as it’s much less verbose than other options. However, this makes tools like Fiddler much less useful when it comes to debugging why the thing isn’t doing what you thought it was doing, because by default…</p><br/></li><li><a href="/a-first-pass-at-potterkata/"><h2 class="is-size-2" style="width:100%;word-break:break-word">A First Pass at PotterKata</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="A First Pass at PotterKata" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 October 2009</p><p style="width:100%;margin-top:2rem">Tonight at Hudson Software Craftsmanship, I paired with another group member and worked on the PotterKata for the first time. I’d seen NotMyself write about it a few days ago, which prompted me to suggest it for the group to work on (summary of the meeting here). Briefly, this kata is a fairly real-world exercise in that it has to do with business rules for a shopping cart that are non-linear. In…</p><br/></li><li><a href="/avoid-entrenched-dependencies/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid Entrenched Dependencies</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Avoid Entrenched Dependencies" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 October 2009</p><p style="width:100%;margin-top:2rem">Last year I wrote about Avoiding Dependencies and described some Insidious Dependencies (with help from many commenters) that many developers might not immediately recognize as dependencies. It occurred to me today that I should point out that dependencies themselves are not intrinsically bad design – all software has dependencies. The important distinction here that I think is a best practice is…</p><br/></li><li><a href="/why-not-classic-legacy-asp/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Why not Classic (Legacy) ASP?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Why not Classic (Legacy) ASP?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 October 2009</p><p style="width:100%;margin-top:2rem">Yesterday I got the following email, which I thought raised some good points that I thought were worth addressing here in my blog in addition to the reply I sent directly. Hi Steve, I’ve been following your blog (as well as Rob C. and Scott H.) as I look into dipping my toes into MVC. I just read you &quot;How I Got Started in Software Development&quot; and your description of the joys of lightweight ASP…</p><br/></li><li><a href="/906/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Conways Life in WPF</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Conways Life in WPF" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 August 2009</p><p style="width:100%;margin-top:2rem">The“Game of Life” was invented in 1970 by John Conway, a British mathematician. The rules of the game are simple, but the resulting behavior of the system that results is often surprising and in any event difficult to predict. There’s a great deal of information available online relating to this game and many implementations of it exist. I found an article called Life with XAML from 3 years ago by…</p><br/></li><li><a href="/caching-key-generation-considerations/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Key Generation Considerations</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 August 2009</p><p style="width:100%;margin-top:2rem">Recently I was reviewing some code and ran across this – can you spot the problem? There are actually a couple of different issues with this approach. The first one is that the serverTime parameter is literally sending in the current time (not date), which means that when it is .ToString()’d and joined into the cacheKey, it’s going to have information down to the second. Since this method is being…</p><br/></li><li><a href="/art-of-agile-development/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - The Art of Agile Development</h2><img src="/static/23b49ac738033b9cc44b75b0498ee988/4e530/art-of-agile.png" alt="Review - The Art of Agile Development" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 August 2009</p><p style="width:100%;margin-top:2rem">Summary This book provides an excellent field manual for implementing agile software techniques. It includes practical advice with extensive cross referencing to theory and principles that are core to agile methodologies. I would recommend it to individuals in the agile team lead/coach role, or senior developers in general interested in agile in practice. Its primary focus is on Extreme…</p><br/></li><li><a href="/asp-net-mvc-and-solid-programming-principles-june-2009/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET MVC and SOLID Programming Principles June 2009</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET MVC and SOLID Programming Principles June 2009" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 June 2009</p><p style="width:100%;margin-top:2rem">This week I presented “Introducing ASP.NET MVC and SOLID Programming Principles” (aka SOLIDify Your ASP.NET MVC) to the Cleveland .NET SIG and the Ann Arbor .NET Developers group. Thanks to everyone who came, it was standing room only at the Microsoft office in Cleveland and a great turnout at the SRT Solutions office in Ann Arbor, too. I thought the presentation went well and had some good…</p><br/></li><li><a href="/binding-in-asp-net-mvc/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Binding in ASP.NET MVC</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 June 2009</p><p style="width:100%;margin-top:2rem">At my ASP.NET MVC + SOLID Principles talk in Cleveland last night, I had a couple of questions about binding in ASP.NET MVC. For instance: Can you still do something like &lt;%= Bind(“Foo”) %&gt; in your form? How does the controller that receives a POST get back the Model that was used in the form that was posted? Does it have to be serializable? What if I need to bind custom types to my Model class…</p><br/></li><li><a href="/azure-developer-contest/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Azure Developer Contest</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Azure Developer Contest" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 May 2009</p><p style="width:100%;margin-top:2rem">If you’re into cloud computing, you should check out the new CloudApp(): Azure Services Platform Developer Contest. You can learn more about it at newCloudApp.com. The contest opened up on May 4th and submissions are due by 18 June 2009. Winners will be chosen and announced by the end of June. The contest is US-based and includes categories for .NET applications, PHP applications (PHP is supported…</p><br/></li><li><a href="/teched-2010-back-in-new-orleans/"><h2 class="is-size-2" style="width:100%;word-break:break-word">TechEd 2010 Back In New Orleans</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="TechEd 2010 Back In New Orleans" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 April 2009</p><p style="width:100%;margin-top:2rem">shrimpcreole As previously announced, it&#x27;s official! TechEd 2010 will (finally) be back in New Orleans! The dates are June 7-11, 2010. It&#x27;s been several years since I&#x27;ve been to New Orleans, but I always have a great time there and I&#x27;m very much looking forward to returning. The food, music, and atmosphere are wonderful. I hope to see you there!</p><br/></li><li><a href="/cloud-computing-with-force-com/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cloud Computing with Force.com</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 April 2009</p><p style="width:100%;margin-top:2rem">Lake Quincy Media uses SalesForce.com as our CRM to manage our leads and customers and keep our salespeople organized. Overall we’ve been very pleased with the solution, and we know plenty of others who swear by SF. So when I heard about their foray into Cloud Computing via Developer.Force.com (DFC), I figured I should check it out. Similar to Azure, you need to register to get an account and the…</p><br/></li><li><a href="/geekfest-2009-at-teched/"><h2 class="is-size-2" style="width:100%;word-break:break-word">GeekFest 2009 at TechEd</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="GeekFest 2009 at TechEd" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 April 2009</p><p style="width:100%;margin-top:2rem">Developer Tools Marketing at Microsoft is hosting a party at TechEd in Los Angeles once again this year. Here are the details: Let’s face it, going to a technical conference is good for your career but it’s not a whole lot of fun. You need an outlet. You need to have fun. Cheap beer and lousy pizza. We are bringing back GeekFest! Join us at Lucky Strikefor a night of pizza, beer, and bowling…</p><br/></li><li><a href="/speaking-wednesday-at-space-coast-net-user-group/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking Wednesday at Space Coast .NET User Group</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Speaking Wednesday at Space Coast .NET User Group" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 April 2009</p><p style="width:100%;margin-top:2rem">This Wednesday I&#x27;ll be in Florida presenting on ASP.NET MVC and Robert Martin&#x27;s SOLID principles of software development. The Space Coast Dot Net User Group is hosting me, and INETA is sponsoring the talk. If you&#x27;re in the area, please stop by to join in the event. More details: Ineta Logo When: 630pm, 15 April 2009 Where: Space Coast Credit Union Corporate Headquarters 8045 N. Wickham Road…</p><br/></li><li><a href="/where-are-the-developer-machines/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Where Are The Developer Machines?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Where Are The Developer Machines?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 April 2009</p><p style="width:100%;margin-top:2rem">I&#x27;m really tired of the fact that computer manufacturers in general have yet to recognize developers as a separate demographic. If you do a search for &quot;developer workstation&quot; in Google, there are no links to any computer manufacturer on the first page (sponsored or otherwise). google developer workstation Search for &quot;gaming computer&quot; and suddenly there are all kinds of links: google gaming…</p><br/></li><li><a href="/code-magazine-upgrade/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CODE Magazine Upgrade</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 March 2009</p><p style="width:100%;margin-top:2rem">If you’re a .NET developer, you’re probably familiar with CODE Magazine, which is pretty much the only industry magazine that isn’t owned by a large corporation, and which has always been known for delivering quality content. Recently, the magazine upgraded its look, as you can see at right, and a refresh of the web site is imminent as well. The most recent issue, in particular, caught my…</p><br/></li><li><a href="/cannot-connect-to-windows-home-server-solution/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cannot Connect to Windows Home Server Solution</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 March 2009</p><p style="width:100%;margin-top:2rem">I have an HP MediaSmart 470 Home Server(previous post) that I like very much for its ease-of-use and simple ability to back up my home network’s computers and act as a streaming media server. However, one of my computers stopped being able to connect to it. Since it was my laptop, and I have another WHS at my office that is also backing up the same machine, I didn’t worry too much about it, but…</p><br/></li><li><a href="/azure-thermostat-service/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Azure Thermostat Service</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Azure Thermostat Service" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 March 2009</p><p style="width:100%;margin-top:2rem">By now I assume most readers are familiar with Azure, Microsoft’s cloud service offering. Azure provides theoretically limitless scalability to online applications, which can be built using existing Microsoft developer tools and skills. As part of the deployment process for an Azure application, the number of nodes required to support the application is specified (in configuration or via the web…</p><br/></li><li><a href="/asp-net-control-panel/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Control Panel</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Control Panel" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 March 2009</p><p style="width:100%;margin-top:2rem">Something I think would be a nice addition to ASP.NET (ideally shipping in 4.0 or N.0, but a community effort would also work) is a control panel that can be plugged into any application. A control panel would provide some or all of the following capabilities to a web site administrator: View Page Trace output View Recent Exceptions View Cache Contents and Clear Cache Other tasks as plugins…</p><br/></li><li><a href="/azure-tooling-suggestion-for-web-roles/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Azure Tooling Suggestion for Web Roles</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Azure Tooling Suggestion for Web Roles" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 March 2009</p><p style="width:100%;margin-top:2rem">With Azure today, there are two projects, you can create a Web Role which is basically an ASP.NET Web Application that is configured to automatically deploy to the local dev fabric (local cloud proxy). When you Run the application, with F5 or Ctrl-F5, it will package up the application and deploy it to your local dev fabric, along with starting other services like Azure Storage locally, so that…</p><br/></li><li><a href="/brief-response-to-corey-on-software-craftsmanship/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Brief Response to Corey on Software Craftsmanship</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Brief Response to Corey on Software Craftsmanship" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 February 2009</p><p style="width:100%;margin-top:2rem">Corey’s blog’s comment box is failing, so posting my response here. Read his response to my post for context. Below is simply cut-and-pasted from a comment I was trying to leave on his blog: Hey Corey, thanks for the well thought out comments. Let me consider my response and most likely post it on my blog, but while I’m writing here I’d like to describe a very real scenario I’m faced with right…</p><br/></li><li><a href="/azure-table-storage-gotcha/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Azure Table Storage Gotcha</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Azure Table Storage Gotcha" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 February 2009</p><p style="width:100%;margin-top:2rem">Steve Marx gave a great talk on getting started with Azure at PDC. You can watch the whole thing here and download his samples. Once you download the Azure SDK (I’m using the January CTP) and ASP.NET MVC (I’m using the RC), you can get his stuff up and running without *too* much trouble. However, one thing that took me a little while to figure out is that for some reason even when Azure Storage…</p><br/></li><li><a href="/asp-net-mvc-request-validation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET MVC Request Validation</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET MVC Request Validation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 February 2009</p><p style="width:100%;margin-top:2rem">When using ASP.NET MVC to post data that might contain HTML or other potentially “dangerous” data, the default behavior as of the Release Candidate is to throw an exception, preventing the posting of the data. This is a well-known feature of ASP.NET that was introduced several versions ago, and the typical way to avoid it (when necessary for the application’s function) is to add validate Request…</p><br/></li><li><a href="/interview-on-performance/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Interview on Performance</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Interview on Performance" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 February 2009</p><p style="width:100%;margin-top:2rem">Last month at CodeMash I met with David Giard who decided to do an impromptu interview on the topic of web site performance. He just let me know that video is online. I’m actually quite impressed with the quality of the sound, considering that I didn’t have a clip-on microphone or anything like that. The video quality is pretty nice, too, though I’m sure it’s well below whatever the native quality…</p><br/></li><li><a href="/idisposable-and-wcf/"><h2 class="is-size-2" style="width:100%;word-break:break-word">IDisposable and WCF</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="IDisposable and WCF" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 February 2009</p><p style="width:100%;margin-top:2rem">Recently we’ve been separating our monolithic application into smaller systems which communicate via services. We’re using WCF for this communication, and one of the things that we’ve quickly noticed is that WCF is, for whatever reason, not compatible with the usual best practice of wrapping IDisposable objects with a using() {…} block. Personally, I don’t think resources should be marked…</p><br/></li><li><a href="/codemash-2009-aftermash/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeMash 2009 Aftermash</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 January 2009</p><p style="width:100%;margin-top:2rem">CodeMash 2009, the third annual Ohio conference (and as far as I know, the largest Ohio developers’ conference), was by all accounts a great success last week. I was privileged to be a speaker at the show but also got a lot of value out of the networking opportunities and other sessions. Mary Poppendieck was also speaking, and it was great to get the opportunity to meet her and her husband Tom, as…</p><br/></li><li><a href="/head-first-design-patterns/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Head First Design Patterns</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Head First Design Patterns" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 December 2008</p><p style="width:100%;margin-top:2rem">I picked up Head First Design Patterns a couple of months ago and read it last month. I have to say that this book is totally different from any other software development book I’ve read in the past. Most software books, you probably know, follow a fairly predictable pattern with each chapter covering some piece of technology through large amounts of text interspersed with code blocks and…</p><br/></li><li><a href="/codemash-2009/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeMash 2009</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 December 2008</p><p style="width:100%;margin-top:2rem">The 2009 Conference Season kicks off early in Ohio with CodeMash 3.0. This is the third year of the event and promises to be a valuable experience with a diverse mixture of software development technologies. This year I’m happy to report that I will be speaking about techniques to improve web application performance, a topic I’ve spoken on frequently to ASP.NET audiences and one which I’ll be…</p><br/></li><li><a href="/asp-net-mvc-at-dogfood-developers-conference/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET MVC at DogFood Developers Conference</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET MVC at DogFood Developers Conference" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 December 2008</p><p style="width:100%;margin-top:2rem">I gave a presentation a couple of weeks ago at the Columbus Ohio Microsoft Dogfood Developers conference. Danilo, the main organizer of the event, snapped a couple pictures of me during the talk. This was my first time presenting on ASP.NET MVC and I want to definitely thank ScottGu,ScottHa,Phil Haack, and Jason Gaylord for their great presentations on this subject, from which I borrowed and added…</p><br/></li><li><a href="/programming-is-just-typing/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Programming is Just Typing</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Programming is Just Typing" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 November 2008</p><p style="width:100%;margin-top:2rem">Well, OK, it&#x27;s not just typing, but fundamentally, typing has a lot to do with it. In fact, it wouldn&#x27;t be too great a stretch of the imagination for someone watching a room full of programmers to mistake them for a room full of writers, typists, dictation takers, or similar clerical staff. What we do to produce software is type it in, one word at a time. Jeff Atwood writes We Are Typists First…</p><br/></li><li><a href="/codemash-2009-sessions-announced/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeMash 2009 Sessions Announced</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 November 2008</p><p style="width:100%;margin-top:2rem">Actually they were announced a couple of days ago, but I’ve been a bit too busy to blog. Eventually these will make it up on the CodeMash web site, but for now they are only listed on the events’mailing list. I’ve included the complete list below. CodeMash is a great developer event held at an indoor water park each January in Sandusky, Ohio. I’ve been to the previous events, and the 2009 event…</p><br/></li><li><a href="/asp-net-membership-manager/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Membership Manager</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Membership Manager" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 November 2008</p><p style="width:100%;margin-top:2rem">In my session this week on Membership and Personalization in ASP.NET, I mentioned a commercial control for this but couldn’t recall the name or URL. Well, here it is, the ASP.NET Membership Management control from Quality Data. I have not personally used the control, but it looks like it has all the features one would need. It’s currently $59 per web server, which seems pretty reasonable.</p><br/></li><li><a href="/announcing-azurefeeds/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Announcing AzureFeeds</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Announcing AzureFeeds" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 November 2008</p><p style="width:100%;margin-top:2rem">VB MVP Serge Baranovsky created VBFeeds.com a few years ago, and shortly afterward he helped me create CSharpFeeds.com using a fork of the source code. I’ve had some interns working on that code off and on and we launched a new and improved version of CSharpFeeds around the end of the summer. The purpose of both of these sites is to provide very focused information about the topic at hand, with…</p><br/></li><li><a href="/asp-net-provider-source-code-install-path/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Provider Source Code Install Path</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Provider Source Code Install Path" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 November 2008</p><p style="width:100%;margin-top:2rem">Some months ago, ScottGu announced the availability of source code for the ASP.NET providers. This was great news and a great many comments followed. In preparation for a talk I’m giving this week at DevConnections, I went out to grab the source again to be able to show it off during my talk. But no matter where I told it to install, nothing was installed. By default it wanted to go to C:Program…</p><br/></li><li><a href="/azure-deployment-portal-–-use-ie/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Azure Deployment Portal – Use IE</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Azure Deployment Portal – Use IE" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 October 2008</p><p style="width:100%;margin-top:2rem">Ran into a small bug in the Azure deployment portal today using Firefox. The “swap” button to swap out a staging with a production environment was non-responsive. Switched to IE and it popped up an “are you sure” alert box as expected. I’m sure this will be addressed quickly but if you’re trying out Azure you may want to be aware of the issue.</p><br/></li><li><a href="/check-if-unique-constraint-will-be-violated-before-insert-with-llblgen/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Check if Unique Constraint will be violated before Insert with LLBLGen</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Check if Unique Constraint will be violated before Insert with LLBLGen" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 October 2008</p><p style="width:100%;margin-top:2rem">I needed to determine if a unique constraint would be violated so that I could programmatically update the Name of a business object to make it unique today. I use LLBLGen for this project’s database layer, and I have a unique constraint (actually a unique index) set on the database. In this case it covers two columns, an integer ID and a string Name, but the nice thing about LLBLGen is that it…</p><br/></li><li><a href="/range-errors-not-just-in-software/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Range Errors Not Just In Software</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Range Errors Not Just In Software" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 October 2008</p><p style="width:100%;margin-top:2rem">A common area to test in software are ranges of values and off-by-one errors. But this problem certainly isn&#x27;t limited to programmer code. I just wrapped up a survey by TNS for customer satisfaction that ended with this question. Note that I have 10 employees in my company (trying to pick the invisible radio button between the first and second one didn&#x27;t work). [range error example</p><br/></li><li><a href="/graffiti-history-widget/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Graffiti History Widget</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Graffiti History Widget" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 October 2008</p><p style="width:100%;margin-top:2rem">Graffiti CMS doesn’t ship with an archive/history widget to display the number of posts published by month, as is common in many other blog engines. I’ve been looking for such a widget for several months and Keyvan pointed me to one a few days ago that I got up and running in just a few moments today. You’ll find it linked from this forum thread, which I’m quoting the relevant post below to make…</p><br/></li><li><a href="/search-trends-october-2008/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Search Trends October 2008</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Search Trends October 2008" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 October 2008</p><p style="width:100%;margin-top:2rem">PDC is fast approaching and Cloud Computing is the theme – and all the rage for everyone else in the Industry media. Amazon recently announced they&#x27;ll be extending their compute cloud to support Windows and real databases. Here&#x27;s a look at some recent trends in the tech industry, using Google Trends. Daylight Savings Time The topic of DST is likely of at least marginal interest to most software…</p><br/></li><li><a href="/reducing-sql-lookup-tables-and-function-properties-in-nhibernate/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Reducing SQL Lookup Tables and Function Properties in NHibernate</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Reducing SQL Lookup Tables and Function Properties in NHibernate" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 October 2008</p><p style="width:100%;margin-top:2rem">One of the points made in Jeffrey’sagile development boot camp last week that struck a chord with me was that many database-centric designs have lookup tables that aren’t really just data. That is, tables that hold values such as statuses that, if modified, can easily break existing code or won’t function as expected without the addition of code. We have a lot of these in our codebase, and we’ve…</p><br/></li><li><a href="/review-–-murach-asp-net-3-5-programming-with-vb/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review – Murach ASP.NET 3.5 Programming with VB</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Review – Murach ASP.NET 3.5 Programming with VB" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 September 2008</p><p style="width:100%;margin-top:2rem">I have a copy of Murach’s ASP.NET 3.5 Web Programming with VB 2008(book web site) that I received over the summer and have been meaning to write a short review. So here goes. First of all, I love the “Murach format” for books, especially for “how-to” books which as it happens tend to be what they publish. Specifically, they lay out their books such that typically the left-hand page is providing…</p><br/></li><li><a href="/avoiding-dependencies/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoiding Dependencies</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Avoiding Dependencies" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 September 2008</p><p style="width:100%;margin-top:2rem">I gave a one day class to about 20 developers today introducing Microsoft .NET, C#, and ASP.NET. As it was only one day and there were no hands-on labs, coverage was necessarily cursory, but overall things went very well. In the course of discussing the Base Class Library and specifically the areas of logging and sending emails (System.Diagnostics and System.Net), I was careful to emphasize to the…</p><br/></li><li><a href="/codebehind-files-in-asp-net-mvc-are-evil/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Codebehind Files in ASP.NET MVC are Evil</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 September 2008</p><p style="width:100%;margin-top:2rem">With the current versions of ASP.NET MVC (Preview 5) that have shipped, the default MVC template sites all include codebehind files for the ASP.NET views. For example, here’s a screenshot of what a new project looks like the one at right. Further, adding a new ASP.NET MVC View Page will also include a .aspx.cs and a .aspx.designer.cs file by default. The question is, why is that codebehind file…</p><br/></li><li><a href="/codeplex-support-for-tortoisesvn/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodePlex Support For TortoiseSVN</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 September 2008</p><p style="width:100%;margin-top:2rem">CodePlex is Microsoft’s open source project repository. It is built using Microsoft Team Foundation System and as such has until recently required the use of Team Explorer to access. However, due to the extreme popularity of Subversion(SVN), an open source tool for source control configuration, CodePlex has just announced support for TortoiseSVN (an SVN client). You can read the full details…</p><br/></li><li><a href="/p3p-trouble-with-internet-explorer/"><h2 class="is-size-2" style="width:100%;word-break:break-word">P3P Trouble with Internet Explorer</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="P3P Trouble with Internet Explorer" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 September 2008</p><p style="width:100%;margin-top:2rem">Recently I&#x27;ve had some customers request that some third party scripts Lake Quincy Media provides avoid the evil eye of death IE evil eye that IE6+ likes to show if such scripts even think about using cookies. In our case, we are testing to see if the browser has Flash installed, and save the result in a cookie since it is a relatively expensive operation and we do not want to have to repeat it…</p><br/></li><li><a href="/client-side-client-detection/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Client Side Client Detection</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Client Side Client Detection" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 September 2008</p><p style="width:100%;margin-top:2rem">I just heard about a new flavor of the top of the line client detection component, BrowserHawk, that is being branded as “BrowserHawk To-Go (BHTG).” What’s interesting about this (to me) is that it’s following a SaaS model and a pay-as-you-go scheme for pricing. This makes the software very affordable for startup sites and simplifies the installation requirements. Implementation in this case is…</p><br/></li><li><a href="/speaking-at-devreach-in-bulgaria/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking at DevReach in Bulgaria</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Speaking at DevReach in Bulgaria" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 August 2008</p><p style="width:100%;margin-top:2rem">125x125-devreach I&#x27;m very excited to be speaking at the DevReach conference in Bulgaria in October. It will be my first international conference speaking experience (though I spoke to a user group in Moscow last year – my first international talk). I&#x27;m told this show is great, with a lot of good content and a lot of fun. I know most of the speakers, and I have to say that (with the possible…</p><br/></li><li><a href="/client-cache-headers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Client Cache Headers</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Client Cache Headers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 August 2008</p><p style="width:100%;margin-top:2rem">Anybody who’s talked to me about web programming in the last 5 years or so knows that I’m a big fan of caching. However, in most of my presentations on ASP.NET caching, I don’t get into the client side of things. Mainly this is because ASP.NET is a server-side technology and there’s plenty of cool stuff to talk about on the server with regard to caching, and I truly think that’s where the biggest…</p><br/></li><li><a href="/sql-server-2008-ships/"><h2 class="is-size-2" style="width:100%;word-break:break-word">SQL Server 2008 Ships</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="SQL Server 2008 Ships" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 August 2008</p><p style="width:100%;margin-top:2rem">Microsoft has released SQL Server 2008 officially, according to this press release. The software is currently available to MSDN and TechNet subscribers: SQL Server 2008 is now available to MSDN and TechNet subscribers and will be available for evaluation download on Aug. 7, 2008. SQL Server 2008 Express and SQL Server Compact editions are available for free download today at http://www.microsoft…</p><br/></li><li><a href="/avoid-app-settings-usage-in-controls-or-shared-libraries/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoid app Settings Usage in Controls or Shared Libraries</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Avoid app Settings Usage in Controls or Shared Libraries" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 July 2008</p><p style="width:100%;margin-top:2rem">Since .NET 1.0, there has been a built-in appSettings section in configuration files. Many developers use this space to store application settings, such as the name of the site or (before ) database connection information. However, many third party tools also make use of this collection, which is a bad practice. Third party tools should use their own configuration section, which is incredibly easy…</p><br/></li><li><a href="/batch-javascript-libraries-for-increased-performance/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Batch JavaScript Libraries for Increased Performance</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Batch JavaScript Libraries for Increased Performance" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 July 2008</p><p style="width:100%;margin-top:2rem">I’ve been meaning to set up batched loading of the JavaScript libraries used by Lake Quincy Media’s administration application for some time, and finally had a chance this past weekend. The site uses a variety of third-party tools such as DevExpress,ComponentArt,AJAX Control Toolkit,Overlib,PeterBlum,Dundas Charts, and probably a couple of others I’m forgetting at the moment. As a result, the site…</p><br/></li><li><a href="/vs-tip-–-incremental-search-in-visual-studio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VS Tip – Incremental Search in Visual Studio</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="VS Tip – Incremental Search in Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 July 2008</p><p style="width:100%;margin-top:2rem">[find replace file If you&#x27;re looking to navigate through the current file in Visual Studio, the typical approach is ctrl-F, which is the shortcut for Find and brings up a dialog like the one at right to locate instance of a string. Bertrand just let me know about another shortcut, ctrl-I, which does Incremental Search. The nice thing about this is that it&#x27;s faster (there is a measurable delay…</p><br/></li><li><a href="/getting-started-with-tdd/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Started with TDD</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Getting Started with TDD" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 July 2008</p><p style="width:100%;margin-top:2rem">RecentlyDannyTwrote on the altdotnet list: On our next project I really want to nail unit testing and possibly even test driven development. My issue however is none of our team has any experience of either so we will be starting totally green. … My question however is, with a goal of wanting to adopt TDD eventually, are we better off starting this next project by writing some unit tests and…</p><br/></li><li><a href="/ann-arbor-give-camp/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Ann Arbor Give Camp</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Ann Arbor Give Camp" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 July 2008</p><p style="width:100%;margin-top:2rem">The Ann Arbor Give Camp is happening this weekend. I think this is really cool, and I’m bummed that other plans have prevented my being able to participate directly. That said, I would like to personally thank all of the developers who are participating. I think it’s really cool and I hope you have a lot of fun this weekend. Even though it’s in Ann Arbor, Michelle (we’re both buckeyes) is…</p><br/></li><li><a href="/getting-rss-right/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting RSS Right</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Getting RSS Right" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 July 2008</p><p style="width:100%;margin-top:2rem">Just made some updates to the aggregate RSS feed on DevMavens.com so that it’s more correct. We weren’t displaying the author correctly before (and we’re still not complying with the RFC that wants to contain an email address, but I see no reason to increase the spam these folks get as it is). I also noticed that our dates weren’t formatted correctly, though I had thought originally they were…</p><br/></li><li><a href="/cache-access-pattern-revised/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cache Access Pattern Revised</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 July 2008</p><p style="width:100%;margin-top:2rem">Karl Seguin has an interesting post about using System.Func to fight repetitive code blocks, which actually addresses a pain point I’ve had for quite some time but had never acted on to fix. Whenever one access the Cache or a similar statebag that might or might not contain the value sought after, it is important to check if the value exists first, and if it doesn’t, go and retrieve it from…</p><br/></li><li><a href="/unit-testing-time/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Unit Testing Time</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Unit Testing Time" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 July 2008</p><p style="width:100%;margin-top:2rem">Oren has a post showing how he deals with time sensitive code in his unit tests. One thing that’s interesting is that, like my previous post, deals with the System.Func construct introduced in .NET 3.5. I see this convention more and more and it’s really growing on me. I’ve dealt with timing issues in my own code using a convention similar to the one Ayende demonstrates, which is to create a…</p><br/></li><li><a href="/blog-move/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Blog Move</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 July 2008</p><p style="width:100%;margin-top:2rem">Please join me as I move my blog to my own URL, SteveSmithBlog.com. I’ll continue to post there about more or less the same things I did here, but with a bit more control over the site layout and other features. The new blog is running on Telligent’s new Graffiti CMS, which really is as easy to get up and running as they claim. The look is currently a stock template, but should be updated to be a…</p><br/></li><li><a href="/announcing-devmavens/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Announcing DevMavens</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Announcing DevMavens" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 July 2008</p><p style="width:100%;margin-top:2rem">This month marks the launch of a new site we’ve been working on to help recognize and support a number of influential bloggers in the .NET developer community. Please help me welcome the initial members of the DevMavens! These bloggers have been invited to be a part of this small but hopefully growing group based on their influence in the community, and the DevMavens site has been set up (using…</p><br/></li><li><a href="/contact-steve/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Contact Steve</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 July 2008</p><p style="width:100%;margin-top:2rem">I’m easy to find online: @ardalis on Twitter About.me Email YouTube Feel free to send me an email directly. If you have a technical question, you may want to ask it on StackOverflow and just email or tweet me the link.</p><br/></li><li><a href="/black-belt-asp-net-performance-talk/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Black Belt ASP.NET Performance Talk</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 June 2008</p><p style="width:100%;margin-top:2rem">I gave my Tech Ed presentation, ASP.NET Black Belt Performance Techniques, yesterday afternoon. The talk was well-attended, with about 300 372in the audience. I gave the talk last month in Cleveland and it was very well-received. I promised attendees the slides and demos would be available on Tech Ed’s CommNet, and right now the slides are but I’m having trouble getting the demos uploaded so I’m…</p><br/></li><li><a href="/aspnetpro-2008-readers-choice-awards-published/"><h2 class="is-size-2" style="width:100%;word-break:break-word">aspNetPRO 2008 Readers Choice Awards Published</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="aspNetPRO 2008 Readers Choice Awards Published" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 May 2008</p><p style="width:100%;margin-top:2rem">A couple of weeks ago the aspNetPRO magazine’s annual Reader’s Choice Awards were published in their latest issue. DevExpress swept the awards, winning nine different categories as well as product of the year. I’ve blogged before about DevExpress and how I’ve been quite impressed with a lot of their tools (CodeRush, XtraReports, controls…). I’ve also gotten to know a bunch of members of their team…</p><br/></li><li><a href="/book-freakonomics/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Book: Freakonomics</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 May 2008</p><p style="width:100%;margin-top:2rem">[Freakonomics [Revised and Expanded]: A Rogue Economist Explores the Hidden Side of Everything: Steven D. Levitt, Stephen J. Dubner: Books](http://www.amazon.com/exec/obidos/ASIN/0061234001/aspalliancecom &quot;Freakonomics [Revised and Expanded]: A Rogue Economist Explores the Hidden Side of Everything: Steven D. Levitt, Stephen J. Dubner: Books&quot;) I’ve been a bit behind on blogging but I’m trying to…</p><br/></li><li><a href="/black-belt-asp-net-performance-techniques/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Black Belt ASP.NET Performance Techniques</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 May 2008</p><p style="width:100%;margin-top:2rem">Last night I presented at the Cleveland .NET SIG on Black Belt ASP.NET Performance Techniques, which is a talk I’ll be giving in a few weeks at Tech:Ed Developers in Orlando. I was asked a couple of weeks ago if I could give a talk in May and I decided to do it so I could practice for TechEd. Since this is a new talk for me (though its material is familiar), I had to put together a new set of…</p><br/></li><li><a href="/book-working-effectively-with-legacy-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Book: Working Effectively With Legacy Code</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 May 2008</p><p style="width:100%;margin-top:2rem">Working Effectively with Legacy Code (Robert C. Martin Series): Michael Feathers: Books I’ve just finished the above book, which was recommended to me by Jeffrey Palermo a few months ago. It is one of the most useful software development books I’ve read since Code Complete. I wish I’d read it years ago, and I’m finding myself refactoring and rethinking my approach to current systems I’ve been…</p><br/></li><li><a href="/comments-in-code-indicate-functions-trying-to-escape/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Comments in Code Indicate Functions Trying To Escape</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 May 2008</p><p style="width:100%;margin-top:2rem">I interviewed a couple of college students earlier this week for internship positions with Lake Quincy Media, and one of them reminded me of my own college days when we were graded in part based on how well commented our code was. In school, comments are typically there as a “check the block” measure to ensure that the professor doesn’t take off points for not having them, but in the real world…</p><br/></li><li><a href="/asp-net-ajax-download-performance-improvement-request/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET AJAX Download Performance Improvement Request</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET AJAX Download Performance Improvement Request" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 April 2008</p><p style="width:100%;margin-top:2rem">I’m a big fan of ASP.NET AJAX in general, but one concern I have and something that has forced me to use other technologies is the size of the library. It’s about 85kb when compressed and unfortunately that is quite large if you’re trying to include it on most every page on a site (or, much much worse, every advertisement in a large Microsoft developer advertising network). One can certainly argue…</p><br/></li><li><a href="/refactor-request/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Refactor Request</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Refactor Request" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 April 2008</p><p style="width:100%;margin-top:2rem">Not sure if it’s already there, but the folks at DevExpress or JetBrains (or Microsoft, but I don’t want to wait for another VS) should have a refactoring for CodeRush/Refactor! or Resharper that will convert verbose properties into C# 3.5 short properties, like so: Make this: Into this: Ideally, it should work in two forms: Right click on the property (field name let’s say) and offer it as an…</p><br/></li><li><a href="/implementing-session-timeout-aspnet/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Implementing a Session Timeout Page in ASP.NET</h2><img src="/static/a3a5a683a943d9075dc767bbc251a703/4e530/implementing-session-timeout.png" alt="Implementing a Session Timeout Page in ASP.NET" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 April 2008</p><p style="width:100%;margin-top:2rem">Introduction In many applications, an authenticated user&#x27;s session expires after a set amount of time, after which the user must log back into the system to continue using the application. Often, the user may begin entering data into a large form, switch to some other more pressing task, then return to complete the form only to find that his session has expired and he has wasted his time. One way…</p><br/></li><li><a href="/book-–-cryptonomicon/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Book – Cryptonomicon</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 March 2008</p><p style="width:100%;margin-top:2rem">One of the things I want to blog about periodically is what I’ve been reading, and a few of the things I’ve read lately have actually not been about software development (which is a good thing, if somewhat rare the last few years). One book I finished last year is the Neil Stephenson’s Cryptonomicon: Cryptonomicon This was a wonderful, very intelligent book. It did a pretty good job of making me…</p><br/></li><li><a href="/book-recommended-to-me/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Book Recommended To Me</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 March 2008</p><p style="width:100%;margin-top:2rem">I just ordered this book on the recommendation of a couple of MVC people: Working Effectively with Legacy Code (Robert C. Martin Series) Note that I don’t actually have the book yet, so I can’t tell you how I like it. But I will. Some day.</p><br/></li><li><a href="/extreme-dotnet/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - eXtreme.NET by Dr. Neil Roodyn</h2><img src="/static/ac23b5df57545a68958d526381f7113f/4e530/xtreme-dotnet.png" alt="Review - eXtreme.NET by Dr. Neil Roodyn" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 March 2008</p><p style="width:100%;margin-top:2rem">Review eXtreme .NET by Dr. Neil Roodyn provides a good introduction to Extreme Programming (XP) to .NET developers. The book&#x27;s examples are in C# and include common XP tasks such as refactoring and writing unit tests. The book also includes exercises for the reader, which provide opportunities to gain practical experience, and which also may make the book appropriate for use in a classroom…</p><br/></li><li><a href="/blackberry-pearl-8130/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Blackberry Pearl 8130</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 March 2008</p><p style="width:100%;margin-top:2rem">On Friday I finally broke down and upgraded my aging Samsung i730 PDA phone. I’ve been with Verizon for some time and have been pretty happy with their coverage and such, and they were giving me there “new every two” deal of $100 off a new phone (with a 2 year contract…) so I figured what the heck. I’m probably the last person I know who hasn’t at least tried a Blackberry, but now that I have this…</p><br/></li><li><a href="/ajax-control-toolkit-update-released/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AJAX Control Toolkit Update Released</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AJAX Control Toolkit Update Released" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 March 2008</p><p style="width:100%;margin-top:2rem">Yesterday (Leap Day), the Ajax Control Toolkit team released an update to the toolkit. This release comes in two flavors, one for the 3.5 framework (which has AJAX baked into ASP.NET 3.5) and one for the AJAX 1.0 release that is an add-on to ASP.NET. As always you can run through the live demos of the controls here. This release does not add any new controls, but does include a number of bug fixes…</p><br/></li><li><a href="/agile-for-customers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Agile For Customers</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Agile For Customers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 February 2008</p><p style="width:100%;margin-top:2rem">Tom Hollander wrote about why your customers will love agile (even if they think they hate it) last week, and made several interesting observations about how agile methodology has taken hold in many companies and teams, and why customers should really be fighting for it, rather than fearing it. He notes that, while generally project management principles aren’t particularly sexy or interesting to…</p><br/></li><li><a href="/money-for-content/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - Money for Content and Your Clicks For Free</h2><img src="/static/28d92b2469c58f8c90d79d63e348e622/4e530/money-for-content.png" alt="Review - Money for Content and Your Clicks For Free" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 February 2008</p><p style="width:100%;margin-top:2rem">Overview &quot;Money for Content and Your Clicks for Free&quot; is by cartoonist JD Frazer, aka Iliad, author of the popular computer geek cartoon series, User Friendly. Right away, this should tell you that this book is not going to be boring to read and dry like many advertising and economics books can be. What is more, JD Frazer had direct experience building up an online community site driven by…</p><br/></li><li><a href="/cio-magazine-on-agile-development/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CIO Magazine on Agile Development</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="CIO Magazine on Agile Development" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 February 2008</p><p style="width:100%;margin-top:2rem">The latest issue of CIO Magazine has a featured article on Getting Clueful: 7 Things CIOs Should Know About Agile Development. It includes quotes from a bunch of developers, including some names you’ll surely recognize if you follow Agile discussions at all, like Scott Ambler. In addition to gurus like Scott, there’s also yours truly in there, talking up the value of well-tested code as a long…</p><br/></li><li><a href="/automotive-gadget-wish-list/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Automotive Gadget Wish List</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Automotive Gadget Wish List" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 January 2008</p><p style="width:100%;margin-top:2rem">A few weeks ago I posted about Ford SYNC, which runs on Microsoft Windows Automotive. The technology is definitely a step in the right direction, but I have to agree with Sondre, another Regional Director, that it’s not enough and really should be nearly ubiquitous by now. Heck, I was amazed my last car didn’t have an aux input for my MP3 player back in 2006. Here it’s two years later and many if…</p><br/></li><li><a href="/codemash-hanselman-iis-talk/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeMash Hanselman IIS Talk</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 January 2008</p><p style="width:100%;margin-top:2rem">I’m at CodeMash today and Scott Hanselman gave the afternoon keynote on IIS7 mashups. The talk was preceded by a very funny introduction Scott gave that introduced me to the LOLCode.NET language with the help of some LOLCats and humorous sample code. The talk focused on how to hook up a PHP application in IIS7, and then enhance it with a few features by adding modules to the HTTP pipeline. For…</p><br/></li><li><a href="/attending-codemash-2008/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Attending CodeMash 2008</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Attending CodeMash 2008" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 January 2008</p><p style="width:100%;margin-top:2rem">I’ll be attending CodeMash again for its second year, at the Kalahari Resort in Ohio. Last year it was a great local conference and this year I expect it will be even better. The conference is uniqe in its approach in that it combines a wide variety of developer technologies in one place, and encourages crossover for all attendees. In this way I believe it is somewhat similar to MIX, but as I’ve…</p><br/></li><li><a href="/being-agile-means-understanding-when-to-change/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Being Agile Means Understanding When to Change</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Being Agile Means Understanding When to Change" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 December 2007</p><p style="width:100%;margin-top:2rem">While I was completing my drive into work this morning, I was thinking about a book I read recently, Cryptonomicon (highly recommended – very smart and interesting), in which there’s an exchange between a WWII German cryptanalyst and some of his Allied counterparts. The German had discovered a flaw in the Enigma system used by the Germans during the war, and had written a paper about how to…</p><br/></li><li><a href="/extending-dropdownlist-enums/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Extending the DropDownList to Support Enums</h2><img src="/static/58d326e88317d8dcb24fa6f71dee926a/4e530/dropdown-enums.png" alt="Extending the DropDownList to Support Enums" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 December 2007</p><p style="width:100%;margin-top:2rem">Introduction A fairly common task in some of the applications I work with is to provide a user with a DropDownList of options that is populated by an enum. This can easily be done with a little bit of code to bind a stock DropDownList control to the enum, but this kind of thing quickly starts to violate the DRY (Don&#x27;t Repeat Yourself) principle, so I created a simple derived DropDownList control…</p><br/></li><li><a href="/browserhawk-11-released/"><h2 class="is-size-2" style="width:100%;word-break:break-word">BrowserHawk 11 Released</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2007</p><p style="width:100%;margin-top:2rem">CyScape recently announced the latest version of their browser capabilities control, BrowserHawk 11. While I haven’t had a chance to review this new product yet, it touts some new features that at least appear to be pretty compelling. I use BrowserHawk and CountryHawk for LakeQuincy’s advertising solution, AdSignia, to quickly determine each ad request’s geographic location, allowing for certain…</p><br/></li><li><a href="/asp-net-model-view-controller-architecture/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Model View Controller Architecture</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Model View Controller Architecture" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 October 2007</p><p style="width:100%;margin-top:2rem">A little while ago, Scotts Guthrie and Hanselman presented on MVC in ASP.NET (and Dynamic Languages) at the oddly named ALT.NET conference in Texas. I’m with ScottH that “Alt” is a pretty silly name and something like Agile or Pragmatic would be a much better descriptor. Alternative is not terribly descriptive since anything that differs from the norm is alternative, and not necessarily better. It…</p><br/></li><li><a href="/caching-talk-in-phoenix/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Talk in Phoenix</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 October 2007</p><p style="width:100%;margin-top:2rem">Tuesday night I gave a presentation on caching in ASP.NET (with a bit of async performance tips thrown in at the end) to the Arizona .NET User Group in Phoenix, Arizona. A lot of the demos were similar to ones I’ve given before, including in my recent DNRTV Show on Caching. I’ve posted the samples from Tuesday night’s talkhere, which include the async demo I did as well as an updated version that…</p><br/></li><li><a href="/caching-in-asp-net-show-on-dnrtv/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching in ASP.NET Show on dnrTV</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 October 2007</p><p style="width:100%;margin-top:2rem">I’m on dnrTV this week with a show about Caching in ASP.NET, one of my favorite topics. I think the whole show is a bit under an hour and I go through a bunch of demos and show off some of the less-well-known features of caching, such as cache profiles, programmatic output cache invalidation, and the Substitution control that lets you have dynamic contents on a fully output-cached page. I also…</p><br/></li><li><a href="/case-sensitive-or-insensitive-sql-query/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Case Sensitive or Insensitive SQL Query</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 September 2007</p><p style="width:100%;margin-top:2rem">Suppose you need to perform a SQL query and you need for it to be case sensitive or case insensitive, an either your database is set up the opposite way or you&#x27;re smart and you&#x27;re trying to write your query so that it will work regardless of how the database may or may not be configured. For instance, consider this query: If your database contains an email for Bill like this one: BillG@microsoft…</p><br/></li><li><a href="/ajax-control-toolkit-update-september-2007/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AJAX Control Toolkit Update September 2007</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AJAX Control Toolkit Update September 2007" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 September 2007</p><p style="width:100%;margin-top:2rem">The AJAX Control Toolkit just released a new version for September 2007. You can get version 10920 now from CodePlex. This release is meant to improve the stability and quality of the controls and includes a bunch of fixes both at the general and control-specific level. There are no new controls in this release. You can view live demos of the toolkit controls on the AJAX Control Toolkit Sample…</p><br/></li><li><a href="/consolas-font-in-vista/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Consolas Font in Vista</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 September 2007</p><p style="width:100%;margin-top:2rem">I&#x27;ve recently been experimenting with other fonts for Visual Studio on Vista after reading this article on new fonts in Vista. I think I like Consolas better than Courier New for coding, if only for its novelty. It also tends to be a little bit more compact than Courier New at the same font size, which is nice to keep long lines from wrapping. Have a look at the difference, see what you think…</p><br/></li><li><a href="/accessing-session-from-an-httphandler/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Accessing Session from an HttpHandler</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Accessing Session from an HttpHandler" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 July 2007</p><p style="width:100%;margin-top:2rem">I’ve run into this before but forgotten about it. I wrote an HttpHandler recently and was trying to access the Session object from the passed in HttpContext context object with context.Session[“foo”] = “bar”; and I encountered a NullReferenceException. Some searching quickly yielded the answer, which is that in order to access Session from an HttpHandler you need to add a marker interface (meaning…</p><br/></li><li><a href="/atlanta-silverlight-training/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlanta Silverlight Training</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlanta Silverlight Training" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 June 2007</p><p style="width:100%;margin-top:2rem">Shawn Wildermuth is teaching a class on Silverlight 1.0 and 1.1 in Atlanta through Dunn Training. The three day Silverlight Workshop is being offered July 16-18, August 13-15, and September 17-19. It looks like it will be a good class, based on the outline provided on the course web site.</p><br/></li><li><a href="/asp-net-scalability-panel-recording-available/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Scalability Panel Recording Available</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Scalability Panel Recording Available" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 June 2007</p><p style="width:100%;margin-top:2rem">I was honored to be asked to participate in a panel discussing ASP.NET Scalability at TechEd 2007 a couple of weeks ago. The panel was moderated by Richard Campbell and Carl Franklin of DotNetRocks, and included Stephen Forte, Kent Alstad, Rob Howard, and myself. The recording of that discussion is now available here: ASP.NET Scalability Panel – TechEd 2007</p><br/></li><li><a href="/beyond-good-enough-is-waste/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Beyond Good Enough Is Waste</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 June 2007</p><p style="width:100%;margin-top:2rem">I just finished reading Jon Galloway’s post, The value of “good enough” technology, and it reminded me of something I repeat very often in my talks on improving performance and/or caching (which share some content as you may imagine). I wanted to emphasize one point a bit more succinctly than Jon did, and that is that in software development (and I imagine in any endeavor where resources are…</p><br/></li><li><a href="/acropolis-ctp-available/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Acropolis CTP Available</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Acropolis CTP Available" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 June 2007</p><p style="width:100%;margin-top:2rem">Acropolis CTP 1 is now available. From the source: The Microsoft code name “Acropolis” Community Technology Preview 1 is a set of components and tools that make it easier for developers to build and manage modular, business focused, client .NET applications. Acropolis is part of the “.NET Client Futures” wave of releases, our preview of upcoming technologies for Windows client development…</p><br/></li><li><a href="/asp-net-workflow/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Workflow</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Workflow" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2007</p><p style="width:100%;margin-top:2rem">Matt Winkler posted some very cool stuff regarding using Windows Workflow and ASP.NET on his blog a few days ago. I’m just getting around to commenting on it myself. Incidentally, there are live bits to install this time. Naturally I haven’t had a chance to play with this myself (or much of anything else that’s come out in the last few months), but I definitely am looking forward to being able to…</p><br/></li><li><a href="/columbus-ohio-net-positions-available/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Columbus Ohio .NET Positions Available</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 March 2007</p><p style="width:100%;margin-top:2rem">Quick Solutions in Ohio is looking for a bunch of .NET developers with solid skills for the Columbus, Ohio office. Here’s the job posting: Work with experienced, knowledgeable professionals who are passionate about technology. Quick Solutions, Inc., a leader in the successful delivery of information technology solutions, is currently looking for exceptional Microsoft .NET development…</p><br/></li><li><a href="/asp-net-wish-list/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Wish List</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Wish List" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 March 2007</p><p style="width:100%;margin-top:2rem">I’m at the MVP Summit this week in Seattle and one of the things this provides an opportunity for is providing feedback to the product teams. I certainly have plenty of ideas of my own for new features I’ve been longing to see in ASP.NET, as well as fixes for some annoyances. If you have ASP.NET feature requests of your own, please add them as comments. I’m going to make sure the ASP.NET team…</p><br/></li><li><a href="/coding-optimization-tip-avoid-repeated-findcontrol-use/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Coding Optimization Tip: Avoid Repeated FindControl() Use</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 January 2007</p><p style="width:100%;margin-top:2rem">In a project I’m working on I have a recursive FindControl() which is quite useful for finding controls that are hiding inside of templates like LoginView or CreateUserWizard. I’m working with some junior developers and trying to instill best practices into them. This is an example of a code optimization technique I’m applying today to some code one of them wrote. Problem Code: The big problem…</p><br/></li><li><a href="/codefile-or-codebehind/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeFile or CodeBehind</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 January 2007</p><p style="width:100%;margin-top:2rem">I just fixed a problem on a coworker’s machine that was quite odd in that the fix involved simply changing CodeFile to CodeBehind in a user control (.ascx) file. The issue was that in the ASPX page I was doing a FindControl within a Repeater’s ItemDataBound event, and casting the resulting control to the type of the codebehind of the user control. So for example if the user control was foo.ascx…</p><br/></li><li><a href="/asp-net-ajax-1-0-released-today/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET AJAX 1.0 Released Today</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET AJAX 1.0 Released Today" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 January 2007</p><p style="width:100%;margin-top:2rem">Today, Microsoft released ASP.NET AJAX 1.0. You can download it, as well as the latest AJAX Control Toolkit and Futures January CTP, from http://ajax.asp.net/. Kudos to the ASP.NET team for making this happen! I know a lot of web applications have been waiting for this day to go live with their AJAX implementations, including several of my own projects which should be upgraded in the next day or…</p><br/></li><li><a href="/codemash-day-one-thoughts/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeMash Day One Thoughts</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 January 2007</p><p style="width:100%;margin-top:2rem">Well, to start, Josh Holmeshas said he’ll shave his head if Technorati has indexed at least 500 codemash blog posts by the end of the show this evening. So, this will bring him 0.2% closer to that… I didn’t make it to CodeMashquite as early as I’d have liked, but I did have the opportunity to use the water park with my family for a little while, and then to meet up with Scott Guthrieand several…</p><br/></li><li><a href="/codemash-scott-guthrie-linq-keynote/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeMash Scott Guthrie LINQ Keynote</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 January 2007</p><p style="width:100%;margin-top:2rem">One of the points in Scott’s keynote at CodeMash was the idea that declarative programming (saying “what I want”) has many advantages over imperative programming (“how I want to do it”). One advantage he noted is that as we start to move more and more toward multi-core computers, rather than faster and faster single cores, the need for applications to be partitionable over multiple processors will…</p><br/></li><li><a href="/ccnet-with-msbuild-and-assemblyinfotask/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CCNET with MSBuild and AssemblyInfoTask</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="CCNET with MSBuild and AssemblyInfoTask" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 January 2007</p><p style="width:100%;margin-top:2rem">This afternoon I embarked on a quick (hah!) task to fix a problem with my CC.NETimplementation. I’m using CC.NET running on my Team Foundation Server machine. It checks my TFS source control to see when anything in my project has changed, and if it has, it kicks off a build using an MSBuild task pointing at a solution (.sln) file which it grabs from source control. The problem I’m encountering is…</p><br/></li><li><a href="/instant-csharp/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - Instant C# and Instant VB Code Conversion Utilities</h2><img src="/static/9fa9ca73896aa5f196ea2fe2de259c0a/4e530/instant-csharp.png" alt="Review - Instant C# and Instant VB Code Conversion Utilities" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 January 2007</p><p style="width:100%;margin-top:2rem">Introduction Since the introduction of .NET, the Common Language Runtime, and C#, developers with a preference for C# or Visual Basic have been faced with the task of converting source code written in one language to the other. Whether to get an online sample working, to integrate some code developed by another team, or just to try and learn the ins and outs of the other language, converting from…</p><br/></li><li><a href="/alienware-end-of-life-–-what-so-soon/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Alienware End Of Life – What? So Soon?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Alienware End Of Life – What? So Soon?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 January 2007</p><p style="width:100%;margin-top:2rem">I own an Alienware m7700 17” beast of a notebook computer. I bought it in December of 2004 as my big splurge after returning from a tour in Iraq (my buddies were all buying cars and Harleys, so I figured a laptop for work and games was pretty conservative in comparison). It worked as advertised, and was fabulous for playing Counterstrike and other games throughout 2005 and as a development machine…</p><br/></li><li><a href="/codemash-–-an-ohio-tech-conference/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeMash – An Ohio Tech Conference</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 January 2007</p><p style="width:100%;margin-top:2rem">What&#x27;s that you say? Ohio has no tech conferences? Well, we do now! Register quickly for CodeMash, happening next week in Sandusky, Ohio (not too far from Michigan and Indiana). CodeMash – I&#x27;ll be there! CodeMash</p><br/></li><li><a href="/asp-net-hosting-recommendation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Hosting Recommendation</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Hosting Recommendation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 January 2007</p><p style="width:100%;margin-top:2rem">Recently I was asked if I could provide a reference for my hosting company, ORCS Web. After responding, I thought it would be worth spreading the love a little via my blog as well. So, now that I’m somewhat recovered from the holidays, here goes. The questions below were asked by a potential customer – the answers are mine and refer to my personal experience with ORCS Web. We are looking at moving…</p><br/></li><li><a href="/animated-musical-light-show-project/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Animated Musical Light Show Project</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Animated Musical Light Show Project" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 December 2006</p><p style="width:100%;margin-top:2rem">Brian Peek of ASPSOFT has an article showing how to create an animated light show to your favorite holiday music on MSDN. It includes a video which you should really check out, and instructions for creating your own with all the hardware and software notes you’ll need. Very cool.</p><br/></li><li><a href="/c-3-0-feature-notes/"><h2 class="is-size-2" style="width:100%;word-break:break-word">C# 3.0 Feature Notes</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 December 2006</p><p style="width:100%;margin-top:2rem">Anders Heljsberg has been giving us an overview of new C# 3.0 features this morning. I’ve made a few notes. Most of this info is available elsewhere, and I’m not re-typing the code from his demos, but there might be some useful tidbits here for some folks. First by way of background, Anders noted the evolution of C# and the key feature that defined each version: C# 1.0 – Managed Code C# 2.…</p><br/></li><li><a href="/aspinsiders-public-notes-–-scott-guthrie/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASPInsiders Public Notes – Scott Guthrie</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASPInsiders Public Notes – Scott Guthrie" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 December 2006</p><p style="width:100%;margin-top:2rem">VS 2005 SP1 coming soon (end of year, hopefully). Will include: 2200+ bug fixes Built-in Web Application Project support GDRs are public fixes (patch rollups) that include rollups of QFEs – GDRs are similar to service packs but service packs affect support (Microsoft supports the latest service pack and the previous service pack, but not further back). So – GDRs are good because they provide…</p><br/></li><li><a href="/assemblybinding-in-web-config-and-xmlns/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AssemblyBinding in Web Config and XMLNS</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AssemblyBinding in Web Config and XMLNS" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 November 2006</p><p style="width:100%;margin-top:2rem">Ran into this (again, I think) today while setting up some assembly binding between Telerik and PeterBlum controls in my LakeQuincy web site. The short version is that the presence of an xmlns= in your node of web.config will prevent ASP.NET 2.0 from reading any assemblyBinding tag. So if you have something like this: You will want to replace it with this: Then your tags in your element (like…</p><br/></li><li><a href="/locate-web-visitors-countryhawk/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - Locate Web Visitors With CountryHawk</h2><img src="/static/a0f0b85ee8d8e7dbed6893c061fb19fb/4e530/countryhawk.png" alt="Review - Locate Web Visitors With CountryHawk" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 October 2006</p><p style="width:100%;margin-top:2rem">Bottom Line Up Front I&#x27;ve been using CountryHawk for almost a year now and have been very pleased with its accuracy and performance for my needs. I had previously evaluated some free geotargeting software I found via searching the &#x27;net, but I was not impressed with the results, and there was still a charge for updated data files. With CountryHawk, I receive monthly updates which require one step…</p><br/></li><li><a href="/componentart-atlas-controls/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ComponentArt Atlas Controls</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 September 2006</p><p style="width:100%;margin-top:2rem">ComponentArt just released a version of their Web.UI suite, which is built for ASP.NET AJAX (aka “Atlas”). Web.UI 2006.2 for ASP.NET AJAX is “the most advanced AJAX framework available. ComponentArt Web.UI for ASP.NET AJAX is the first commercial control suite designed to fully utilize this new framework.” I haven’t had a chance to do more than view the demos but they look pretty slick. The line…</p><br/></li><li><a href="/atlas-contest-winners-announced/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas Contest Winners Announced</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas Contest Winners Announced" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 September 2006</p><p style="width:100%;margin-top:2rem">Microsoft’s Mash It Up With Atlas contest has ended, and the grand prize winner was DotNetSlacker sand Alessandro Gallo (aka Garbin).Congratulations! See all the winners here: http://atlas.asp.net/default.aspx?tabid=47&amp;subtabid=475</p><br/></li><li><a href="/conditional-attribute-and-trace-in-asp-net-2-0/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Conditional Attribute and TRACE in ASP.NET 2.0</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 September 2006</p><p style="width:100%;margin-top:2rem">In ASP.NET 1.x I had created some helper classes that wrapped the ASP.NET Trace class. These included methods like this one: [Conditional(“TRACE”)] public static void Write(string category, string message, Exception myException) { context = HttpContext.Current; if (context != null) context.Trace.Write(category, message, myException); } In VS2003, I would simply mark my project as having the TRACE…</p><br/></li><li><a href="/caching-in-o-r-mappers-and-data-layers-1/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching in O/R Mappers and Data Layers</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 September 2006</p><p style="width:100%;margin-top:2rem">Frans Bouma, creator of LLBLGen, MVP, and all around very smart guy, wrote yesterday about the ‘myth’ that caching inside an Object-Relational (O/R) mapper makes queries run faster or makes the O/R mapper more efficient. I think he’s missing a few key usage scenarios (and, what’s more, I think he generally has a dislike of caching for whatever reason, which may bias his opinion), which I’d like to…</p><br/></li><li><a href="/caching-in-o-r-mappers-and-data-layers/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching in O/R Mappers and Data Layers</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 September 2006</p><p style="width:100%;margin-top:2rem">Frans Bouma, creator of LLBLGen, MVP, and all around very smart guy, wrote yesterday about the ‘myth’ that caching inside an Object-Relational (O/R) mapper makes queries run faster or makes the O/R mapper more efficient. I think he’s missing a few key usage scenarios (and, what’s more, I think he generally has a dislike of caching for whatever reason, which may bias his opinion), which I’d like to…</p><br/></li><li><a href="/add-profile-items-in-createuserwizard-and-recursive-findcontrol-1/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Add Profile Items in CreateUserWizard and Recursive FindControl</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Add Profile Items in CreateUserWizard and Recursive FindControl" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 August 2006</p><p style="width:100%;margin-top:2rem">There&#x27;s an example in Professional ASP.NET 2.0 that shows how to add a few profile items to a CreateUserWizard. Unfortunately, it doesn&#x27;t work in certain cases, specifically when the profile item in question is set to allowAnonymous=&quot;false&quot;. When that happens, you will receive this error: &quot;This property cannot be set for anonymous users.&quot; One fix is to simply set the allowAnonymous flag to true…</p><br/></li><li><a href="/add-profile-items-in-createuserwizard-and-recursive-findcontrol/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Add Profile Items in CreateUserWizard and Recursive FindControl</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Add Profile Items in CreateUserWizard and Recursive FindControl" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 August 2006</p><p style="width:100%;margin-top:2rem">There&#x27;s an example in Professional ASP.NET 2.0 that shows how to add a few profile items to a CreateUserWizard. Unfortunately, it doesn&#x27;t work in certain cases, specifically when the profile item in question is set to allowAnonymous=&quot;false&quot;. When that happens, you will receive this error: &quot;This property cannot be set for anonymous users.&quot; One fix is to simply set the allowAnonymous flag to true…</p><br/></li><li><a href="/community-server-upgrade-1/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Community Server Upgrade</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 August 2006</p><p style="width:100%;margin-top:2rem">Yesterday we upgraded AspAdvice (and the other Advice Sites) to Community Server 2.1. If you find any bugs or things that don&#x27;t look right, please contact me and let me know and we&#x27;ll work on getting them fixed. One of the biggest changes from 2.0 to 2.1 is the implementation of tags rather than categories, and the tag clouds that you&#x27;ll now see in several places on blogs and blog listings on the…</p><br/></li><li><a href="/community-server-upgrade/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Community Server Upgrade</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 August 2006</p><p style="width:100%;margin-top:2rem">Yesterday we upgraded AspAdvice (and the other Advice Sites) to Community Server 2.1. If you find any bugs or things that don&#x27;t look right, please contact me and let me know and we&#x27;ll work on getting them fixed. One of the biggest changes from 2.0 to 2.1 is the implementation of tags rather than categories, and the tag clouds that you&#x27;ll now see in several places on blogs and blog listings on the…</p><br/></li><li><a href="/asp-net-2-0-mvp-hacks-and-tips/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET 2.0 MVP Hacks and Tips</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET 2.0 MVP Hacks and Tips" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 August 2006</p><p style="width:100%;margin-top:2rem">I got a copy of WROX’s ASP.NET 2.0 MVP Hacks and Tips yesterday and skimmed the TOC and read a few chapters. I have to say that this is a very good book from my first impression of it, based on the fact that I learned a few new techniques in just the brief amount of time I’ve spent on it so far. Since I haven’t read the whole thing yet, I can’t write up a good formal review, but let me give you…</p><br/></li><li><a href="/atlas-naming-game-1/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas Naming Game</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas Naming Game" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 August 2006</p><p style="width:100%;margin-top:2rem">Ok, Microsoft &quot;Atlas&quot; is now less than six months away, assuming it ships on schedule or with minimal slippage. That means it&#x27;s now time to play… Name That Microsoft Product! I&#x27;ll be your host, and will get the ball rolling. Note that some of these potential names are serious, and some are less so, but by all means, vote for your favorite by posting in the comments. Also, some of these I&#x27;m listing…</p><br/></li><li><a href="/atlas-naming-game/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas Naming Game</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas Naming Game" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 August 2006</p><p style="width:100%;margin-top:2rem">Ok, Microsoft &quot;Atlas&quot; is now less than six months away, assuming it ships on schedule or with minimal slippage. That means it&#x27;s now time to play… Name That Microsoft Product! I&#x27;ll be your host, and will get the ball rolling. Note that some of these potential names are serious, and some are less so, but by all means, vote for your favorite by posting in the comments. Also, some of these I&#x27;m listing…</p><br/></li><li><a href="/20140-2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Atlas July CTP Now Available</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Atlas July CTP Now Available" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 August 2006</p><p style="width:100%;margin-top:2rem">You can now download the July Community Tech Preview of Atlas here. Some Details: UpdatePanel and ScriptManager: ScriptManager.RegisterControl() takes optional parameter to specify client type to create. Fix for UpdatePanels in Firefox. Drag and Drop: Added public dragStart/dragEnd events to DragDropManager. dragStart fires with dragMode, dataType, and data as eventArgs. dragStop fires with empty…</p><br/></li><li><a href="/20140/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Atlas July CTP Now Available</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Atlas July CTP Now Available" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 August 2006</p><p style="width:100%;margin-top:2rem">You can now download the July Community Tech Preview of Atlas here. Some Details: UpdatePanel and ScriptManager: ScriptManager.RegisterControl() takes optional parameter to specify client type to create. Fix for UpdatePanels in Firefox. Drag and Drop: Added public dragStart/dragEnd events to DragDropManager. dragStart fires with dragMode, dataType, and data as eventArgs. dragStop fires with empty…</p><br/></li><li><a href="/20150-2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Lake Quincy Media Site Facelift</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Lake Quincy Media Site Facelift" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 August 2006</p><p style="width:100%;margin-top:2rem">Lake Quincy Media, the advertising network made up exclusively of .NET developer community web sites, has been undergoing a substantial redesign throughout the month of July. Well, after a lot of work, the new design was launched yesterday. The new design is, I think, much more professional and attractive than the one I managed to put together earlier this year, which is a credit to the design…</p><br/></li><li><a href="/20150/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Lake Quincy Media Site Facelift</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Lake Quincy Media Site Facelift" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 August 2006</p><p style="width:100%;margin-top:2rem">Lake Quincy Media, the advertising network made up exclusively of .NET developer community web sites, has been undergoing a substantial redesign throughout the month of July. Well, after a lot of work, the new design was launched yesterday. The new design is, I think, much more professional and attractive than the one I managed to put together earlier this year, which is a credit to the design…</p><br/></li><li><a href="/20125-2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">C# Feeds and News</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="C# Feeds and News" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 July 2006</p><p style="width:100%;margin-top:2rem">Today CSharpFeeds officially goes live. This is a pet project of mine and Gregg Stark’s based on Serge’s VBFeeds.com site and its source code (thanks to Serge for letting me see the source!). VBFeeds is a great place to find just VB information from the top VB people, moderated so that it doesn’t include posts about going on vacation or other personal posts. C# Feeds seeks to do the exact same…</p><br/></li><li><a href="/20125/"><h2 class="is-size-2" style="width:100%;word-break:break-word">C# Feeds and News</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="C# Feeds and News" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 July 2006</p><p style="width:100%;margin-top:2rem">Today CSharpFeeds officially goes live. This is a pet project of mine and Gregg Stark’s based on Serge’s VBFeeds.com site and its source code (thanks to Serge for letting me see the source!). VBFeeds is a great place to find just VB information from the top VB people, moderated so that it doesn’t include posts about going on vacation or other personal posts. C# Feeds seeks to do the exact same…</p><br/></li><li><a href="/20041/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Microsoft Twelve Tenets to Promote Competition</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Microsoft Twelve Tenets to Promote Competition" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 July 2006</p><p style="width:100%;margin-top:2rem">Microsoft recently announced the publication of its Twelve Tenets to Promote Competition, also referred to as “Windows Principles”. These include: Principle I: Choice for Computer Manufacturers and Customers Installation of any software (by OEMs and end customers)\ Easy access (to windows navigation by OEMs and end customers)\ Defaults (for things like media playing, Internet browsing)\ Exclusive…</p><br/></li><li><a href="/20050/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas Plugged – Columbus User Group</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas Plugged – Columbus User Group" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 July 2006</p><p style="width:100%;margin-top:2rem">I gave a presentation on Atlasto the Central Ohio .NET User Grouplast night. About 50 people were in attendance and I thought the presentation went pretty well, especially considering it was my first time presention on this subject. I’ve posted my slides and samples on the ASPAlliance Resource Directory – the direct link is Atlas Plugged – July 2006 After the presentation I went out with about a…</p><br/></li><li><a href="/19983/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas DragOverlayExtender Controls Return To Original Position</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas DragOverlayExtender Controls Return To Original Position" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 July 2006</p><p style="width:100%;margin-top:2rem">While using the DragOverlay in a demo I ran into a problem where the controls I wanted to drag around the page kept on returning to their original position when I released my mouse button. A quick internet search found me Rob Garrett’s post, which describes this issue and the fix: Basically, you can’t drag items beyond the rendered area of the HTML page. For a demo, there’s not a lot of HTML on…</p><br/></li><li><a href="/19962/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking in Columbus Tomorrow</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Speaking in Columbus Tomorrow" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 July 2006</p><p style="width:100%;margin-top:2rem">I’m giving a presentation on Atlas tomorrow (Thursday July 27th) in Columbus, Ohio. Stop by if you’re interested. Here’s more information about the time/place/details. http://www.condg.org/</p><br/></li><li><a href="/19966/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Run Cassini as Root Web within Visual Studio</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Run Cassini as Root Web within Visual Studio" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 July 2006</p><p style="width:100%;margin-top:2rem">I’ve been fighting with differences in folder paths between production and dev (via Cassini / WebDevServer) for a while now and stumbled upon this forum topic today and gave it a shot. The forum didn’t provide full details but here’s what I managed to figure out. Yes, Cassini supports root pathed sites, but it’s not how Visual Studio (or, presently, Expression Web Designer) are configured to use…</p><br/></li><li><a href="/19837/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Adding Master Page Support to Dynamically Created Pages</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Adding Master Page Support to Dynamically Created Pages" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 July 2006</p><p style="width:100%;margin-top:2rem">Yesterday I wrote about AspAlliance.SimpleCms, which is coming along still today. One hurdle Brendan and I were facing was how to allow a dynamically created (from a PageHandlerFactory) page to specify a master page. The idea is that the page, which resides in a separate assembly from the main web application, will use a master page specified within web.config and residing in the main web…</p><br/></li><li><a href="/19815/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Book Review – Murach C# 2005</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Book Review – Murach C# 2005" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 July 2006</p><p style="width:100%;margin-top:2rem">Murach&#x27;s C# 2005 Murach’s C# 2005 is one of many books I’ve picked up since .NET 2.0/VS2005 went gold last November. I have to say, I really love the layout of Murach’s line of books. The book would make an ideal textbook for a training class, but outside of a training environment it is still a great learning tool. In addition to great technical material, each chapter also includes practice…</p><br/></li><li><a href="/19797/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AspAlliance Simple CMS Plugin</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AspAlliance Simple CMS Plugin" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 July 2006</p><p style="width:100%;margin-top:2rem">I’ve been interested in plug-in applications for ASP.NET for a while now. I think it can be a very powerful way to quickly add new functionality to an existing site without significant rework of the site being extended. The architecture that makes this possible is the HttpHandler and HttpModule combination that, in fact, is what makes ASP.NET work in the first place. One simple example of such an…</p><br/></li><li><a href="/19739/"><h2 class="is-size-2" style="width:100%;word-break:break-word">New Caching Video</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="New Caching Video" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 July 2006</p><p style="width:100%;margin-top:2rem">I recored a quick video demonstrating the effects of a very short duration cache on a page that’s hitting the database more than 1/second (microcaching). This is one of my favorite demos when I give my caching presentations – I believe I first saw Rob Howard do pretty much the same demo quite a few years ago so credit goes to him for the idea. You’ll find the video in the ASPAlliance Videos…</p><br/></li><li><a href="/19652/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Best Web Hosting</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Best Web Hosting" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 July 2006</p><p style="width:100%;margin-top:2rem">I just filled out a customer satisfaction survey for my hosting provider, ORCSWeb, which makes me think I should probably write a little something here in my blog about how much I like them. I’ve been using ORCSWeb’s services for what seems like forever, but off the top of my head I’d have to say at least since 2000. Before switching to them, I had used a couple of other hosting providers, all of…</p><br/></li><li><a href="/19630/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Starter Kits and Samples for SQLExpress and .NET 2.0</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Starter Kits and Samples for SQLExpress and .NET 2.0" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 July 2006</p><p style="width:100%;margin-top:2rem">If you haven’t seen them already, there are a bunch of sample applications available for SQL 2005 from Microsoft. These include: Internet Explorer Favorites Manager Skills Manager Survey Manager Help Desk Web Reports Windows Reports In addition, there are also a number of Starter Kit apps available. I’m not sure what makes one thing a “Starter Kit” and another a “Sample” (the web sites state that…</p><br/></li><li><a href="/19444/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Presenting to Cleveland .NET SIG Tuesday Night</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Presenting to Cleveland .NET SIG Tuesday Night" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 July 2006</p><p style="width:100%;margin-top:2rem">I’ll be speaking to the Cleveland .NET SIG tomorrow night about .NET Caching Best Practices, my current (and somewhat longstanding) favorite topic. If you’re in the area, stop by and say hello. The details: Next Meeting: .NET Caching Best Practices Presented by Steve Smith – Founder ASPAlliance July 11th, 2006 5:45pm – 7:30pm Location: Microsoft Corporation 6050 Oak Tree Blvd. Independence, Ohio…</p><br/></li><li><a href="/19224/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas June CTP Available</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas June CTP Available" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 July 2006</p><p style="width:100%;margin-top:2rem">If you’ve been usingAtlas, or if you’ve been waiting for a more stable version of Atlas, the latest Community Tech Preview release is now available.Download the June CTP here.</p><br/></li><li><a href="/19315/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Team Foundation Source Control Tips</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Team Foundation Source Control Tips" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 July 2006</p><p style="width:100%;margin-top:2rem">Barry Gervin recently wrote some nice tips for working with source control and Team System on a mailing list: The best guidance is to do a Get on the entire tree just before you begin a new logic of work. Work on it for however long it takes – and then when you are ready to check it in – do another get latest first and make sure you can still build/run tests. This is an important step to properly…</p><br/></li><li><a href="/19221/"><h2 class="is-size-2" style="width:100%;word-break:break-word">BoundField DataFormatString attribute not working</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="BoundField DataFormatString attribute not working" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 July 2006</p><p style="width:100%;margin-top:2rem">I was stuck with a problem a few weeks ago where my DataFormatString on a BoundField in a GridView was not being applied. I had a chance to look at the code again today and found this very helpful post by Raj Kaimal with the fix this morning. The short answer is that you need to set HtmlEncode=”false” in order for the DataFormatString to work. The HtmlEncoding by default is designed to defeat…</p><br/></li><li><a href="/19223/"><h2 class="is-size-2" style="width:100%;word-break:break-word">LLBLGen v2 Released</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="LLBLGen v2 Released" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 July 2006</p><p style="width:100%;margin-top:2rem">Frans announced yesterday that LLBLGen 2.0 has been released! I’ve been using LLBLGen happily for several years now. It is a very solid ORM tool and I’m looking forward to using the new version going forward. You can read a list of new features and enhancements here. If you haven’t used LLBLGen before, I recommend downloading the tool and the sample Pet Shop application that Frans has written…</p><br/></li><li><a href="/19054/"><h2 class="is-size-2" style="width:100%;word-break:break-word">TechSmith at TechEd</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="TechSmith at TechEd" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 June 2006</p><p style="width:100%;margin-top:2rem">I love TechSmith – they have some extremely cool tools including my favorite, Camtasia, which is the de facto standard for creating screencasts and coding/presentation videos (like the Atlas videos now on ASPAlliance.com). I finally got a chance to meet up with TechSmith Chief Evangelist Betsy Weber, whom I’ve worked with via email for years, and she posted a picture of us on Flickr: Incidentally…</p><br/></li><li><a href="/19055/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Sandbox Projects</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Sandbox Projects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 June 2006</p><p style="width:100%;margin-top:2rem">Ambrose posted about the ASP.NET Sandbox yesterday (which I saw in my daily DotNetSlackers new email), which prompted me to have another look at it. Read Ambrose’s post first – he gives a nice overview of what’s there. The list includes some projects that have had big press, like Web Application Projects and Web Deployment Projects, but there are also some less-well-known projects in the works…</p><br/></li><li><a href="/18721/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tech Ed 2006 Summary</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Tech Ed 2006 Summary" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 June 2006</p><p style="width:100%;margin-top:2rem">I haven’t posted in a bit, so let me summarize what I’ve been doing the last few days, apart from going to various parties and staying out late. Monday I went to several Regional Director connect meetings with various Microsoft teams – didn’t make it to any sessions. I spent about an hour with SoftArtisans learning about how their OfficeWriter product integrates with Microsoft SQL Reporting…</p><br/></li><li><a href="/18722/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas, IIS7, and BLINQ</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas, IIS7, and BLINQ" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 June 2006</p><p style="width:100%;margin-top:2rem">Scott Guthrie presented on Atlas and BLINQ this afternoon at TechEd. The latest Atlas bits seem to be coming along very nicely, allowing standard ASP.NET controls to be decorated with functionality without the need to replace or modify the original controls. One nice concequence of this “add on” nature of the tool is that it can be used to correct deficiencies that were present when ASP.NET 2.…</p><br/></li><li><a href="/18723/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Birds of a Feather</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Caching Birds of a Feather" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 June 2006</p><p style="width:100%;margin-top:2rem">I hosted a Caching Best Practices Birds of a Feather today at Tech Ed. The attendance was not quite as great as I’d hoped but wasn’t terrible – about 15–20 people came. Overall I think it went reasonably well, with a number of people having questions and plenty of others with good experience to share. I talked about some of my favorite caching tips, tricks, and less-well-known ASP.NET caching…</p><br/></li><li><a href="/18724/"><h2 class="is-size-2" style="width:100%;word-break:break-word">TechEd Boston – What&#x27;s Up With All the Cows?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="TechEd Boston – What&#x27;s Up With All the Cows?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 June 2006</p><p style="width:100%;margin-top:2rem">So, all week at Boston I’ve seen these cows all over the city, and have been wondering what, if any, significance they have. I finally broke down and did some searching and found this: http://boston.cowparade.com/</p><br/></li><li><a href="/18679/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Software Projects As Seen By Everyone Involved – Cartoon</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Software Projects As Seen By Everyone Involved – Cartoon" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 June 2006</p><p style="width:100%;margin-top:2rem">This is a great cartoon showing the life of a simple software project, as a cartoon. So true, it’s funny. http://www.scaryideas.com/Cartoons/ITProjects/project_1.5.html</p><br/></li><li><a href="/18642/"><h2 class="is-size-2" style="width:100%;word-break:break-word">New Video: Using the ATLAS Confirm Button</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="New Video: Using the ATLAS Confirm Button" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 June 2006</p><p style="width:100%;margin-top:2rem">Mohammad Azam has a new video up on AspAlliance.com Videos on Using the ATLAS Confirm Button. Check it out.</p><br/></li><li><a href="/18599/"><h2 class="is-size-2" style="width:100%;word-break:break-word">TechEd Keynote</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="TechEd Keynote" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2006</p><p style="width:100%;margin-top:2rem">Choloe O’Brien from 24 has been the highlight of the keynote so far. There’ve been several 4–minute videos following the 24 format (dubbed “4”) which were pretty humorous. The main gist of the keynote so far as been security and availability via server systems. As a developer, I haven’t seen much yet, although they did talk a bit about Windows Live Authentication and how it will hopefully become…</p><br/></li><li><a href="/18611/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Keynote Notes For Developers</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Keynote Notes For Developers" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2006</p><p style="width:100%;margin-top:2rem">In the latter half of the keynote there was one small piece for developers, showing off Expression Interactive Designer (which integrates nicely with ASP.NET and VS.NET) and the new Visual Studio 2005 Team System For Database Professionals, which they have about 4,000 cds with the first CTP bits on them that will be handed out later today. The v1 story for VSTO:DB is going to include SchemaCompare…</p><br/></li><li><a href="/18402/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Debugging Tips and VS 2005 Code Snippets</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Debugging Tips and VS 2005 Code Snippets" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 June 2006</p><p style="width:100%;margin-top:2rem">Last week I published two new articles on ASPAlliance.com: Visual Studio Debugging Tips and Tricks – which shows how to use some attributes to make your debugging experience much easier with Visual Studio. Using Visual Studio 2005 Code Snippets to Write Better Code Faster – which demonstrates the new code snippets features in VS 2005, which allows simple keywords to be used to generate code, from…</p><br/></li><li><a href="/18403/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas Charting Goodness</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas Charting Goodness" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 June 2006</p><p style="width:100%;margin-top:2rem">I really love charts and statistics. Give me a decent reporting application and I can spend all kinds of time analyzing data this way and that, looking for trends. The problem is, usually you have to have a separate reporting interface, away from your main application, which limits its usability. One reason for this is that charts take up a lot of room, and so you don’t want to detract from your…</p><br/></li><li><a href="/18261/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Announcing Visual Studio Team Edition for Database Professionals</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Announcing Visual Studio Team Edition for Database Professionals" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 June 2006</p><p style="width:100%;margin-top:2rem">This morning (09:00 PST, Wednesday May 31st 2006) the Visual Studio Team System team announced the availability of a brand product in the Team System family. Visual Studio Team Edition for Database Professionals delivers a market-shifting database development product designed to manage database change, improve software quality through database testing and bring the benefits of Visual Studio Team…</p><br/></li><li><a href="/use-vs-code-snippets-write-better-code/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using Visual Studio 2005 Code Snippets to Write Better Code Faster</h2><img src="/static/f1349e2556bea9c24dd99e24f844c306/4e530/visual-studio-better-code-faster.png" alt="Using Visual Studio 2005 Code Snippets to Write Better Code Faster" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 May 2006</p><p style="width:100%;margin-top:2rem">Introduction In my accompanying article, Visual Studio Debugger Tips and Tricks, I showed a number of ways that properties and classes could be customized with attributes in order to make debugging such classes simpler and more streamlined. The end result of those attributes was something like the class shown in Listing 1. Listing 1 Clearly there is a lot more code here than before we started…</p><br/></li><li><a href="/visual-studio-debugger-tips-tricks/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Studio Debugger Tips and Tricks</h2><img src="/static/9ac8bf4002c3f0af67d6f25a28faa653/4e530/vs-debugger-tips.png" alt="Visual Studio Debugger Tips and Tricks" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 May 2006</p><p style="width:100%;margin-top:2rem">Introduction Visual Studio 2005 provides a powerful debugger which makes stepping through your code to find problems a breeze. However, sometimes it offers too much information, and it can become tedious to find just what you are looking for amidst all of the extra noise. Fortunately, the debugger can be customized using a few simple techniques. TMI! Too Much Information Many times the debugger…</p><br/></li><li><a href="/17805/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Expression Web Designer Is Here</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Expression Web Designer Is Here" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 May 2006</p><p style="width:100%;margin-top:2rem">CTP 1 of Expression Web Designer is now available for download. Please see the announcement from Devindra Chainani, Group Program Manager, Expression Web Designer, for more details and download links. Expression Web Designer is a new Microsoft tool for creating professional looking web sites which is compatible with ASP.NET.</p><br/></li><li><a href="/code-query-language/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Code Query Language</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 May 2006</p><p style="width:100%;margin-top:2rem">http://www.practicaldot.net/en2/main.htm Have you ever wanted to run some metrics on your code base, to try and gauge its quality or to try and find bad practices? There are some tools out there for such static analysis, such as FxCop and the built in tools in VSTS, as well as SSW’s regular expression based Code Auditor Tool. However, another approach, using a Code Query Language, seems to have a…</p><br/></li><li><a href="/17729/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Practical .NET2 and C#2</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Practical .NET2 and C#2" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 May 2006</p><p style="width:100%;margin-top:2rem">I recently had the opportunity to skim-read Practical .NET2 and C#2 by Microsoft MVP Patrick Smacchia. You’ll find the book’s table of contents and examples online at its website (linked from title), along with an impressive list of testimonials. I would have to agree with what many other reviewers have noted – this is a very good comprehensive look at C# 2.0 and how to use it to work with the…</p><br/></li><li><a href="/beginning-ajax-book-–-tech-edit-complete/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Beginning AJAX Book – Tech Edit Complete</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Beginning AJAX Book – Tech Edit Complete" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 May 2006</p><p style="width:100%;margin-top:2rem">As of today I’m officially done tech editing Beginning AJAX, a book coming soon from Wiley publishing. Amazon has a page for the book (pre-production) here. The book includes information on writing your own AJAX framework, using several existing free AJAX libraries, and working with Microsoft’s ATLAS framework. It still has a few more steps to go through before it hits the presses but you should…</p><br/></li><li><a href="/caching-domain-objects-article/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Domain Objects Article</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 April 2006</p><p style="width:100%;margin-top:2rem">My DotNetSlackers news pointed me to this article on Domain Objects Caching Pattern in .NET. This is actually a pretty good article on caching best practices, but I did want to take exception to one statement that is clearly in error: And, your options are ASP.NET Cache, Caching Application Block in Microsoft Enterprise Library, or some commercial solution like NCache from Alachisoft. Personally…</p><br/></li><li><a href="/asp-net-2-0-provider-source-code-released/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET 2.0 Provider Source Code Released</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET 2.0 Provider Source Code Released" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 April 2006</p><p style="width:100%;margin-top:2rem">This is very cool. The ASP.NET team has released the source code for the built in providers for the following: Membership Role Management Site Navigation Session State Profile Web Events Web Part Personalization You can download them here. Learn more about the ASP.NET 2.0 Provider Model (e.g. what are these?) here. Read more, including white papers, on ScottGu’s Blog.</p><br/></li><li><a href="/aep-talk-in-columbus-ohio-today/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AEP Talk in Columbus Ohio Today</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AEP Talk in Columbus Ohio Today" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 April 2006</p><p style="width:100%;margin-top:2rem">I drove down to Columbus Ohio to speak to the AEP (American Electric Power) ASP.NET User Group’s lunch meeting. There was a pretty good turnout with about 40 people present locally and another dozen or so connected in from Oklahoma via video conference. The subject was my favorite, .NET Caching Best Practices, and the presentation seemed to be well-received. You can find the basic slide deck here…</p><br/></li><li><a href="/atlas-control-toolkit-released/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Atlas Control Toolkit Released</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Atlas Control Toolkit Released" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 April 2006</p><p style="width:100%;margin-top:2rem">The ASP.NET team has released the Atlas Control Toolkit, which, according to their site, is: a collection of samples and components that makes it easier then ever to build and consume rich client-side “Atlas” controls and extenders. The toolkit provides both ready to go samples and a powerful SDK to simplify the creation and re-use of your own custom controls and extenders. You can read more and…</p><br/></li><li><a href="/caching-birds-of-a-feather-at-teched-—-vote-for-me-please/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Birds of a Feather at TechEd — VOTE FOR ME PLEASE</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 March 2006</p><p style="width:100%;margin-top:2rem">I’m trying to organize a Birds of a Feather session on one of my favorite topics, Caching, at Tech Ed 2006 in Boston. Whether you’re going to TechEd or not you can vote for BOF sessions here: https://www.msteched.com/cfp/bofvoting.aspx If you’re so inclined, I’d appreciate any votes I can get for my session: Caching Patterns and Best Practices Come share your experience with using Caching in…</p><br/></li><li><a href="/15952/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Get Date From DateTime In SQL</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Get Date From DateTime In SQL" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 March 2006</p><p style="width:100%;margin-top:2rem">Something I need to do from time to time is get just the date part of a datetime value in SQL. I found a cool way to do it on SQLJunkies today. select convert(varchar,DateColumn,101) The 101 means “mm/dd/yyyy” format, but there are a bunch of other codes you can use. 108 will return just the time “hh:mm:ss” for instance. Update: 101 includes 4 digit year ‘yyyy’. A code of 1 would apparently be “mm…</p><br/></li><li><a href="/annoying-visual-studio-add-existing-project-behavior-solved/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Annoying Visual Studio Add Existing Project Behavior Solved</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Annoying Visual Studio Add Existing Project Behavior Solved" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 March 2006</p><p style="width:100%;margin-top:2rem">Using Visual Studio 2005, I set up a new solution the other day with a bunch of projects. The folder structure looks something like this: /Solution /Solution/Project1 /Solution/Project2 /Solution/Project3 However, one of the projects was originally in another folder under My Documents/Other Projects/Project4 let’s say. I don’t recall if I originally added it from this location and then removed it…</p><br/></li><li><a href="/15308/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VSTS Overview Talk at Wayne State University</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="VSTS Overview Talk at Wayne State University" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 February 2006</p><p style="width:100%;margin-top:2rem">I gave a presentation on Visual Studio Team System last night to about 30 students at Wayne State University in Detroit. I don’t think it was one of my better presentations, for a number of reasons, which I’ll lament here and attempt to improve in the future. First off, this was an earlier presentation than most of the INETA talks I give, and was scheduled to start at 5pm. I scheduled my flight…</p><br/></li><li><a href="/15324/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AxoSoft Social Marketing Experiment – OnTime BugTracker At 99 Percent OffAxoSoft Social Marketing Experiment – OnTime BugTracker At 99 Percent Off</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AxoSoft Social Marketing Experiment – OnTime BugTracker At 99 Percent OffAxoSoft Social Marketing Experiment – OnTime BugTracker At 99 Percent Off" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 February 2006</p><p style="width:100%;margin-top:2rem">Axosoftis doing a social marketing experiment (blogs, Digg, etc.) where they’re selling a $500 copy of their OnTime Small Team (5 users) bug tracker and project management tool for just $5 and donating the proceeds to the American Red Cross. The experiment expires Friday Feb. 24th. http://www.axosoft.com/Products/ontime.aspx?cn=otm_stepromo</p><br/></li><li><a href="/1893/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cool AJAX Implementation</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Cool AJAX Implementation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 February 2006</p><p style="width:100%;margin-top:2rem">I’ve recently been talking with the folks at FarPoint Technologies and took a look at their AJAX implementation of a web-based spreadsheet. It’s very cool! It’s essentially like having Excel embedded in your browser, complete with forumulas, and you can bind the whole thing to a database (and persist it back with the click of a button, too). Have a look at the demo.</p><br/></li><li><a href="/coming-soon-–-web-projects-in-vs-2005/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Coming Soon – Web Projects in VS 2005</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 February 2006</p><p style="width:100%;margin-top:2rem">Scott Guthrie has just posted an update on the new VS 2005 Web Application Project Template and VS 2005 Web Deployment Projects. You can always learn more about this project on hiswebsite dedicated to vs 2005 web projects. Says Scott: The refresh build of the VS 2005 Web Application Project we are putting out this week contains a lot of new feature functionality support.There are still some…</p><br/></li><li><a href="/and-you-thought-waterfall-software-development-process-was-dead/"><h2 class="is-size-2" style="width:100%;word-break:break-word">And You Thought Waterfall Software Development Process Was Dead</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="And You Thought Waterfall Software Development Process Was Dead" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2006</p><p style="width:100%;margin-top:2rem">Help bring back the Waterfall Software Development Process! Attend Waterfall 2006 this year, being held April 1st in Niagara Falls, NY. Check out the conference website for a detailed listing of sessions, including these: and more!</p><br/></li><li><a href="/cache-manager-released/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cache Manager Released</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 January 2006</p><p style="width:100%;margin-top:2rem">Those of you who subscribe to the ASPAlliance Times weekly newsletter already know that Cache Manager 1.0 was released earlier this week. You can download it from ASPAlliance.com here: ASP.NET Cache Manager This plug-in allows for the viewing and removal of any Cache API entries or output cached ASP.NET pages within an ASP.NET application. It has been compiled under 1.1 and so my hope is that it…</p><br/></li><li><a href="/c-code-snippets/"><h2 class="is-size-2" style="width:100%;word-break:break-word">C# Code Snippets</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 January 2006</p><p style="width:100%;margin-top:2rem">David Yack just pointed me to the C# Code Snippets that should have been in VS 2005 but weren’t. Download them now from MSDN. C# Code Snippets David’s also got them broken down by categories if you prefer.</p><br/></li><li><a href="/peter-blum-validation-and-more/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - PeterBlum.com Validation and More Controls</h2><img src="/static/951c152d30542d7257857ecdb58d9406/4e530/validation-and-more.png" alt="Review - PeterBlum.com Validation and More Controls" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 December 2005</p><p style="width:100%;margin-top:2rem">Overview Validation controls have been one of my favorite features of ASP.NET since I first saw it previewed (back when it was still ASP+). Coming from an ASP background, where integration of client- and server-side validation was, to be kind, tedious, I was eager to put these controls to the test. Initially, I was very pleased with the controls, but with time it became clear that they were &quot;a…</p><br/></li><li><a href="/cache-manager-almost-ready/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cache Manager Almost Ready</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 December 2005</p><p style="width:100%;margin-top:2rem">I’m almost done with my Cache Manager application, which is modeled after ELMAHand uses an HttpHandler model to add cache management functionality to any ASP.NET application. At the moment it’s built using VS 2005 and v2 of the framework, but doesn’t really use any 2.0 functionality (except for .resx files, which are AWESOME for managing string resources within a project!). Here’s a screenshot…</p><br/></li><li><a href="/aspalliance-survey-request/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASPAlliance Survey Request</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASPAlliance Survey Request" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 November 2005</p><p style="width:100%;margin-top:2rem">ASPAlliance.com is getting a third-party site traffic audit done this week and as part of that we need a bunch of people to fill out a really quick 10-question survey (really, it’s quick — it’s all checkboxes/radio buttons). If you’ve ever visited ASPAlliance and we’ve saved you some time, please give us back one minute of your time by filling out this survey. I believe it ends on November 22nd…</p><br/></li><li><a href="/comparing-net-and-j2ee/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Comparing .Net and J2EE</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 November 2005</p><p style="width:100%;margin-top:2rem">This is a common theme, especially in IT departments at larger companies where the religious wars rage. Microsoft, in support of their recent new product launches, has compiled a set of “materials designed to help you evaluate Microsoft .NET vs. J2EE application server technologies”. .NET vs. J2EE Reports and Evidence</p><br/></li><li><a href="/asp-net-connections-presentations/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Connections Presentations</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Connections Presentations" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 November 2005</p><p style="width:100%;margin-top:2rem">I’ve uploaded my presentations from last week’sASP.NET Connections conferencein Las Vegas to theASPAlliance Resource Directory’s Presentationsarea. Enjoy!</p><br/></li><li><a href="/alienware-support/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Alienware Support</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Alienware Support" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2005</p><p style="width:100%;margin-top:2rem">My Alienware laptop battery stopped working about a month or two ago. I emailed their support a few weeks ago and they replied back saying I should put it in my laptop and let it charge for 24 hours and it should be fine. Duh, it wasn’t fine, that’s why I emailed them. So Tuesday I called them (since they failed to reply to my reply back to them which let them know that their response was, ah…</p><br/></li><li><a href="/13460/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Presentation – Fort Worth</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Caching Presentation – Fort Worth" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2005</p><p style="width:100%;margin-top:2rem">Flew out and spoke to the Fort Worth .NET User Group, led by Stephen Swienton, last week. There was a pretty good turnout and I thought it went quite well. I only had one demo that didn’t go off as planned and that was a result of my having switched from a Beta 2 VPC to an RTM VPC at sort of the last minute. The slides and demos should be available on the Fort Worth website at some point, but I…</p><br/></li><li><a href="/caching-presentation-–-findlay-ohio/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Presentation – Findlay, Ohio</h2></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2005</p><p style="width:100%;margin-top:2rem">As I mentioned in my previous post, I presented on Caching in Findlay last night. The presentation was remarkable because I did it without my laptop, which sadly decided to die as I was booting it up for the meeting. I was ill-prepared in that I failed to have a backup of my slide deck on a USB drive or online somewhere, so I ended up grabbing an older version of the slide deck from my training…</p><br/></li><li><a href="/aspinsiders-summit-photos/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASPInsiders Summit Photos</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASPInsiders Summit Photos" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 October 2005</p><p style="width:100%;margin-top:2rem">I’ve posted up a new photo gallery for MVP-Insiders Summit 2005 pictures, which I’ll be updating as the week goes on. The next few days we’ll be meeting with the ASP.NET team to discuss upcoming enhancements to web applications using Microsoft technologies. (more on ASPInsiders).</p><br/></li><li><a href="/1926/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC: Atlas Hands-On Lab</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="PDC: Atlas Hands-On Lab" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 September 2005</p><p style="width:100%;margin-top:2rem">I just completed the ASP.NET “Atlas” hands-on lab. It was very well put-together considering how completely new Atlas is. I imagine a few members of the ASP.NET team probably lost some sleep the week prior to PDC getting all of this put together in time. You can complete the lab yourself — it’s available from the Atlas website. At the moment it requires the Beta 2 version of ASP.NET, but a new lab…</p><br/></li><li><a href="/1925/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More SqlDependency Gotchas</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="More SqlDependency Gotchas" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 September 2005</p><p style="width:100%;margin-top:2rem">I wrote about some issues with SqlDependency in the latest interim build last week, but I forgot to mention one other gotcha that we ran into, which Scott Hanselman was struggling with yesterday. The necessary trick, which is only for that build so if you’re reading this post-release of ASP.NET 2.0 this shouldn’t be an issue, is to modify the SQL Server database settings for the database in…</p><br/></li><li><a href="/1924/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Anders on C# 3.0 and LINQ</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Anders on C# 3.0 and LINQ" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 September 2005</p><p style="width:100%;margin-top:2rem">Just came from Anders Hejlsberg’s talk on C# 3.0 and LINQ. You can actually download a LINQ tech previewfrom MSDN, here: http://msdn.microsoft.com/netframework/future/linq/ The language features that had to go into place to allow for LINQ are quite impressive, and I’ll have to play around with them myself to really wrap my brain around them since many of them involve rethinking how I think about…</p><br/></li><li><a href="/1921/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC – I&#x27;m Here</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="PDC – I&#x27;m Here" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 September 2005</p><p style="width:100%;margin-top:2rem">Flew in last night. I was supposed to stay at the New Otani but they oversold their rooms, so at 1am local time they finally found me (and about 8 other PDC-goers) rooms back at the airport (45 min away). They paid for everything, as well they should, but I’m rather short on sleep now as a result. So far PDC has been pretty cool — I’m about to blog about the keynote and some other cool news, then…</p><br/></li><li><a href="/1922/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC – Bill Gates Keynote</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="PDC – Bill Gates Keynote" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 September 2005</p><p style="width:100%;margin-top:2rem">Bill Gates gave this morning’s first keynote at PDC 05. As is customary, he had a video to augment his presentation. These are usually very funny, but this one didn’t do much for me (it was about Bill as a recruiter or something, but I didn’t think they pulled it off well). However, he did make a great comment that brought laughter from the crowd. Yesterday, there was a significant power outage in…</p><br/></li><li><a href="/1923/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC – Jim Allchin&#x27;s Keynote</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="PDC – Jim Allchin&#x27;s Keynote" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 September 2005</p><p style="width:100%;margin-top:2rem">Jim Allchin gave the second keynote, which included many demos from a variety of Microsoft teams and a couple of partners. Most of it centered around new features that will be available in Vista. For example, their virtual memory system will be able to take advantage of external memory, such as from USB drives. They showed off a feature called SuperFetch, but unfortunately I was dozing off for…</p><br/></li><li><a href="/1919/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Old Databases and Sql Query Notifications (cache invalidation)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Old Databases and Sql Query Notifications (cache invalidation)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 September 2005</p><p style="width:100%;margin-top:2rem">Julie and I were having issues with getting Sql Query Notifications to work for ASP.NET cache dependencies (for our DevConnections talks). The trick was this: sp_dbcmptlevel yourdatabasename,90 Julie did most of the research on this one, with help from Sushil Chordia and Leonid Tsybert from Microsoft. She has more on her blog, but I’m noting here so I might remember this next time.</p><br/></li><li><a href="/1917/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Register Controls via Web.Config</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Register Controls via Web.Config" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 August 2005</p><p style="width:100%;margin-top:2rem">I had a conversation with ScottW about this about a year ago (almost exactly, from Iraq, no less), and yet I still keep forgetting this technique every time I need it. So I’m blogging it myself this time just to try to keep it in my (online) memory bank. NOTE TO SELF: IF YOU WANT TO USE CONTROLS FROM APP_CODE IN A PAGE YOU NEED TO DEFINE THE REFERENCE IN WEB.CONFIG, NOT IN A &lt;%@ Register %&gt;BLOCK…</p><br/></li><li><a href="/1911/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working on Caching Presentation</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Working on Caching Presentation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 August 2005</p><p style="width:100%;margin-top:2rem">I’m working on my caching presentation for Fall ASP.NET Connections and a few user group presentations. Those few who read my blog can enjoy some early looks at my research, which I’ll detail here for my own future reference (and yours!). First of all I only recently found a great article on Query Notifications in ADO.NET 2.0 which goes into depth about how Query Notifications work in SQL Server…</p><br/></li><li><a href="/1912/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Looking for ConfigurationManager?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Looking for ConfigurationManager?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 August 2005</p><p style="width:100%;margin-top:2rem">In .NET 2.0 there is a new configuration class called ConfigurationManager. It supercedes the ConfigurationSettings class that most .NET developers are familiar with today. When you create a website in VS2005 the ConfigurationManager class should be available because by default the necessary reference is included in the website’s compile settings. However, other types of projects don’t have this…</p><br/></li><li><a href="/1913/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More on SQL Server Query Notifications</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="More on SQL Server Query Notifications" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 August 2005</p><p style="width:100%;margin-top:2rem">I found this post by Rushi Desai on Invalidating cached result sets using SQL Server Query Notification. It’s from March so it’s a bit out of date, but it has some working ASP.NET sample code (well, working in Beta 2, I presume, but pretty close for RTM).</p><br/></li><li><a href="/1914/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET 2.0 Sample Themes</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET 2.0 Sample Themes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 August 2005</p><p style="width:100%;margin-top:2rem">DotNetTreats has a collection of sample themes for ASP.NET 2.0, along with some tips on how to work with themes.</p><br/></li><li><a href="/1915/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Scott Guthrie explains why web project files go away in 2.0</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Scott Guthrie explains why web project files go away in 2.0" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 August 2005</p><p style="width:100%;margin-top:2rem">ScottGuwrite about the lack of web project files in VS2005: VS 2005 Web Project System: What is it and why did we do it? There have been some threads lately on other blogs about whether this helps or hurts enterprise developers, with the main counter-point from Scott being that most of the pain points being reported around ASP.NET 2.0 Beta 2 are in fact Beta2 issues, not ASP.NET 2.0 issues, and…</p><br/></li><li><a href="/1909/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VS2005 RC, TFS Beta 3 Coming in September</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="VS2005 RC, TFS Beta 3 Coming in September" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 August 2005</p><p style="width:100%;margin-top:2rem">Soma announces Visual Studio 2005 RC1 and Visual Studio 2005 Team Foundation Server (TFS) Beta 3 will be released in September. The Beta 3 will feature a Go Live license, so organizations can immediately begin using the Team System features. Release of TFS is slated for the first quarter of 2006, and all data in the Beta 3 edition will (in theory) migrate seamlessly to the final version of TFS…</p><br/></li><li><a href="/1908/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Hidden Network Cards</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Hidden Network Cards" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 August 2005</p><p style="width:100%;margin-top:2rem">I just moved a server and switched it from using a wireless card to a 10/100 Ethernet port and I kept getting this kind of message when I set it back up with its IP addresses: The IP address you have entered for this network adapter is already assigned to another adapter . is hidden from the network and Dial-up Connections folder because it is not physically in the computer or is a legacy…</p><br/></li><li><a href="/1906/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Windows Vista Screenshots</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Windows Vista Screenshots" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 August 2005</p><p style="width:100%;margin-top:2rem">Jason Gaylord has uploaded some Windows Vista Screenshots on WindowsAdvice.com.</p><br/></li><li><a href="/1907/"><h2 class="is-size-2" style="width:100%;word-break:break-word">C# a Total Failure with no Future… ?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="C# a Total Failure with no Future… ?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 August 2005</p><p style="width:100%;margin-top:2rem">According to Calvin Austin, writing in JDJ (which, as a dead trees publication, you would expect to have better, more accurate information than some uninformed blogger or /.er, but not this time) has a recent column titled C#: Is the Party Over? In it, he makes a number of statements which, while humorous to those of us with a clue, serve to further mis-inform the (presumably dozens or more…</p><br/></li><li><a href="/ajax-controls-–-darts-livecontrols-reviewed/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AJAX Controls – Dart&#x27;s LiveControls Reviewed</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AJAX Controls – Dart&#x27;s LiveControls Reviewed" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 August 2005</p><p style="width:100%;margin-top:2rem">I’ve had a chance to work with Dart’s suite of AJAX-style LiveControls, and posted a review up on AspAlliance.com. If you’re interested in adding AJAX capabilities to your ASP.NET applications, but don’t want to have to write a lot of code (especially client-side code), I highly recommend you take a look at these controls. Review – Dart PowerWEB LiveControls</p><br/></li><li><a href="/1903/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Konfabulator</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Konfabulator" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 August 2005</p><p style="width:100%;margin-top:2rem">Cindy pointed me to Konfabulator last week, and I had a chance to download it and set it up a couple of days ago. It’s pretty slick. They were recently bought by Yahoo! and now the whole thing is free (I guess it used to cost $40 or something). Basically it’s a framework for widgets that live on your Windows or Mac desktop. There are a bunch of widgets that come with it, and several hundred…</p><br/></li><li><a href="/1904/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET 2.0 Provider Toolkit Available</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET 2.0 Provider Toolkit Available" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 August 2005</p><p style="width:100%;margin-top:2rem">ScottGu announced the availability of the ASP.NET 2.0 Provider Toolkit a couple of days ago — I just saw it. The toolkit provides a full source code implementation of how to build your own providers for Membership, Role Management, Health Monitoring, and Personalization features. Definitely going to grab that immediately…</p><br/></li><li><a href="/dart-powerweb-livecontrols/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - Dart PowerWEB LiveControls 1.1.3</h2><img src="/static/168e4cd068d49f9f3a327a9da196b3c0/4e530/dart-powerweb.png" alt="Review - Dart PowerWEB LiveControls 1.1.3" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 August 2005</p><p style="width:100%;margin-top:2rem">Overview I’ve recently had the opportunity to work with Dart’s PowerWEB LiveControls suite at a client who was building a call center application using ASP.NET architecture. One requirement of the application was that incoming calls and work items needed to be visible to all users with up-to-the-second frequency. Using Dart’s controls, and most importantly their LiveDataGrid control, this…</p><br/></li><li><a href="/1900/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Development Helper Browser Plugin</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Development Helper Browser Plugin" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 August 2005</p><p style="width:100%;margin-top:2rem">I’m a bit late, but I just discovered Nikhil’s ASP.NET Development Helper Browser Plugin (with screenshots). Downloading it and will have to play with it next chance I get. From the screenshots it looks very cool, especially the ability to view the current page’s ViewState (both encoded, and decoded with value pairs). Check it out.</p><br/></li><li><a href="/1901/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Validation Controls – Common Problems and Fixes</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Validation Controls – Common Problems and Fixes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 August 2005</p><p style="width:100%;margin-top:2rem">Peter Blum has an article today on AspAlliance.com that addresses some common problems with the built-in ASP.NET validation controls. It’s definitely worth a read if you’re using these controls, or want to learn more about them: Solving the Challenges of ASP.NET Validation</p><br/></li><li><a href="/1898/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More Official Names Announced</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="More Official Names Announced" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 July 2005</p><p style="width:100%;margin-top:2rem">Today, in addition to launching Windows Vista Beta 1, Microsoft also has announced the final names for several key technologies which they have been talking about for several years. A new presentation layer technology, code-named “Avalon”, is now officially known as Windows Presentation Foundation. The new communications layer technology, code-named “Indigo”, is now officially known as Windows…</p><br/></li><li><a href="/1899/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Sending Emails with aspNetEmail and RapidMailer</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Sending Emails with aspNetEmail and RapidMailer" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 July 2005</p><p style="width:100%;margin-top:2rem">I had to send out a bunch of emails to some partners I work with and the easiest way for me to generate the list was via an SQL query of my database. It wasn’t a huge list, just 30 or so emails, but enough that I didn’t want to go and type them all into Outlook as BCC entries. My first thought was to check with Dave Wanta, god of all things email in the .NET space. Dave wasn’t around, so instead…</p><br/></li><li><a href="/1895/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Upgrading and Migrating to ASP.NET 2.0</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Upgrading and Migrating to ASP.NET 2.0" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 July 2005</p><p style="width:100%;margin-top:2rem">There is an Upgrade Center available on MSDNnow for customers seeking to move from ASP.NET 1.x to ASP.NET 2.0. It includes a white paper describing lessons learned, best practices, and valuable techniques that will help developers upgrade their applications. If you have existing ASP.NET applications that you will eventually upgrade to 2.0, you may want to look at some of this information sooner…</p><br/></li><li><a href="/1896/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Escape Yesterworld!</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Escape Yesterworld!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 July 2005</p><p style="width:100%;margin-top:2rem">Here’s a fun site to check out if you have a few minutes. Basically a look back at how software development used to be, before we had all the great tools and processes we (developers) have now… http://www.escapeyesterworld.com/</p><br/></li><li><a href="/1894/"><h2 class="is-size-2" style="width:100%;word-break:break-word">&quot;Longhorn&quot; is now Windows Vista – Beta Soon</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="&quot;Longhorn&quot; is now Windows Vista – Beta Soon" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 July 2005</p><p style="width:100%;margin-top:2rem">Microsoft has announced that “Longhorn” will be named Windows Vista, and the first beta will be available August 3rd. Find out more at the Windows Vista website, and discuss what’s new and what’s coming on the Windows Vista forumsonWindowsAdvice.com.</p><br/></li><li><a href="/1892/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Going to PDC</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Going to PDC" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 July 2005</p><p style="width:100%;margin-top:2rem">I haven’t officially registered for PDC yet, but I’m buying my plane tickets right now (not bad, less than $300 non stop from Cleveland). So, I’m pretty much going to be there. If you’ll be there and want to talk, look me up (email me or something via my contact form if we’ve not met). Should be fun, although the timing so close to the MVP Summit means a lot of the folks I usually see won’t be…</p><br/></li><li><a href="/1888/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More Team System Class Notes</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="More Team System Class Notes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 July 2005</p><p style="width:100%;margin-top:2rem">See Day One. Didn’t get a chance to post my notes for days two and three until now. We spent some time looking at testing in general, and the theory of why to test and how testing relates to quality. Briefly mentioned TDD and other related disciplines. In VSTS, tests are code and are versioned along with the code. The tool can auto-generate tests per method or class. The skeleton is generated…</p><br/></li><li><a href="/1887/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VSTSOffSite Opportunity</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="VSTSOffSite Opportunity" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 June 2005</p><p style="width:100%;margin-top:2rem">Ok, so I just finished a 3-day Ascend class on VSTS and one thing I’m disappointed by is the fact that I most likely won’t be able to use VSTS to replace SourceGear Vault immediately, since I collaborate with developers over the Internet all over the world, and VSTS does a lot of stuff via AD or direct network access. The only solution for over-the-internet work is a VPN, which at the moment I don…</p><br/></li><li><a href="/1884/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Preventing Duplicate Record Insertion on Page Refresh</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Preventing Duplicate Record Insertion on Page Refresh" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 June 2005</p><p style="width:100%;margin-top:2rem">Terri Morton has a new article this week on preventing duplicate records from being inserted when a user refreshes a page that does a form POST. Here’s the abstract: A common concern of ASP.NET developers is, “How do I prevent previously submitted form data from being reinserted into the database when the user presses the browser’s Refresh button?” This article outlines some possible solutions to…</p><br/></li><li><a href="/1886/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Studio Team System Class Notes</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Visual Studio Team System Class Notes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 June 2005</p><p style="width:100%;margin-top:2rem">I’m taking a VSTS class this week at Microsoft in Columbus, Ohio. The course is being taught by Chris Menegay, a Microsoft Regional Director and principal consultant with Notion Solutions, Inc. Chris developed the course material and works closely with the VSTS team, and seems to really know VSTS. I took some notes today but I figured they’d be more useful in electronic format, and I figured while…</p><br/></li><li><a href="/1883/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Scott Guthrie announces future plans for async callback story (AJAX-style stuff)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Scott Guthrie announces future plans for async callback story (AJAX-style stuff)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 June 2005</p><p style="width:100%;margin-top:2rem">Scottwrites: What we’ve set out to do is to make it dramatically easier for anyone to build AJAX-style web applications that deliver rich, interactive, and personalized experiences. Developers should be able to build these applications without great expertise in client scripting; they should be able to integrate their browser UI seamlessly with the rest of their applications; and they should be…</p><br/></li><li><a href="/1882/"><h2 class="is-size-2" style="width:100%;word-break:break-word">WebCasts and LunchTime Learning</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="WebCasts and LunchTime Learning" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 June 2005</p><p style="width:100%;margin-top:2rem">Cindy Brucato has begun an interesting lunchtime learning program at her workplace, which she’s dubbed The Brown Bag Initiative (or Brown Bagging It) — BBI. Yesterday she updated this with a list of good webcasts to watch during these events, and since most of them looked interesting to me, I’m blogging it so I can find the links later.</p><br/></li><li><a href="/1868/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Free Beer at Microsoft in Atlanta this Friday!</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Free Beer at Microsoft in Atlanta this Friday!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 June 2005</p><p style="width:100%;margin-top:2rem">Kirk Allen Evans reports: This Friday (May 20th) come to the Microsoft Alpharetta office for the .NET Experience Expo! This is a free event where you can come hear all about some of the hottest topics for developers and architects. This is a huge opportunity to learn more about what Microsoft is doing for developers (and it’s a great chance to win an Xbox!) All attendees will receive a free copy…</p><br/></li><li><a href="/1865/"><h2 class="is-size-2" style="width:100%;word-break:break-word">May 12th GC.NUG Meeting</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="May 12th GC.NUG Meeting" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 June 2005</p><p style="width:100%;margin-top:2rem">Last Thursday I spoke to the GC.NUG group in Charleston. Charleston seems like a really nice place, and I’d like to visit there again some time when I have more time to look around. I’ve always liked South Carolina ever since my first experience there coming from Army basic training in Ft Sill (not fun) to Columbia and a much more pleasant experience of AIT at Ft. Jackson (10 years ago). Chris…</p><br/></li><li><a href="/1866/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching: Automatically Renew Stale Items</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Caching: Automatically Renew Stale Items" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 June 2005</p><p style="width:100%;margin-top:2rem">I’m working on a new library for Caching that has been an interest of mine for some time, but which I only took the time to implement last week (on the plane home from Charleston). Basically the problem is that for many of the things that are ideal candidates for caching, it would be nice if there were an easy way to keep these in the cache forever while still ensuring the cached values are…</p><br/></li><li><a href="/1867/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Custom Cache Dependencies</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Custom Cache Dependencies" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 June 2005</p><p style="width:100%;margin-top:2rem">I’m looking to write a custom cache dependency but I’m having a very hard time thinking of a useful one that doesn’t involve a database (SqlCacheDependency is already taken, and I don’t know any other database system well enough to attempt to duplicate the SqlCacheDependency). If anybody has any ideas for CacheDependencies they’d like to see created, comment to this post and perhaps I’ll build one…</p><br/></li><li><a href="/1881/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Book Review – Pragmatic Unit Testing in C# with NUnit</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Book Review – Pragmatic Unit Testing in C# with NUnit" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 June 2005</p><p style="width:100%;margin-top:2rem">I recently finished reading Pragmatic Unit Testing in C# with NUnit. It’s a good overview of unit testing and I picked up a few things from it. I’ve previously read several of the books referenced in this one, including Kent Beck’s XP book (Extreme Programming Explained). I also have Pragmatic Version Control, which I haven’t had a chance to look at yet. I learned a few new acronyms from this book…</p><br/></li><li><a href="/asp-net-podcasting/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Podcasting</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Podcasting" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 June 2005</p><p style="width:100%;margin-top:2rem">I’ve been talking to Wally McClure and a few others about doing some ASP.NET podcasting. I’m totally new to the technical details of publishing a podcast, but Wally and others mostly have that end covered. Wally just added a new ‘episode’ (if that’s the right term) which you’ll find here.</p><br/></li><li><a href="/1880/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Studio 2005 DevCon – Detroit, Michigan</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Visual Studio 2005 DevCon – Detroit, Michigan" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 June 2005</p><p style="width:100%;margin-top:2rem">If you’re in the greater Detroit area, and aren’t doing anything more interesting this Thursday (June 16th), I strongly recommend attending the Visual Studio 2005 DevCon being put on by Microsoft and including a bunch of local subject matter experts. I’ll be giving the first session in the ASP.NET track, What’s New in ASP.NET 2.0. All attendees will receive a copy of Visual Studio Team System Beta…</p><br/></li><li><a href="/1878/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More TechEd Thoughts</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="More TechEd Thoughts" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 June 2005</p><p style="width:100%;margin-top:2rem">Sorry, I got busy and didn’t post any more daily missives during Tech Ed. Here’s my ‘summary’ blog post on it. Wednesday I ended up sleeping through my alarm, so I missed ScottGu’sfirst session on what’s new with 2.0, but I made it to his second session which was very popular and probably the better of the two, since he said it was much more demo-heavy whereas the first one had a lot more slides…</p><br/></li><li><a href="/1877/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Seth Godin and Viral Marketing</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Seth Godin and Viral Marketing" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 June 2005</p><p style="width:100%;margin-top:2rem">Seth Godin (Seth’s blog) has written several books on a term I believed he coined, ‘viral marketing’. I was talking to some folks at TechEd this week about ways to generate buzz for their products, and two topics dominated my advice: blogs and viral marketing. If you’re reading this then I probably don’t have to explain why I think blogs are an important way to spread the word about something, but…</p><br/></li><li><a href="/1875/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tech Ed Day 1 (summary)</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="Tech Ed Day 1 (summary)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 June 2005</p><p style="width:100%;margin-top:2rem">Got up early, which was an accomplishment considering how late I was out with Doug, Stephen, Scott, and Amy Sunday night, and made it to the keynote at 0900. Steve Ballmer was presenting, assisted by Samantha Bee (from the Daily Show, I think) and a few MS employees. The keynote was definitely entertaining with some pretty cool demos. The main focus of the demos was on mobile technology and server…</p><br/></li><li><a href="/1876/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tech Ed Day 2 Keynote</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="Tech Ed Day 2 Keynote" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 June 2005</p><p style="width:100%;margin-top:2rem">Paul Flessner’s keynote, still under way, has been about how much connectivity there is today. Samantha Bee is here again today and helps lighten the presentations significantly. One of the demos involved RFID (Radio Frequency IDentification) tags, which all attendees got on registration. The demo first showed how they were actually using these here at the show, for instance they were able to see…</p><br/></li><li><a href="/1873/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tech Ed Day -1</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="Tech Ed Day -1" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 June 2005</p><p style="width:100%;margin-top:2rem">Today started off well. Got up on time, got some breakfast, things were looking good. Then things started to go wrong. The garage door opener had shorted out and wouldn’t open/close. I noticed that my flight actually arrived at the connection at 10 something, rather than departing at 10 something as I had thought. So, there was a bit of panic there. However, made it to the airport shortly after my…</p><br/></li><li><a href="/1874/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tech Ed Day 0</h2><img src="/static/47e65a9b156dab8cfe0d8f7532509d4c/0ff54/background-2462434_1280.jpg" alt="Tech Ed Day 0" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 June 2005</p><p style="width:100%;margin-top:2rem">I spent today at an INETA User Group Leader summit, which was pretty interesting but more so for (not surprising) user group leaders than folks like me (who speak at user groups, but don’t organize them). It was good to meet a lot of people either for the first time or whom I haven’t seen in a long time. I registered today and the lines were not bad. Got a nice bag full of stuff that I haven’t…</p><br/></li><li><a href="/1871/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Google Maps has Satellite Imagery!</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Google Maps has Satellite Imagery!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 June 2005</p><p style="width:100%;margin-top:2rem">Ambrose pointed this out to me. Check it out! You can get down to like 1m resolution. And I really like the interface — you can click and drag the image (or map) around at will, without postback. This isn’t immediately obvious, but it’s much nicer than continually clicking on arrows. Check it out</p><br/></li><li><a href="/1872/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Party with Palermo pre-TechEd</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Party with Palermo pre-TechEd" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 June 2005</p><p style="width:100%;margin-top:2rem">Jeffrey Palermo is organizing a get together for folks coming to Tech Ed, Saturday night before the conference. Details</p><br/></li><li><a href="/1869/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Ready for Tech Ed</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Getting Ready for Tech Ed" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 June 2005</p><p style="width:100%;margin-top:2rem">Haven’t blogged much in a while, sorry. Tonight I have to pack for Tech Ed. Going to be my first conference since getting back home in January, so I’m looking forward to seeing a lot of people I haven’t seen in over a year. If you’re going to be there and want to meet up, I’m going to be at the Web Cabana most of the week (helping staff it). If I’m not there, somebody there will know when I’ll be…</p><br/></li><li><a href="/1870/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AspAlliance Ideas</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AspAlliance Ideas" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 June 2005</p><p style="width:100%;margin-top:2rem">One cool thing about blogs is that you can brainstorm ideas and send them to the entire world to see who likes them. Of course, in my case, the entire world is limited to the three of you reading this, but in theory there could be more. Something I haven’t done much of in the past is solicit feedback from the general public about ideas I have for AspAlliance.com’s direction or features. I usually…</p><br/></li><li><a href="/iron-speed-designer/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - Iron Speed Designer</h2><img src="/static/ca9f932ffb8f91ad882cc34fee93c6ea/4e530/iron-speed.png" alt="Review - Iron Speed Designer" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 June 2005</p><p style="width:100%;margin-top:2rem">Introduction Iron Speed Designer is a Rapid Application Development (RAD) tool developed by Iron Speed Inc. Unlike many similar products I’ve encountered and worked with, Iron Speed Designer has immense breadth and depth of coverage and details. It’s been my experience that a particular tool might be good at generating a data access layer, or providing some simple UI for managing the contents of a…</p><br/></li><li><a href="/remove-output-cache-entries/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Remove ASP.NET Page Output Cache Entries</h2><img src="/static/0ea5034c9c968d5d9c18a64dc72099a1/4e530/remove-output-cache.png" alt="Remove ASP.NET Page Output Cache Entries" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 May 2005</p><p style="width:100%;margin-top:2rem">Sample Code Programmatic Output Cache Entry Removal Introduction A frequently asked question I get when I present or write about ASP.NET’s caching features is, “How do I programmatically remove a page from the output cache?” For a long time now I’ve been unsure of the answer to this. I finally broke down and learned that yes, you can do this, and discovered two methods for implementing the…</p><br/></li><li><a href="/1864/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Programmatically Expire ASP.NET Pages From Output Cache</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Programmatically Expire ASP.NET Pages From Output Cache" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 May 2005</p><p style="width:100%;margin-top:2rem">This was something I’d been wondering about for a while, and finally learned how to do yesterday. It seems significant enough to merit an actual article – read about it here: Remove ASP.NET Page Output Cache Entries</p><br/></li><li><a href="/1863/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Talk in Columbus</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Caching Talk in Columbus" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 April 2005</p><p style="width:100%;margin-top:2rem">Gave my first presentation since over a year ago this evening to the .NET Developers Group in Central Ohio. Seemed well-received. It was in Columbus, Ohio, just 2 hours south of my home, and where I used to work and go to school. Thanks to Drew and Dave and Nate for having me down, and to INETA for organizing it. I think there were like 50 or so people but I’m not a great judge. There were a few…</p><br/></li><li><a href="/1862/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Data Access Application Block (Enterprise Library)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Data Access Application Block (Enterprise Library)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 April 2005</p><p style="width:100%;margin-top:2rem">I used to be a big fan of the Data Access Application Block. It used to be nice, simple. It would save me a lot of repetitive code. It was a standalone library with basically one class I needed to learn. It just worked. Enter the Enterprise Library. This thing is aptly named, in that its complexity is something only an Enterprise would really want to deal with. In addition to the DAAB, the other…</p><br/></li><li><a href="/1859/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Whidbey Beta 2 (ASP.NET 2.0) Goes Live</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Whidbey Beta 2 (ASP.NET 2.0) Goes Live" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 April 2005</p><p style="width:100%;margin-top:2rem">Big news! ASP.NET Beta 2 is now live! You can view the Go Live license here: http://lab.msdn.microsoft.com/vs2005/golive/license/default.aspx The ASP.NET Quickstart tutorials have been completely updated for this release as well. View thousands of samples here: http://beta.aspalliance.com/Quickstart/ As part of this release, there are several new starter kit applications. They include a Personal…</p><br/></li><li><a href="/1858-2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Unit Testing with Ordered Tests</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Unit Testing with Ordered Tests" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 April 2005</p><p style="width:100%;margin-top:2rem">On the NUnit mailing list there’s a discussion going on about whether or not it would be useful and/or advisable to be able to specify the order in which unit tests are run by a test harness (in this case, NUnit). I have to say that I would be strongly in favor of such a feature, and I have some thoughts on how to easily implement it in such a way that it would not greatly disturb anybody who…</p><br/></li><li><a href="/1858/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Unit Testing with Ordered Tests</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Unit Testing with Ordered Tests" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 April 2005</p><p style="width:100%;margin-top:2rem">On the NUnit mailing list there’s a discussion going on about whether or not it would be useful and/or advisable to be able to specify the order in which unit tests are run by a test harness (in this case, NUnit). I have to say that I would be strongly in favor of such a feature, and I have some thoughts on how to easily implement it in such a way that it would not greatly disturb anybody who…</p><br/></li><li><a href="/peters-date-package/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - Peter&#x27;s Date Package 1.1</h2><img src="/static/9a5a3a535e84b3d3b42bf3d5e2791fc2/4e530/peter-date-package.png" alt="Review - Peter&#x27;s Date Package 1.1" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 April 2005</p><p style="width:100%;margin-top:2rem">Introduction I have been meaning to do a review of Peter’s Date Package for quite some time, and finally got around to it a few weeks ago. I had figured on the review only taking me a relatively short amount of time, because I needed to use some date selection controls in an application I was building. I figured I’d use Peter&#x27;s controls, write what I thought about them, and kill two birds with one…</p><br/></li><li><a href="/write-caching-optimize-applications/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Use Write Caching to Optimize High Volume Data Driven Applications</h2><img src="/static/80221f33cd18becd3c91969f86f20fe9/4e530/write-caching-optimize-data-driven-applications.png" alt="Use Write Caching to Optimize High Volume Data Driven Applications" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 April 2005</p><p style="width:100%;margin-top:2rem">Scenario For the past several years, I’ve been running a small online advertising network which, as I write this, serves about 50 million ads per month. A requirement of this application is that impressions and clicks be tracked so that my customers can evaluate the results of their campaigns. My system uses a SQL Server database that is located on a dedicated server on the same network as my…</p><br/></li><li><a href="/1856/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Use Write Caching to Optimize High Volume Data Driven Applications</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Use Write Caching to Optimize High Volume Data Driven Applications" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 April 2005</p><p style="width:100%;margin-top:2rem">Today I published another caching-related article on AspAlliance.com. This time I’m looking at caching from another angle — caching write data rather than read data. Another term for this is batch updating, and it can have a significant impact on performance for applications that do a lot of writing. Abstract: The typical use of caching applies to read caching, or caching data in the application…</p><br/></li><li><a href="/1854/"><h2 class="is-size-2" style="width:100%;word-break:break-word">June Events</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="June Events" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 March 2005</p><p style="width:100%;margin-top:2rem">In addition to these speaking engagements, I’ve also got the following plans for June 2005: Tech Ed 5-10 June 2005 Orlando, FL I won’t be speaking but I’ll likely be one of their volunteer experts, doing stuff with MVPs, ASPInsiders, INETA, CodeWise/CodeZone, etc. I’m looking forward to seeing many of my .NET community friends there, most of whom I haven’t seen in over a year. Visual Studio 200…</p><br/></li><li><a href="/1850/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Wilson UIMapper and CodeSmith Tip</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Wilson UIMapper and CodeSmith Tip" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 March 2005</p><p style="width:100%;margin-top:2rem">I’m sure this is documented as being a requirement, but if you miss that part and just get the error, you’ll have a hard time associating the error with the requirement that corrects things. In my case, I was trying to use the Wilson UIMapper package to build the UI config files for some assemblies I had built using Paul Welter’s LoreSoft WilsonORMapper CodeSmith Templates. Everything was going…</p><br/></li><li><a href="/1851/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking at Fall ASP.NET Connections</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Speaking at Fall ASP.NET Connections" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 March 2005</p><p style="width:100%;margin-top:2rem">I found out a few days ago that I’ll be speaking at the Fall ASP.NET Connections show. I didn’t make it to last Fall’s, which I was also scheduled to speak at, which really depressed me. It was going to be my first time in Vegas, and my birthday. But it looks like perhaps I’ll still get my chance, since it’s still in Vegas, and it’s once again spanning my birthday. You can view the full list of…</p><br/></li><li><a href="/1852/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Upcoming Speaking Engagements</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Upcoming Speaking Engagements" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 March 2005</p><p style="width:100%;margin-top:2rem">I missed ASP.NET Connections this week, but I have been slowly getting back into my speaking and training schedule. I have two INETA engagements coming up in the next couple months: 28 April 2005 .NET Developers Group in Central Ohio Topic: Caching Best Practices in ASP.NET 6pm at Microsoft Polaris Building 12 May 2005 Greater Charleston .NET User GroupTopic: Caching Best Practices in ASP.NET 6pm…</p><br/></li><li><a href="/1853/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ZaneBug – an enhancement to NUnit</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ZaneBug – an enhancement to NUnit" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 March 2005</p><p style="width:100%;margin-top:2rem">Scott Watermasysk just pointed me to ZaneBug, which I immediately downloaded and started playing with (about 10 minutes ago). From first impressions, it’s pretty impressive. It feels a little bit slower than NUnit, but I haven’t had a chance to do any qualitative analysis of performance. However, that’s a very minor point. It worked out of the box, and claims to be compatible with NUnit 2.1 and…</p><br/></li><li><a href="/1849/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Studio Could not write to output file annoyance</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Visual Studio Could not write to output file annoyance" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 March 2005</p><p style="width:100%;margin-top:2rem">Every now and then my VS.NET solutions will fail to build because of an error like: Could not write to outputfile (filepath in /obj/ folder). The file is being used by another process. There is a KB article describing this bug: BUG: Could Not Copy Temporary Files to the Output Directory But to be honest, that has never helped me one bit. In my case, I’m not using a shared output folder, I am using…</p><br/></li><li><a href="/1847/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Internet Access from VirtualPC with Windows Server 2003</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Internet Access from VirtualPC with Windows Server 2003" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 March 2005</p><p style="width:100%;margin-top:2rem">Decided to install a fresh VPC for development, which is why I justified getting so much RAM in my latest laptop (the graphics card, on the other hand, was purely for CounterStrike / HalfLife 2). Got it up and running in short order, but it didn’t want to talk to the Internet. I knew I’d seen this before but it took me about half an hour of googling to find the quick fix here: http://blogs.msdn…</p><br/></li><li><a href="/1848/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VirtualPC Memory Limit — Nero InCD</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="VirtualPC Memory Limit — Nero InCD" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 March 2005</p><p style="width:100%;margin-top:2rem">Chris Wille pointed me to Nero InCD as the culprit when my VirtualPC machine wouldn’t let me use more than 256mb of my 2GB of RAM. He says now that this is fixed in the latest version. Ben Armstrong also covers the issue of Nero InCD and VirtualPC, recommending uninstalling. What I’ve found works for me is to simply open up Windows Task Manager, go to the Processes tab, sort by Image Name, select…</p><br/></li><li><a href="/1846/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Sql Tip: Update Fields on Tables across several Databases, at once</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Sql Tip: Update Fields on Tables across several Databases, at once" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 March 2005</p><p style="width:100%;margin-top:2rem">There was a good thread on the SqlAdvice.com Stored Procedure list today which included several solutions for this problem. The latest and ostensibly best one so far can be found in the sql archives here. That list, and the other lists on SqlAdvice, are great places to ask questions about anything database and SQL related.</p><br/></li><li><a href="/1844/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Working with Wilson ORMapper / UIMapper</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Working with Wilson ORMapper / UIMapper" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 March 2005</p><p style="width:100%;margin-top:2rem">I’ve been trying to get Paul Wilson’s ORMapper and UIMapper to work for a small application I’ve been working on. First, let me vent a bit. The lack of documentation for these tools is very frustrating. I would love to see at least a user-documentation area like the wiki that is set up at http://docs.communityserver.org/ so that Paul’s users could help build up the documentation themselves. I…</p><br/></li><li><a href="/1845/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More Fun With Wilson UIMapper</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="More Fun With Wilson UIMapper" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 March 2005</p><p style="width:100%;margin-top:2rem">I’ve now gotten a fair bit further along, and have created my first custom widget for the UIMapper. There is a sweet filepicker control (which also handles file uploading) called AWS FilePicker. It’s also FREE! Anyway, I now have a FilePickerWidget working with the Wilson UIMapper. It was actually pretty straightforward to get working. Given that the AWS control is free, maybe Paul would bundle…</p><br/></li><li><a href="/1842/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Multiple Root Webs on XP Pro</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Multiple Root Webs on XP Pro" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 March 2005</p><p style="width:100%;margin-top:2rem">Steven Cohn has anice hack for supporting multiple root websites on Windows XP Pro. You can’t do multiple simultaneous sites, but between this and the HOSTS file you can simulate any live site on your XP Pro box, which is a lot handier than having to remote into a Server install or use a virtual machine. (and of course, the reason this is an issue at all is that developing a site that resides in a…</p><br/></li><li><a href="/1841/"><h2 class="is-size-2" style="width:100%;word-break:break-word">List Options using CSS (e.g. avoiding HTML tables)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="List Options using CSS (e.g. avoiding HTML tables)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 March 2005</p><p style="width:100%;margin-top:2rem">I’ve recently been converted to the “kill all unnecessary tags used for layout” camp. I’ve been working for the last couple of months on usability and structural improvements to AspAlliance.com and have reduced the total size of each page significantly. The site flies now compared to a few months ago. However, it still uses a lot of TABLE tags for the main body, since I’ve thus far only had time…</p><br/></li><li><a href="/1840/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Bill Gates Knighted</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Bill Gates Knighted" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 March 2005</p><p style="width:100%;margin-top:2rem">Bill Gates was knighted by Queen Elizabeth II today. Gates will become a Knight Commander of the Most Excellent Order of the British Empire, an honor said to date back to 1917.** Gates was recognized for his contributions to improving health and reducing poverty in parts of the Commonwealth and elsewhere in the developing world, and for his contribution to enterprise, employment, education, and…</p><br/></li><li><a href="/1839/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Convert TivoToGo Files to Normal MPG for DVD Recording</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Convert TivoToGo Files to Normal MPG for DVD Recording" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 March 2005</p><p style="width:100%;margin-top:2rem">I’ve had a TiVo for a couple of years now and just recently installed the TiVo Desktop and TivoToGo software. I immediately ran into the problem that it’s impossible for me to burn shows to DVD without using Sonic’s software (I already have Nero so why should I buy something else?). Thankfully, there’s a lot of stuff available on Google including this popular article on TivoToGo MPEG2 Descrypting…</p><br/></li><li><a href="/1838/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Community Server Source Available</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Community Server Source Available" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 February 2005</p><p style="width:100%;margin-top:2rem">Rob Howard announces that Community Server, which was released last week, now hassource available as well.</p><br/></li><li><a href="/1837/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Spec Writing</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Spec Writing" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->23 February 2005</p><p style="width:100%;margin-top:2rem">I’m taking all my paper notes that I’ve accumulated over the last year (or two) on what the next version of my Internet advertisement server application will look like, and putting them into an electronic specification document. Not wanting to start from scratch, I did a bit of Googling to see what the latest and greatest wisdom is on writing functional specifications. Google yielded two notable…</p><br/></li><li><a href="/1836/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More Updates To AspAlliance</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="More Updates To AspAlliance" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 February 2005</p><p style="width:100%;margin-top:2rem">Last week I built some RSS consuming pieces for AspAlliance.com. I decided late in the week that I wanted to go ahead and add a listing of blog entries made by any AspAlliance Author, but although I had all the code to merge the many RSS feeds, I didn’t have a handy way to do so in an async fashion (that is, without causing a page to time out whenever the time came to go load up dozens of separate…</p><br/></li><li><a href="/1835/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Rules to Live By</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Rules to Live By" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 February 2005</p><p style="width:100%;margin-top:2rem">Bob Parsons, owner and founder of GoDaddy.com, has published his rules for survival, &quot;Robert, they can&#x27;t eat you!&quot;. It&#x27;s definitely a good read.</p><br/></li><li><a href="/1832/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Merging Multiple RSS Feeds</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Merging Multiple RSS Feeds" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 February 2005</p><p style="width:100%;margin-top:2rem">I’ve been working on a feature for the AspAlliance.com home page that would show some news and articles from a variety of sources in a single listing. So for the last day or two I’ve been building a couple of classes and methods and unit tests, etc. to handle the combining of multiple RSS feeds. Naturally it was only tonight as I’m almost done that I stumble upon Kent Sharkey‘s article, E…</p><br/></li><li><a href="/1833/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Wireless Dropping Problem (and Solution)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Wireless Dropping Problem (and Solution)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 February 2005</p><p style="width:100%;margin-top:2rem">On one of the AspAdvice mailing lists somebody was asking for help with their wireless card that kept dropping and re-connecting to the wireless network. The solution seems to be described in this ArsTechnica article, Ask Ars: routinely dropping WiFi connectivity.</p><br/></li><li><a href="/1834/"><h2 class="is-size-2" style="width:100%;word-break:break-word">An Interesting Prediction/Critique of Microsoft&#x27;s .NET Platform</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="An Interesting Prediction/Critique of Microsoft&#x27;s .NET Platform" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 February 2005</p><p style="width:100%;margin-top:2rem">Richard Grimes, a very recognized author and speaker on .NET topics, addresses what he considers as some missteps in the development of .NET and offers words of warning about the future of the platform. I have to say that some of his predictions, while certainly not what I would like to hear, seem to be pretty feasible given the course Microsoft has taken these last few years. I also tend to agree…</p><br/></li><li><a href="/1831/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Data Access Performance Comparison</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Data Access Performance Comparison" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 February 2005</p><p style="width:100%;margin-top:2rem">My article on Data Access Performance Comparison with .NET, ASP.NET and ADO.NET was published today on AspAlliance.com. In it, I compare the performance of several common data access techniques, including using DataReaders vs using DataTable or DataSet constructs. The one big surprise I ran into was just how much an open DataReader can cost on a busy site. The words instant death come to mind. One…</p><br/></li><li><a href="/dotnet-data-access-performance/"><h2 class="is-size-2" style="width:100%;word-break:break-word">.NET Data Access Performance Comparison</h2><img src="/static/330228211f14e1aa6b2f9963250dcdd7/4e530/dotnet-data-access.png" alt=".NET Data Access Performance Comparison" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 February 2005</p><p style="width:100%;margin-top:2rem">Download Sample Files Introduction and Background In .NET, there are several ways to extract data from a data source. The two most common techniques using ADO.NET involve the use of the DataReader or the filling of a DataSet or DataTable with a DataAdapter. In this article, a very easy-to-reproduce set of tests is analyzed to determine which techniques performs the fastest. Further, additional…</p><br/></li><li><a href="/1828/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Big Update To AspAlliance</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Big Update To AspAlliance" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 February 2005</p><p style="width:100%;margin-top:2rem">I’m getting ready to push a big update of AspAlliance.com tonight. I’ve implemented a number of Scott Mitchell’s articles/samples into the site now, including his UrlRewrite article (which someone referred me to when I was asking about resources on the topic, and ironically this was a topic I felt comfortable enough with a year ago that I almost co-authored with Scott for the MSDN piece. Guess I’m…</p><br/></li><li><a href="/1829/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Update Completed</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Update Completed" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 February 2005</p><p style="width:100%;margin-top:2rem">Updated the AspAlliance.com a few minutes ago. The new site looks like this: New AspAlliance Home Page First off, it won’t look anything like this if your CSS file is cached. So if it looks goofy to you, hit CTRL-F5 to refresh all files including the new CSS. I ran into one problem that threw me for a loop when I deployed. I started getting Site is Invalid errors, which I tracked down to my…</p><br/></li><li><a href="/1826/"><h2 class="is-size-2" style="width:100%;word-break:break-word">CodeSmith – Improved Sproc Generation Templates</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="CodeSmith – Improved Sproc Generation Templates" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 January 2005</p><p style="width:100%;margin-top:2rem">I edited my first CodeSmith templates today and found it to be quite straightforward, and a very powerful tool. I think I’m going to be hooked. Anyway, I was using it to generate some CRUD sprocs for a couple of tables I need in a small project I’m working on now for AspAlliance.com, and I decided that the default templates that shipped with it didn’t fit my needs because my tables have prefixes…</p><br/></li><li><a href="/1827/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Shuffle an ArrayList</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Shuffle an ArrayList" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 January 2005</p><p style="width:100%;margin-top:2rem">I have a need to randomly order the contents of a collection which has as its underlying container an ArrayList. Googling took more effort than I expected to come up with anything useful, but did yield this link. Working from there, I came up with this method, which differs in a few ways: The main improvements are these: The original used ArrayList.Length which wasn’t defined, so I converted to…</p><br/></li><li><a href="/1825/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Getting Back Into Coding</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Getting Back Into Coding" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 January 2005</p><p style="width:100%;margin-top:2rem">I’ve been back from Iraq for almost a month now, and back home in Ohio for almost 2 weeks. I have a new Alienware laptop that came last week and I’ve been trying to get it set up so that I can get some work done on it. It always surprises me how much *stuff* I have to install before I feel like my environment is ready to go. Here’s a quick list off the top of my head for this box: Windows XP Pro…</p><br/></li><li><a href="/asp-net-developers-cookbook-featured-on-net-book-club/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Developer&#x27;s Cookbook Featured on .NET Book Club</h2><img src="/static/9993bf94b0d410edfac0416e19c84c3f/0ff54/book-4600757_1280.jpg" alt="ASP.NET Developer&#x27;s Cookbook Featured on .NET Book Club" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 October 2004</p><p style="width:100%;margin-top:2rem">The ASP.NET Developer’s Cookbookis the featured book for October on the .NET Book Clubsite. Check it outhere.</p><br/></li><li><a href="/making-datareaders-less-evil/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Making DataReaders Less Evil</h2><img src="/static/6aa3b75e9484ef9092de1dfb61b89fce/0ff54/data-reader.jpg" alt="Making DataReaders Less Evil" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 September 2004</p><p style="width:100%;margin-top:2rem">I admit it, I’ve never been a big fan of the DataReader. There are two main reasons for this. Firstly, I’m a big fan of caching, and DataReaders cannot be cached. Thus, even if they are, say, 2x as fast as a DataTable the first time, the cached DataTable is 10x faster whenever it’s read from the cached (these numbers are made up just like 87% of all statistics). Another reason I’ve shied away from…</p><br/></li><li><a href="/days-of-the-week-selector-control/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Writing a Days of the Week Selector Control</h2><img src="/static/5d2905e8103056c978482f588a9b7d2c/4e530/days-week-selector.png" alt="Writing a Days of the Week Selector Control" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 September 2004</p><p style="width:100%;margin-top:2rem">No Control Required Download Code My first stab at this, keeping things as simple as possible, was just to do it on a web form without the added complication of creating a custom control. I&#x27;m storing the resulting selection in a database as in integer bitmask, where Sunday is 1 and Saturday is 64 (so values between 0000000 and 1111111 binary or 0 and 127 decimal are allowed). To do this, all…</p><br/></li><li><a href="/ten-ways-to-make-your-code-more-testable/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Ten Ways to Make Your Code More Testable</h2><img src="/static/a8ca43d8582eb44e6e3658175d07956d/0ff54/bulletin-board-3127287_1280.jpg" alt="Ten Ways to Make Your Code More Testable" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 September 2004</p><p style="width:100%;margin-top:2rem">I recently found this awesome article on TheServerSide.NET– I recommend it to anybody interested in TDD/Agile methodologies. 10 Ways to Make Your Code More Testable by Justin Gehtland</p><br/></li><li><a href="/bitmask-helper-function/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Bitmask Helper Function</h2><img src="/static/d87fe7ae9ed9a1ae4f827af7eec945e9/0ff54/deployment.jpg" alt="Bitmask Helper Function" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->31 August 2004</p><p style="width:100%;margin-top:2rem">I had a need recently to be able to determine if a given position of an integer bitmask was set or not (for example, given the bitmask 0101 which is 5 in decimal, how would you check if the 4 position is set? — this is less obvious for, say decimal 75 — is 16 set?). Here’s the method I came up with, which could be done in one line but is broken into several for clarity and ease of debugging…</p><br/></li><li><a href="/outlook-search-plugin-lookout/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Outlook Search Plugin Lookout!</h2><img src="/static/e0aa4fa021a3e666e2dc162771fb1d15/0ff54/search-2951638_1280.jpg" alt="Outlook Search Plugin Lookout!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 August 2004</p><p style="width:100%;margin-top:2rem">http://www.microsoft.com/downloads/details.aspx?FamilyID=09b835ee-16e5-4961-91b8-2200ba31ea37&amp;displaylang=en Note to self – download this and try it out ASAP.</p><br/></li><li><a href="/changes-coming-in-whidbey-b2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Changes Coming in Whidbey B2</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="Changes Coming in Whidbey B2" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 August 2004</p><p style="width:100%;margin-top:2rem">In case you’ve been in Iraq or something and haven’t already seen this, here’s a post from Shankuabout upcoming changes to ASP.NET coming in Beta 2 (mostly features that won’t make the cut). http://weblogs.asp.net/ShankuN/archive/2004/08/16/215487.aspx Somehow, despite my being in Iraq at the moment, this blog still gets way more readers than my current one at ArmySteve.com. I guess that’s a good…</p><br/></li><li><a href="/visual-web-developer-express-edition-whidbey-beta-1-released-2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Web Developer Express Edition (Whidbey) Beta 1 Released 2</h2><img src="/static/46b97653b16b8e2dc63e636cff5c2064/02521/vs2017-previewlogo.png" alt="Visual Web Developer Express Edition (Whidbey) Beta 1 Released 2" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 June 2004</p><p style="width:100%;margin-top:2rem">From www.asp.net: Visual Web Developer Express Edition 2005 Beta 1 Released! Microsoft is pleased to announce Visual Web Developer Express Edition 2005 Beta 1, a lightweight, easy to learn development tool focused exclusively on Web development. Inside you will find everything you need to begin building exciting, dynamic Web applications with ASP.NET 2.0. Visit http://lab.msdn.microsoft.com…</p><br/></li><li><a href="/visual-web-developer-express-edition-whidbey-beta-1-released/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Web Developer Express Edition (Whidbey) Beta 1 Released!</h2><img src="/static/46b97653b16b8e2dc63e636cff5c2064/02521/vs2017-previewlogo.png" alt="Visual Web Developer Express Edition (Whidbey) Beta 1 Released!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 June 2004</p><p style="width:100%;margin-top:2rem">From www.asp.net: Visual Web Developer Express Edition 2005 Beta 1 Released! Microsoft is pleased to announce Visual Web Developer Express Edition 2005 Beta 1, a lightweight, easy to learn development tool focused exclusively on Web development. Inside you will find everything you need to begin building exciting, dynamic Web applications with ASP.NET 2.0. Visit http://lab.msdn.microsoft.com…</p><br/></li><li><a href="/rss-aggregator-info/"><h2 class="is-size-2" style="width:100%;word-break:break-word">RSS Aggregator Info</h2><img src="/static/a6895bc47acc7c3608f95b068506310a/6050d/code-geek-2680204_1280.png" alt="RSS Aggregator Info" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 June 2004</p><p style="width:100%;margin-top:2rem">If you’re someone who’s interested in some content on a particular site, especially a blog, and you find yourself constantly checking the site to see if any new information has been posted, then you probably would benefit from using an aggregator. Almost every blog engine supports a standard called RSS, which is the de facto aggregation standard. What RSS does is provide a standard format…</p><br/></li><li><a href="/msdn-article-portals-and-personalization-in-asp-net-2-0/"><h2 class="is-size-2" style="width:100%;word-break:break-word">MSDN Article: Portals and Personalization in ASP.NET 2.0</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="MSDN Article: Portals and Personalization in ASP.NET 2.0" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 June 2004</p><p style="width:100%;margin-top:2rem">My MSDN Article was published a few weeks ago – here’s a link to the online version. http://msdn.microsoft.com/msdnmag/issues/04/06/ASPNET20Portals/default.aspx</p><br/></li><li><a href="/3dftp-client-ws_ftp-lite-client/"><h2 class="is-size-2" style="width:100%;word-break:break-word">3DFTP Client &gt;&gt; WS_FTP(lite) Client</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="3DFTP Client &gt;&gt; WS_FTP(lite) Client" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->08 June 2004</p><p style="width:100%;margin-top:2rem">I’ve been using WS_FTP for a LONG time (the free/lite version) and recently I had the need to download something with resume capability (my ‘net access is intermittent at best here at Ft. Leonardwood, Missouri). So I did a quick search and found 3dFTP, which I downloaded and have been very happy with. It’s multi-threaded, so it will download several files concurrently. Somehow, that makes for a…</p><br/></li><li><a href="/micro-caching-article-published/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Micro Caching Article Published</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Micro Caching Article Published" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 May 2004</p><p style="width:100%;margin-top:2rem">Those of you interested in caching should read my article on AspAlliance about what I’ve termed micro-caching. Basically, the idea is that even a very short-term cache can make a big difference in site performance for a high-volume application or resource. I’d known about this in theory for some time, but I finally demo’d it to a class I was teaching at Ohio Savings Bank in April to get some hard…</p><br/></li><li><a href="/microcaching-one-second-cache/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Micro Caching - Benefits of a One-Second Cache</h2><img src="/static/38f28171ea9333c54df41aad9e45ec1b/4e530/micro-caching-title.png" alt="ASP.NET Micro Caching - Benefits of a One-Second Cache" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 May 2004</p><p style="width:100%;margin-top:2rem">Introduction I fell in love with caching when I first started playing with it in the early versions of the ASP.NET alphas. I was aware of caching before that, but I&#x27;d never really gone to the effort to seriously implement a cache engine in an ASP app, and with ASP.NET, I didn&#x27;t have to. The thing that attracts me to caching is its impact on performance without requirements (usually) for major re…</p><br/></li><li><a href="/properties-universally-good-or-not/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Properties? Universally good or not?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Properties? Universally good or not?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 April 2004</p><p style="width:100%;margin-top:2rem">jaybaz_MS writes about Properties? Not my bag baby and makes some excellent points. I’m at a public connection right now so I don’t have time to take up his challenge of writing a generic cached property class, but perhaps when I have some time at home I will (and this post will remind me).</p><br/></li><li><a href="/mvp-summit-pics/"><h2 class="is-size-2" style="width:100%;word-break:break-word">MVP Summit Pics</h2><img src="/static/549509c74b92757685909e5e224b6efc/8c332/WeeklyDevTips_600x591-600x360.png" alt="MVP Summit Pics" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 April 2004</p><p style="width:100%;margin-top:2rem">I’ve posted some of my pics from the MVP Summit.</p><br/></li><li><a href="/asp-net-connections-pictures/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Connections Pictures</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="ASP.NET Connections Pictures" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 April 2004</p><p style="width:100%;margin-top:2rem">I’m at ASP.NET Connections in Orlando this week, promoting DevAdvice with my wife Michelle, our daughter Ilyana, and David Gottlieb, who has been doing a lot of dev work for the site. I’ve uploaded the first couple of days’ pictures to a gallery here. Update: David Gottlieb has some more pictures here. I’ll be adding more to my gallery, perhaps today, as well.</p><br/></li><li><a href="/asp-net-feature-request/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Feature Request</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="ASP.NET Feature Request" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 April 2004</p><p style="width:100%;margin-top:2rem">If you’re not aware, a great feature coming in ASP.NET 2.0 allows user profile data to be stored based on a simple config section, with strong typing and design time Intellisense. Thus, you can modify the pieces of information you wish to store about a user, and immediately get Intellisense, strong typing, etc. However, the Roles feature continues to use string literals to describe roles, such as…</p><br/></li><li><a href="/more-breaking-changes-for-whidbey-–-personalization-profile/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More Breaking Changes for Whidbey – Personalization/Profile</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="More Breaking Changes for Whidbey – Personalization/Profile" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 April 2004</p><p style="width:100%;margin-top:2rem">Personalization as a keyword/namespace has been replaced with Profile. The namespace, the config section, etc. Also, the provider model for personalization has changed between the PDC Whidbey and the March04Preview Whidbey, such that now providers must inherit from System.Web.Profile.ProfileProvider, rather than implementing a couple of (now non-existent) interfaces. An example config section…</p><br/></li><li><a href="/tech-ed-meet-the-technologist-sessions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tech Ed Meet The Technologist Sessions</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Tech Ed Meet The Technologist Sessions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 April 2004</p><p style="width:100%;margin-top:2rem">I’m presenting two ‘Meet the Technologist’ Sessions at TechEd04. These sessions are similar to breakout sessions and run at the same time as the breakouts and for the same length of time. The only difference is they are smaller and more intimate, with the largest ones seating about 40 people. They are located in the Developer Tools and Technology community area. The first one I’m presenting is on…</p><br/></li><li><a href="/visual-studio-ide-settings-–-remember-mine/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Studio IDE Settings – Remember Mine!</h2><img src="/static/860f09a6f174e72bde5a733ca23b1926/4c509/vscode-760x360.png" alt="Visual Studio IDE Settings – Remember Mine!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 April 2004</p><p style="width:100%;margin-top:2rem">TimSull writes about a new feature coming in Whidbey/VS2K5 that will allow developers to export and import their Visual Studio customization settings to and from files. This is a feature I’ve had an interest in for some time, but I want to take it a step further. I’ve mentioned this on several occasions to members of the VS.NET team, but I don’t think they’re going for it, so please comment on…</p><br/></li><li><a href="/weird-caching-error-youre-probably-not-using-the-right-cache-access-pattern…/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Weird Caching Error? You&#x27;re probably not using the right cache access pattern…</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Weird Caching Error? You&#x27;re probably not using the right cache access pattern…" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->02 April 2004</p><p style="width:100%;margin-top:2rem">Scott Cate, who runs kbAlertz.com, among other things, writes about an intermittent error he was getting on his site last fall. Shortly before this, I had written an article on msdn about Caching Best Practices, in which I described a caching pattern that should be followed to ensure proper behavior (e.g. no null reference exceptions). Scott was getting intermittent errors about 1 every 50,00…</p><br/></li><li><a href="/aspadvice-facelift/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AspAdvice Facelift</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AspAdvice Facelift" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 April 2004</p><p style="width:100%;margin-top:2rem">We’ve updated the look of AspAdvice, thanks to Ken Schaefer. Jeff Julianwas nice enough to implement the look on the AspAdvice Blogs home page, too, and hopefully we’ll have the new design applied to all of our DevAdvice sites.</p><br/></li><li><a href="/new-version-of-fxcop-released-1-30/"><h2 class="is-size-2" style="width:100%;word-break:break-word">New Version of FxCop Released (1.30)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="New Version of FxCop Released (1.30)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 March 2004</p><p style="width:100%;margin-top:2rem">Jeffrey van Gogh announces a new version of FxCop. Version 1.30 finally stops locking assemblies it’s analyzing! Yay! And it’s got a few other new features, too… http://www.gotdotnet.com/team/fxcop/</p><br/></li><li><a href="/avoiding-the-global-assembly-cache/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Avoiding the Global Assembly Cache</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Avoiding the Global Assembly Cache" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 March 2004</p><p style="width:100%;margin-top:2rem">Chris Sells writes about reasons why we should avoid using the Global Assembly Cache, or GAC (pronounced “gack!”). I have to say that I definitely agree with his sentiments. Ted Neward disagrees with some points here. One counter-argument Ted makes against Chris’ original statement is this: First and foremost, I’ve never heard of the idea that the GAC is there to save hard drive space; anybody who…</p><br/></li><li><a href="/speaking-in-redmond-about-whidbey/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking in Redmond about Whidbey</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Speaking in Redmond about Whidbey" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 March 2004</p><p style="width:100%;margin-top:2rem">Carl Prothman invited me to speak at the .NET Developers Association meeting in April next week about Whidbey features. Hopefully I’ll have all of my demos working with the new March04 Preview build that just came available last week. Full details of the meeting, which takes place the week of the MVP summit in the evening (so hopefully I’ll get some of my fellow MVPs there), are available here…</p><br/></li><li><a href="/got-asp-net-email-questions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Got ASP.NET Email Questions?</h2><img src="/static/b6703bce61b1a559a5dba27a7ffcb55c/0ff54/email-3597088_1280.jpg" alt="Got ASP.NET Email Questions?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 March 2004</p><p style="width:100%;margin-top:2rem">Dave Wanta, who also sells the great email component AspNetEmail, has created a great resource for learning about and troubleshooting (and there’s often trouble to shoot) sending emails using System.Web.Mail (aka CDONTS). This resource is aptly named SystemWebMail.com.</p><br/></li><li><a href="/aspnet-whidbey/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Whidbey Overview</h2><img src="/static/aac9a81b84b20501924e5eae25528ce4/4e530/whidbey.png" alt="ASP.NET Whidbey Overview" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 March 2004</p><p style="width:100%;margin-top:2rem">Introduction ASP.NET was first previewed at PDC in July of 2000. The first beta followed about a year later and the actual RTM of ASP.NET 1.0 came in February of 2002. ASP.NET 1.1 and Visual Studio 2003 came about a year after that, but did not include many feature updates. ASP.NET 2.0 / Visual Studio 2005, collectively code-named &#x27;Whidbey&#x27;, have been in development since before ASP.NET 1.0 was…</p><br/></li><li><a href="/mounting-iso-images-as-drives/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Mounting ISO Images as Drives</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Mounting ISO Images as Drives" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 March 2004</p><p style="width:100%;margin-top:2rem">I tried using Isobuster to extract the ISO of the VS2005 DVD image that I just downloaded off of MSDN but after burning it, I got a “Please insert VS Disk 1” midway through the install (I don’t know if that was user error, an Isobuster issue, or a DVD-burning issue — probly user error). So, that DVD is now a coaster. Did a quick search since I knew that it should be possible to mount an ISO as a…</p><br/></li><li><a href="/deloittes-adserve/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Deloittes AdServe</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Deloittes AdServe" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 March 2004</p><p style="width:100%;margin-top:2rem">I’ve been looking for some ad serving software for DevAdvice this year, and the best one around for purchase that I’ve found is deloittes.NET AdServe. I have their full-source license, which comes with VB and has thus far been pretty easy to customize with a few of my own requirements. I was really impressed with the overall professional look of the user interface and the reporting capabilities…</p><br/></li><li><a href="/vs-2005-breaking-changes-from-pdc-bits/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VS 2005 Breaking Changes (from PDC Bits)</h2><img src="/static/396359eee4e20ff24d9a2d3fa5dbc497/4c509/vslogo-760x360.png" alt="VS 2005 Breaking Changes (from PDC Bits)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 March 2004</p><p style="width:100%;margin-top:2rem">As I mentioned in an earlier post, I’ve just installed VS 2005 and am now ready to start reporting on it. Some folks like Rick have reported stability issues with this build but I haven’t had any such problems thus far, and it is working much better than an interim build I had installed about a month ago. One of the first things I’m doing is looking for breaking changes from the previous alpha, of…</p><br/></li><li><a href="/more-breaking-changes-in-asp-net-march-2004-preview-build/"><h2 class="is-size-2" style="width:100%;word-break:break-word">More Breaking Changes in ASP.NET (March 2004 Preview Build)</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="More Breaking Changes in ASP.NET (March 2004 Preview Build)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 March 2004</p><p style="width:100%;margin-top:2rem">Found some more breaking changes: System.Web.Personalization no longer exists. I believe it’s been renamed to System.Web.Profile but I haven’t 100% confirmed this yet. System.Configuration.Settings no longer exists. I can’t find its replacement. I’m looking for where IProvider and ISettingsProvider are defined now. I can’t find these either, so I’m thinking they may no longer exist. I’m not sure…</p><br/></li><li><a href="/devdays-aftermath-a-bit-late/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DevDays Aftermath (a bit late)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="DevDays Aftermath (a bit late)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 March 2004</p><p style="width:100%;margin-top:2rem">I’ve been awfully busy, so I apologize to the two of you who actually read my blog. I spoke at DevDaysin Cleveland a few weeks ago. Overall the event went pretty well. There were over 200 people there. I saw a bunch of folks I’ve worked with before at various clients in the Cleveland area, including Gregg, John, Mike, Dan, and others. I was surprised what a ‘small world’ Cleveland is as far as the…</p><br/></li><li><a href="/visual-studio-2005-community-technology-preview-march-2004-–-full-dvd-image-english/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Visual Studio 2005 Community Technology Preview March 2004 – Full DVD Image (English)</h2><img src="/static/860f09a6f174e72bde5a733ca23b1926/4c509/vscode-760x360.png" alt="Visual Studio 2005 Community Technology Preview March 2004 – Full DVD Image (English)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 March 2004</p><p style="width:100%;margin-top:2rem">If you’re an MSDN Universal subscriber, you can now download VS 2005 from https://msdn.one.microsoft.com/Subscriber/1033/Default.asp. I believe VSLive attendees are getting the DVDs this week as well. I’ve got quite a few hours to go on my download, but once I have it and install it, I’ll be sure to blog about what’s new.</p><br/></li><li><a href="/going-to-teched/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Going to TechEd</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Going to TechEd" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 March 2004</p><p style="width:100%;margin-top:2rem">I registered for TechEd today, so I’m definitely going. I’m staying at the Holiday Inn Harbor View from Sunday night through Thursday night and leaving Friday. I haven’t booked a flight yet. I’m not speaking this time around but I’ll probably do some Ask The Experts, Birds of a Feather, or other breakout session(s). Hope to see you there!</p><br/></li><li><a href="/whidbey-and-yukon-final-names-and-latest-ship-date-estimates-announced/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Whidbey and Yukon Final Names (and latest ship date estimates) Announced</h2><img src="/static/e2f0998b6c15f649fdcf24a42844178b/47974/sql-server-sql-server-management.png" alt="Whidbey and Yukon Final Names (and latest ship date estimates) Announced" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 March 2004</p><p style="width:100%;margin-top:2rem">In this eWeek article, Microsoft confirms that the final names for Whidbey and Yukon will be Visual Studio 2005 and Microsoft SQL Server 2005. Both are expected to ship in the first half of 2005 (my own predictions of a Whidbey ship date of 2004Q5 may yet be realized…)</p><br/></li><li><a href="/provider-design-pattern-explained/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Provider Design Pattern Explained</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Provider Design Pattern Explained" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 March 2004</p><p style="width:100%;margin-top:2rem">Rob Howard goes into detail explaining how the Provider Design Pattern works, where it came from, why you should use it, and how to write your own providers, both today and once Whidbey is released. Check it out in the resurrected Nothin’ But ASP.NET column on MSDN online. Provider Model Design Pattern and Specification, Part 1</p><br/></li><li><a href="/new-resource-for-crystal-reports-users/"><h2 class="is-size-2" style="width:100%;word-break:break-word">New Resource For Crystal Reports Users</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="New Resource For Crystal Reports Users" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 March 2004</p><p style="width:100%;margin-top:2rem">There is now a Crystal Reports -dedicated community on AspAlliance.com, run by CR guru Eric Landes. If you’re in need of assistance with a CR problem or just want to get up to speed, check it out. http://aspalliance.com/crystal</p><br/></li><li><a href="/vault-thoughts/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Vault Thoughts</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Vault Thoughts" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 February 2004</p><p style="width:100%;margin-top:2rem">Xander Sherry has a new blog and is wondering why people like Vault. Here’s my $.03. It’s all .NET. I know that shouldn’t really matter to me as long as it does what it says it does, but i like that. It’s DB-based, so it won’t get corrupted or have issues with file locks like VSS does. It works over the Internet – VSS doesn’t. It’s alive and thriving. VSS has been on 6.0x for the last decade…</p><br/></li><li><a href="/infopath-2003-hacking-change-xsn-location-db-source/"><h2 class="is-size-2" style="width:100%;word-break:break-word">InfoPath 2003 Hacking Change XSN Location; DB Source</h2><img src="/static/53f261aef62d142c37e2078f20ca20d6/0ff54/database.jpg" alt="InfoPath 2003 Hacking Change XSN Location; DB Source" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 February 2004</p><p style="width:100%;margin-top:2rem">I built a handy InfoPath form to do some data entry for the AspAlliance Ad Network back when it was still in beta over the summer of 2003. In December, I moved my database server to a dedicated box (with new connection string settings), and around that same time I rebuilt my file server and renamed it as well. Thus, the next time I went to use my handy InfoPath form, it informed me that the XSN…</p><br/></li><li><a href="/i-love-infopath-but-it-doesnt-use-net…-until-now/"><h2 class="is-size-2" style="width:100%;word-break:break-word">I love InfoPath, but it doesn&#x27;t use .NET… until now</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="I love InfoPath, but it doesn&#x27;t use .NET… until now" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 February 2004</p><p style="width:100%;margin-top:2rem">Check it out — the InfoPath 2003 Toolkit for VS.NET was released a few days ago. My biggest gripe about InfoPath is that it relies on VBScript/JavaScript and ADO for its customization (e.g. anything outside the norm you want it to do). Well, according to the download page, the new toolkit: provides integration features and documentation that enable you to use Visual Studio .NET to create, debug…</p><br/></li><li><a href="/oreilly-csharp-cookbook/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Book Review - O&#x27;Reilly C# Cookbook</h2><img src="/static/f15330418465836327c06f5a448ea47c/4e530/csharp-cookbook-review.png" alt="Book Review - O&#x27;Reilly C# Cookbook" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 February 2004</p><p style="width:100%;margin-top:2rem">Overview Cover O&#x27;Reilly&#x27;s C# Cookbook, by Stephen Teilhet &amp; Jay Hilyard (not to be confused with the MS Press C# Programmer&#x27;s Cookbook or the SAMS Visual C# .NET 2003 Developers&#x27; Cookbook), retails for $49.95 and is about 800 pages. It&#x27;s about $35 from Amazon at the moment. The book uses the &#x27;cookbook&#x27; format that is becoming quite popular as evidenced by the two other C# cookbooks on the market…</p><br/></li><li><a href="/outlook-2003-calendar-living-in-the-past/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Outlook 2003 Calendar Living In The Past</h2><img src="/static/15a16d1be0eb66b134eb2267a34803d5/4e530/outlook2003.png" alt="Outlook 2003 Calendar Living In The Past" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 February 2004</p><p style="width:100%;margin-top:2rem">There’s probably a way to fix this – I’m hoping someone will tell me. I have Outlook 2003. I have the calendar set up to default to Month view. However, it seems to always want to show me a lot of stuff in the past. It might just be that it is showing me the whole current month, but halfway through the month I really don’t care about the first half of the month, I’m much more concerned with the…</p><br/></li><li><a href="/latest-tdd-tool-in-the-nfoo-series-ncover/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Latest TDD Tool in the NFoo series: NCover</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Latest TDD Tool in the NFoo series: NCover" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 February 2004</p><p style="width:100%;margin-top:2rem">Everybody’s talking about it, it seems (Jonathan Cogley, Jeff Key, hey, that’s everybody, right?). NCover (GDN, SF) is a new tool that analyzes source code and unit tests to provide information about test coverage — that is, how much of your code is actually being tested by your tests. One nice feature it supports already (the SF version is 0.7 — I haven’t tried the GDN version which I just now…</p><br/></li><li><a href="/paired-programming-analysis-by-the-menlo-software-factory/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Paired Programming Analysis by the Menlo Software Factory</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Paired Programming Analysis by the Menlo Software Factory" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->21 February 2004</p><p style="width:100%;margin-top:2rem">Finally subscribed to Jonathan Cogley’s blog and found this gem on Paired Programming: http://www.menloinstitute.com/freestuff/whitepapers/pairedprogramming_qanda.htm As JC notes, view the PDF not just the HTML, since it includes some pictures of how the work environment is laid out.</p><br/></li><li><a href="/asp-net-resource-kit-available/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Resource Kit Available</h2><img src="/static/d8bade7c69f4cb2cf1e6e8b009d2f20f/f1407/aspnetcore-1.png" alt="ASP.NET Resource Kit Available" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 February 2004</p><p style="width:100%;margin-top:2rem">Download the ASP.NET Resource Kit and check it out. It’s 131MB (you can also order the CD, which I imagine will probably come with MSDN or something at some point). It’s only become available for download within the hour and I’m at 5% as I write this, so obviously I haven’t had time to really play with it. It comes with a bunch of sample web apps, code samples, step-by-step guides, training videos…</p><br/></li><li><a href="/whidbey-overview-talk-in-south-bend-went-pretty-well/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Whidbey Overview Talk in South Bend Went Pretty Well</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Whidbey Overview Talk in South Bend Went Pretty Well" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 February 2004</p><p style="width:100%;margin-top:2rem">I spoke to about a dozen folks at the MADNUG user group this evening about Whidbey. Borrowing heavily from Scott Guthrie’s slide/demo pack that he has shown on several occasions, I did a ‘whirlwind tour’ of the new features that are coming. Some of the highlights included Master Pages, Authentication Controls, built-in portal features, GridView/DetailsView, dynamic image generation support…</p><br/></li><li><a href="/speaking-in-south-bend-in/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking in South Bend, IN</h2><img src="/static/d8bade7c69f4cb2cf1e6e8b009d2f20f/f1407/aspnetcore-1.png" alt="Speaking in South Bend, IN" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 February 2004</p><p style="width:100%;margin-top:2rem">I’ll be speaking at the Michiana Area .NET Users Group (MADNUG) this Tuesday, February 17th, about Whidbey (ASP.NET / VS.NET v2). The presentation will essentially be a ‘whirlwind tour’ of many of the most exciting new features in Whidbey, with the general format being slide, demo, slide, demo. If you haven’t seen Whidbey yet, or had a chance to use the tech preview (released at PDC to attendees…</p><br/></li><li><a href="/auto-updating-cache-entries/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Auto-Updating Cache Entries</h2><img src="/static/d8bade7c69f4cb2cf1e6e8b009d2f20f/f1407/aspnetcore-1.png" alt="Auto-Updating Cache Entries" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 February 2004</p><p style="width:100%;margin-top:2rem">As I posted here, I’m interested in a feature of the ASP.NET Cache engine that isn’t there today, and it sounds like won’t be there in Whidbey. To wit, I’d like to be able to throw something in the cache and have it periodically update itself in an offline process, rather than simply expire and force a user request to sit and wait while the data is retrieved. I’ve come up with a workaround/hack…</p><br/></li><li><a href="/speaking-in-redmond-april-5th/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking in Redmond April 5th</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="Speaking in Redmond April 5th" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 February 2004</p><p style="width:100%;margin-top:2rem">I’ll be speaking in Redmond on April 5th at the .NET Developers Association user group, on Microsoft campus. Thanks to Carl Prothman for organizing the event and inviting me. I’ll be in town for Microsoft’s MVP Summit, which should be a lot of fun. I’m speaking on Whidbey (ASP.NET/VS.NET v2) features, providing a ‘whirlwind tour’ of the new features in this upcoming release. Carl and I are hoping…</p><br/></li><li><a href="/sourcegear-vault-2-0-released-–-and-price-reduced/"><h2 class="is-size-2" style="width:100%;word-break:break-word">SourceGear Vault 2.0 Released – And Price Reduced!</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="SourceGear Vault 2.0 Released – And Price Reduced!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 February 2004</p><p style="width:100%;margin-top:2rem">http://software.ericsink.com/vault2_pricing.html Eric Sink of SourceGear talks about why they’ve opted to drop their prices – mostly they’ve adopted a very reasonable volume licensing scheme which I like a lot better than their previous $400/user no-matter-how-many model. I must admit I was one of the many whiners about their old pricing model, and it’s nice to see that SourceGear as a company…</p><br/></li><li><a href="/switching-primary-blog-locations-to-blogs-aspadvice-com/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Switching Primary Blog Locations to Blogs.AspAdvice.com</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Switching Primary Blog Locations to Blogs.AspAdvice.com" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 February 2004</p><p style="width:100%;margin-top:2rem">I’m going to be doing most of my blogging over at http://aspadvice.com/blogs/ from now (well, actually a couple of weeks ago) on. If you’re subscribed to this, you should subscribe to http://aspadvice.com/blogs/ssmith/rss.aspx instead/as well. Thanks! Steve Update: Updated URLs. Also, get $5 for signing up for a new PayPal-like service I blogged about here(until end of Feb 06).</p><br/></li><li><a href="/home-from-vermont-and-montreal/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Home From Vermont and Montreal</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Home From Vermont and Montreal" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 February 2004</p><p style="width:100%;margin-top:2rem">Today was my first day back home from my trip to Vermont and Montreal to speak at user groups. I’ve posted a few pictures in my gallery. I flew in and out of Burlington, VT, which is a tiny little international airport. I got in Saturday, saw some of downtown Burlington with Julia Lerman, my host, and her husband Richard. They live up in the mountains about 45 minutes south of Burlington. On…</p><br/></li><li><a href="/paul-vick-top-10-rules-of-performance/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Paul Vick Top 10 Rules of Performance</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Paul Vick Top 10 Rules of Performance" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 February 2004</p><p style="width:100%;margin-top:2rem">I was just referred to this by Darren Neimke. It’s a great top 10 list of things to do/not to do when you’re trying to increase the performance of an application. Being a scalability and performance kind of guy, I really enjoyed the read, and must blog about it so that I can find it in the future. Top 10 Rules of Performance</p><br/></li><li><a href="/1771/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Code Katas</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Code Katas" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->03 February 2004</p><p style="width:100%;margin-top:2rem">I found an interesting page I haven’t had a chance to really play with yet, but I’m posting it here so I can find it later. I’ll comment more when I have a chance to actually go through some of these katas. PragDave’s Code Kata</p><br/></li><li><a href="/asp-net-whidbey-caching-features-–-wheres-the-self-renewing-feature/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Whidbey Caching Features – Where&#x27;s the Self-Renewing Feature?</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="ASP.NET Whidbey Caching Features – Where&#x27;s the Self-Renewing Feature?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2004</p><p style="width:100%;margin-top:2rem">One new feature Whidbey supports is custom CacheDependencies. Simply inherit from CacheDependency and NotifyDependencyChanged() whenever you want the cache to be invalidated — very simple. An old feature that has been around since 1.0 is the CacheItemRemovedCallback. For those unfamiliar, this (still sealed) callback is executed immediately after a cache entry is invalidated. Unfortunately, it is…</p><br/></li><li><a href="/vs-net-asp-net-projects-as-class-library-projects/"><h2 class="is-size-2" style="width:100%;word-break:break-word">VS.NET: ASP.NET Projects as Class Library Projects</h2><img src="/static/46b97653b16b8e2dc63e636cff5c2064/02521/vs2017-previewlogo.png" alt="VS.NET: ASP.NET Projects as Class Library Projects" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2004</p><p style="width:100%;margin-top:2rem">http://staff.develop.com/onion/Samples/aspdotnet_without_web_projects.htm Excerpt: The Web Project wizard in Visual Studio .NET is convenient for creating quick ASP.NET applications on your local machine, but in an effort to simplify your life, it also makes many decisions for you that are difficult to change if you need more flexibility. My biggest pet peeve with Web Projects is that you cannot…</p><br/></li><li><a href="/cleveland-devdays-–-ill-be-there/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cleveland DevDays – I&#x27;ll Be There</h2><img src="/static/78e6f64dc8ddf2639fb15c269367e3f3/0ff54/cleveland.jpg" alt="Cleveland DevDays – I&#x27;ll Be There" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2004</p><p style="width:100%;margin-top:2rem">If you’re in the Cleveland area, I encourage you to sign up now for the Cleveland DevDays event, happening on Wednesday, March 10th. I’ll be presenting there on some of the fundamentals of web-application security (in the Web Development track, obviously), and there will be a bunch of other presentations as well. In addition to the content, one of the biggest reasons why you shouldn’t miss this…</p><br/></li><li><a href="/speaking-in-vermont/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking in Vermont</h2><img src="/static/983e483415848c9ff1e0ede84a6b2472/0ff54/vermont.jpg" alt="Speaking in Vermont" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2004</p><p style="width:100%;margin-top:2rem">I’ll be speaking at the Vermont .NET User Group on Caching in ASP.NET next Monday night, February 9th, 2004. If you’re in the area, stop by and say hi.</p><br/></li><li><a href="/speaking-in-montreal-canada/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking in Montreal, Canada</h2><img src="/static/ab048a6b0249b8fbbba44942223054bd/0ff54/canada.jpg" alt="Speaking in Montreal, Canada" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 February 2004</p><p style="width:100%;margin-top:2rem">I’ll be speaking at the Montreal .NET User Group hosted by Guy Barrette next Tuesday February 10th on ASP.NET Caching. Stop by if you’re in the area. It will be downtown at the IBM building on the 19th floor, and starts at 6:30pm.</p><br/></li><li><a href="/jamaica-pictures-posted/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Jamaica Pictures Posted</h2><img src="/static/2d6288aed4449d1a64fe693784a5837c/0ff54/jamaica.jpg" alt="Jamaica Pictures Posted" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 January 2004</p><p style="width:100%;margin-top:2rem">Trying out the Gallery feature of .Text, I’ve added a bunch of pictures from my recent family vacation to Jamaica. You’ll find the pictures here. I got my SCUBA Open Water certification while I was there; the pictures are from my second and third dives for the certification with Andrew my instructor and two fellow vacationers, Jim and Kevin. We were in Jamaica from January 14th to the 19th.</p><br/></li><li><a href="/blogs-have-come-to-aspadvice/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Blogs Have Come To AspAdvice</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Blogs Have Come To AspAdvice" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 January 2004</p><p style="width:100%;margin-top:2rem">More changes are coming soon to AspAdvice. Look for better searching of the lists, community member blogs, forums (perhaps integrated with the mailing lists), and more!</p><br/></li><li><a href="/production-database-migration/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Production Database Migration</h2><img src="/static/df6b54097902507e78ffbc03e03225b6/41d01/asp-net-mvc-logo.jpg" alt="Production Database Migration" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->13 December 2003</p><p style="width:100%;margin-top:2rem">I thought I’d share my experience with moving a heavily used production database for a live website from one server to another this weekend. The database in question is used to support AspAlliance.com, but since it has been around for a long time, and since getting additional databases has not always been easy or free, there are several other sites that rely on this same database. Additionally, on…</p><br/></li><li><a href="/evolving-custom-web-controls/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Evolving Custom Web Controls</h2><img src="/static/d8bade7c69f4cb2cf1e6e8b009d2f20f/f1407/aspnetcore-1.png" alt="Evolving Custom Web Controls" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->12 December 2003</p><p style="width:100%;margin-top:2rem">Although sometimes you start out knowing you need a custom control, what more often happens is you find that you’re using the same functionality in more than one place, so you start packaging it up into a control in order to remove duplication and improve reusability. This article takes a look at when and how you should do such things by taking a fairly simple piece of ASP.NET functionality and…</p><br/></li><li><a href="/newsgator-activation/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Newsgator Activation</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Newsgator Activation" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 December 2003</p><p style="width:100%;margin-top:2rem">Ok, so I got newsgator last week (http://weblogs.asp.net/ssmith/posts/41415.aspx) and today was the first day since then that I actually rebooted my machine and got the nag prompt to activate it when I started Outlook. So, having become enthralled with the product, I decided what the heck and spent the $29 to buy it. Got my activation key in an email a few minutes later, life was good, I clicked…</p><br/></li><li><a href="/aspalliance-com-rss-is-back/"><h2 class="is-size-2" style="width:100%;word-break:break-word">AspAlliance.com RSS Is Back</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="AspAlliance.com RSS Is Back" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 December 2003</p><p style="width:100%;margin-top:2rem">After a couple of months of downtime, AspAlliance.com‘s RSS Feed has returned and is better than ever. Thanks to Scott Mitchell for his cool MSDN article on building an RSS feed. http://aspalliance.com/rss.aspx</p><br/></li><li><a href="/newsgator-1-3/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Newsgator 1.3</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Newsgator 1.3" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 December 2003</p><p style="width:100%;margin-top:2rem">I’ve never used Newsgator before but since I just redid the RSS feed on AspAlliance.com I thought I should give it a shot and see how it works (I’ve also only recently gone to Outlook from Outlook Express (see past archives for my thoughts on the switch)). I have to say I really like it and am starting to subscribe to a bunch of blogs that previously I would manually periodically check with my…</p><br/></li><li><a href="/pdc-sessions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC Sessions</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="PDC Sessions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 November 2003</p><p style="width:100%;margin-top:2rem">In addition to the powerpoints available at http://www.asp.net/whidbey/ you can also watch the presentations, including demos, in MS Producer format at http://microsoft.sitestream.com/PDC2003/Default.htm.Others have noted this – I mention it here so I can find the link later…</p><br/></li><li><a href="/sys-con-radio-interview-pdc-2003/"><h2 class="is-size-2" style="width:100%;word-break:break-word">SYS-CON Radio Interview (PDC 2003)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="SYS-CON Radio Interview (PDC 2003)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 November 2003</p><p style="width:100%;margin-top:2rem">My SYS-CON Radio Interview from PDC has recently been published on their website (along with a great many other more important people’s interviews). Check them out and download them in MP3 format. http://www.sys-con.com/dotnet/radio2003/interviews.cfm</p><br/></li><li><a href="/speaking-at-memphis-dnug/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Speaking At Memphis DNUG</h2><img src="/static/d8bade7c69f4cb2cf1e6e8b009d2f20f/f1407/aspnetcore-1.png" alt="Speaking At Memphis DNUG" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->14 November 2003</p><p style="width:100%;margin-top:2rem">I’ll be speaking at the Memphis .NET User Groupon Tuesday, 11/18. I’m going to be giving an overview of ASP.NET Whidbey, which of course has recently been made public at the Microsoft Professional Developers’ Conference 2003 in late October. For more information and directions to the event, see the MNUG website.</p><br/></li><li><a href="/regex-to-the-rescue-for-shorter-urls/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Regex To The Rescue For Shorter URLs</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Regex To The Rescue For Shorter URLs" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 November 2003</p><p style="width:100%;margin-top:2rem">I’ve been redesigning AspAlliance.com off and on for the last several months, and I made a few more changes this morning. The big one that is noticeable to the general public is the URLs. Instead of having to link to articles via a viewer ASPX page and a series of querystring values, it is now sufficient to simply append the article ID to the end of the domain name (after a slash), like so: http…</p><br/></li><li><a href="/34798/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Touchgraph GoogleBrowser</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Touchgraph GoogleBrowser" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 October 2003</p><p style="width:100%;margin-top:2rem">Check out this cool tool to map out where your website is in the Internet space, according to Google. TouchGraph GoogleBrowser</p><br/></li><li><a href="/caching-tips-pdc2003/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Caching Tips from PDC 2003</h2><img src="/static/71d75233c2cb50b8942b0b40c16264dd/4e530/pdc-2003-caching.png" alt="ASP.NET Caching Tips from PDC 2003" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 October 2003</p><p style="width:100%;margin-top:2rem">Caching Tips I hosted a Birds of a Feather Session at PDC 2003 which was attended by about 30 people, including Rob Howard from the ASP.NET team. During the course of the event, a number of tips and resources for caching in .NET were revealed. The highlights are listed here. Output caching, even for just a couple of seconds, can dramatically reduce database load if pages are being hit several…</p><br/></li><li><a href="/pdc-asp-net-panel-discussion-–-non-postback-callbacks-to-pages/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC ASP.NET Panel Discussion – Non-Postback Callbacks to Pages</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="PDC ASP.NET Panel Discussion – Non-Postback Callbacks to Pages" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 October 2003</p><p style="width:100%;margin-top:2rem">A new feature in Whidbey will allow controls to make calls directly back to page methods without making full postbacks. This features uses XMLHTTP behind the scenes and allows controls to talk to the server in an optimized fashion without requiring a full postback. In the 1.x timeframe, a solution for this which you can use today (and which actually may be simpler to implement based on what I’ve…</p><br/></li><li><a href="/pdc-2003-caching-birds-of-a-feather-summary-of-tips/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC 2003: Caching Birds of a Feather : Summary of Tips</h2><img src="/static/2bcf8d1ec45106e529bb3a6176467a31/c5cb2/aspnetcore-logo.png" alt="PDC 2003: Caching Birds of a Feather : Summary of Tips" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->29 October 2003</p><p style="width:100%;margin-top:2rem">I hosted a Birds of a Feather Tuesday night at PDC 2003 and we had about 25 or 30 people attend, including Rob Howard of the ASP.NET team (responsible for the caching featureset). I’ve published a summary of the tips along with some resource links we discussed at the meeting on AspAlliance.com: Caching Tips from PDC 2003</p><br/></li><li><a href="/asp-net-whidbey-discussion-lists-launched/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Whidbey Discussion Lists Launched</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="ASP.NET Whidbey Discussion Lists Launched" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 October 2003</p><p style="width:100%;margin-top:2rem">AspAdvice.com now has about a dozen lists set up for the discussion of ASP.NET Whidbey. If you’ve got the PDC bits, this is a great place to look for help if you get stuck with something. Many of the members of these lists will be folks who have had access to the bits for some time and of course Microsoft employees themselves. You’ll find the full list of signups here: AspAdvice Whidbey Lists…</p><br/></li><li><a href="/tuesday-at-pdc/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Tuesday at PDC</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Tuesday at PDC" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2003</p><p style="width:100%;margin-top:2rem">Managed to get to some sessions today, including the morning’s keynote, which was lucky since I was out pretty late with a bunch of Codewise community members and Microsofties. The keynote was pretty cool, and included an excellent demo by Scott Guthrie as well as a fun demo of mobile control support by Batman. I spent most of the middle of the day in the expo hall talking to various vendors about…</p><br/></li><li><a href="/vault-source-control/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - Vault Source Control</h2><img src="/static/3ac3a1ed06767c1fb2887a192c043873/4e530/vault-source-control.png" alt="Review - Vault Source Control" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2003</p><p style="width:100%;margin-top:2rem">Introduction - What is Vault? SourceGear Vault (Version 1.2.2 as of this writing) is a version control system for Windows developers. If you&#x27;ve used Visual SourceSafe, Vault is a similar (but much better) product. It is built entirely on the .NET Framework with a SQL Server 2000 backend storage system (as compared to VSS&#x27;s file system storage system). A key feature of Vault is its backward…</p><br/></li><li><a href="/whidbey-caching/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Whidbey Caching Overview</h2><img src="/static/c43a79556217a32ff986106d54bccb62/4e530/whidbey-caching.png" alt="ASP.NET Whidbey Caching Overview" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 October 2003</p><p style="width:100%;margin-top:2rem">Caching in 1.x... ASP.NET Caching in 1.x is very powerful and includes three pieces: output caching, fragment caching, and the cache API. The simplest form, output caching, simply caches the output of a page. Fragment caching is a bit more granular, and caches the output of a user control. Finally, the most powerful caching functionality is achieved using the cache API, and allows any…</p><br/></li><li><a href="/hope-lax-is-open-for-me…/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Hope LAX Is Open For me…</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Hope LAX Is Open For me…" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2003</p><p style="width:100%;margin-top:2rem">Well, I’m leaving Ohio in about 4.5 hours for Atlanta, then getting into LAX (in theory) at 10am local time. Hopefully the airport won’t be burned down or closed or anything. See everyone in PDC if I make it there.</p><br/></li><li><a href="/sourcegear-vault-review-published/"><h2 class="is-size-2" style="width:100%;word-break:break-word">SourceGear Vault Review Published</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="SourceGear Vault Review Published" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2003</p><p style="width:100%;margin-top:2rem">I’ve been using SourceGear Vault for a while now and have been pretty happy with the product. I’ve published a review on AspAlliance.com. Review: SourceGear Vault</p><br/></li><li><a href="/pdc2003-1623-on-day-one/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC2003: 1623 on Day One</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="PDC2003: 1623 on Day One" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->26 October 2003</p><p style="width:100%;margin-top:2rem">Ok, this post will be of little use to most people – I apologize. I got in at 10am or so, one of the few people unaffected by the airport delays caused by all the fires. Managed to get checked in at hotel and to the convention center by noon, just in time for lunch. Met Scott Swanson and Serge from VbCity for lunch, then hit the expo hall for a while. Talked to a bunch of vendors, saw Andrew…</p><br/></li><li><a href="/34-hours-to-departure-for-pdc-2003-2/"><h2 class="is-size-2" style="width:100%;word-break:break-word">34 Hours to Departure for PDC 2003</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="34 Hours to Departure for PDC 2003" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 October 2003</p><p style="width:100%;margin-top:2rem">My flight leaves at 0535 Monday morning from Akron-Canton, getting me into Los Angeles at 0951. I figure I’ll probably make it to the hotel by 11am and the convention center by noon, which means I’ll miss the keynotes. I’m looking forward to meeting a ton of folks at PDC this year. I think I’ve got more meetings set up than sessions to attend, so I guess I’d better order the DVD with the slides. I…</p><br/></li><li><a href="/34-hours-to-departure-for-pdc-2003/"><h2 class="is-size-2" style="width:100%;word-break:break-word">34 Hours to Departure for PDC 2003</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="34 Hours to Departure for PDC 2003" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 October 2003</p><p style="width:100%;margin-top:2rem">My flight leaves at 0535 Monday morning from Akron-Canton, getting me into Los Angeles at 0951. I figure I’ll probably make it to the hotel by 11am and the convention center by noon, which means I’ll miss the keynotes. I’m looking forward to meeting a ton of folks at PDC this year. I think I’ve got more meetings set up than sessions to attend, so I guess I’d better order the DVD with the slides. I…</p><br/></li><li><a href="/outlook-2003-spam-bayes-rocks/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Outlook 2003 + Spam Bayes Rocks!</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Outlook 2003 + Spam Bayes Rocks!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 October 2003</p><p style="width:100%;margin-top:2rem">I’m still on the Beta of Outlook 2003 – I’ll upgrade to the release version at some point. But I just installed SpamBayes and I have to say that so far I’m very happy with it. It’s not totally “trained” yet (it’s only been about 8 hours, but I get about 100 spam in that time), but it’s only categorized 2 things I wanted to have as possible spam (and they were automated emails), and nothing has…</p><br/></li><li><a href="/pdc-countdown-come-to-my-bof-session-on-caching/"><h2 class="is-size-2" style="width:100%;word-break:break-word">PDC Countdown: Come to My BOF Session on Caching</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="PDC Countdown: Come to My BOF Session on Caching" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 October 2003</p><p style="width:100%;margin-top:2rem">I’m hosting a Birds of a Feather session on ASP.NET Caching techniques and strategies on Tuesday 10/28 at 9pm – 10pm. Please join me if you’re interested. You can find a complete schedule of the Birds of a Feather sessions atJeffrey McManus’ Blog.</p><br/></li><li><a href="/nunit-article-published-for-real-this-time/"><h2 class="is-size-2" style="width:100%;word-break:break-word">NUnit Article Published (for real this time)</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="NUnit Article Published (for real this time)" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->15 October 2003</p><p style="width:100%;margin-top:2rem">http://msdn.microsoft.com/asp.net/?pull=/library/en-us/dnaspp/html/aspnet-testwithnunit.asp This is my latest MSDN article, an introduction to NUnit as well as some lessons learned for unit testing a data access layer. I don’t claim to be a unit testing expert, but these techniques have definitely helped me when I have had the discipline to apply them. Hopefully it will help a few folks to avoid…</p><br/></li><li><a href="/enums-and-lookup-tables/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Enums and Lookup Tables</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Enums and Lookup Tables" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->22 September 2003</p><p style="width:100%;margin-top:2rem">Everyone knows (or would know if they’d read Code Complete) that ‘magic numbers’ are a bad thing in your code. Enumerated types, or Enums in .NET, are a great way to avoid such magic numbers. For instance, let’s say I have a content management system which has articles whose state can vary between Draft, Editing, and Production. I could simply use 1, 2, and 3 for these states and remember what…</p><br/></li><li><a href="/dynamic-excel-asp/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Dynamic Excel Reports with ASP</h2><img src="/static/f85835bac66ee13f15fcc1a574e97764/4e530/dynamic-excel.png" alt="Dynamic Excel Reports with ASP" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 September 2003</p><p style="width:100%;margin-top:2rem">Technique There are many situations in which you may wish to convert table data into an Excel spreadsheet format for the user. There are several methods available for doing this; I will describe in this article one of the simplest ones. It basically tricks the user&#x27;s browser into thinking the HTML it is downloading is actually an Excel document, and then Excel does the rest of the work by parsing…</p><br/></li><li><a href="/cache-configuration-helper-class-article-published/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cache Configuration Helper Class Article Published</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Cache Configuration Helper Class Article Published" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 September 2003</p><p style="width:100%;margin-top:2rem">In a follow-up to my caching best practices article, this one shows how to encapsulate the best practices into a helper class. Creating a Cache Configuration Object for ASP.NET Summary: Learn how the CacheConfig helper class can improve caching policies across an ASP.NET application, improve reuse of cached data, and significantly reduce lines-of-code to implement caching using best practices…</p><br/></li><li><a href="/nunit-2-1-final-release-available/"><h2 class="is-size-2" style="width:100%;word-break:break-word">NUnit 2.1 Final Release Available </h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="NUnit 2.1 Final Release Available " width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->01 September 2003</p><p style="width:100%;margin-top:2rem">From Charlie Poole on the TDD List: The final release of NUnit 2.1 is now available for download at http://nunit.sourceforge.net. This release has a number of improvements, most notably that it will run under version 1.0 of the .NET framework as installed. It includes separate configuration files for use with .NET versions 1.0 and 1.1. Both configs are copied and the correct version for the…</p><br/></li><li><a href="/object-must-implement-iconvertible-with-ms-data-access-application-block/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Object Must Implement IConvertible with MS Data Access Application Block</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Object Must Implement IConvertible with MS Data Access Application Block" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 August 2003</p><p style="width:100%;margin-top:2rem">Ran into this bug today. I’m not the first, as a quick google search found: Google group thread. Ted Graham also wrote about it, specifically for Access. I think I’m close to finding the actual bug in the C# version of the DAAB, but I don’t have time to totally fix it just yet. However, I did find a workaround that I hope will help some folks. I was calling a stored procedure like so: All I did to…</p><br/></li><li><a href="/databinding-server-controls-–-learned-something-new/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Databinding Server Controls – Learned Something New</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Databinding Server Controls – Learned Something New" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 August 2003</p><p style="width:100%;margin-top:2rem">I was running into an issue databinding an ImageButton’s ImageUrl property to a string comprised partly of literal text and partly of a string I was pulling from my ConfigurationSettings.AppSettings collection. I was using the standard &lt;%# … %&gt; syntax for the databinding, but the result kept showing my databinding syntax in the button’s URL, rather than the actual value. It seems that while you…</p><br/></li><li><a href="/unexpected-error-creating-debug-information/"><h2 class="is-size-2" style="width:100%;word-break:break-word">unexpected error creating debug information</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="unexpected error creating debug information" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 August 2003</p><p style="width:100%;margin-top:2rem">I keep running into this issue in my multi-project VS.NET solutions. For some reason, something is locking the dll(s) in the /obj/ folder of library components. The fix that I have at the moment is as follows: Shut down VS.NET Browse to the project in windows explorer Delete the /obj/ folder. Delete the project outputs (.dll and .pdb) from /bin (not sure this step is necessary) (can’t hurt, might…</p><br/></li><li><a href="/test-tool/"><h2 class="is-size-2" style="width:100%;word-break:break-word">.TEST Tool</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt=".TEST Tool" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 August 2003</p><p style="width:100%;margin-top:2rem">James Avery wrote about .TEST, so I checked out their video demo. It looks really very nice. The automatic generation of white box tests, ability to add black box tests without resorting to code, and notification of violations of best practices all were very compelling. The speaker in the movie needed to enunciate a bit better at times, and the UI looks like it could use some improvements, mainly…</p><br/></li><li><a href="/infopath-tidbit/"><h2 class="is-size-2" style="width:100%;word-break:break-word">InfoPath Tidbit</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="InfoPath Tidbit" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 August 2003</p><p style="width:100%;margin-top:2rem">InfoPath forms can only be viewed and filled out by folks who have InfoPath installed… or can they? As it turns out, InfoPath .xdr files are really just CAB files. This means you can use the ‘expand’ utility (in Windows 2000 and later, I believe) to pull out the pieces of the XDR file, one of which contains a definition of the form (actually, one .xsl file per form). With a little search-and…</p><br/></li><li><a href="/caching-best-practices-article-on-msdn-website/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Best Practices Article on MSDN website</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Caching Best Practices Article on MSDN website" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 August 2003</p><p style="width:100%;margin-top:2rem">My first MSDN online article was published this week: ASP.NET Caching: Techniques and Best Practices. The first half is pretty much well-known info about caching in ASP.NET (at least, it should be well-known to anybody writing ASP.NET applications). The tips and the best practice pattern are the real valuable parts here for everyone who already knows the caching capabilities of ASP.NET, since…</p><br/></li><li><a href="/dundas-chart-review/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Dundas Chart Review</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Dundas Chart Review" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 July 2003</p><p style="width:100%;margin-top:2rem">I’ve posted a brief review of Dundas Chart 3.5 based on what I’ve used it for (no rocket science, but stuff that most of us probably could use for our apps, imho). You may read it here: http://aspalliance.com/stevesmith/articles/dundaschart35.asp</p><br/></li><li><a href="/ftc-offers-guidelines-to-reduce-spam/"><h2 class="is-size-2" style="width:100%;word-break:break-word">FTC Offers Guidelines to Reduce SPAM</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="FTC Offers Guidelines to Reduce SPAM" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 July 2003</p><p style="width:100%;margin-top:2rem">If you run any servers, even at home, you should probably read this and/or forward it on to anybody you know who manages servers. As anybody with a clue can attest, SPAM is quickly clogging up not just our individual inboxes, but also the networks that make the Internet work. Most of these messages are being sent by unsuspecting individuals’ computers, not from the spammers’ own machines. Do your…</p><br/></li><li><a href="/dundas-chart/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - Dundas Chart 3.5</h2><img src="/static/12612968f21ef7d70204bfd20cc253d5/4e530/dundas-chart.png" alt="Review - Dundas Chart 3.5" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 July 2003</p><p style="width:100%;margin-top:2rem">Installation Dundas Chart 3.5 (in beta at time of publication) is the latest version of Dundas&#x27; Charting component for ASP.NET. I&#x27;ve had the opportunity to use it for some simple real-world applications I&#x27;ve been building, and I thought I&#x27;d share my experiences here. Detected and uninstalled previous version - no problem. Installed in about 5 minutes with no errors or problems. My configuration…</p><br/></li><li><a href="/rss-for-events/"><h2 class="is-size-2" style="width:100%;word-break:break-word">RSS for Events</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="RSS for Events" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 July 2003</p><p style="width:100%;margin-top:2rem">RSS = Real Simple Syndication, I learned recently. I’ve been wanting to implement something similar for events (of the calendar variety) for some time. There are several formats in use today to describe events, but none are as pervasive and as widely used as RSS is for blogging and articles. I have an event calendar on my website. It’s hard to keep it updated, though, since there is today no…</p><br/></li><li><a href="/ms-passport-–-what-are-they-thinking/"><h2 class="is-size-2" style="width:100%;word-break:break-word">MS Passport – What are they thinking?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="MS Passport – What are they thinking?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 July 2003</p><p style="width:100%;margin-top:2rem">Note – this is a rant I’ve had for a long time, not a response to anything new. You can learn more about Passport here and here. To get right to the chase, here’s the part I think is ludicrous and detrimental to Passport ever getting any market share: There are two fees for licensing .NET Passport: a periodic compliance testing fee of US$1,500 per URL and a yearly provisioning fee of US$10,000 per…</p><br/></li><li><a href="/9062/"><h2 class="is-size-2" style="width:100%;word-break:break-word">The Caching Pattern</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="The Caching Pattern" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->20 June 2003</p><p style="width:100%;margin-top:2rem">Here’s a little something that I term “the caching pattern” for using the ASP.NET cache object: The as keyword will try to cast Cache[key] to DataTable and if unsuccessful it will return null. If it is null, it will return null. The rest of it is pretty straightforward. This is the best practice way to get something from the cache, but look at it! It’s huge! I’m trying to come up with a helper…</p><br/></li><li><a href="/8859/"><h2 class="is-size-2" style="width:100%;word-break:break-word">DotNetBips Interview</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="DotNetBips Interview" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 June 2003</p><p style="width:100%;margin-top:2rem">Bipin Joshi interviewed me (virtually) for his website, DotNetBips.com. You may read the interview here if you’re interested: DotNetBips Inteviews Steve Smith</p><br/></li><li><a href="/8862/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching Application Block Released</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Caching Application Block Released" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 June 2003</p><p style="width:100%;margin-top:2rem">News if you haven’t heard, another application block has been released (actually a couple): Caching Application Block (the other one is Aggregation) I’ve read over the docs for the Caching block and at first glance it looks like it doesn’t offer anything to ASP.NET developers that the built-in Cache API doesn’t have, unless you’re looking to store your cached data in a database (and suffer big…</p><br/></li><li><a href="/8785/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Hosting</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Hosting" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 June 2003</p><p style="width:100%;margin-top:2rem">I’ve had enough people ask me for hosting advice lately to write up my thoughts in an article. You can read about my experience with the people who make up ORCSWeb in this ASPAlliance article: Hosting Review: ORCSWeb.com Listening To: Saliva – Rest In Pieces</p><br/></li><li><a href="/8625/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Handy Tracing Utility</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Handy Tracing Utility" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->11 June 2003</p><p style="width:100%;margin-top:2rem">There are three features I wish ASP.NET tracing had out of the box: Check for a null context and gracefully disable if context is null (e.g. at design time) If I don’t specify a category, default to the name of the method in which the trace is being called. Automatically compile out of production code via the Conditional(“DEBUG”) attribute or something similar. Today, Trace routines carry overhead…</p><br/></li><li><a href="/8525/"><h2 class="is-size-2" style="width:100%;word-break:break-word">NUnit 2.0 And .NET 1.1 Together</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="NUnit 2.0 And .NET 1.1 Together" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 June 2003</p><p style="width:100%;margin-top:2rem">I spoke at the Wisconsin .NET User Group last night and had a good time. A small part of my talk was on using NUnit to do unit testing and an introduction to Test Driven Development(TDD). In the course of preparing my samples I upgrade to VS.NET 2003 from VS.NET 2002 and thus from .NET v1.0 to v1.1. Unfortunately, I had a heck of a time getting NUnit to work after doing this, and was getting a…</p><br/></li><li><a href="/8371/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Easier ADO.NET Parameters using Enums and Attributes</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Easier ADO.NET Parameters using Enums and Attributes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 June 2003</p><p style="width:100%;margin-top:2rem">DonXML has a cool article I just read on how to use Attributes to extend Enums to create strongly typed parameter objects for ADO.NET commands. You can read the whole article here: http://www.donxml.com/FunwithAttributeBasedProgramming.htm The article is cool for two reasons: It makes it so that adding a parameter is a very simple one line of code (not 2-3 with a bunch of parameters to mess with…</p><br/></li><li><a href="/8222/"><h2 class="is-size-2" style="width:100%;word-break:break-word">SCSI Information</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="SCSI Information" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->04 June 2003</p><p style="width:100%;margin-top:2rem">Aaron Seet posted a link to this very long and very detailed analysis of SCSI vs. IDE hard drives, which I’m posting here for others to reference and also so I know where the link is so I can finish this long article. http://scsi.radified.com/</p><br/></li><li><a href="/asp-net-developers-cookbook-released/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Developer&#x27;s Cookbook Released</h2><img src="/static/62876da68c845a23822b0213dc56bb21/6a287/aspnet-developers-cookbook-389x360.jpg" alt="ASP.NET Developer&#x27;s Cookbook Released" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 May 2003</p><p style="width:100%;margin-top:2rem">My new book, the ASP.NET Developer’s Cookbook, is now available. I just checked Amazon and it’s still just accepting pre-orders, but I know it’s done because I have a copy in my hands! This book was written as a combined effort between myself, Rob Howard of the ASP.NET Team, and about 20 columnists from ASPAlliance.com. It contains over 200 task-oriented recipes aimed at solving common problems…</p><br/></li><li><a href="/8041/"><h2 class="is-size-2" style="width:100%;word-break:break-word">What&#x27;s an ASPInsider?</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="What&#x27;s an ASPInsider?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->30 May 2003</p><p style="width:100%;margin-top:2rem">Some of you have heard of a new group, the ASPInsiders. Lately, I’ve been getting a lot of questions about this group such as who are they, are they a replacement for (insert another group here), how do I get in, etc. Thankfully, the group has created an FAQ to answer these exact questions. You can find the answers to these questions and more here.</p><br/></li><li><a href="/6606/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Regular Expressions and ASP.NET Connections</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Regular Expressions and ASP.NET Connections" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 May 2003</p><p style="width:100%;margin-top:2rem">I completed my Regular Expression Cheat sheet a couple of days ago, so that I can hand it out this week at my session on regular expressions at ASP.NET Connections in New Orleans. It’s intended to be printable (thus it’s not a complete reference – only the simple beginner stuff that fits on one page), so that someone could tack it up to the wall of their cubicle or tape it next to their monitor if…</p><br/></li><li><a href="/caching-and-callbacks/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Caching and Callbacks</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Caching and Callbacks" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->24 April 2003</p><p style="width:100%;margin-top:2rem">I gave my second presentation to a user group for INETA this evening (well, last evening – it’s late). I spoke to about 70 members of the Philadelphia .NET user group, Philly .NET, about ASP.NET Performance Tips and Tricks and the Caching support in ASP.NET. While I was discussing callbacks and the CacheItemRemovedCallback delegate that can be specified when an object is inserted into the cache…</p><br/></li><li><a href="/maxivista-desktop-sharing/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Review - MaxiVista Desktop Sharing Software</h2><img src="/static/2072573dc6ff85e4572ad7f0fa9d8470/4e530/maxivista-title.png" alt="Review - MaxiVista Desktop Sharing Software" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->19 April 2003</p><p style="width:100%;margin-top:2rem">Review Let me preface this review by saying that I&#x27;m one of those people who never has enough desktop space. I&#x27;ve got a laptop with a WUXGA screen that I run at 1920x1200 and it&#x27;s still not enough room. A large part of the reason for this is that I typically have open Outlook 2003, Visual Studio .NET 2003, a few IE6 windows, and a few instant messenger windows. Since I like to be able to keep…</p><br/></li><li><a href="/test-driven-development-article/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Test Driven Development Article</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Test Driven Development Article" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->10 April 2003</p><p style="width:100%;margin-top:2rem">Eric Gunnerson at Microsoft has published an article on Unit Testing and Test Driven Development (he calls it Test First Development). It does a good job of introdcuing the concept of TDD and showing how to use NUnit to perform unit testing of a class before and during its construction. Another good resource I’ve found for TDD is the TDD Yahoo Group. I’m hoping to write a few articles on the use…</p><br/></li><li><a href="/5213/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Windows Server 2003 Notes</h2><img src="/static/87cf4f76ee5961606f3a6855814db4a6/a84be/default-post-image.jpg" alt="Windows Server 2003 Notes" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->09 April 2003</p><p style="width:100%;margin-top:2rem">I set up Win2K3 Server on a box at home a few days ago and here are some of the things I’ve learned. The first thing I’d like to point out is that there is a pretty good Unofficial FAQ maintained by Windows XP MVP Larry Samuels. The machine I installed on is a Dell Dimension 4100, P3-1GHz with 512MB ram. It has a DVD player that was flaking out under XP Pro for some reason (no sound during movies…</p><br/></li><li><a href="/when-is-it-ok-to-use-a-datareader/"><h2 class="is-size-2" style="width:100%;word-break:break-word">When is it OK to use a DataReader?</h2><img src="/static/bc23f24e73cd980e4b59179e339bb42d/f0719/datareaders-vs-datasets.jpg" alt="When is it OK to use a DataReader?" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->07 April 2003</p><p style="width:100%;margin-top:2rem">I just responded to a discussion on this topic on the ASP.NET Forums… There is a good article on the actual performance characteristics of DataReaders vs. DataSets on MSDN here. In it, you will find that DataSets are not always slower than DataReaders, especially when there is any significant latency between the web server and the database server or when there are a limited number of connections…</p><br/></li><li><a href="/san-francisco-and-custom-paging/"><h2 class="is-size-2" style="width:100%;word-break:break-word">San Francisco and Custom Paging</h2><img src="/static/3bbe25014d79760d127ab1e3b7bb90b6/f0719/asp.net-c.jpg" alt="San Francisco and Custom Paging" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->27 March 2003</p><p style="width:100%;margin-top:2rem">Well, I’m out in San Francisco this week to teach ASP.NET with C# to half a dozen students, and that’s going quite well. I had the opportunity to see Alan Shalloway speak at the Bay Area User Group on Tuesday night, and met up with ASPAlliance columnist Steve Sharrock there for the first time as well. We had dinner the next night, and he mentioned something he had used for a solution for a client…</p><br/></li><li><a href="/unit-testing/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Unit Testing</h2><img src="/static/86b7331dbc609a58a1fe6d9ce7835b55/f0719/unit-testing-1.jpg" alt="Unit Testing" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->17 March 2003</p><p style="width:100%;margin-top:2rem">I’m really getting more and more into unit testing and testing frameworks. At the moment I’m using NUnit 2.0 for my test purposes as I redesign ASPAlliance.com‘s content management system for integration into the Microsoft Codewise Community standard specification for Federated Search. I’m working with a friend and fellow columnist, Jonathan Cogley, who suggested a this resource on Unit Testing…</p><br/></li><li><a href="/buildit-from-microsoft/"><h2 class="is-size-2" style="width:100%;word-break:break-word">BuildIt From Microsoft</h2><img src="/static/3b993ba567fe822b5d1d604e50a98e4b/31119/msbuild.png" alt="BuildIt From Microsoft" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 March 2003</p><p style="width:100%;margin-top:2rem">Microsoft has a Team Development Build Tool called BuildIt which you can download here. From their site: “BuildIt.NET is designed to jump-start the build process used for development of .NET distributed applications. This download provides full source code and comprehensive documentation for the Microsoft Visual C#® development tool and Microsoft Visual Basic® .NET development system.”</p><br/></li><li><a href="/asp-net-cookbook/"><h2 class="is-size-2" style="width:100%;word-break:break-word">ASP.NET Cookbook</h2><img src="/static/62876da68c845a23822b0213dc56bb21/6a287/aspnet-developers-cookbook-389x360.jpg" alt="ASP.NET Cookbook" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->28 February 2003</p><p style="width:100%;margin-top:2rem">The ASP.NET Cookbook is finally 100% complete and submitted to the publisher, SAMS (as of 2/26/03). This has been quite an undertaking, and having completed the longest and hardest phase of the book writing process (author review remains, but is not nearly as arduous), I must once again say that I never want to write another book. Of course, I said that after writing ASP.NET By Example, too… So…</p><br/></li><li><a href="/blogs-r-kewl/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Blogs R Kewl</h2><img src="/static/25fae55e7fe12bd6594992887b6c912c/f0719/blogging-1.jpg" alt="Blogs R Kewl" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 February 2003</p><p style="width:100%;margin-top:2rem">I just thought I’d write something quick to tell Scott Watermasysk that he has a pretty cool thing going here with these blogs. Having thus buttered him up, I thought I’d also rant a bit about the fact that even though I tell the login to remember me, it doesn’t, and that there is thus no way for me to find the link to the Admin section for my blog except to remember it and type in the URL. When…</p><br/></li><li><a href="/idiots-at-the-mic-–-more-news-from-the-mvp-summit/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Idiots at the Mic – More news from the MVP Summit</h2><img src="/static/336fba5e00b2a89ca7828f5bdc603a28/f0719/mvp-2015.jpg" alt="Idiots at the Mic – More news from the MVP Summit" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->18 February 2003</p><p style="width:100%;margin-top:2rem">Since I’m in a foul mood and I am procrastinating finishing my book, I just thought I’d write a quick note to express my disapproval for the MVPs at last week’s summit who thought that the opportunity to ask questions of Microsoft executives was actually an opportunity for them to look impressive (or perhaps just stupid) to their peers. The first such idiot, who was a frequent attendant to the mic…</p><br/></li><li><a href="/mvp-summit-aftermath/"><h2 class="is-size-2" style="width:100%;word-break:break-word">MVP Summit Aftermath</h2><img src="/static/336fba5e00b2a89ca7828f5bdc603a28/f0719/mvp-2015.jpg" alt="MVP Summit Aftermath" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->16 February 2003</p><p style="width:100%;margin-top:2rem">I had a good time at the MVP Summit last week; it was my first. I have some pictures to upload but they’re still on my camera at the moment. However, I wanted to reference a few other folks met and spent time with during the event. Christian Weyer, a web services guy who was very nice. Apparently, he also has joined the growing ranks of people who have been kicked out of AspElite, too, through no…</p><br/></li><li><a href="/regular-expressions/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Regular Expressions</h2><img src="/static/6dcc5c1b3fd2044b33b13abe14411271/f0719/regularexpressions-500x360.jpg" alt="Regular Expressions" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->06 February 2003</p><p style="width:100%;margin-top:2rem">Regular expressions are very powerful, and are one of my favorite tools to use because they are so flexible and they can be used regardless of whether one is a .NET developer or a Unix shell scripter or a Java developer or whatever. As I started getting into regular expressions for validation controls, I noticed that there wasn’t any online library for these expressions, which of course meant that…</p><br/></li><li><a href="/first-post/"><h2 class="is-size-2" style="width:100%;word-break:break-word">First Post!</h2><img src="/static/65ec94bcd89878602d7fbf7bdf915e02/f0719/first-blog-post.jpg" alt="First Post!" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->05 February 2003</p><p style="width:100%;margin-top:2rem">This would be my obligatory first post to Scottw’s awesome new DotNetWebLogs site! I hope to return and add more content once I finish up my *$#&amp;#@# second ASP.NET book. By the way, if you ever hear me say that I’m writing another ASP.NET book, smack some sense into me. Please</p><br/></li><li><a href="/ado-and-sql/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Basic ADO and SQL Tutorial</h2><img src="/static/e2af97f67158e96261d5877db2daafee/4e530/ado-sql-tutorial.png" alt="Basic ADO and SQL Tutorial" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 September 2000</p><p style="width:100%;margin-top:2rem">Introduction Author&#x27;s note: This was originally published in September 2000. It has been only slightly revised and republished in March 2005. Also, if you&#x27;re just learning ASP, I strongly recommend you jump to ASP.NET instead. Return to this site often with your questions about data access in ASP. If you have specific questions, please email them to me. The purpose of this tutorial is to give…</p><br/></li><li><a href="/asp-cookies/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Cookies With ASP</h2><img src="/static/9e10f2323819881c5dcb98dfd994c3b0/4e530/cookies-asp.png" alt="Cookies With ASP" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 September 2000</p><p style="width:100%;margin-top:2rem">Mmmmm, cookies... Cookies can be a good method for passing data between pages and especially for retaining data between sessions. Today, it&#x27;s pretty safe to assume that anyone who is using your site can use cookies, since nearly every site that is non-static makes use of them(including all ASP sites that use sessions). It is also possible to set and read cookies using client-side code, but it is a…</p><br/></li><li><a href="/server-side-include-files/"><h2 class="is-size-2" style="width:100%;word-break:break-word">Using Server Side Include Files</h2><img src="/static/1dc37878d3421dee0bb0f2c42c1a5210/4e530/server-side-include.png" alt="Using Server Side Include Files" width="100%"/></a><p style="width:100%;font-weight:bold;color:#3571B8"> Date Published: <!-- -->25 September 2000</p><p style="width:100%;margin-top:2rem">Include Files Server Side Includes (SSI) are a powerful tool for code re-use and to make site maintenance easier. Include files can themsevles include other files, allowing for cascading include files. This can make it much easier for the developer to maintain a consistent site. One of the most popular uses for SSIs is to create uniform headers and footers, often with menu items. On a previous…</p><br/></li></ul><p><a href="/category/">Browse all categories</a></p></div></div></article></div></div></div><div><header><div><div class="tile is-parent"><article class="tile is-child box"><div class="sidebar" id="sidebar"><div class="content has-text-centered"><div class="content-card"><div class="card-sidebar"><div class="firstinfo"><img src="/static/steve-smith-ardalis-200x200-e9fab63b806b33a2ee3ded4a954bbdfa.jpg" alt="Steve Smith"/><div class="profileinfo"><h1>About Ardalis</h1><h3>Software Architect</h3><p class="bio">Steve is an experienced software architect and trainer, focusing on code quality and Domain-Driven Design with .NET.</p></div></div></div></div></div><div style="padding:8px;margin-left:10px">Get a <a href="/tips">Free Developer Tip</a> in your inbox every Wednesday.</div><div><a href="/search"><h2 style="font-size:22px;padding:7px;margin-left:15px;font-weight:BOLD"><span role="img" aria-label="magnifying glass">🔍</span> SEARCH</h2></a></div> <br/><div><h2 style="font-size:22px;padding:7px;margin-left:15px;font-weight:BOLD"><span role="img" aria-label="graduation cap">🎓</span> ONLINE TRAINING</h2></div> <br/><div class="recent-post"><ul class="recent-post"><li><a href="https://dometrain.com/bundle/from-zero-to-hero-modular-monoliths-in-dotnet/">From Zero to Hero: Modular Monoliths in .NET</a></li><li><a href="https://www.pluralsight.com/courses/refactoring-solid-c-sharp-code">Refactoring to SOLID C# Code</a> NEW!</li><li><a href="https://www.pluralsight.com/courses/aspdotnet-core-6-web-api-best-practices">ASP.NET Core 6 Web API: Best Practices</a></li><li><a href="https://www.pluralsight.com/courses/working-c-sharp-generics-best-practices">Working with C# Generics: Best Practices</a></li><li><a href="https://www.pluralsight.com/courses/fundamentals-domain-driven-design">Domain-Driven Design Fundamentals</a></li><li><a href="https://www.pluralsight.com/courses/refactoring-csharp-developers">Refactoring for C# Devs</a></li><li><a href="https://www.pluralsight.com/courses/kanban-getting-started">Kanban: Getting Started</a></li><li><a href="https://www.pluralsight.com/courses/csharp-solid-principles">SOLID Principles for C# Devs</a></li><li><a href="https://www.pluralsight.com/courses/design-patterns-overview">Design Patterns Overview</a></li></ul></div> <br/><div class="recent-post"><h2 style="font-size:22px;padding:7px;font-weight:BOLD"><span role="img" aria-label="clipboard">📋</span> CATEGORIES</h2> <br/><ul class="recent-post" style="text-transform:uppercase"><li><a href="/category/career-advice/">Career Advice<!-- --> (<!-- -->2<!-- -->)</a></li><li><a href="/category/iraq/">Iraq<!-- --> (<!-- -->158<!-- -->)</a></li><li><a href="/category/personal/">Personal<!-- --> (<!-- -->37<!-- -->)</a></li><li><a href="/category/productivity/">Productivity<!-- --> (<!-- -->168<!-- -->)</a></li><li><a href="/category/security/">Security<!-- --> (<!-- -->7<!-- -->)</a></li><li><a aria-current="page" class="" href="/category/software-development/">Software Development<!-- --> (<!-- -->960<!-- -->)</a></li><li><a href="/category/uncategorized/">Uncategorized<!-- --> (<!-- -->435<!-- -->)</a></li></ul> </div><div><br/><h4 style="font-size:22px;padding:7px;margin-left:15px;font-weight:BOLD"><span role="img" aria-label="book">📘</span> FREE ARCHITECTURE EBOOK</h4><br/><center><a href="/architecture-ebook"><img src="/static/Architecture-eBook-Cover-242x300-09d775f8f28cb004b00c47b84c574494.png" alt="book"/></a><h4><a href="/architecture-ebook">Get the Book!</a></h4></center><br/><h1 style="font-size:22px;padding:7px;margin-left:15px;font-weight:BOLD"><span role="img" aria-label="pen">🖊️</span> RECENT ARTICLES</h1><br/><div class="columns is-multiline"><div><article><header><div class="recent-post"><ul class="recent-post"><li><a href="/interfaces-describe-what-implementations-describe-how/">Interfaces Describe What - Implementations Describe How</a></li></ul></div></header></article></div><div><article><header><div class="recent-post"><ul class="recent-post"><li><a href="/you-should-blog/">You Should Blog</a></li></ul></div></header></article></div><div><article><header><div class="recent-post"><ul class="recent-post"><li><a href="/from-microservices-to-modular-monoliths/">From Microservices to Modular Monoliths</a></li></ul></div></header></article></div><div><article><header><div class="recent-post"><ul class="recent-post"><li><a href="/navigation-properties-between-aggregates-modules/">Modeling Navigation Properties Between Aggregates or Modules</a></li></ul></div></header></article></div><div><article><header><div class="recent-post"><ul class="recent-post"><li><a href="/comparing-unit-testable-code-with-maintainable-code/">Comparing Unit Testable Code with Maintainable Code</a></li></ul></div></header></article></div></div><br/><h1 style="font-size:22px;padding:7px;margin-left:15px;font-weight:BOLD"><span role="img" aria-label="bird">🐦</span> RECENT TWEETS</h1><a class="twitter-timeline" data-width="400" data-height="800" data-theme="light" href="https://twitter.com/ardalis?ref_src=twsrc%5Etfw" data-chrome="noscrollbar">Tweets by ardalis</a><script async="" src="https://platform.twitter.com/widgets.js" charSet="utf-8" type="text/javascript"></script></div><div></div></div></article></div></div></header></div></div></div></div></section></div><footer class="footer has-background-black has-text-white-ter"><div class="content has-text-centered has-background-black has-text-white-ter"><div class="container has-background-black has-text-white-ter"><div class="columns"><div class="column is-4"><form action="https://www.google.com/search" method="get"><input type="hidden" name="q" value="site:ardalis.com"/><input type="text" name="q" alt="search" class="googletextbox"/><input type="submit" value="Search my Site with Google" class="googletextbox"/></form><br/><a href="/interviews/">Interviews</a><br/><a href="/contact">Contact</a></div><div class="column is-4"><div class="content has-text-centered"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AUaFDIfzRKZlwAAHOhJREFUeNrtfX2YXFWZZzMEnB1BMDioOOQBIm6ehQG667zn3goGmFWIw6AYzaNx3WXGlbCSpPuec+6trxAM4jIjukwABQKLjqPP7owoMR/d95xz762u/qhOHBOZCREiMEElKCM7JIAQQj6es3+c6u6k6lZ13dvVXbeT/uM8Dw/p7rp1z++8X+f3/t4OpVTHibSuskpnIUdejgm/Hqi4GRHxv4C6P8JUjAAVu4HyA5hJBVQct/T/4weAit2Iip8C5Rv073o3I+LegCx5+VVW6awT7X3N6Ief1913OupxERDvi5iK9UDFDkzlb4GKg0ampNKrtyozP6yM7IDCTlFhO1BAazd/fEmF7UBhp6iM7IAy88MqvXqbMrIDCog4iJn3G6BiB+jPujnF3CsNsvUPZwEwjQuvkhcgiy8Bwr+NmNyFiHjTzJfHNtrI9Cts+wpYo42OuJhU2PaVkekfB0ahrBDlh4CKp4DJ72LmLUXEv3AWAFOw0Ire9yLmfwYT8Tii3m+N7IAyc0P6ZNtB6zY64sK2r0afxcwNKmDeS0DFj8D2b7pi5cb3zwJgsqedugam8j6w/edHT56R6W/N6Wby+DVpQEhlOP1jlgio/2vMxINgy0Uda9acMguAJteitf2nIuZ/Bts+R1QcSRfKysiUom0SkwqYN2a2zdygMvNllS5sVenV25SZL+uTmx1UZnawYtbLKr16m0oXtiozX1ZmbvAYd+JF/nwj06/MQnn0vwVmxWWdy9fPmQVAndW5fP0czPgybAdlI6NPO7b95n20EygzN6RGAYNtXwERBxHhzwLhZUT444jwh4HKdYi6X0FUWJhIgokkiAoLUfcrQOU6RPjDQMSPEOUDiPBnEeFvaiCVKsAYUtgJmgYEZt64VWDBthSVt3Qu3/QfZgFwrKlnfCnY/tZRfwrMa8r/mrnBsVgACN8PtjcElD+KiNdj2KWrO7vdi9DKDXMXd/edHh2Q2+eglRvm4lXyAkzFNYi6twITD4HtDQHh+4/1/U0BlXmV5x1W2PZ/AlR8bs0adcpJDYCUIxdi5rnaTE+88Zh5Y+YaiDiCmP8EEPEQZuJGYH0XL1rbf+p0uChgfRdjJm4Ewu8H5u0AIo6OupUJwcCkBkJ2UGHb97to7zUnHQBSt2w+B9v+OuwEB8z8sMITbbxTVOlCWWE7UIjyJxDz7kyRvoXzup89vf2ua/ucFJELEfPuBMJ/BkweTRfKCjvFxjUHJituLngbbP+bnYS/76QAALL4EuwET6cLI41TOCaVkSmpdL6sgIp9hh08imz5sc7l2+ckNaJes0adggj/CLb9R4CIl8d9v2zsygojCliwBzO+7IQFQOqWzecgKh80nKLOmRuceCNbGnUJzwPlaw0q5s+0Agsi/oXAxGrM/Kd0nNL4O5uVIhZi8rtGz6ZzTygAINabxnZxh1kYaegjjUy/MvNlhW3/OcS8nkum8UVM1YJV7pnAvC9hJ3hyrI7R0BqUleEEu1IWv/qEAACi8lbM/DfM/HDjL54fUZj5v8UsKFze7b7nRLt06Vz+2Luw058B299rTuD+zNyQwrb/FqbCmrEA6Fy+fg4Q/i0jW6qgntf5soMK28ERbBcfMVbMPFMfdXX1bD4fbP+b2AneNnNDdQNFwykqU7uN9VNZN5iSP3p5t/sesOXGijmve+p1ZO8/kaLun5/oG19T+7Dln2E7GKlkAnXT3nRhRGHmuVOVJbT+5He7FwGV29OFkbroNsfz5XvQyg1zT7bNH13pzMYzgIi7MPOPmHWDRKnShREFTO4E1ndxogFg9Gz5IKJyl978Bl/GCfYgi3/8ZN34GrdA3GvBDp6pbHT4odGW4l9Rz2aUSACgHhcZTnGPmRtuGOEC80Qn3TR/duNDYgPqb0w3uAMx88PKsIMXUqu2QKIA0EnFfMy8X5m6aFO1uDKcos6DbbluwdLHTpvOm0Ugbg7b3gOY8vsiLcf7Flju6gVfnubntb2vGdmSMpxiaOBcyRD2pqiARACgk26aj+1gZ3iax5WRLSls+4cQ4T3TXoyh3lVGpqTShZHKxU2EVdA3fynqTXuACpa4GdvBQSNbCgEBV2Z+WIET7LmiZ8sH2wqAFN18DjCxrZ7PN7IDCjP/94jKz7elGkfFP4ZbpeZWWoN6S1vuSwj/BLb9/ZpcEu4OgMmdk80OJpfnU53q1Y30nWAf0N7F7XiBJu27FDP/jclQxrAdKGD+W0C8VFuKR929i7ET7DPrgaAwojCV/OoVpXdOOwCAinVmvhwatepr0eIrXdaW69pWgmX8b+tnI1GsQFkhwh9uW3BobbkO28VXwi2Bzqom83wx0xb+xfC7b15h4wSvdxH32rYVWbrdDwAVvzOc/kkDwHCKCpjYt9BxL2pnmoidYJ+RKdU+o+3riqHFu6cFAGBxE+zg1bBLDewUFXb6DwIVn2vrTRzl+fQkfH+NFSiMKCD8jrZeKjHxF9gODuIQUBtOv8K2fwBR96opBYBBxbuB8id1cMRr8/zsQGwktmpdvaL0TkTcZ3QE3RoAGJmSQhbfe2m+9+y2gsDqu3mM71iTGQwpROUvUrR0zpQBAFniwXC/KpVZGFGIiHvbfv1K5E367t1rYQ+AVGZ+SKWoWNn+7+feXS/2MgsjCjH+3SkBACLyBt1e5YeYyLICKrxFN/W/o930LET5Nn3L1tomEDM3qBDh/7y4zTS0BUsfOw1RvtkMOYijNHjE+j7TUgBo0y+eC7uw0CmKfKGrxz+/7aeDisXY9ifkGMZrJPG0K6DiU23nFhD+PkS9PWHpoZkZUIiKF0y65byWASBFwlMqbPsKO8XDiLg3JIOGxTe0MvgLKwwhIngSOn1SrO+jYAeHDCcIDVpTFl/fEgAg20XY9t4OK6ik8yMKKL8nEdQr0pcCKg823UwSpzCku40OY8I/nBDAf1UH5LLmYALzmnrOJgK/PhFW5zdzQwpRdxescs9MBAAoX2/mR6a8IdQslBWy+PeT8J0NsvUPEeHbdczDa+4LEHEHlvzgB38QGwDQ437ScIpHqxs2KqZfYSKvTcKLwKvkBYiKVzQXf4o7gvVnvJ5i4j8m4hqZ9l6DnaDWQjOpjOygmohqXj/a/PJjpyHL3R4WUacLZQWk73uJYd4SvibOpQ+2/Qodi0ezAvmyAuLenRwKuvtQWIym6ff8yXSmfEZkACAqP2tmB2oi6koF8JWkcPWvvLX3bET4nnq3Zo2ieqB8HxD+ctS4oZINvNiubp7qdRkNzgMq/q26VIyZrl90MfGlSABYsPSx05DFf1p7+mUF/XxNgk7//4hz+s18WSHi3pmy3NVxfx+oYAmyArYZEhAaun7x83l1GmTrBFTuJ41MKeT0lxSi4oWk8PYr1POfTdR1E3bNi5n/BiL+hSbdch4wuT9q/GBkBxSi7lOda5PR6g2r3DOBit3VtRrMPGVkBhS2wmOBemhya04Fk5VTwwuJOf1UfhJnSkchYuEnra3YD48pIP299qE8mghEdkAhJj6TGCtA3VvN/FBNmVhnBHygKQCgHhchKg5V+0UjU1JA+K9NW/5xcgAgRKOOo7q5vBMc7TomgwFbLjKc4tuY+RHLw0MKUT7ckYA+f6VUx4cy5TMQ4b+ojocw8xQw70jKkQsnBgDl91Vq+zXVJUTcOxOD9m6RBuYdihrAmblBBcTd1rn++C5jRNz+eozmusv2FLaLR4C5/zkxDSdEZrT1ljWZG6biwYYAMOjWdyPKf1kTTWr/uB/b8oLkmDv+d3EYP2ZuSCFLfCHEmnxOxxIyYmFoRCHq/mNS3kslI/hddUxTac97qTpzqar5u5/W5kPW+kzq/n1iTD/zLwYqX8NOEDFwKymg4pdX5ofPruURPPZORN2nogeUvgIqDiJbXpKgw/FAzeGoKJMA439ZFwCI8u9X+9RRnwmMX5ccAIi7J5P6NSh756PGFOPX4e43k/J+Uha/GtvB4Wr3WAkGHw8FgNETnIsI31tt/o3sgEKEP50USVSjJzgXKH8xlB/XsIQbKKByfyM1zxT78Z8AFS9H5RIaTr8CIl7G3e4HkpEeb58DhP+sJiXU3+t3x17dH5dShZl/jRqRmOAPLN5tNGirbnz6J2bLIOo+aBbKMXsI5G3JeU8iW2slpW52sbxltQBg4ls15o95Cmz/UIrUpg/t6qZFRPzcjOqnma+A+YdRd2964nt29wqg4lDklFBbymcvs36cCEXxLsI7gXkHatxAbliBNR7P6Z60m/rfoV/sQJX5H1SIuE+nMxvPSIRvY3xZmJWa+PQPKyBuccmSxlejx6SEm9ORrYAOsjCV/z0Riqtf7n8HEL7dqNJj0i7dfSb9Bb2nFb8quxARb1ZfKereOP5oYiRkqdsfme9XqdgZVH42Mv8xYoXRzA0pIO5PkqJkBoT/bfX70hbBOzhqDXXxwBL/LbT0mxuM9OKm9t5bXIOZfySqaR4NYqPIrCxY+vPTEOFPGLnB6LxBp3i0i/Drk1EU4teH6SynC2WFetxbxwAApNb/V3zH71NscyKID4jwH0RP/fT9BSY8E12pXKw0c8ORlcT1e+R9iTg0Of98IPxlo6ooZOaGFRBt2UczgHJ1/ViXTPk/zYuhs9vyze+RlwCTb0Yu/FTSHpMG50X+zLw/FxGxt5GsW3i66Stg3sFW9e9POh20+LCZH6qqCg4oIHynUqqjI50pnwFU/KY699UTMcR3EnH6mXtvurA1XoGG8PsnkXJ+PU65OV0YUYjKR5IRB7gPVTOlsVNUyOL/fmW3+54O1CMvQVS8dXwAKHV7N+nLtH3znd736kbPYvTCD5MHukjQGTvryPAPAfVei8wVcIoKCE/E3Qmy5fLqIRvY9hWm4m0gfakOTOS1htN/XMSr6c+BameH77jv9wpht1vN+WJ3Y3tiD20FMOFfTUA94MM1zTKsUhAi/BMdyBJfSK/eWhMAIsIPGRnvg201X6vcM4Hw5yLz/agWmkZETrphBWy5CNvBEWAxeIPEfRGt9Nsqg9fV458PRNQIZaRXb1WpHrGyA4i4qzoDqNS2f9lu6hdY/C/NCdS26+fjoiUB7KK1/aciwofi1B/M/JBChK9oK2k233s2EHd39d2JmRtSmPL7OoCJ79VWiwYVJrK8+L72ZQCLu/tOB8J/Uh3BNgeAYYWIXNE6MypvilWB1KDZ0bl2R9t4g0t+oP4ACC9WA7hiVTd2ABVD1aIDlWvDzW31/Zb8mFbnkJFNL1D+q1aa3s6c/y5E+TPRqee6CoktvrTNlvQxMyQTACp+1gFEPl1TAi6MKEzF37XrgTvWrDkFKN8U924eEf43U9N8MhyDgzCswHK9Nmsm3J9eva32goyK5zsQ5S9V17wrP3xP+x64LwW2dyCqwlelUPQaML/lmrqm3TsvTvsZ1jeqh+PIt7Swb/KeagAAFQoIP9IRRqmu/PC69pl/95F0rNSrrIDw701hOfrhWIUhTUP/v21kT2f1BBZZky11hE+1GlKYynx78n7/QmByX+TCj851j3ZRcc2UXUdTAbpV3o/eUMrka52Wt6A9XcRej5kdDI2nwgGQHVQG8XraY/75HXFOv5kbUoj0DU1DC5Y7idjkG22iipMZAYBL871nI+o+H5XvB0yO9sD91yl/mRZfamRLKmo3kr5r4S+1Y6h0dAC0yQUgwlek6yhgTXjnb7m7pkPZe82aNacgy/1pnJTQzJcVYq6dLBeQkCCwc/n2OYi40UkYY+aff+Pybvc9Jg3OO3Z19Ww+vzPnvytq0+nCjPd+3O1+oPrvmbb8YyD8DjPGc+oRt+7uS235R8kJAon8dTXLph1pILbEjUamP5bCl/4d/iJQ/q9A+a+OXUZuYC+waO3s+hZQ7MbU+3X130OE70FE7I2tNJYdUCnmLUtMGoip3NXuQlDHmjWnIMpFuhBf4Qs7gTIyekLZsevK27crFJET0Om4fwqUHzVzwzV/z8iUVFRiSgjNfmg6R8k3LAQBFf04095SMGIiDdSLzPdrOvqOqGSGbHkJUDEpqfkJeIMKEf6RRJSCMeXfb/dlEBD+PXOK9P0SB4DxgtUPk3EZ1ObrYMPqXQDMe3UyZnWmAaCi4/dWZ4/7p22/Dm43IQSIuHsyvn8mAmCsPGyJKW8onZAQ0k5KWCfh7wMqIzd6nggA0Ffw8uUrVhTnTTclDFeKfcDEX7SVFAoWp3HKqicCAEaldhF1b28XKdSwZVfbaOGwyj0TUf6UGZnvd+IAQBeGxHNT2Xs5IS28XY0hiMrPaylTedICYLT9DtlyedsaQ9rRGtah6+mDUzHYYUYBYKwDm2+finuMplvDprs5FBH+EWwHKpa0O5M6SG1yLVy9VaWouy4GAN4aDY6bXRDDmmHb0ya5u/UzF5puDp3u9nAg7g/jFn5Gx9Y0uxbe9pPIF1td1LsUqDg4OqCp6aVlaOJpF1lctK09fDoFIjAVl+nBDkHMoIl/CxF5A2L8480sg4pPAeH/KZoSSfkMbPPrMRM3Nvs5iLg3ABVfCztxzSmYeIfA4mYrZwmA5e5oSiBiOiViEOEPmDF4dZUXu/fSW9s7uq0hocWWf4SoiK5cXrECKcK/3VJiLfMONiURM10iUSYNzkOU/z8jxmAHc4ro3q0ntIrb49Q2RhnNnS2S4UeEFyKJRE2HTBxQflucl1NpEHkdWN/FiQcA6b0QqHwlDsgrc4r/phXpHyLuP0eSiZtQKNKanFBk7MEOo8OpSDK0ipqrcYhYtPbK4XthsoLcsYQiJ5SKnSTfHlHxV2YMfb9KHfttw5J4pgAAiJfCLDp9fDQW6KKTG7+LCH84nY8hFVtfLDpQiMpX446JGZ9uNRgzRXK3zJTNP6a5ZUucVNfIDiogfGcUUatj1xWZ8vuBiJdjiUVXeO/3hpkvLXsivhIPkfKGOI2ewDxl6HRx8UwDAFCx2LCDyPTx0Ys4RN3Pxiyx58NGxzQlF6+U6kh1u1e0emCEPg3Dsdi+QHh5OvlzrRxng0i8OcYVvcH+WAMjQrqYIw2MqNv9EnNkTJfVi7Htxyj86JSl2mfNKDfA3C/Ejnvs4HDK4ldP+8iYMZMdQtGOMzQKEfc7ccSXKxz6p5MylCmWG1hbkbiJQXjRvEH3/zT7WVdZPz6rZUOjOpdvn9OKsXEGFfOBiv3RJ3rK0dGn9kzd/GN1BdKxhloGClP5BrK3XNJczOFmw8S0jNygQpa7s95t45QOjgQi7koXRiomqfmlBZb4b9GK3vfOdAB09fjnI8L/Xb+3aO9Bz2kS9zY1JobUGxw5rLosN9rgSKUmPzp2YcZ7P1Cxb+Ft/6TM3KAyc0NNrytv36EQlX890zf/GCtw/5W3b4/0DszcoEqv3qYQ4QcmKg/XHx07pBDhT8QaHavUxMOjkS0/1qAa9SGg4n8C4XcA5WubXoTfAba/NsXEn5woAMC2vAAz706gcm2kd0HlWkTlX5uEd9a/um48PNqYIJ1sIoXrE+m64+P5U0kZH38yrmbGxy9a23/qpADQRXgntv03sF0MqdKNKIhIt5pdLWVWfTUdUvTRjSf+YUz4hyek5zX5Qd8I8zEVV3AYkdbTmWbXRNNT+j4KdnDICOmoShdGFLJqq37xAbByw1yg4rmwWT2aRSRfMFf0zpvdmGmqMhL+PkS9PWGUel1GFi8YheDclgHguDEqITdcFbJGcdFN/e+Y3aCpXQuWPnYaonyzWcciG5n+SAOto7JdHgyXSZPKzDeXs86uSRNq9dDMkIs1szCiEJt4NF5sABhUvBsof1IHHrwGfdok9bHZjZqqVrq+m0eZysdvPtfC1FT+IkVL50wZACr9fCbYwatho1SwU1TY6T8IVHxudsNaHPQR/gnD6T8YVlY3nH6Fbf9AHDXSuB2nXzSyA6FI1AgNXk/CsIkTZXUR91rsBPv0NS+vGmHv605fKx6LaDKEh3X1fJEGR/GVLmvLdbMbOMnNt7Zch+3iK+FcytH7Av5w7Da9yRAegMqN9WhPZnZAYSfYB7R38exGxnzH3b2LsRPsq9dBrcW8JL96Remd0w4ArZ27+RxgYls9AWUjO6Aw83+PqPz87IZGZVHxJdj299djUZv5YQVM7qzm+E0rAJRSHZ1003xsBzvDKV9cGdmSwrZ/CKiYzQ4iRPvYDg4Z2VKtz6dcD8O0/Wc7HfeiSXdqt6oZAtv+7nBLwJXhFDXb1ZbrFiydejnXmboWre0/FWzva0a2pJthaja/Iu5k+3tbNZiydahd2ZfCTvB0PfIntn1lFsoKmCc66ab5sxteTRzZfD5Qf2M6P1y3bd7Ml5VhBy+kVm1p2VTS1gYtKzbNR0zuqj9UQUet4AR7kMU/Prvx42ke2MEz4+ypcJ+PnWA36tmMWirW0frI1b0IqLctXaiv+m2O1xDuQSs3zD1pff2q758JRNyNmX8k7KLtuEPD5E6jZ0vLZfumJoJd6c8FW6eI9cwZtn3drGD7T6So++cnX6DHr8NOsM3MDat6lHnMPD2BlHnuZKP9aQXAeGOEe6+RHRhtS6rTBDGosFM8gm3/O+2eVDpdvh4z/2Gw/UONegYMp6gqVmF93DaxtgLgGG7gLcC81xt1BmHb16mNE/wbZkHhskl2xyZxXWb9+CzMggLY/l4zP9JQH6kS6b+FqbCmXKl9msydie3iDrPQ+IsbTr8ucDjBHkz9/IlAC+/M+e8C5n0JO8UnzXxZhV2iHZ8pjSjDCXZF7QpKNACUUh2pWzafg6h80HCKaqIuYSNT0g0ozHseKF9rtEg1Y3r5ev6FQPltwOQzZm5I10Ea9QOOuUr5qNGz6dzpes72lDid4GkdAAYTTgDXM4TEPrCD7yJbfmzRl5PLOupcvn1OF3Gvxbb/CBDxspkfVnrAlGzYAWQWRhSwYA9mfNl0P3N7TsfKDXMNO/g6doIDZn54wjEx2Cmq9HhG8S+IeXemetwrk9A3OK/72dNTpG8hYt6diPInMPP0szrFhk2hmHk6t7eDt8H2vzlVUX4iATAeG2w2gcle7RaGJuylx5WZO5WA8ijY/r8AEQ9hJm5MWfxD0zE1bNHa/lOB9V2MmbgRCL8fMf8JIOKImS+rcI5EreaBdgklhW2fg927qJ17kIwGB4svAeZvNbIDOgJuQlQB274ysoOVlzmgEBWvYuaNICL+NzBJDRZ81KBiPlq5Ye7iGHrHi7v7TkcrN8zt7HYvMuzS1Yh4PUD5o2B7Q0D4/tFnNXODzSmeVsbxGdkBBczfGoW4ecIDYLRugBlfhu2grIPA4ealZJnUvjQ3pMZPYqCAiIOI8GeBuGVExONA5aNA5Tpg7l2YCgsTSTCRBFNhAXPvAirXIcIfRoQ/DoSX9e+Kg5ptW1LpQlkD1AmaVjvRKe7w6DOVDSo/myTBiwTeiK091aD+p4B5WxAVh9OFsoqsvsmkAuaN0aTN3KAy88MqXRhR6dXbVLowoszsgDKzg5U1cMy/bVVmvqx1kjP9o+NdIsrbyDHAAOVHsVPkmBWXLVq09tSkve9kN1V2uwam8j6w/eeNrLYK1cMPJiPVftyatPK3HKtjaDPvPY+pfABnJm7PmgXARFnDit73Ylt+Ggj/IdjeXh0IDo2b+imWdG+Uwh0bCwDzXkJEPA7M/y8zpYg14yprV6zonYcsvgQY/zZichci4k0zXx47eeNmW7Z0sMOoOxnNQrRekngTMbkLCP92ishPI+JfONPe54wus87r7jsd9bgIUe+vMJUPABU7gMoXgfK3jUxJpVdvHQ/AnKK2Fo2AUQkmsVMc2+j06q2jCp4HMfN+A1TswFSsB+J9EfW4aKomqswCIOZKZ8pnpJh7BSb8eqDi5pTFvw6U/wMQvhWo2I0Ify1sTA1mUiHCXwMqduuf5f+gf1fcjAm/Hjny8qus0lkn2vv6//hI30xRIly2AAAAB3RFWHRBdXRob3IAqa7MSAAAAAh0RVh0Q29tbWVudAD2zJa/AAAACnRFWHRDb3B5cmlnaHQArA/MOgAAAA50RVh0Q3JlYXRpb24gdGltZQA19w8JAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIwLTA1LTI2VDIwOjM5OjUzKzAwOjAwSCqP9AAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMC0wNS0yNlQyMDozOTo1MyswMDowMDl3N0gAAAAMdEVYdERlc2NyaXB0aW9uABMJISMAAAALdEVYdERpc2NsYWltZXIAt8C0jwAAAAl0RVh0U29mdHdhcmUAXXD/OgAAAAd0RVh0U291cmNlAPX/g+sAAAAGdEVYdFRpdGxlAKju0icAAAAIdEVYdFdhcm5pbmcAwBvmhwAAAABJRU5ErkJggg==" alt="Ardalis" style="width:5em;height:5em"/><p>Copyright © 2024</p><br/></div></div><div class="column is-4 social"><a title="facebook" href="https://www.facebook.com/StevenAndrewSmith"><img src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RmFjZWJvb2sgaWNvbjwvdGl0bGU+PHBhdGggZD0iTTIyLjY3NiAwSDEuMzI0Qy41OTMgMCAwIC41OTMgMCAxLjMyNHYyMS4zNTJDMCAyMy40MDguNTkzIDI0IDEuMzI0IDI0aDExLjQ5NHYtOS4yOTRIOS42ODl2LTMuNjIxaDMuMTI5VjguNDFjMC0zLjA5OSAxLjg5NC00Ljc4NSA0LjY1OS00Ljc4NSAxLjMyNSAwIDIuNDY0LjA5NyAyLjc5Ni4xNDF2My4yNGgtMS45MjFjLTEuNSAwLTEuNzkyLjcyMS0xLjc5MiAxLjc3MXYyLjMxMWgzLjU4NGwtLjQ2NSAzLjYzSDE2LjU2VjI0aDYuMTE1Yy43MzMgMCAxLjMyNS0uNTkyIDEuMzI1LTEuMzI0VjEuMzI0QzI0IC41OTMgMjMuNDA4IDAgMjIuNjc2IDAiLz48L3N2Zz4=" alt="Facebook" style="width:1em;height:1em"/></a><a title="linkedin" href="https://www.linkedin.com/in/stevenandrewsmith"><img src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+TGlua2VkSW4gaWNvbjwvdGl0bGU+PHBhdGggZD0iTTIwLjQ0NyAyMC40NTJoLTMuNTU0di01LjU2OWMwLTEuMzI4LS4wMjctMy4wMzctMS44NTItMy4wMzctMS44NTMgMC0yLjEzNiAxLjQ0NS0yLjEzNiAyLjkzOXY1LjY2N0g5LjM1MVY5aDMuNDE0djEuNTYxaC4wNDZjLjQ3Ny0uOSAxLjYzNy0xLjg1IDMuMzctMS44NSAzLjYwMSAwIDQuMjY3IDIuMzcgNC4yNjcgNS40NTV2Ni4yODZ6TTUuMzM3IDcuNDMzYy0xLjE0NCAwLTIuMDYzLS45MjYtMi4wNjMtMi4wNjUgMC0xLjEzOC45Mi0yLjA2MyAyLjA2My0yLjA2MyAxLjE0IDAgMi4wNjQuOTI1IDIuMDY0IDIuMDYzIDAgMS4xMzktLjkyNSAyLjA2NS0yLjA2NCAyLjA2NXptMS43ODIgMTMuMDE5SDMuNTU1VjloMy41NjR2MTEuNDUyek0yMi4yMjUgMEgxLjc3MUMuNzkyIDAgMCAuNzc0IDAgMS43Mjl2MjAuNTQyQzAgMjMuMjI3Ljc5MiAyNCAxLjc3MSAyNGgyMC40NTFDMjMuMiAyNCAyNCAyMy4yMjcgMjQgMjIuMjcxVjEuNzI5QzI0IC43NzQgMjMuMiAwIDIyLjIyMiAwaC4wMDN6Ii8+PC9zdmc+" alt="Linkedin" style="width:1em;height:1em"/></a><a title="twitter" href="https://twitter.com/ardalis"><img class="fas fa-lg" src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+VHdpdHRlciBpY29uPC90aXRsZT48cGF0aCBkPSJNMjMuOTU0IDQuNTY5Yy0uODg1LjM4OS0xLjgzLjY1NC0yLjgyNS43NzUgMS4wMTQtLjYxMSAxLjc5NC0xLjU3NCAyLjE2My0yLjcyMy0uOTUxLjU1NS0yLjAwNS45NTktMy4xMjcgMS4xODQtLjg5Ni0uOTU5LTIuMTczLTEuNTU5LTMuNTkxLTEuNTU5LTIuNzE3IDAtNC45MiAyLjIwMy00LjkyIDQuOTE3IDAgLjM5LjA0NS43NjUuMTI3IDEuMTI0QzcuNjkxIDguMDk0IDQuMDY2IDYuMTMgMS42NCAzLjE2MWMtLjQyNy43MjItLjY2NiAxLjU2MS0uNjY2IDIuNDc1IDAgMS43MS44NyAzLjIxMyAyLjE4OCA0LjA5Ni0uODA3LS4wMjYtMS41NjYtLjI0OC0yLjIyOC0uNjE2di4wNjFjMCAyLjM4NSAxLjY5MyA0LjM3NCAzLjk0NiA0LjgyNy0uNDEzLjExMS0uODQ5LjE3MS0xLjI5Ni4xNzEtLjMxNCAwLS42MTUtLjAzLS45MTYtLjA4Ni42MzEgMS45NTMgMi40NDUgMy4zNzcgNC42MDQgMy40MTctMS42OCAxLjMxOS0zLjgwOSAyLjEwNS02LjEwMiAyLjEwNS0uMzkgMC0uNzc5LS4wMjMtMS4xNy0uMDY3IDIuMTg5IDEuMzk0IDQuNzY4IDIuMjA5IDcuNTU3IDIuMjA5IDkuMDU0IDAgMTMuOTk5LTcuNDk2IDEzLjk5OS0xMy45ODYgMC0uMjA5IDAtLjQyLS4wMTUtLjYzLjk2MS0uNjg5IDEuOC0xLjU2IDIuNDYtMi41NDhsLS4wNDctLjAyeiIvPjwvc3ZnPg==" alt="Twitter" style="width:1em;height:1em"/></a><a title="youtube" href="https://www.youtube.com/ardalis/"><img src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48dGl0bGU+WW91VHViZSBpY29uPC90aXRsZT48cGF0aCBkPSJNMjMuNDk1IDYuMjA1YTMuMDA3IDMuMDA3IDAgMCAwLTIuMDg4LTIuMDg4Yy0xLjg3LS41MDEtOS4zOTYtLjUwMS05LjM5Ni0uNTAxcy03LjUwNy0uMDEtOS4zOTYuNTAxQTMuMDA3IDMuMDA3IDAgMCAwIC41MjcgNi4yMDVhMzEuMjQ3IDMxLjI0NyAwIDAgMC0uNTIyIDUuODA1IDMxLjI0NyAzMS4yNDcgMCAwIDAgLjUyMiA1Ljc4MyAzLjAwNyAzLjAwNyAwIDAgMCAyLjA4OCAyLjA4OGMxLjg2OC41MDIgOS4zOTYuNTAyIDkuMzk2LjUwMnM3LjUwNiAwIDkuMzk2LS41MDJhMy4wMDcgMy4wMDcgMCAwIDAgMi4wODgtMi4wODggMzEuMjQ3IDMxLjI0NyAwIDAgMCAuNS01Ljc4MyAzMS4yNDcgMzEuMjQ3IDAgMCAwLS41LTUuODA1ek05LjYwOSAxNS42MDFWOC40MDhsNi4yNjQgMy42MDJ6Ii8+PC9zdmc+" alt="YouTube" style="width:1em;height:1em"/></a><a title="github" href="https://github.com/ardalis"><img src="data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+R2l0SHViIGljb248L3RpdGxlPjxwYXRoIGQ9Ik0xMiAuMjk3Yy02LjYzIDAtMTIgNS4zNzMtMTIgMTIgMCA1LjMwMyAzLjQzOCA5LjggOC4yMDUgMTEuMzg1LjYuMTEzLjgyLS4yNTguODItLjU3NyAwLS4yODUtLjAxLTEuMDQtLjAxNS0yLjA0LTMuMzM4LjcyNC00LjA0Mi0xLjYxLTQuMDQyLTEuNjFDNC40MjIgMTguMDcgMy42MzMgMTcuNyAzLjYzMyAxNy43Yy0xLjA4Ny0uNzQ0LjA4NC0uNzI5LjA4NC0uNzI5IDEuMjA1LjA4NCAxLjgzOCAxLjIzNiAxLjgzOCAxLjIzNiAxLjA3IDEuODM1IDIuODA5IDEuMzA1IDMuNDk1Ljk5OC4xMDgtLjc3Ni40MTctMS4zMDUuNzYtMS42MDUtMi42NjUtLjMtNS40NjYtMS4zMzItNS40NjYtNS45MyAwLTEuMzEuNDY1LTIuMzggMS4yMzUtMy4yMi0uMTM1LS4zMDMtLjU0LTEuNTIzLjEwNS0zLjE3NiAwIDAgMS4wMDUtLjMyMiAzLjMgMS4yMy45Ni0uMjY3IDEuOTgtLjM5OSAzLS40MDUgMS4wMi4wMDYgMi4wNC4xMzggMyAuNDA1IDIuMjgtMS41NTIgMy4yODUtMS4yMyAzLjI4NS0xLjIzLjY0NSAxLjY1My4yNCAyLjg3My4xMiAzLjE3Ni43NjUuODQgMS4yMyAxLjkxIDEuMjMgMy4yMiAwIDQuNjEtMi44MDUgNS42MjUtNS40NzUgNS45Mi40Mi4zNi44MSAxLjA5Ni44MSAyLjIyIDAgMS42MDYtLjAxNSAyLjg5Ni0uMDE1IDMuMjg2IDAgLjMxNS4yMS42OS44MjUuNTdDMjAuNTY1IDIyLjA5MiAyNCAxNy41OTIgMjQgMTIuMjk3YzAtNi42MjctNS4zNzMtMTItMTItMTIiLz48L3N2Zz4=" alt="GitHub" style="width:1em;height:1em"/></a><a title="mastodon" rel="me" href="https://fosstodon.org/@ardalis">Mastodon</a></div></div><div class="columns"><div class="column is-12"> <br/></div></div></div></div></footer></div></div><div id="gatsby-announcer" style="position:absolute;top:0;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0" aria-live="assertive" aria-atomic="true"></div></div><script id="gatsby-script-loader">/*<![CDATA[*/window.pagePath="/category/software-development/";window.___webpackCompilationHash="9f072ce39b8c45e776d8";/*]]>*/</script><script id="gatsby-chunk-mapping">/*<![CDATA[*/window.___chunkMapping={"polyfill":["/polyfill-7da9e88def8c798a4eb9.js"],"app":["/app-405db4ecfef604df7c88.js"],"component---src-pages-404-js":["/component---src-pages-404-js-1976de88f000a167ddcd.js"],"component---src-pages-blog-xxindex-js":["/component---src-pages-blog-xxindex-js-6bcf93906ae77ae2d8f9.js"],"component---src-pages-category-index-js":["/component---src-pages-category-index-js-48d61f4a46bb641b8956.js"],"component---src-pages-contact-us-index-js":["/component---src-pages-contact-us-index-js-5b411c187d58149838fb.js"],"component---src-pages-contact-us-thanks-js":["/component---src-pages-contact-us-thanks-js-4628b8a932d6ba8aab4f.js"],"component---src-pages-search-js":["/component---src-pages-search-js-a08b213b54d487a46d0b.js"],"component---src-pages-tags-index-js":["/component---src-pages-tags-index-js-19205344ecd0edc99e53.js"],"component---src-templates-assessments-page-js":["/component---src-templates-assessments-page-js-6eb574b0cb3280515679.js"],"component---src-templates-blog-list-js":["/component---src-templates-blog-list-js-0654f80ec4fb1083e770.js"],"component---src-templates-blog-post-js":["/component---src-templates-blog-post-js-a0b924a3ca1633ff2ab9.js"],"component---src-templates-category-js":["/component---src-templates-category-js-fcf4126d77453579328c.js"],"component---src-templates-ebook-page-js":["/component---src-templates-ebook-page-js-bd3cc1f64c724e6b2225.js"],"component---src-templates-index-page-js":["/component---src-templates-index-page-js-e858569f1b057f1865d5.js"],"component---src-templates-interviews-page-js":["/component---src-templates-interviews-page-js-ba4485a2c98fe4cbe0d7.js"],"component---src-templates-mentoring-page-js":["/component---src-templates-mentoring-page-js-5bb43e188b85eb0ea5d8.js"],"component---src-templates-software-craftsmanship-2016-wall-calendar-sponsorship-page-js":["/component---src-templates-software-craftsmanship-2016-wall-calendar-sponsorship-page-js-336fba6ad39c3dd88394.js"],"component---src-templates-tags-js":["/component---src-templates-tags-js-be64cf526cda48ad19f7.js"],"component---src-templates-tips-page-js":["/component---src-templates-tips-page-js-46547b7f6de4bc8075e7.js"],"component---src-templates-tools-used-page-js":["/component---src-templates-tools-used-page-js-57cf6d51808846c98f3d.js"],"component---src-templates-training-classes-page-js":["/component---src-templates-training-classes-page-js-9f8bb3852c890a4a7db3.js"]};/*]]>*/</script><script src="/polyfill-7da9e88def8c798a4eb9.js" nomodule=""></script><script src="/app-405db4ecfef604df7c88.js" async=""></script><script src="/532a2f07-f97befafd74bf8dd0311.js" async=""></script><script src="/framework-3a4fd0dc0ae7f6fdcce7.js" async=""></script><script src="/webpack-runtime-3c5edcbff810762fe2d4.js" async=""></script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10