<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7113888591536837437</id><updated>2012-01-19T04:36:32.331-08:00</updated><category term='C#'/><category term='quote'/><category term='design'/><category term='quality'/><category term='language'/><category term='DPF gadget'/><category term='WP7 Android'/><category term='html5 canvas'/><category term='MVP design'/><title type='text'>Code Liability</title><subtitle type='html'>Code is a liability!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-8499796295235629632</id><published>2011-10-05T17:06:00.000-07:00</published><updated>2011-10-05T17:20:11.289-07:00</updated><title type='text'>Review your Event Logs</title><content type='html'>I was just browsing my event log and found the following entry in system:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Remote session from client name a exceeded the maximum allowed failed logon attempts. The session was forcibly terminated.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This normally would not be a concern except I've the message was logged every minute or so. &amp;nbsp;After further review I see that this has been going on for the last 3 months! (as far back as my event goes)&lt;br /&gt;&lt;br /&gt;Clearly someone is trying to hack into my computer through the Remote Desktop Service. &amp;nbsp;I do have a forwarding rule in my ISP's router that forwards port 3389 to my desktop. &amp;nbsp;Being as 3389 is the default port for remote desktop, I guess I should not be&amp;nbsp;surprised&amp;nbsp;that this was happening.&lt;br /&gt;&lt;br /&gt;So what did I do? &amp;nbsp;I changed the default RDP port. &amp;nbsp;Yes, that's right "Security by obscurity" &amp;nbsp;Not the&amp;nbsp;preferred solution&amp;nbsp;but it should slow down the attacks.&lt;br /&gt;&lt;br /&gt;I updated the forwarding rule in the ISP router/firewall and updated my desktop RDP port using&amp;nbsp;&lt;a href="http://support.microsoft.com/kb/306759"&gt;http://support.microsoft.com/kb/306759&lt;/a&gt;&amp;nbsp; The desktop computer firewall also had to modified to support the new port. &amp;nbsp;The firewall rule for RDP on port 3389 is locked &amp;nbsp;so I just created a new one for the new port.&lt;br /&gt;&lt;br /&gt;I also changed the Local Security Policy's Account Lockout Policy to 3 attempts and 30 minutes to reset. &amp;nbsp; &amp;nbsp;This should slow someone down as well.&lt;br /&gt;&lt;br /&gt;Luckily&amp;nbsp;I have a strong password according to&amp;nbsp;&lt;a href="http://www.passwordmeter.com/"&gt;http://www.passwordmeter.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, 'Trebuchet MS', 'Lucida Grande', Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellpadding="5" cellspacing="1" id="tablePwdCheck" style="background-attachment: initial; background-clip: initial; background-color: #334455; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; margin-bottom: 10px; width: 610px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="background-attachment: initial; background-clip: initial; background-color: #445566; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: white; text-align: left; vertical-align: top;"&gt;Score:&lt;/th&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; text-align: left; vertical-align: top;"&gt;&lt;div id="scorebarBorder" style="background-attachment: initial; background-clip: initial; background-color: #333333; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(0, 0, 0); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(0, 0, 0); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(0, 0, 0); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(0, 0, 0); border-top-style: solid; border-top-width: 1px; height: 16px; margin-bottom: 2px; width: 100px;"&gt;&lt;div id="score" style="color: black; font-size: 11px; font-weight: bold; position: absolute; text-align: center; width: 100px; z-index: 10;"&gt;79%&lt;/div&gt;&lt;div id="scorebar" style="background-image: url(http://www.passwordmeter.com/images/bg_strength_gradient.jpg); background-position: -316px 50%; background-repeat: no-repeat no-repeat; position: absolute; width: 100px; z-index: 0;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th style="background-attachment: initial; background-clip: initial; background-color: #445566; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: white; text-align: left; vertical-align: top;"&gt;Complexity:&lt;/th&gt;&lt;td style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; text-align: left; vertical-align: top;"&gt;&lt;div id="complexity"&gt;Strong&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;So I suggest you do take some time to review your event logs. &amp;nbsp;It's surprising what you might learn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-8499796295235629632?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/8499796295235629632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=8499796295235629632&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8499796295235629632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8499796295235629632'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2011/10/review-your-event-logs.html' title='Review your Event Logs'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-2945218380840010760</id><published>2011-02-20T08:19:00.001-08:00</published><updated>2011-02-20T08:19:39.172-08:00</updated><title type='text'>Some important Google Chrome Add-Ons</title><content type='html'>Google Chrome has been released more than two years ago and it's the browser of choice for many people. Despite having won hearts for its speed and elegance, Google Chrome does have some minor flaws that you might want to fix. Here are some of them:  &lt;br /&gt;  &lt;p&gt;1. No confirmation when closing multiple tabs&lt;/p&gt;  &lt;p&gt;Google Chrome does't show a warning when you close a window with multiple tabs. If you accidentally close Chrome windows, you can install &lt;a href="https://chrome.google.com/extensions/detail/fjccknnhdnkbanjilpjddjhmkghmachn"&gt;Chrome Toolbox&lt;/a&gt;. The next time you close many tabs, you'll at least get a warning.    &lt;br /&gt;&lt;img border="0" alt="alt" src="http://3.bp.blogspot.com/-SxQKoB4OB-A/TWEaYiLhn3I/AAAAAAAAgiQ/Kxv_6LWQhMw/s640/guest-chrome-1-confirmation-dialog.png" width="400" height="141" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;2. Basic history page&lt;/p&gt;  &lt;p&gt;Google Chrome's history page is pretty basic and you can't restrict the list to a certain time interval.   &lt;br /&gt;The &lt;a href="https://chrome.google.com/extensions/detail/cahejgbbfgmlmjgdjlibphdjeldhagkp"&gt;History 2&lt;/a&gt; extension comes to the rescue by allowing you to sort web pages based on the day/week you visited them. History &lt;/p&gt;  &lt;p&gt;2 allows you to delete multiple items from your history page at the click of a button – something that's not possible by default.&lt;/p&gt;  &lt;p&gt;&lt;img border="0" alt="alt" src="http://2.bp.blogspot.com/-AG4_rr8XHfg/TWEaYYIJ8EI/AAAAAAAAgiI/AVBhm0pjmlE/s640/guest-chrome-2-better-history.png" width="400" height="213" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;3. Missing image properties&lt;/p&gt;  &lt;p&gt;There's no way to quickly examine an image when you're in Chrome. Fortunately, you can install &lt;a href="https://chrome.google.com/extensions/detail/khagclindddokccfbmfmckaflngbmpon"&gt;Image Properties Context Menu&lt;/a&gt;, an extension that lets you right-click on an image and find information about the image size, location, dimensions and more.    &lt;br /&gt;&lt;img border="0" alt="alt" src="http://1.bp.blogspot.com/-hSiY_l_f4EE/TWEaYSo8uVI/AAAAAAAAgiA/xkLdLL3tCEk/s640/guest-chrome-3-image-properties.png" width="400" height="140" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;4. No support for feeds&lt;/p&gt;  &lt;p&gt;Chrome simply doesn't recognize RSS feeds and all you get is a page with gibberish text. If you install the &lt;a href="https://chrome.google.com/extensions/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd"&gt;RSS Subscription&lt;/a&gt; extension developed by Google, you can quickly subscribe to any feed using Google Reader, iGoogle, Bloglines or My Yahoo.    &lt;br /&gt;&lt;img border="0" alt="alt" src="http://4.bp.blogspot.com/-9y-RzIIHdIs/TWEaYMuQknI/AAAAAAAAgh4/aLJVPJ97RMk/s640/guest-chrome-4-rss-support.png" width="400" height="193" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;5. You can't send a web page by email&lt;/p&gt;  &lt;p&gt;While other popular browsers allow you to quickly send any web page you're viewing by email, such an option is nowhere to be found in Google Chrome.   &lt;br /&gt;Worry not, because you can create &lt;a href="http://www.tech-recipes.com/rx/3024/google_chrome_add_send_link_button_to_bookmarks_bar/"&gt;a simple Javascript bookmarklet&lt;/a&gt; to open your default email program with the current URL. If Gmail is what you use, you can alternatively install the &lt;a href="https://chrome.google.com/extensions/detail/pgphcomnlaojlmmcjmiddhdapjpbgeoc"&gt;Send from Gmail&lt;/a&gt; extension to send the web page to Gmail.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;6. No session manger&lt;/p&gt;  &lt;p&gt;Closing Google Chrome and reopening it does not restore previously opened tabs. In order to do that, go to the Options dialog and enable Reopen tabs that were open last.   &lt;br /&gt;If you want advanced session saving options like the ability to create multiple sessions, try the &lt;a href="https://chrome.google.com/extensions/detail/edacconmaakjimmfgnblocblbcdcpbko"&gt;Session Buddy&lt;/a&gt; addon for Google Chrome.&lt;/p&gt;  &lt;p&gt;7. You can't switch to a tab from the Omnibox&lt;/p&gt;  &lt;p&gt;Firefox 4 lets you switch to any open tab by typing relevant words into the address bar. If you'd like to see a similar feature in Chrome, install the&lt;a href="https://chrome.google.com/extensions/detail/gbfhhcljihbgcobpfnceegfmooomhhli"&gt;Switch To Tab&lt;/a&gt; extension.    &lt;br /&gt;The next time you have too many open tabs, just type sw followed by some words from the page. Hitting Enter switches to the tab that's listed as the first match.    &lt;br /&gt;&lt;img border="0" alt="alt" src="http://3.bp.blogspot.com/-tatTD1IE_bk/TWEaYFHDrsI/AAAAAAAAghw/Anc0rTDN_eA/s640/guest-chrome-7-switch-to-tab.png" width="400" height="133" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;And as a bonus, on You Tube you can not set you’re preferred stream to HD.&amp;#160; Get the &lt;a href="https://chrome.google.com/webstore/detail/kaielpkecabnggniojjhghggjedkecfj#"&gt;Auto HD for YouTube&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-2945218380840010760?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/2945218380840010760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=2945218380840010760&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2945218380840010760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2945218380840010760'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2011/02/some-important-google-chrome-add-ons.html' title='Some important Google Chrome Add-Ons'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-SxQKoB4OB-A/TWEaYiLhn3I/AAAAAAAAgiQ/Kxv_6LWQhMw/s72-c/guest-chrome-1-confirmation-dialog.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-5466662465842772176</id><published>2011-02-12T10:26:00.001-08:00</published><updated>2011-02-12T13:12:36.890-08:00</updated><title type='text'>Reviewing ReactiveUI</title><content type='html'>&lt;p&gt;I am reviewing the &lt;a href="https://github.com/xpaulbettsx/reactiveui"&gt;ReactiveUI&lt;/a&gt; code now and I have to say it’s some of the coolest code I’ve seen in a while!&lt;/p&gt;  &lt;p&gt;I really like the base ReactiveValidatedObject class for building ViewModels.&amp;#160; The view models become so much easier for validation and INotifyPropertyChanged:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;_Name;&lt;br /&gt;[&lt;span style="color: #2b91af"&gt;Required&lt;/span&gt;]&lt;br /&gt;[&lt;span style="color: #2b91af"&gt;StringLength&lt;/span&gt;(35, MinimumLength = 3, ErrorMessage = &lt;span style="color: #a31515"&gt;&amp;quot;Names have to be between 3 and 35 letters long&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: blue"&gt;public string &lt;/span&gt;Name {&lt;br /&gt;    &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_Name; }&lt;br /&gt;    &lt;span style="color: blue"&gt;set &lt;/span&gt;{ _Name = &lt;span style="color: blue"&gt;this&lt;/span&gt;.RaiseAndSetIfChanged(x =&amp;gt; x.Name, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The MemoizingMRUCache class looks very handy and I also like how the logging is accomplished.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The sample that comes with it has great comments and I learned more about MEF in the process.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;It has a Ruby feel to with with a rake build script.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I have so much more to review. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-5466662465842772176?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/5466662465842772176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=5466662465842772176&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5466662465842772176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5466662465842772176'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2011/02/reviewing-reactiveui.html' title='Reviewing ReactiveUI'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-1182930962055174390</id><published>2011-02-04T03:36:00.000-08:00</published><updated>2011-02-04T03:36:22.485-08:00</updated><title type='text'>we hatez your browser or how not to design web sites in 2011!</title><content type='html'>While visiting the www.MVA.Maryland.gov website I discovered the following message:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Verdana;"&gt;&lt;strong&gt;The eMVA store is not available to Google Chrome users. Please use another browser.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Verdana;"&gt;In the words of Jar Jar... "how rude"&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-1182930962055174390?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/1182930962055174390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=1182930962055174390&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1182930962055174390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1182930962055174390'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2011/02/we-hatez-your-browser-or-how-not-to.html' title='we hatez your browser or how not to design web sites in 2011!'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-8233676351692533014</id><published>2010-11-22T15:33:00.001-08:00</published><updated>2010-11-22T15:33:49.554-08:00</updated><title type='text'>Cheating at Bejeweled Blitz on Facebook</title><content type='html'>My new bot is complete and is scoring greater than 800k.&lt;br /&gt;&lt;br /&gt;Check it out at&amp;nbsp;&lt;a href="http://cheatatbejeweledblitz.com/"&gt;http://cheatatbejeweledblitz.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-8233676351692533014?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/8233676351692533014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=8233676351692533014&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8233676351692533014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8233676351692533014'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2010/11/cheating-at-bejeweled-blitz-on-facebook.html' title='Cheating at Bejeweled Blitz on Facebook'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-2732386595588262157</id><published>2010-10-21T05:24:00.000-07:00</published><updated>2010-10-21T05:24:44.648-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WP7 Android'/><title type='text'>Your Android may one day be infected at it's core</title><content type='html'>Last night's BaltoMSDN presentation by Mike Wolf was on Windows Phone 7 development. &amp;nbsp;When I heard that all apps would need to be certified by Microsoft, I thought, "Oh, No. &amp;nbsp;Here we go with the oppressive oversight". &amp;nbsp;But after a little surfing this morning regarding mobile OS's and security I came across this&amp;nbsp;white paper describing how the entire Android OS could be infected with Ad/Malware.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://appanalysis.org/tdroid10.pdf"&gt;http://appanalysis.org/tdroid10.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let's hope Microsoft get's security right on the WP7 but is not as oppressive as Apple in app certification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-2732386595588262157?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/2732386595588262157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=2732386595588262157&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2732386595588262157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2732386595588262157'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2010/10/your-android-may-one-day-be-infected-at.html' title='Your Android may one day be infected at it&apos;s core'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-7651939255522444768</id><published>2010-10-10T18:25:00.001-07:00</published><updated>2010-10-10T18:26:50.920-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html5 canvas'/><title type='text'>HTML5 Canvas</title><content type='html'>I thought it was time to start learning some HTML5 so I dove into the Canvas element. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://amazonfoobar.s3.amazonaws.com/HTML5/canvas.html"&gt;View it here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-7651939255522444768?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/7651939255522444768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=7651939255522444768&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7651939255522444768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7651939255522444768'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2010/10/html5-canvas_10.html' title='HTML5 Canvas'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-7114126173161543233</id><published>2010-08-13T13:42:00.000-07:00</published><updated>2010-08-13T14:11:49.583-07:00</updated><title type='text'>Node.js can't use multiple CPU/Cores</title><content type='html'>I just install Ubuntu 10.04 and got &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; up and running.&lt;br /&gt;&lt;br /&gt;It's scary how easy it is to create a highly scalable web / socket application.&lt;br /&gt;&lt;br /&gt;Don't get too excited yet.  The gurus at Yahoo had this to say:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;But all is not sunshine and lollipops in NodeJS land. While single-process performance is quite good, eventually one CPU is not going to be enough; the platform provides no ability to scale out to take advantage of the multiple cores commonly present in today's server-class hardware. With current NodeJS builds, the practical limits of a single CPU acting as an HTTP proxy are around 2100 reqs/s for a 2.5GHz Intel Xeon.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;While Node is relatively solid, it does still crash occasionally, adversely impacting availability if you're running only a single NodeJS process. Such problems can be particularly common when using a buggy compiled add-on that can suffer from the usual cornucopia of C++ goodies such as segfaults and memory scribbling. When handling requests with multiple processes, one processing going down will simply result in incoming requests being directed at the other processes.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;And lastly, Alex Payne sums up what large&amp;nbsp;scalability&amp;nbsp;and why node.js might just remain the realm of the less than skilled programmers.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://al3x.net/2010/07/27/node.html"&gt;http://al3x.net/2010/07/27/node.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Threads are not dead!&lt;br /&gt;&lt;br /&gt;This looks interesting for javascript :  &lt;a href="http://documentcloud.github.com/underscore/"&gt;http://documentcloud.github.com/underscore/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-7114126173161543233?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/7114126173161543233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=7114126173161543233&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7114126173161543233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7114126173161543233'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2010/08/nodejs.html' title='Node.js can&apos;t use multiple CPU/Cores'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-5229935012273122667</id><published>2010-05-01T05:09:00.001-07:00</published><updated>2010-05-01T05:09:25.760-07:00</updated><title type='text'>CQRS and User Interface Design</title><content type='html'>&lt;p&gt;I am beginning to have a shift in thinking about user interface design as I study the CQRS architectural pattern. The pattern really forces you to think about design UI’s around tasks.&lt;/p&gt;  &lt;p&gt;You have to ask yourself, “Why would a user want to change the state of the system?”&lt;/p&gt;  &lt;p&gt;Why would the user want to change the address of a customer?&amp;#160; Was it a mistake?&amp;#160; Did they move?&amp;#160; These might be important to know.&amp;#160; If they made a mistake and they have pending orders about to ship it might imply very different business rules.&lt;/p&gt;  &lt;p&gt;It also forces you to think about the experience from the user’s perspective.&lt;/p&gt;  &lt;p&gt;Udi Dahan said it perfectly during one of his talks: &amp;quot;User Interface design is as much a part of architecture as anything else that you do&amp;quot;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-5229935012273122667?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/5229935012273122667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=5229935012273122667&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5229935012273122667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5229935012273122667'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2010/05/cqrs-and-user-interface-design.html' title='CQRS and User Interface Design'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-4406553787405370916</id><published>2009-07-22T13:40:00.000-07:00</published><updated>2009-07-22T13:42:24.588-07:00</updated><title type='text'>Google Hates Internet Explorer</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4hw5ZShkMy8/Smd5n6zY15I/AAAAAAAACXM/aaDe8HY5eFU/s1600-h/GoogleVsFireFox.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 66px;" src="http://1.bp.blogspot.com/_4hw5ZShkMy8/Smd5n6zY15I/AAAAAAAACXM/aaDe8HY5eFU/s200/GoogleVsFireFox.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5361387608114517906" /&gt;&lt;/a&gt;&lt;br /&gt;Just went to look something up and was using IE.  Google is advertising Chrome in IE but not FireFox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-4406553787405370916?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/4406553787405370916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=4406553787405370916&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/4406553787405370916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/4406553787405370916'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2009/07/google-hates-internet-explorer.html' title='Google Hates Internet Explorer'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4hw5ZShkMy8/Smd5n6zY15I/AAAAAAAACXM/aaDe8HY5eFU/s72-c/GoogleVsFireFox.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-1762253839670869181</id><published>2008-08-30T06:09:00.001-07:00</published><updated>2008-08-30T06:11:17.135-07:00</updated><title type='text'>Open Source Code Review - A choice to name a method "Inscrutable"?</title><content type='html'>&lt;div class="csharpcode"&gt;I've been reviewing various open source projects related to Amazon S3 and discovered the excellent &lt;a href="http://www.codeplex.com/resourceful"&gt;Resourceful&lt;/a&gt; library and the related project &lt;a href="http://www.codeplex.com/spaceblock"&gt;SpaceBlock&lt;/a&gt;.&amp;#160; The following code is a utility class in the SpaceBlock project.&amp;#160; &lt;/div&gt;  &lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="csharpcode"&gt;The method I found offensive was named &lt;a href="http://www.codeplex.com/spaceblock/SourceControl/FileView.aspx?itemId=90714&amp;amp;changeSetId=11381"&gt;&amp;quot;Inscrutable&amp;quot; and is located in the class named F&lt;/a&gt;.&amp;#160; The definition of &amp;quot;&lt;a href="http://dictionary.reference.com/search?q=inscrutable"&gt;Inscrutable&lt;/a&gt;&amp;quot; from dictionary.com is &amp;quot;incapable of being investigated, analyzed, or scrutinized; impenetrable.&amp;quot;&amp;#160; This reminds me of a quote I heard 25 years ago from an old mainframe programmer at Westinghouse.&amp;#160; I was complaining about the understandability of his VMS code and he said &amp;quot;If it was hard to write, it should be hard to understand&amp;quot;.&amp;#160; I couldn't have disagreed with him more.&amp;#160; I believe in intellectual manageability of the code you write.&amp;#160; You don't write code for yourself or the compiler.&amp;#160; You write it for other people.&amp;#160; By naming a function &amp;quot;Inscrutable&amp;quot; you are flipping me and everyone else the bird!&amp;#160; &lt;/div&gt;  &lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="csharpcode"&gt;I guarantee this will happen to you one day (if it has not already).&amp;#160; You will be reviewing your own code for a bug fix and discover a particularly tricky piece of code that you didn't comment or name your function properly.&amp;#160; If you were so arrogant as to name your method &amp;quot;YouAreTooStupidToUnderstandHowThisWorksSoDontEvenTry&amp;quot; you will be essentially flipping yourself the bird!&amp;#160; You will then end up spending way too much time figuring out and reflecting on exactly you were thinking when you wrote that code.&lt;/div&gt;  &lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="csharpcode"&gt;Now, I'm not saying I'm not guilty of doing similar complexities with my code.&amp;#160; In fact, I can hear my co-workers now shouting over the cubical walls &amp;quot;Hey, isn't that the pot calling the kettle black&amp;quot;.&amp;#160; I'm posting this as a reminder to myself and all developers to never do something this blatant and egotistic as this in our code.&lt;/div&gt;  &lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="csharpcode"&gt;I am not slamming these projects. I think they are well written and have a great coding style. I plan to use them in the future.&lt;/div&gt;  &lt;div class="csharpcode"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="csharpcode"&gt;&lt;/div&gt; &lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-1762253839670869181?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/1762253839670869181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=1762253839670869181&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1762253839670869181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1762253839670869181'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2008/08/open-source-code-review-choice-to-name.html' title='Open Source Code Review - A choice to name a method &amp;quot;Inscrutable&amp;quot;?'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-2199447583842850479</id><published>2008-08-30T05:14:00.001-07:00</published><updated>2008-08-30T05:14:22.753-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# 4.0: Meet the Design Team</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Anders and crew meet in the room where C# was birthed and talk about the future.&lt;/p&gt;  &lt;p&gt;&lt;iframe src="http://channel9.msdn.com/posts/Charles/409364/player/" frameborder="0" width="320" scrolling="no" height="325"&gt;&lt;/iframe&gt;    &lt;br /&gt;&lt;a href="http://channel9.msdn.com/posts/Charles/C-40-Meet-the-Design-Team/"&gt;C# 4.0: Meet the Design Team&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-2199447583842850479?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/2199447583842850479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=2199447583842850479&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2199447583842850479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2199447583842850479'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2008/08/c-40-meet-design-team.html' title='C# 4.0: Meet the Design Team'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-7837075929232829789</id><published>2008-05-07T11:08:00.001-07:00</published><updated>2008-05-07T11:08:28.348-07:00</updated><title type='text'>Edward Tufte One Day Seminar</title><content type='html'>&lt;p&gt;Yesterday I attended a one day seminar in Arlington, VA presented by &lt;a href="http://www.edwardtufte.com/tufte/"&gt;Edward Tufte&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;It was a great presentation and I picked up all four of his books.&lt;/p&gt;  &lt;p&gt; quotes and general notes:&lt;/p&gt;  &lt;p&gt;Great designs are transparent&lt;/p&gt;  &lt;p&gt;Never segregate data by the mode of production.&lt;/p&gt;  &lt;p&gt;Show all the data, it provides credibility.&lt;/p&gt;  &lt;p&gt;We should be concerned with the quality of thought.&lt;/p&gt;  &lt;p&gt;Don't use lowest common denominator design or you will have an intellectual disaster.&lt;/p&gt;  &lt;p&gt;Tables out perform graphs for data less than 1000 points.&lt;/p&gt;  &lt;p&gt;Screens should be 95% content and 5% administrative debris (scrollbars, toolbars, etc.).&amp;#160; Measure it.&lt;/p&gt;  &lt;p&gt;Design the surface first.&amp;#160; Outside-In design.&amp;#160; iPhone designed the hardware platform before the software.&amp;#160; iPhone has one of the highest DPI of any consumer device.&lt;/p&gt;  &lt;p&gt;Don't provide an application solution.&lt;/p&gt;  &lt;p&gt;Leave the UI alone once it's done.&lt;/p&gt;  &lt;p&gt;There is no relationship between the amount of information and the ability to process.&amp;#160; The human eye can process 10mbit/sec.&lt;/p&gt;  &lt;p&gt;Don't be an original.&amp;#160; Steal a good design.&lt;/p&gt;  &lt;p&gt;Consider a &amp;quot;super graph&amp;quot;.&amp;#160; It unifies and relates the audience to the data or theme.&lt;/p&gt;  &lt;p&gt;Increase information throughput&lt;/p&gt;  &lt;p&gt;Examine how newspapers report data and clone it. Examine &amp;quot;Nature&amp;quot; magazine.&lt;/p&gt;  &lt;p&gt;Multivariant problems are the only interesting problems.&lt;/p&gt;  &lt;p&gt;Progress in technology is measured in resolution&lt;/p&gt;  &lt;p&gt;Don't use legends on graphs.&amp;#160; Put the text on the line.&lt;/p&gt;  &lt;p&gt;Maximize content reasoning and minimize decoding&lt;/p&gt;  &lt;p&gt;&amp;quot;We want to be approximately right rather than absolutely wrong&amp;quot;&lt;/p&gt;  &lt;p&gt;Use &lt;a href="http://www.fonts.com/findfonts/detail.htm?pid=427675&amp;amp;gclid=CIu-wbb8lJMCFQ4yGgodyVlCgw"&gt;Gill Sans Font&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Annotate everything&lt;/p&gt;  &lt;h4&gt;about presentations&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Show up early for your own presentation to meet people, to show a gracious gesture, and to hand out materials early.&lt;/li&gt;    &lt;li&gt;Use presentations as a review of the material distributed prior to the meeting.&amp;#160; Maybe simply ask &amp;quot;Are there any questions?&amp;quot; and end the meeting.&lt;/li&gt;    &lt;li&gt;Use Power Point as a projector operating system&lt;/li&gt;    &lt;li&gt;Give out handouts before meeting - people can read 2x-4x times faster than you can talk.&lt;/li&gt;    &lt;li&gt;What is the problem?&lt;/li&gt;    &lt;li&gt;Who cares? the relevance&lt;/li&gt;    &lt;li&gt;The solution&lt;/li&gt;    &lt;li&gt;Have a summary&lt;/li&gt;    &lt;li&gt;Say you will answer questions when they are done reading&lt;/li&gt;    &lt;li&gt;Use sentences.&amp;#160; No laundry lists of nouns.&amp;#160; Sentences for you to think causally.&lt;/li&gt;    &lt;li&gt;Don't use bullet reveals.&lt;/li&gt;    &lt;li&gt;Practice in front of a friend or a video camera&lt;/li&gt;    &lt;li&gt;Turn off the video and listen to the audio&lt;/li&gt;    &lt;li&gt;Ask a trusted friend for criticisim&lt;/li&gt;    &lt;li&gt;Never begin with an all purpose joke&lt;/li&gt;    &lt;li&gt;Never apologize at the start of the presentation&lt;/li&gt;    &lt;li&gt;Stay out of the first person during the introduction&lt;/li&gt;    &lt;li&gt;Stay on content&lt;/li&gt;    &lt;li&gt;Finish early &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-7837075929232829789?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/7837075929232829789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=7837075929232829789&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7837075929232829789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7837075929232829789'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2008/05/edward-tufte-one-day-seminar.html' title='Edward Tufte One Day Seminar'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-4724960227907759428</id><published>2008-04-16T07:35:00.001-07:00</published><updated>2008-04-16T07:35:47.582-07:00</updated><title type='text'>Patterns and Practices releases Unity 1.0</title><content type='html'>&lt;p&gt;How did I miss this?&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.codeplex.com/unity" href="http://www.codeplex.com/unity"&gt;http://www.codeplex.com/unity&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-4724960227907759428?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/4724960227907759428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=4724960227907759428&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/4724960227907759428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/4724960227907759428'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2008/04/patterns-and-practices-releases-unity.html' title='Patterns and Practices releases Unity 1.0'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-8717278395398460873</id><published>2008-04-16T07:32:00.001-07:00</published><updated>2008-04-16T07:32:57.525-07:00</updated><title type='text'>He's worse than dead!</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;embed src="http://www.youtube.com/v/qJQwHwP0ojI&amp;amp;rel=0" width="425" height="355" type="application/x-shockwave-flash" wmode="transparent" /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-8717278395398460873?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/8717278395398460873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=8717278395398460873&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8717278395398460873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8717278395398460873'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2008/04/he-worse-than-dead.html' title='He&amp;#39;s worse than dead!'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-5564773791237831388</id><published>2008-03-26T05:39:00.001-07:00</published><updated>2008-03-26T05:39:57.552-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quote'/><title type='text'>Quote of the day</title><content type='html'>&lt;div id="banner"&gt;&lt;q&gt;Good judgement is the result of experience ... Experience is the result of bad judgement.&lt;/q&gt; — &lt;author&gt;Fred Brooks&lt;/author&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-5564773791237831388?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/5564773791237831388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=5564773791237831388&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5564773791237831388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5564773791237831388'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2008/03/quote-of-day.html' title='Quote of the day'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-7762467437445739708</id><published>2008-01-30T07:28:00.000-08:00</published><updated>2008-01-30T07:30:18.152-08:00</updated><title type='text'>Playing with the .NET FCL symbols and source code</title><content type='html'>&lt;p class="MsoNormal"&gt;I’m playing with the debug symbols for the .NET framework and came across some interesting things in code.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Dropping back to memory manipulation for performance from the String class&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color: green;"&gt;// Returns the entire string as an array of characters. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;unsafe&lt;/span&gt; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;char&lt;/span&gt;[] ToCharArray() {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color: green;"&gt;// &lt;strip&gt; huge performance improvement for short strings by doing this &lt;/strip&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; length = Length;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;char&lt;/span&gt;[] chars = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: blue;"&gt;char&lt;/span&gt;[length];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (length &gt; 0)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;            &lt;/span&gt;{ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;span style="color: blue;"&gt;fixed&lt;/span&gt; (&lt;span style="color: blue;"&gt;char&lt;/span&gt;* src = &amp;amp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.m_firstChar)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;span style="color: blue;"&gt;fixed&lt;/span&gt; (&lt;span style="color: blue;"&gt;char&lt;/span&gt;* dest = chars) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                        &lt;/span&gt;wstrcpyPtrAligned(dest, src, length); &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; chars; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;        &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;AMD Specific code!&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: blue;"&gt;#if&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt; AMD64 &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                &lt;/span&gt;// for AMD64 bit platform we unroll by 12 and&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                &lt;/span&gt;// check 3 qword at a time. This is less code &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;span style=""&gt;          &lt;/span&gt;// than the 32 bit case and is shorter&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                &lt;/span&gt;// pathlength&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                &lt;/span&gt;while (length &gt;= 12) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;if (*(long*)a&lt;span style=""&gt;     &lt;/span&gt;!= *(long*)b) break; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;if (*(long*)(a+4) != *(long*)(b+4)) break; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;if (*(long*)(a+8) != *(long*)(b+8)) break;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;a += 12; b += 12; length -= 12; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: gray;"&gt;&lt;span style=""&gt;                &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: blue;"&gt;#else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;span style="color: blue;"&gt;while&lt;/span&gt; (length &gt;= 10)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                &lt;/span&gt;{ &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (*(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)a != *(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)b) &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (*(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)(a+2) != *(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)(b+2)) &lt;span style="color: blue;"&gt;break&lt;/span&gt;; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (*(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)(a+4) != *(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)(b+4)) &lt;span style="color: blue;"&gt;break&lt;/span&gt;; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (*(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)(a+6) != *(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)(b+6)) &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                    &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (*(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)(a+8) != *(&lt;span style="color: blue;"&gt;int&lt;/span&gt;*)(b+8)) &lt;span style="color: blue;"&gt;break&lt;/span&gt;; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;         &lt;/span&gt;&lt;span style=""&gt;           &lt;/span&gt;a += 10; b += 10; length -= 10;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas;"&gt;&lt;span style=""&gt;                &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 12pt; font-family: Consolas; color: blue;"&gt;#endif&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-7762467437445739708?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/7762467437445739708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=7762467437445739708&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7762467437445739708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7762467437445739708'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2008/01/playing-with-net-fcl-symbols-and-source.html' title='Playing with the .NET FCL symbols and source code'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-5367276892471613720</id><published>2007-12-14T12:23:00.000-08:00</published><updated>2007-12-14T12:25:40.396-08:00</updated><title type='text'>DBPro for unit testing - PITA</title><content type='html'>DBPro for unit testing has been a PITA for the following reasons:&lt;br /&gt;&lt;br /&gt;1.       Roll back of initial test state is difficult&lt;br /&gt;&lt;br /&gt;There is no easy way to begin a transaction in the setup and rollback in the tear down without modifying the generated code to use transaction scope.  The setup/tear down methods cannot be used because they run on a separate connection than the test is executed.   This is important for security testing but not all that applicable to the work that we perform.  I don’t think it’s reasonable for the tear down methods to have to reverse all the work of the test setup methods.  Database rollback is the appropriate approach.  Therefore, we have reverted to not using anything but the body of the test.&lt;br /&gt;&lt;br /&gt;2.       Inability to share T-SQL code to setup common state across tests&lt;br /&gt;&lt;br /&gt;This is forcing us write T-SQL setup code that is duplicated across multiple tests or we resort to putting all the testing for a given state into single test.  These tests are then testing a single unit (stored proc, trigger, view, etc.) but are testing multiple conditions.  If the first condition fails, all subsequent tests will not execute.  Also, using state that was modified by a previous test can be very problematic and creates interdependencies between tests.&lt;br /&gt;&lt;br /&gt;3.       Test designer for specifying test conditions is difficult&lt;br /&gt;&lt;br /&gt;The point/click interface for editing many test conditions becomes laborious for large numbers of result sets and columns.    Managing inline T-SQL with RAISERROR statements is easier and allows a script to be reviewed without the designer surface.&lt;br /&gt;&lt;br /&gt;4.       T-SQL test editing designer is not friendly for debugging your test&lt;br /&gt;&lt;br /&gt;Most people find that using SQL Management Studio to write/debug your unit tests is easier.  In order to use SMS you must copy-paste your code in and out of the DBPro test designer.  This process is error prone and laborious.&lt;br /&gt;&lt;br /&gt;5.       DBPro is slow at executing tests&lt;br /&gt;&lt;br /&gt;6.       Data Generation Plans are not useful&lt;br /&gt;&lt;br /&gt;I may be wrong but I don’t find the Data Plan Generation facility very useful for most unit tests.  I see how it would be useful for performance or load testing but these types of tests are much higher level.&lt;br /&gt;&lt;br /&gt;7.       Integrating the DBPro tests into the build process is not easy&lt;br /&gt;&lt;br /&gt;This has not been attempted yet but it does not appear on the surface to be easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-5367276892471613720?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/5367276892471613720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=5367276892471613720&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5367276892471613720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5367276892471613720'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/12/dbpro-for-unit-testing-pita.html' title='DBPro for unit testing - PITA'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-5633426765480444220</id><published>2007-11-30T09:40:00.000-08:00</published><updated>2007-11-30T09:41:53.966-08:00</updated><title type='text'>ObjectBuilder Documentation is incorrect.</title><content type='html'>The following is the default Object Builder Pipeline Stages:&lt;br /&gt;&lt;br /&gt;PreCreation&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.TypeMappingStrategy&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.SingletonStrategy&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.ConstructorReflectionStrategy&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.PropertyReflectionStrategy&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.MethodReflectionStrategy&lt;br /&gt;&lt;br /&gt;Creation&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.CreationStrategy&lt;br /&gt;&lt;br /&gt;Initialization&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.PropertySetterStrategy&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.MethodExecutionStrategy&lt;br /&gt;&lt;br /&gt;PostInitialization&lt;br /&gt;    Microsoft.Practices.ObjectBuilder.BuilderAwareStrategy&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-5633426765480444220?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/5633426765480444220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=5633426765480444220&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5633426765480444220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5633426765480444220'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/11/objectbuilder-documentation-is.html' title='ObjectBuilder Documentation is incorrect.'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-2346753514784280710</id><published>2007-11-25T17:39:00.000-08:00</published><updated>2007-11-25T18:01:48.837-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DPF gadget'/><title type='text'>My Digital Picture Frame project (DPF)</title><content type='html'>&lt;p&gt;I considered purchasing one of these cool toys but had high requirements for it.&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;WiFi&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Support Pictures via RSS with local storage media as fall back.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Remote Administration&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Re-chargeable battery&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Options for wood frames&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Of course the few that actually fit these most were &gt; $500 up to $1000.  There was only one that supported RSS.&lt;br /&gt;&lt;br /&gt;So I used an old Tecra 8100 laptop and set out this long holiday weekend to build my own.  I purchased a frame and shadowbox at Micheal's craft store at a total cost of $22.&lt;br /&gt;&lt;br /&gt;Three hours later I had produced this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lindell.mark/DMarkLindell/photo?authkey=c-slMoxvKFU#5136957495729579234"&gt;&lt;img src="http://lh4.google.com/lindell.mark/R0ojoCc95OI/AAAAAAAAAwc/m8d8OoXiQFM/s400/DSCN0484.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lindell.mark/DMarkLindell/photo?authkey=c-slMoxvKFU#5136957512909448434"&gt;&lt;img src="http://lh4.google.com/lindell.mark/R0ojpCc95PI/AAAAAAAAAwk/ahG5l6YcFrQ/s400/DSCN0486.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The laptop already had windows XP loaded on it so it was just a matter of:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/315231"&gt;Setting windows to automatically login&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Loading the &lt;a href="http://pack.google.com/screensaver.html"&gt;google screen saver&lt;/a&gt; which supports local media as well as RSS feeds.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Loading up &lt;a href="http://www.tightvnc.com/"&gt;TightVNC&lt;/a&gt; for remote administration&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Adding &lt;a href="http://www.nirsoft.net/utils/nircmd.html"&gt;nircmd.exe screensaver&lt;/a&gt; as a startup item.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;When I unplug the laptop and it will run for an hour or so and then go into standby mode.  luckily, (this particular laptop) when you plug it back it it comes right back on and begins charging again.&lt;br /&gt;&lt;br /&gt;I decided I had better leave the back panel of the shadowbox to allow air flow.  The laptop does get a little bit warm.&lt;br /&gt;&lt;br /&gt;I hope this inspires you to build your own DPF!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-2346753514784280710?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/2346753514784280710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=2346753514784280710&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2346753514784280710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2346753514784280710'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/11/my-digital-picture-frame-project-dpf.html' title='My Digital Picture Frame project (DPF)'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-6996631190878383413</id><published>2007-11-21T13:59:00.000-08:00</published><updated>2007-11-21T14:00:02.363-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><title type='text'>Effective Code Reviews... the next steps.</title><content type='html'>I've been giving a lot of thought as to how to move closer toward pair programming within our development organization. Code reviews today are somewhat effective but tend to take a back seat when the pressure is on to make schedules to release code. e.g. The urgent always wins over the important. (Stephen Covey)&lt;br /&gt;&lt;br /&gt;So developers and managers under pressure will delaying code reviews until after the release. That's just a stall tactic as sometimes that occurs and sometimes it doesn't. Either way, it's POINTLESS! The further in time you are away from when the code was written the more chance you have of making a breaking change. (ignoring unit test coverage and unit test quality)&lt;br /&gt;&lt;br /&gt;Most code reviews reveal code that can be improved but is not incorrect. These types of changes should never be made on released code! Sometimes it's even worse in that the code requires design changes that we glossed over during the design phase but we obvious design concerns now that the code is complete.&lt;br /&gt;&lt;br /&gt;Perhaps the best approach to shortening the time between when the code is written to when the code is reviewed is to enforce check-in policies. This would require at least another developer to review code changes before it could be committed to the source code repository.&lt;br /&gt;&lt;br /&gt;I have noticed that TFS contains a field to indicate that the code was reviewed. I imagine a combination of shelving and using this flag with policies in place could begin to move code reviews more into the daily coding work flow rather than waiting until there is no time at the end of the schedule.&lt;br /&gt;&lt;br /&gt;Another possibility to get closer to pair programming is to all developers be requires to spend one hour each day reviewing (hence pairing) on another developers work for the day.&lt;br /&gt;&lt;br /&gt;I just don't think the culture shift to pair programming is going to be something that is ever dropped into an existing organization. We need to find methods to introduce it in small doses in order to succeed.&lt;br /&gt;&lt;br /&gt;As Einstein once said, "Insanity is doing the same thing over and over again and expecting different results."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-6996631190878383413?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/6996631190878383413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=6996631190878383413&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/6996631190878383413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/6996631190878383413'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/11/effective-code-reviews-next-steps.html' title='Effective Code Reviews... the next steps.'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-111977641894907418</id><published>2007-10-28T06:29:00.001-07:00</published><updated>2007-10-28T06:56:01.882-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVP design'/><title type='text'>Presenter communication with the view - events or direct communication.</title><content type='html'>I just started reading &lt;a href="http://codebetter.com/blogs/jeremy.miller/default.aspx"&gt;Jeremy Miller&lt;/a&gt;'s excellent blog post series on &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/07/25/the-build-your-own-cab-series-table-of-contents.aspx"&gt;Build your own CAB series&lt;/a&gt;.  I'm currently up to his 6th post on "&lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/06/04/build-your-own-cab-part-6-view-to-presenter-communication.aspx"&gt;View to Presenter Communication&lt;/a&gt;" and found the discussion of using events vs. callbacks on the presenter very interesting and relevant to my current work.&lt;br /&gt;&lt;br /&gt;Let me share a recent experience...&lt;br /&gt;&lt;br /&gt;I've been using events from my view to communicate with the presenter and ran across a bug  that was related to using event inadvertently.  While working one day, I accidentally  pressed  Ctrl-L and duplicated a line  in my  presenter constructor.  The line I duplicated was a hook of a view event.  This caused my presenter event delegate to be called twice.&lt;br /&gt;&lt;br /&gt;I found out later that my unit tests for the presenter were correctly checking that I wired all the view events but they were not checking that the events were only wired once.  All my integration testing was in debug mode!  Then ran the application in release mode.  BOOM!&lt;br /&gt;&lt;br /&gt;It turns out the events fired in a different order under release mode and caused a null reference exception with a state change in the model.&lt;br /&gt;&lt;br /&gt;If the purpose of events is to allow multiple listeners, when would I ever design the use of a single event to communicate multiple methods in the presenter?&lt;br /&gt;&lt;br /&gt;Perhaps I would but that appears to be more of an edge case and not very good design. It would lead me back towards a design where events don't communicate specifics but something more abstract as the 'SomethingChanged' event.&lt;br /&gt;&lt;br /&gt;Would I ever have multiple presenters for the same view?  Never.&lt;br /&gt;&lt;br /&gt;So is using events a good design principle to create loose coupling?  Yes, but only if you require multiple listeners.  If you don't, are you over engineering the solution?  Perhaps.&lt;br /&gt;&lt;br /&gt;Now when it comes to the model, events are essential!  I have multiple presenters listening to model objects!&lt;br /&gt;&lt;br /&gt;I've also been fighting memory leaks due to the use events on my model objects.  My model has certain objects that can be retrieved from cache and exist for the life of the process.  When my presenter hooks these events, it was causing my presenter to not unload when the view was destroyed.  This cause me to have to disconnect my model events from the model objects when the presenter was disposed.  This also required me to dispose my presenter when the code that first created the presenter fell out of scope.&lt;br /&gt;&lt;br /&gt;On a side note, I found the memory leak using &lt;a href="http://memprofiler.com/?gclid=CM3v_tvcsY8CFRGoGgod3ne7SQ"&gt;SciTech's excellent memory profiler&lt;/a&gt;.    If you are creating WinForm applications, I suggest you download it and try it against your application.  You might be surprised to find you have memory leaks in your applications.   It also has an API so you can build integration or unit tests to check for memory leaks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1 class="CommonTitle"&gt;&lt;a href="http://codebetter.com/blogs/jeremy.miller/default.aspx"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/h1&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-111977641894907418?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/111977641894907418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=111977641894907418&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/111977641894907418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/111977641894907418'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/10/presenter-communication-with-view.html' title='Presenter communication with the view - events or direct communication.'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-2610513562159963420</id><published>2007-10-20T06:56:00.000-07:00</published><updated>2007-10-20T06:58:20.172-07:00</updated><title type='text'>Some more unknown programming quotes</title><content type='html'>"Any sufficiently advanced bug is indistinguishable from a feature."&lt;br /&gt;&lt;br /&gt;"Programming is an art form that fights back."&lt;br /&gt;&lt;br /&gt;"There are two ways to write error-free programs; only the third one works."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-2610513562159963420?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/2610513562159963420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=2610513562159963420&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2610513562159963420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2610513562159963420'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/10/some-more-unknown-programming-quotes.html' title='Some more unknown programming quotes'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-240482990954305006</id><published>2007-10-16T05:55:00.000-07:00</published><updated>2007-11-11T12:11:28.627-08:00</updated><title type='text'>Ioc is very simple and important.</title><content type='html'>I attended the CMAP code camp this past weekend and sat in on Michael Pastore's excellent presentation on Dependency Injection and &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control"&gt;Inversion of Control&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Although I was already familiar with DI/IOC his presentation managed to sharpen my understanding of why Ioc is important.&lt;br /&gt;&lt;br /&gt;I don't have Mike's exact definition of Ioc but in my words:&lt;br /&gt;&lt;br /&gt; "Ioc is where code surrenders control or configuration to external code"&lt;br /&gt;&lt;br /&gt;This is very common in most Frameworks including the the .NET framework.&lt;br /&gt;&lt;br /&gt;Consider the TrueForAll method from List&lt;t&gt; from reflector:&lt;br /&gt;&lt;/t&gt;&lt;table style="margin-bottom: 0px;" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="padding: 4px 5px;" colspan="2" valign="top"&gt;&lt;pre&gt;&lt;span style="color: rgb(16, 0, 160);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(16, 0, 160);"&gt;static&lt;/span&gt; &lt;a title="System.Boolean" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Boolean"&gt;bool&lt;/a&gt; &lt;b&gt;&lt;a class="bold" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Array/TrueForAll%3C%3E%28%3C%21%210%3E%5b%5d,System.Predicate%3C%3C%21%210%3E%3E%29:Boolean"&gt;TrueForAll&lt;/a&gt;&lt;/b&gt;&lt;&lt;b&gt;T&lt;/b&gt;&gt;(&lt;a title="T // Generic Argument"&gt;T&lt;/a&gt;[] array, &lt;a title=""&gt;Predicate&lt;/a&gt;&lt;&lt;a title="T // Generic Argument"&gt;T&lt;/a&gt;&gt; match)&lt;br /&gt;{&lt;br /&gt; &lt;span style="color: rgb(16, 0, 160);"&gt;if&lt;/span&gt; (&lt;a title="T[] array; // Parameter"&gt;array&lt;/a&gt; == &lt;span style="color: rgb(128, 0, 0);"&gt;null&lt;/span&gt;)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(16, 0, 160);"&gt;throw&lt;/span&gt; &lt;span style="color: rgb(16, 0, 160);"&gt;new&lt;/span&gt; &lt;a title="System.ArgumentNullException.ArgumentNullException(string paramName);" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.ArgumentNullException/.ctor%28String%29"&gt;ArgumentNullException&lt;/a&gt;(&lt;span style="color: rgb(128, 0, 0);"&gt;"array"&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt; &lt;span style="color: rgb(16, 0, 160);"&gt;if&lt;/span&gt; (&lt;a title=""&gt; match&lt;/a&gt; == &lt;span style="color: rgb(128, 0, 0);"&gt;null&lt;/span&gt;)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(16, 0, 160);"&gt;throw&lt;/span&gt; &lt;span style="color: rgb(16, 0, 160);"&gt;new&lt;/span&gt; &lt;a title="System.ArgumentNullException.ArgumentNullException(string paramName);" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.ArgumentNullException/.ctor%28String%29"&gt;ArgumentNullException&lt;/a&gt;(&lt;span style="color: rgb(128, 0, 0);"&gt;"match"&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt; &lt;span style="color: rgb(16, 0, 160);"&gt;for&lt;/span&gt; (&lt;a title="System.Int32" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Int32"&gt;int&lt;/a&gt; &lt;b&gt;i&lt;/b&gt; = &lt;span style="color: rgb(128, 0, 0);"&gt;0&lt;/span&gt;; &lt;a title="int i // Local Variable"&gt;i&lt;/a&gt; &lt; &lt;a title="T[] array; // Parameter"&gt;array&lt;/a&gt;.&lt;a title="int System.Array.Length { ... }" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Array/property:Length:Int32"&gt;Length&lt;/a&gt;; &lt;a title="int i // Local Variable"&gt;i&lt;/a&gt;++)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(16, 0, 160);"&gt;if&lt;/span&gt; (!&lt;a title=""&gt;match&lt;/a&gt;(&lt;a title="T[] array; // Parameter"&gt;array&lt;/a&gt;[&lt;a title="int i // Local Variable"&gt;i&lt;/a&gt;]))&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color: rgb(16, 0, 160);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;false&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt; &lt;span style="color: rgb(16, 0, 160);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(128, 0, 0);"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;This method delegates control to the Predicate&lt;t&gt; inverting the control to the caller.  These delegate / callback methods appear all over the .NET framework.&lt;br /&gt;&lt;br /&gt;So in my opinion Ioc is a very important concept that every developer should understand to  effectively implement that &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;Single Responsibility Principle&lt;/a&gt;.&lt;/t&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-240482990954305006?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/240482990954305006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=240482990954305006&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/240482990954305006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/240482990954305006'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/10/ioc-is-very-simple-and-important.html' title='Ioc is very simple and important.'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-7909462822537161373</id><published>2007-10-12T09:00:00.000-07:00</published><updated>2007-10-12T09:02:35.051-07:00</updated><title type='text'>My Seven Year old is out blogging me!</title><content type='html'>&lt;a href="http://alexlindell.blogspot.com/"&gt;My seven year old took up blogging last week.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Has a real fascination with star wars.  (Webkinz is is side hobby)&lt;br /&gt;&lt;br /&gt;It's really pathetic that I can't seem to blog as much as he does!  Yikes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-7909462822537161373?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/7909462822537161373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=7909462822537161373&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7909462822537161373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7909462822537161373'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/10/my-seven-year-old-is-out-blogging-me.html' title='My Seven Year old is out blogging me!'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-6057884898650551755</id><published>2007-09-28T14:40:00.001-07:00</published><updated>2007-09-28T14:42:06.382-07:00</updated><title type='text'>A nice quote relative to current work</title><content type='html'>I'm currently working on a Presenter First design and I stumbled across this quote:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Doing encapsulation right is a commitment not just to abstraction of state, but to eliminate state oriented metaphors from programming." &lt;/span&gt;— Alan Kay, Early History of Smalltalk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-6057884898650551755?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/6057884898650551755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=6057884898650551755&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/6057884898650551755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/6057884898650551755'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/09/nice-quote-relative-to-current-work.html' title='A nice quote relative to current work'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-5641052413828983432</id><published>2007-09-12T08:23:00.000-07:00</published><updated>2007-09-12T08:28:04.514-07:00</updated><title type='text'>Tech gadgets I would like to get for Christmas</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Logitech-961403-0403-Quickcam-Fusion/dp/B000AA2IC8"&gt;&lt;li&gt; Logitech Quickcam Fusion&lt;/li&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Aliph-Jawbone-Shield-Bluetooth-Headset/dp/B000RZFNN2/ref=pd_bbs_sr_1/002-9433398-0430420?ie=UTF8&amp;s=wireless&amp;tag=diabeticbooks&amp;qid=1189408226&amp;sr=8-1"&gt;&lt;br /&gt;&lt;li&gt;Aliph Jawbone Noise Shield Bluetooth Headset&lt;/li&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Guitar-Hero-2-Bundle/dp/B000I4JIK6"&gt;&lt;br /&gt;&lt;li&gt;Guitar Hero II&lt;/li&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-5641052413828983432?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/5641052413828983432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=5641052413828983432&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5641052413828983432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5641052413828983432'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/09/tech-gadgets-i-would-like-to-get-for.html' title='Tech gadgets I would like to get for Christmas'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-118323843199611148</id><published>2007-08-26T08:23:00.000-07:00</published><updated>2007-08-26T08:31:36.134-07:00</updated><title type='text'>WTF Comcast?</title><content type='html'>I recently moved from Comcast Digital TV and Internet Services to FiOS and I couldn't be happier.  My download speeds on the Comcast's internet service was horrific at times.&lt;br /&gt;&lt;br /&gt;I just followed &lt;a href="http://digg.com/world_news/Comcast_disconnects_users_for_using_too_much_bandwidth"&gt;this a digg link&lt;/a&gt; and found &lt;a href="http://consumeraffairs.com/news04/2007/08/comcast_ban.html?imw=Y"&gt;this article&lt;/a&gt; about how Comcast has drawn an invisible line for acceptable bandwidth use.  The interesting thing was I got an advertisement on the page for comcast triple play.  LOL!!!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4hw5ZShkMy8/RtGcbfpGp3I/AAAAAAAAAm8/qjl5x7Yw0vM/s1600-h/Comcast.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer;" src="http://3.bp.blogspot.com/_4hw5ZShkMy8/RtGcbfpGp3I/AAAAAAAAAm8/qjl5x7Yw0vM/s400/Comcast.png" alt="" id="BLOGGER_PHOTO_ID_5103031848951785330" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-118323843199611148?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/118323843199611148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=118323843199611148&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/118323843199611148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/118323843199611148'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/08/wtf-comcast.html' title='WTF Comcast?'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4hw5ZShkMy8/RtGcbfpGp3I/AAAAAAAAAm8/qjl5x7Yw0vM/s72-c/Comcast.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-4829963693812423652</id><published>2007-07-28T09:08:00.000-07:00</published><updated>2008-03-26T05:44:33.262-07:00</updated><title type='text'>FizzBuzz c# 3.0</title><content type='html'>I've been playing with the C# 3.0 Express beta....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(from n in Enumerable.Range(1, 100)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;where (n % 3) == 0 || (n % 2) == 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select n.ToString() + "=" + (((n % 2) == 0) ? "fizz" : "") + (((n % 3) == 0) ? "buzz" : "")).ToList().ForEach(Console.WriteLine);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-4829963693812423652?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/4829963693812423652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=4829963693812423652&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/4829963693812423652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/4829963693812423652'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/07/fizzbuzz-c-30.html' title='FizzBuzz c# 3.0'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-2439093184545927884</id><published>2007-07-28T09:07:00.000-07:00</published><updated>2007-07-28T09:08:37.436-07:00</updated><title type='text'>Complexity</title><content type='html'>&lt;span style="font-style: italic;"&gt;Every problem can be solved by adding another layer of indirection.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Unfortunately, adding another layer usually creates a new problem.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-2439093184545927884?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/2439093184545927884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=2439093184545927884&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2439093184545927884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2439093184545927884'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/07/complexity.html' title='Complexity'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-3194029354337254025</id><published>2007-07-26T05:20:00.000-07:00</published><updated>2007-07-26T05:21:46.538-07:00</updated><title type='text'>The inverse of Moore's Law?</title><content type='html'>&lt;h2&gt;Moore’s Law&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;The power of computers per unit cost doubles every 24 month.&lt;/span&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;Wirth’s law&lt;/h2&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;Software gets slower faster than hardware gets faster.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-3194029354337254025?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/3194029354337254025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=3194029354337254025&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/3194029354337254025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/3194029354337254025'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/07/inverse-of-moores-law.html' title='The inverse of Moore&apos;s Law?'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-4523698431989487825</id><published>2007-07-26T05:19:00.001-07:00</published><updated>2007-07-26T05:19:40.703-07:00</updated><title type='text'>Another good law...</title><content type='html'>&lt;h2&gt;Conway’s Law&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Any piece of software reflects the organizational structure that produced it&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Put another way...&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;If you have four groups working on a compiler, you’ll get a 4-pass compiler.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-4523698431989487825?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/4523698431989487825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=4523698431989487825&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/4523698431989487825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/4523698431989487825'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/07/another-good-law.html' title='Another good law...'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-6592250145615703526</id><published>2007-07-26T05:17:00.000-07:00</published><updated>2007-07-26T05:18:28.476-07:00</updated><title type='text'>A new tip one for my wall</title><content type='html'>&lt;h2&gt;Hofstadter’s Law&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;A task always takes longer than you expect, even when you take into account Hofstadter’s Law.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-6592250145615703526?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/6592250145615703526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=6592250145615703526&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/6592250145615703526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/6592250145615703526'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/07/new-tip-one-for-my-wall.html' title='A new tip one for my wall'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-7419303781401535762</id><published>2007-07-17T17:38:00.001-07:00</published><updated>2007-07-17T17:49:26.558-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>statics are EVIL!!!</title><content type='html'>I made this statement a year or so ago while on a Microsoft lab engagement trip and I got some strange looks from some of the Microsoft folks over lunch.  So here are my thoughts on why I believe use of statics is a bad idea.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;when you use a static you couple to an implementation and not an interface.  You can not change the implementation without changing all dependencies.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;your statics are essentially global.  Use of globals should be discouraged for the reason of intellectual manageability of your code.  Strive to minimize the scope.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;using statics do not follow tenets of Object Orientation.  Fine for your functional programming style but not OO.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;statics leads to all or nothing testing.  Testing a single unit is much harder if not impossible.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;For me it all comes down to testability.  Some folks say that testing should not drive design but as I have said before, designing your code for more than one client leads to a much better and flexable design.&lt;br /&gt;&lt;br /&gt;Of course this crazy talk will eventually lead you to Ioc.  See you when you get there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-7419303781401535762?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/7419303781401535762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=7419303781401535762&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7419303781401535762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7419303781401535762'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/07/statics-are-evil.html' title='statics are EVIL!!!'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-2977811078689320988</id><published>2007-06-27T08:35:00.000-07:00</published><updated>2007-06-27T08:36:40.944-07:00</updated><title type='text'>How to code....</title><content type='html'>Make it correct, make it clear, make it concise, make it fast.  In that order.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-2977811078689320988?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/2977811078689320988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=2977811078689320988&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2977811078689320988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/2977811078689320988'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/06/how-to-code.html' title='How to code....'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-1025169383351738193</id><published>2007-06-12T18:26:00.000-07:00</published><updated>2007-06-12T18:34:03.433-07:00</updated><title type='text'>Presenter First Pattern</title><content type='html'>I've been using MVC patterns for 10+ years and recently have been looking at Fowler's Passive View and Supervising Controller now that he has pulled the MVP pattern.&lt;br /&gt;&lt;br /&gt;But the &lt;a href="http://en.wikipedia.org/wiki/Presenter_First"&gt;Presenter First pattern&lt;/a&gt; really is starting to make a lot of sense when it comes to easy testing and mocking of the model and presenter.  I saw someone describe on a blog as "UI as a service".  I like the idea of the Model and View being totally ignorant of the view.&lt;br /&gt;&lt;br /&gt;I'm still a little fuzzy on the mechanics of wiring MVP triads together at the model levels.&lt;br /&gt;&lt;br /&gt;Grab the &lt;a href="http://atomicobject.com/files/PresenterFirstAgile2006.pdf"&gt;whitepaper&lt;/a&gt; and check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-1025169383351738193?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/1025169383351738193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=1025169383351738193&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1025169383351738193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1025169383351738193'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/06/presenter-first-pattern.html' title='Presenter First Pattern'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-5329517476640945436</id><published>2007-06-06T16:08:00.000-07:00</published><updated>2007-06-08T15:11:17.820-07:00</updated><title type='text'>Getting back to Domain Driven Design</title><content type='html'>&lt;span style="font-family:arial;"&gt;I recently started reading &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=pd_bbs_sr_1/102-3335312-0110502?ie=UTF8&amp;s=books&amp;amp;qid=1181171342&amp;sr=8-1"&gt;Domain Driven Design by Eric Evans&lt;/a&gt;&lt;span style="font-family:arial;"&gt; and am gaining some insights into many of the DDD design practices I have unknowingly been using over the past 5 years.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;It is interesting to see how over time aspects of my companies domain design has been muddled and broken down over time due to the miscommunication of the UBIQUITOUS LANGUAGE we developed in the initial design of the system.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;This quote from the FACTORY/REPOSITORY chapters was quite pungent and applicable to our current environment when I read it:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-style: italic;font-family:georgia;" &gt;"A client needs a practical means of acquiring reference to pre-existing domain objects.  If the infrastructure makes it easy to do so, the developers of the client may add more traversable associations, muddling the model.  On the other hand, they may use queries to pull the exact data they need from the database, or to pull a few specific objects rather than navigating the AGGREGATE roots.  Domain VALUE OBJECTS become mere data containers.  The sheer technical complexity of applying most database access infrastructure quickly swaps the client code, which leads developers to dumb down the domain layer, which makes the model irrelevant."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Also, in discussing the corrosion of the domain model he mentions how making it easy to convert data into objects using mapping layer can lead developers astray.  Developers don't think of objects but just think of data containers.  Is this the debate between DataSets and Business Objects a wolf in sheep's clothing?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-style: italic;font-family:arial;" &gt;"As a client code uses the database directly, developers tempted to bypass model features such as the AGGREGATES, or even object encapsulation, instead directly taking and manipulating the data they need.  More and more domain rules become embedded in query code or simply lost."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I've been heads down in design and coding for so long in an attempt to establish the financial stability.  I have been ineffective in the capacity as a System Architect in this regard.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;My situation is rather humorous because the majority of Architects tend to spend too much time on Architecture related tasks where as I've been spending the majority of the last 5 years on design, coding, and support.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Also, people will fall back on the argument that any added abstraction is going to impact performance.  Pooh to that!  Depends on what you are building.  If you are building a typical business app, design it correctly for God sake!  Unit test it for performance and adjust as required.  A good design is agile to change with TDD.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I look forward to reading more of DDD.  It's stimulating new ideas and re-enforcing ones I already knew to be correct.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-5329517476640945436?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/5329517476640945436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=5329517476640945436&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5329517476640945436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/5329517476640945436'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/06/getting-back-to-domain-driven-design.html' title='Getting back to Domain Driven Design'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-7899966809882299821</id><published>2007-06-03T06:25:00.000-07:00</published><updated>2007-06-03T06:31:10.248-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Esoteric and entertaining programming languages</title><content type='html'>If you ever have some times to waste I encourage you to check out the following programming languages.   They are not really of any use but are a cool mental exercise.&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://compsoc.dur.ac.uk/whitespace/index.php"&gt;Whitespace&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://www.muppetlabs.com/%7Ebreadbox/bf/"&gt;BrainFu*k (or BF)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Whitespace is interesting because you embed secret messages through code within white space of your web pages. &lt;br /&gt;&lt;br /&gt;Sure, go ahead and print out your white space program and destroy the source file.  No one is ever going to figure it out now.&lt;br /&gt;&lt;br /&gt;Apparently I had some time to waste this weekend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-7899966809882299821?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/7899966809882299821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=7899966809882299821&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7899966809882299821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/7899966809882299821'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/06/esoteric-and-entertaining-programming.html' title='Esoteric and entertaining programming languages'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-6989027284041138687</id><published>2007-05-13T07:09:00.000-07:00</published><updated>2007-05-13T07:26:42.969-07:00</updated><title type='text'>My Fizz Buzz interview question</title><content type='html'>So there has been some "buzz" about the &lt;a href="http://www.codinghorror.com/blog/archives/000781.html"&gt;interview question that sets the bar for any entry level programmer&lt;/a&gt;. (forgive the pun)&lt;br /&gt;&lt;br /&gt;I have my own entry level programming problem I have developed over many years of interviewing:&lt;br /&gt;&lt;br /&gt;    "&lt;span style="font-style: italic;"&gt;Write the code in your favorite language (or pseudo-code) to remove all items from a list that a contained in another list.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;I give them concrete lists so we can talk about the implementation:&lt;br /&gt;&lt;br /&gt;    List 1 =  A, B, C, D, E, F &lt;br /&gt;    List 2 = C, E, F&lt;br /&gt;&lt;br /&gt;Sounds easy enough but candidates almost always start with a loop over List 1 with an inner loop or lookup in list 2.  Then, any normal programmer realizes the errors in their ways and say's oh crap, I'll be screwing up my iterator or index over list 1 if I modify list 1.  It's interesting to watch as they try to come to a solutions.  You would be surprised how many can not make a leap to a solution.&lt;br /&gt;&lt;br /&gt;I get statements such as "Oh, man I've done this before" and then they never come to a solution.&lt;br /&gt;&lt;br /&gt;Better candidates always ask questions such as what data structures would they be stored in and how large could the sets become?  Is performance a factor?  Do I memory limitations.  The poor developers never make it to a solution.  This is the true sign of an experienced developer.&lt;br /&gt;&lt;br /&gt;But it's important that they give you a solution that works.  I don't take the intelligent discussions around the problem as confirmation that they are a good developer.  I want developers on my team that are good thinkers as well as can get things done.&lt;br /&gt;&lt;br /&gt;I debated if I should post my version of the "Fizz Buzz" question here but my traffic on my blog is almost non-existent.  I guess it's because either I don't have anything interesting to say or I don't blog enough.&lt;br /&gt;&lt;br /&gt;Whatever....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-6989027284041138687?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/6989027284041138687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=6989027284041138687&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/6989027284041138687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/6989027284041138687'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/05/my-fizz-buzz-interview-question.html' title='My Fizz Buzz interview question'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-165557719704230511</id><published>2007-04-25T07:04:00.000-07:00</published><updated>2007-04-25T07:32:33.836-07:00</updated><title type='text'>Bug-by-by compatibility - semantic compatibility</title><content type='html'>I just finished to a &lt;a href="http://feeds.feedburner.com/%7Er/Hanselminutes/%7E3/103926930/hanselminutes_0056.mp3"&gt;Hanselminutes episode with Raymond Chen&lt;/a&gt; where they discussed a multitude of topics.  One of them was about how the Microsoft App compat team has to deal with what Raymond called "Bug-By-Bug compatibility"&lt;br /&gt;&lt;br /&gt;I realized that what he was really talking about was a form of semantic compatibility.    My best real world example of semantic compatibility is when a component exposes events through it's interface.  Although the interface is immutable the order in which events fire is not.  So a component vendors may release a new version of a component for bug fixes or new features and not modify the interface but modify the order in which it's events fire causing a semantic compatibility problem. &lt;br /&gt;&lt;br /&gt;The software development industry is doing a great disservice by not documenting event ordering through it's standard component documentation.  Yes, we have BeforeActivate and AfterActivate through naming standards but does BeforeActivate come before or after BeforeInitialize?  Got me!  Let me test that.  Oh, ok...  now I know what it does.  Is that what it's going to do on the next version?&lt;br /&gt;&lt;br /&gt;So here's an interesting story I've told many friends:&lt;br /&gt;&lt;br /&gt;Years ago I wrote a security component that handled all user password for encryption and decryption for system.  This component was written in VB6 and used the CryptoAPI calls to encrypt and decrypt the passwords.   As an example for calling the CryptoAPI I used this &lt;a href="http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=5795&amp;lngWId=1"&gt;class from planetsourcecode.com &lt;/a&gt;  I created full unit tests for encrypting and decrypting and everything worked great.  The application shipped and the world is happy. &lt;br /&gt;&lt;br /&gt;Now, we are migrating the system to .NET and one of the first components I needed to migrate was the security component.  Unfortunately .NET 1.1 did not have native managed support for the algorithm I selected (CALG_RC4).  No problem, I'll just implement the PInvoke calls as I did in the VB6 code. &lt;br /&gt;&lt;br /&gt;I did that.  Wrote unit tests and for some reason I was unable to decrypt passwords encrypted with the VB6 component.  Passwords encrypted with the .NET component decrypted fine.  Hmmmm, very odd.  It turns out that the one of the hash parameters in the VB6 Crypto API declarations was defined "as String" when it should have been defined "as Any".  This caused the hash to go through a unicode string conversion where the .NET code was not. &lt;br /&gt;&lt;br /&gt;So now we have to inject a bug in our .NET code to maintain compatibility with a bug in our VB6 code. ARRRRRRGGGG!&lt;br /&gt;&lt;br /&gt;A few of lessons here:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Just because it passes all your tests does not mean it is correct.&lt;/li&gt;&lt;li&gt;Don't use code directly off the internet (even API declarations)&lt;/li&gt;&lt;li&gt;Once software is in the field you must maintain bug-for-bug compatibility and semantic compatibility.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-165557719704230511?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/165557719704230511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=165557719704230511&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/165557719704230511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/165557719704230511'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/04/bug-by-by-compatibility-semantic.html' title='Bug-by-by compatibility - semantic compatibility'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-1300445372136229211</id><published>2007-04-20T12:10:00.000-07:00</published><updated>2007-04-20T12:25:05.944-07:00</updated><title type='text'>ORM and when query plans go bad.</title><content type='html'>I've been listening to quite a few discussions on the debates between the use or ORMs and two topics that never seem to get discussed is:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;How can dynamic SQL ORMs deal with the fact that your database server (a.k.a SQL Server) can decide at any point that it is going to use an alternate query plan.  A simple index HINT on the join syntax can fix this problem but how is my ORM going to handle this?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How come there is no talk about scaling these ORMs.  No, I'm not talking about scaling the database.  A layer between the ORM and the database execution.&lt;/li&gt;&lt;/ol&gt;Point #1 can be explained away in a theoretical world where all the correct load testing scenarios are covered  during your quality assurance phase.  BUT THAT NEVER HAPPENS.&lt;br /&gt;&lt;br /&gt;Point #2 I've also een starting to pay more attention to the Microsoft Entities Framework.  .NET Rocks did a show with one of the product managers for ADO.vNext (Dan someone) and he talked about the Entities framework in depth.  He talked about how they are getting pressure from the community that they are not supporting all the functionality that the ORMs (such as NHibernate) are providing.  His response was that MS has a longer term strategy with the EF to support replication and reporting (essentially a unified model) against the EF.  He continued to say we would have to put up with the limited capabilities to reach this higher level.&lt;br /&gt;&lt;br /&gt;The interesting part was that he continued on to talk about how he worked on the WinFS team before it was killed.  He talked about the reason it was killed was because they were unable to deliver all the functionality on one release and how no one (especially mgmt) could not decide on the base feature set.  It was rather ironic that he was mentioning this on the heals of talking about how the EF was a stepping stone.&lt;br /&gt;&lt;br /&gt;In my opinion the EF will certainly be a wait and see technology.  CSLA .NET is still my choice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-1300445372136229211?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/1300445372136229211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=1300445372136229211&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1300445372136229211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1300445372136229211'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/04/orm-and-when-query-plans-go-bad.html' title='ORM and when query plans go bad.'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-948075440506115200</id><published>2007-04-20T12:07:00.000-07:00</published><updated>2007-04-20T12:10:31.794-07:00</updated><title type='text'>Searching for .NET solutions</title><content type='html'>Dan Appleman did a talk at VSLive Orlando about "Discoverability".  I was not able to attend the session but my co-worker did. &lt;br /&gt;&lt;br /&gt;I also heard Dan talk on the internet talk show .Net Rocks regarding the same topic.  One interesting link that was served up was a site that uses a google custom search.  Dan has set one up for only search the top .NET sites.  The site is &lt;a href="http://www.searchdotnet.com/"&gt;www.searchdotnet.com &lt;/a&gt;and currently searchs about 300 sites.  Some of those sites are the MSDN blog sites so the actual depth of the content being searched is much greater than the 300 sites.&lt;br /&gt;&lt;br /&gt;So far it has been returning much more relative results than straight google searchs on .NET topics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-948075440506115200?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/948075440506115200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=948075440506115200&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/948075440506115200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/948075440506115200'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/04/searching-for-net-solutions.html' title='Searching for .NET solutions'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-8023954024523211728</id><published>2007-04-20T12:05:00.000-07:00</published><updated>2007-04-20T12:06:13.312-07:00</updated><title type='text'></title><content type='html'>I've been looking for a private simple desktop VPN solution for a while and I finally found it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.hamachi.cc/"&gt;http://www.hamachi.cc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Encrypted over HTTP... NICE!  No more opening RTP ports in my firewall.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-8023954024523211728?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/8023954024523211728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=8023954024523211728&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8023954024523211728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8023954024523211728'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/04/ive-been-looking-for-private-simple.html' title=''/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-8605279000960152897</id><published>2007-04-19T11:19:00.000-07:00</published><updated>2007-04-19T11:20:02.998-07:00</updated><title type='text'>Javascript prototype function for formatting dates objects.</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Some useful javascript for formatting date objects:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;String.prototype.zf = function(l) { return '0'.string(l - this.length) + this; }&lt;br /&gt;String.prototype.string = function(l) { var s = '', i = 0; while (i++ &lt; l) { s += this; } return s; }&lt;br /&gt;Number.prototype.zf = function(l) { return this.toString().zf(l); }&lt;br /&gt;&lt;br /&gt;Date.prototype.format = function(f)&lt;br /&gt;{&lt;br /&gt;    if (!this.valueOf())&lt;br /&gt;        return ' ';&lt;br /&gt;&lt;br /&gt;    var d = this;&lt;br /&gt;&lt;br /&gt;    return f.replace(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/gi,&lt;br /&gt;        function($1)&lt;br /&gt;        {&lt;br /&gt;            switch ($1.toLowerCase())&lt;br /&gt;            {&lt;br /&gt;            case 'yyyy': return d.getFullYear();&lt;br /&gt;            case 'mmmm': return gsMonthNames[d.getMonth()];&lt;br /&gt;            case 'mmm':  return gsMonthNames[d.getMonth()].substr(0, 3);&lt;br /&gt;            case 'mm':   return (d.getMonth() + 1).zf(2);&lt;br /&gt;            case 'dddd': return gsDayNames[d.getDay()];&lt;br /&gt;            case 'ddd':  return gsDayNames[d.getDay()].substr(0, 3);&lt;br /&gt;            case 'dd':   return d.getDate().zf(2);&lt;br /&gt;            case 'hh':   return ((h = d.getHours() % 12) ? h : 12).zf(2);&lt;br /&gt;            case 'nn':   return d.getMinutes().zf(2);&lt;br /&gt;            case 'ss':   return d.getSeconds().zf(2);&lt;br /&gt;            case 'a/p':  return d.getHours() &lt; 12 ? 'a' : 'p';&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    );&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-8605279000960152897?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/8605279000960152897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=8605279000960152897&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8605279000960152897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/8605279000960152897'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/04/javascript-prototype-function-for.html' title='Javascript prototype function for formatting dates objects.'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7113888591536837437.post-1484307793492302365</id><published>2007-02-01T10:56:00.000-08:00</published><updated>2007-02-01T10:57:18.935-08:00</updated><title type='text'>A new Vista security issue?</title><content type='html'>&lt;a href="http://www.microsoft-watch.com/content/security/vista_please_dont_listen_to_me.html?kc=MWRSS02129TX1K0000535"&gt;A new Vista security issue?&lt;/a&gt; I don't think so!!!  This is the exact reason I can't stand rags like e-Week. &lt;br /&gt;&lt;br /&gt;Grrrrr...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7113888591536837437-1484307793492302365?l=codeliability.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeliability.blogspot.com/feeds/1484307793492302365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7113888591536837437&amp;postID=1484307793492302365&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1484307793492302365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7113888591536837437/posts/default/1484307793492302365'/><link rel='alternate' type='text/html' href='http://codeliability.blogspot.com/2007/02/new-vista-security-issue.html' title='A new Vista security issue?'/><author><name>D. Mark Lindell</name><uri>http://www.blogger.com/profile/06102973229672434002</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
