<?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-1603231381798309901</id><updated>2011-12-23T06:49:25.225-06:00</updated><category term='CodeMash'/><category term='gripe'/><category term='Visual Studio'/><category term='education'/><category term='Twitter'/><category term='powershell'/><category term='CodeMash2009'/><category term='politics'/><category term='Review'/><category term='quote'/><category term='Software'/><category term='Windows'/><category term='ChicagoCodeCamp'/><category term='itunes'/><category term='open-source'/><category term='Entity Framework'/><category term='.NET'/><category term='1984'/><title type='text'>Sleepless Monkey's Adventures</title><subtitle type='html'>A software developer's trip through the fun journey known as life.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-8075172412141225321</id><published>2011-12-23T06:49:00.001-06:00</published><updated>2011-12-23T06:49:25.266-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><title type='text'>Well I certainly feel accomplished</title><content type='html'>&lt;p&gt;Another year drawing to a close and looking back I certainly have done quite a bit over the past 12 months.&amp;#160; The one I’m currently proudest of:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Introduction To Artificial Intelligence - Statement of Accomplishment" border="0" alt="Introduction To Artificial Intelligence - Statement of Accomplishment for Steven Evans" src="http://lh4.ggpht.com/-PVP_9lCaK_g/TvR41JJDBnI/AAAAAAAAB_A/ygDqoJhleAk/Introduction-To-AI---SoA7.png?imgmax=800" width="369" height="490" /&gt;&lt;/p&gt;  &lt;p&gt;For those that didn’t know, Stanford University tried something slightly new in online education.&amp;#160; They offered a few classes completely free for anyone and in each they had two tracks, a Basic one where you only had to watch the video lectures &amp;amp; answer quiz questions after the video, and an Advanced one where you also had to do some home each week.&amp;#160; I only tried the Basic track, but that doesn’t mean it was that much easier. There were Q&amp;amp;A discussion boards set up for each individual video, so if you got completely stuck you had a large population of people going through the material at the same time as you to help explain the material.&lt;/p&gt;  &lt;p&gt;The experience was quite interesting in that rather than having an hour (or three) long lecture video, the instructors broke the videos out into 2-8 minutes long videos out on YouTube.&amp;#160; That way also if you struggled to understand a concept you could easily re-watch the specific video again. This was quite handy on several occasions since most of the class involved digging up my knowledge of probability math.&lt;/p&gt;  &lt;p&gt;Overall though the class was quite an experience.&amp;#160; Keep an eye out for future offerings if you’re interested in learning an interesting university-level topic for free.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-8075172412141225321?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/8075172412141225321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=8075172412141225321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8075172412141225321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8075172412141225321'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2011/12/well-i-certainly-feel-accomplished.html' title='Well I certainly feel accomplished'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-PVP_9lCaK_g/TvR41JJDBnI/AAAAAAAAB_A/ygDqoJhleAk/s72-c/Introduction-To-AI---SoA7.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-838239329549280238</id><published>2010-06-07T08:00:00.000-05:00</published><updated>2010-06-07T08:00:08.526-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Are auto-updating applications really that useful?</title><content type='html'>&lt;p&gt;Being &lt;strike&gt;incessantly nagged&lt;/strike&gt; gently reminded by over a dozen applications (and some of their plug-ins) in the past week that there’s updates available, I really have to question whether all these auto-updating (or even just auto-checking for updates) applications are actually worth the hassle.&amp;#160; Sure, when you’re developing an application you’re thinking “My users are never going to bother checking for bug fixes on their own, we’ll have the application call home and check for updates itself.”&amp;#160; That’s all well and good until you realize that you are not the only one in the world developing an application and you’re not the only developer with that thought.&amp;#160; When a single application notifies you that it can be updated, that’s no big deal.&amp;#160; When you have a dozen of them over the course of a week that need to be updated, that becomes a major pain.&amp;#160; Especially for those users that still have &lt;acronym title="User Account Control"&gt;UAC&lt;/acronym&gt; turned on.&amp;#160; Granted I seem to be in the very obscure minority of users who keep UAC on, it’s still an unnecessary step to require admin rights, even when the installer itself is never writing to a protected file/folder/registry setting/etc. that really should never require admin rights.&lt;/p&gt;  &lt;p&gt;I think the biggest issue with installers seem to be that those that install the application in the &lt;strike&gt;Add/Remove Programs&lt;/strike&gt; Programs and Features are actually creating a registry value in HKEY_LOCAL_MACHINE.&amp;#160; If only a purely user-based installer existed.&amp;#160; Or better yet, Programs and Features listed user-based installs as well as machine-based installs.&amp;#160; I think ClickOnce can support user-based installs, but not everybody wants to use ClickOnce.&amp;#160; Not even in the .NET environment where it’s part of the toolset.&amp;#160; Most teams seem to turn to easily scriptable options like NSIS or WiX.&amp;#160; In all honesty I haven’t looked at ClickOnce since it first came out with .NET 2.0/VS2005.&amp;#160; I could only find one situation where it actually fit my needs, but outside of that I constantly hit limitations and pain points with it.&amp;#160; Perhaps those have been fixed by now, but I haven’t had a need to write an installer in recent projects.&amp;#160; Outside of the .NET world (especially in open source applications that build installers), NSIS seems to be pretty common.&amp;#160; &lt;em&gt;Ed. Note: usage of tools is purely subjective conjecture based on looking over code bases, noticing the standard UI rendered by the tools, and some the fingerprinting the tools leave out the installer artifacts.&amp;#160; I may be missing other common installer creators (InstallShield is out there, but is quite expensive) or grouping them together incorrectly.&lt;/em&gt;&amp;#160; A problem with this is that different installer types are created.&amp;#160; MSI’s are recognized as installers and thus require admin rights in order to run them.&amp;#160; NSIS outputs executable installers.&amp;#160; Depending at the flags in the script, the admin rights prompt may not occur until it first tries to write to a protected area.&amp;#160; I’ve also seen this hang up the installer or cause it to outright cancel the install.&amp;#160; Talk about a bad user experience.&lt;/p&gt;  &lt;p&gt;I’m not really sure what point I’m looking to make with this post, but it’s a rant I wanted to get off my mind.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-838239329549280238?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/838239329549280238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=838239329549280238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/838239329549280238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/838239329549280238'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/06/are-auto-updating-applications-really.html' title='Are auto-updating applications really that useful?'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-7919484586306075166</id><published>2010-05-31T08:00:00.000-05:00</published><updated>2010-05-31T08:00:10.031-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Don’t use ‘entities’ as the namespace for an Entity Framework model</title><content type='html'>&lt;p&gt;In a .NET 3.5 project I created an Entity Framework model and wanted to consolidate the generated classes into a namespace that seemed appropriate to categorize them.&amp;#160; So I chose the namespace ‘entities’.&amp;#160; Apparently that’s an unwritten no-no and I’m the only one who’s run into it (or at least have no shame in admitting I ran into this error).&amp;#160; The problem is that it causes an “UpdateModelFromDatabaseException” error when trying update the model from the database (like you couldn’t guess from the exception name…).&amp;#160; Outside of that issue everything seemed to be working correctly with the model.&amp;#160; All database calls were working, no compile errors, no odd behaviors in the classes themselves.&amp;#160; It just wouldn’t update the model.&amp;#160; So when googling didn’t turn up any answers, I turned to &lt;a href="http://stackoverflow.com/questions/2449889/updatemodelfromdatabaseexception-when-trying-to-add-a-table-to-entity-framework-m" target="_blank"&gt;StackOverflow&lt;/a&gt;.&amp;#160; Like a number of my questions, it wound up not getting any answers (and very few views at that).&amp;#160; Thus it came time to start experimenting by repeating the steps in creating the model but changing small things.&amp;#160; After a few hours it wound up being the namespace name.&lt;/p&gt;  &lt;p&gt;So like title says: &lt;strong&gt;&lt;em&gt;Don’t use ‘entities’ as the namespace for an Entity Framework model&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-7919484586306075166?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/7919484586306075166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=7919484586306075166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/7919484586306075166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/7919484586306075166'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/05/dont-use-entities-as-namespace-for.html' title='Don’t use ‘entities’ as the namespace for an Entity Framework model'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-4381485657443218165</id><published>2010-02-08T08:00:00.000-06:00</published><updated>2010-02-08T08:00:06.221-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gripe'/><title type='text'>Make Sure Your Open Source Project Actually Builds!</title><content type='html'>&lt;p&gt;I suppose this post could apply to any project, but since I like to dig into open source projects quite a bit that’s what I’m focusing on.&lt;/p&gt;  &lt;p&gt;How hard is it to bring a new developer into your open source project?&amp;#160; Outside of the core IDE of choice for the language, what else needs to be installed on the developer’s machine in order to get it to build?&amp;#160; If you have to tell them to install a few versions of .NET, Ruby, Python, and then a slew of other tools, why not just put it in a README file at the root of the project instead of relaying that information to every developer who has to ask you directly?&amp;#160; If I can pull the source down from the repository of choice, I should be able to get up and running with the code base without having to spend even an hour trying to figure out how to build the project.&amp;#160; If it’s a .NET application, I would expect to open it up in Visual Studio and press Cntl+Shift+B and have a successful build.&amp;#160; Even better is if there’s a build script and some batch/shell script that will run the build.&amp;#160; That way the developer can find out if the way they’re compiling the code is the same as what’s available as an official release.&amp;#160; There’s been a number of projects that work 99.999% of the way I need it to, but there’s one small feature I need to add or comment out and recompile the rest to fit my need.&amp;#160; If your official releases are strictly Visual Studio builds, then mention it.&amp;#160; Yes that means *gasp* documenting your project.&amp;#160; Heaven forbid.&amp;#160; A little 1-2 line README file that’s not likely to get out of sync of the code isn’t going to kill you.&lt;/p&gt;  &lt;p&gt;Even worse is if a 3rd party library needs to be installed for the code to compile correctly.&amp;#160; Include it in the repository if possible (when licensing doesn’t prevent it), or at least have a README or REQUIREMENTS type document that lets me (as a new developer project) know what else I need to install.&amp;#160; Say you’re developing a WPF project, and you’re using a Codeplex project full of controls, then let me know to install it.&amp;#160; Don’t let there be a missing reference in Visual Studio for me to spend extra time figuring out what it’s supposed to be.&lt;/p&gt;  &lt;p&gt;All in all, I suppose this really boils down to asking “Can you build your project on another machine in one simple step?” or “Does your project pass #2 on &lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html" target="_blank"&gt;The Joel Test&lt;/a&gt;?”&amp;#160; It really shouldn’t be that hard?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-4381485657443218165?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/4381485657443218165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=4381485657443218165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/4381485657443218165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/4381485657443218165'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/02/make-sure-your-open-source-project.html' title='Make Sure Your Open Source Project Actually Builds!'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-4486427647723054236</id><published>2010-02-01T08:00:00.000-06:00</published><updated>2010-02-01T08:00:06.396-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open-source'/><title type='text'>If you’re going to start a new OSS project, do your research first</title><content type='html'>&lt;p&gt;I’m a fan of open source software the same as many developers.&amp;#160; So much so that I like to subscribe to the RSS feeds from sites like &lt;a href="http://www.codeplex.com/rss.ashx" target="_blank"&gt;Codeplex&lt;/a&gt; to keep an eye out for new and interesting projects.&amp;#160; I have to admit that there’s some cool projects that look like they could have some real potential, but the I’m noticing that the projects fall into one of the following categories (ordered by perceived number of projects)&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;So-and-so’s utility class(es)&lt;/li&gt;    &lt;li&gt;So-and-so’s school project.&amp;#160; This includes user group projects.&lt;/li&gt;    &lt;li&gt;Control(s) for a popular product (typically Sharepoint)&lt;/li&gt;    &lt;li&gt;Contrib projects to existing projects (both open &amp;amp; closed source)&lt;/li&gt;    &lt;li&gt;Port of another project (typically projects that are in another language)&lt;/li&gt;    &lt;li&gt;Proof-of-concept project&lt;/li&gt;    &lt;li&gt;Other minutia that generally has only one-off type usage.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The reason for this post is the prevalence of projects that fall into number 5 above.&amp;#160; I’ve come across a number of projects that are ports of Rail’s Migrations into the .NET space.&amp;#160; The problem as I see it is that a couple of them were started up because the originator of the project wasn’t even aware that other projects existed.&amp;#160; I’m all in favor of the competition is best for the consumer approach, but having multiple projects that do nearly the exact same thing because neither was aware of the other just creates lots of rework for no good reason.&lt;/p&gt;  &lt;p&gt;So if you’re thinking of starting up an open source project, please spend at least 10 minutes flexing your Google-fu muscles to see if a project already exists that can fit your needs.&amp;#160; If there are similar projects, but lacking some key features, at least contact the developers behind the project to see if it’s on their list of features to implement.&amp;#160; If they’re not going to implement them, then either code the feature up and contribute it back to the project yourself, or fork the project and go down your own path with it.&amp;#160; If you can’t find a project that’s going to fit your need, then by all means do your own project, but at least acknowledge similar projects and explain how yours is different.&amp;#160; Not only does this help show that you’re intentionally going down a path that’s probably been trodden before, but it also establishes who your &lt;a href="http://www.codinghorror.com/blog/archives/001246.html" target="_blank"&gt;arch-enemy&lt;/a&gt; projects are going to be.&amp;#160; Don’t be afraid to have an arch-enemy project as it gives a great frame of reference in what you’re looking to achieve with the project.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-4486427647723054236?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/4486427647723054236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=4486427647723054236' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/4486427647723054236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/4486427647723054236'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/02/if-youre-going-to-start-new-oss-project.html' title='If you’re going to start a new OSS project, do your research first'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-9064905673734174588</id><published>2010-01-25T08:00:00.000-06:00</published><updated>2010-01-25T08:00:06.448-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash retrospective</title><content type='html'>&lt;p&gt;So I’ve been posting all these posts about the sessions from Codemash, but that’s not all that I learned during my time there.&amp;#160; So I thought I’d do an “outside the session” retrospective.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;No matter how well the facility prepares, 700+ geeks are going to kill the network.&amp;#160; It may have been the wireless access points, but no matter the case people quickly became used to near dial-up speeds again because of so much traffic. &lt;/li&gt;    &lt;li&gt;I really need to realize I know more about some topics than I think I do.&amp;#160; I went to a couple sessions that looked like they should be higher level and more technical, but ended up focusing on the 150-level type of coding.&lt;/li&gt;    &lt;li&gt;Great presenters follow the “what am I going to tell you, tell you, what did I just tell you” pattern for presenting.&amp;#160; They also are aware of their time constraints and will make sure to allocate enough time for Q&amp;amp;A, or provide a way to contact them for follow up.&lt;/li&gt;    &lt;li&gt;Developers have the odd behavior of always sitting near the back of the room.&amp;#160; Some of it makes sense when the power source is in the back or the projector screen is so huge that it would cause neck problems by sitting up front.&amp;#160; This really makes no sense because of technical issues like the mic not working make it easier to hear the presenter.&amp;#160; (ironically, I’m sitting in the back row while I’m writing this up.) &lt;/li&gt;    &lt;li&gt;A developer conference being held in Sandusky, OH in the middle of January definitely doesn’t sound like a bright idea, but it’s obviously a great conference.&amp;#160; It sold out in about a month.&amp;#160; Maybe it’s the waterpark that’s attached to the hotel.&amp;#160; Speaking of which… &lt;/li&gt;    &lt;li&gt;I now understand the draw of sitting in a hot tub outside in freezing cold weather.&amp;#160; The hot tubs in the Kalahari waterpark all have an outside area and the feeling of sitting out there was amazing.&amp;#160; That &lt;em&gt;almost&lt;/em&gt; made me want to skip some extra sessions to head out to them. &lt;/li&gt;    &lt;li&gt;Enter The Haggis is an awesome band.&amp;#160; Edge Case Software paid for the band to come out to the conference and perform at the after party after the first day&amp;#160; of the actual conference (day 2 if you attended the Pre-compiler).&amp;#160; You can never go wrong with a band that has a bagpipe in it.&lt;/li&gt;    &lt;li&gt;Conference sessions are only valuable to you for the first few years of learning a new technology.&amp;#160; Either make use of Open Spaces (provided the conference has it), or network with others.&amp;#160; Open Spaces is great because if there’s something you want to talk about, get it posted on the open space board.&amp;#160; Maybe a time slot has no valuable conference session to you, so check out what’s going on with Open Spaces.&amp;#160; You can learn quite a bit more that way, or meet people you normally wouldn’t.&amp;#160; In my case I caught Jeremy Miller giving a presentation on Storyteller and his goal with it.&amp;#160; And for networking, I got several contacts for the Madison .NET User Group to hopefully get some more prizes coming in. &lt;/li&gt;    &lt;li&gt;Speaking of Jeremy Miller, I have to admit I’m now wondering why he’s considered such a big deal.&amp;#160; Sure he has done some great things in the open source field, but his presentation skills are kind of lacking.&amp;#160; He has a lot of great ideas, but he takes forever to present them.&amp;#160; I now understand where his monolithic, thousands of words type of blog posts stem from.&amp;#160; Seriously, you’re talking to technical people who are children of the Internet.&amp;#160; Our attention spans aren’t that long.&amp;#160; Keep it moving and vary it up a bit. &lt;/li&gt;    &lt;li&gt;You can (usually) quickly tell how old some of the pictures are for those that use actual images of themselves on Twitter.&amp;#160; Those that have a somewhat recent picture made it easy to recognize them.&amp;#160; Although it does give you that surreal, “Where the hell do I know you from” feeling when you are sitting right next to the person but can’t place a name with a face.&lt;/li&gt;    &lt;li&gt;Vendors that use twitter to give away prizes at the conference can be very annoying.&amp;#160; In the case of Pillar, they had a retweet message about being entered to win a Kindle.&amp;#160; The problem is that people just kept retweeting it, even beyond when the conference is going on.&amp;#160; Seriously annoying as all it did was spam the #codemash hashtag.&amp;#160; Telerik took a better approach in that only those that attended the session knew what specific @’s and #’s to put in a message to be entered for a prize.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Overall an outstanding conference.&amp;#160; Definitely looking forward to attending next year, although I think I may actually spend more time in sessions on languages I don’t normally use everyday.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-9064905673734174588?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/9064905673734174588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=9064905673734174588' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/9064905673734174588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/9064905673734174588'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-retrospective.html' title='Codemash retrospective'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-4928491653694721624</id><published>2010-01-18T08:00:00.000-06:00</published><updated>2010-01-18T08:00:09.565-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='1984'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='gripe'/><title type='text'>The Problem of Developers and the English Language</title><content type='html'>&lt;p&gt;&lt;em&gt;This is more of a rant on development rather than useful code, but hopefully it helps provoke some thought.&amp;#160; And while I may be targeting the English language in this post, I believe the other languages run into this issue just as much.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The very &lt;a href="http://sleeplessmonkey.blogspot.com/2007/01/quote-from-1984.html" target="_blank"&gt;first post&lt;/a&gt; I made on this blog was a quote from the book &amp;quot;1984&amp;quot; about a pared down language because (a) it surprised me that everybody focuses on the Big Brother aspect of the story rather than the redefined communication, (b) an explicit language where each word can only mean one thing makes a lot of sense, and (c) having words that are meant to be a scale (good, better, best) actually having the same initial word in them (good, plusgood, doubleplusgood) is more in line with the Latin roots of the English language.&amp;#160; Think back to when you were first starting to understand all the oddities that make up the English language.&amp;#160; &lt;em&gt;I before E except after C. To pluralize a word, add an S; except if it ends in these letters, then do this instead.&lt;/em&gt;&amp;#160; There’s a lot of rules to the language that don’t make&amp;#160; a lot of sense.&amp;#160; Although I’m pretty sure Ph.D. bearing learned people can give me the reasoning, the general answer to why it must be done this way is “Because that’s how it’s always been done”.&amp;#160; Outstanding.&amp;#160; Way to think outside the box.&lt;/p&gt;  &lt;p&gt;When you're gathering requirements for a problem, how often do the developers interpret a different meaning than what the end users actually meant?&amp;#160; Like referring to the &amp;quot;home page&amp;quot; of a site as the first page a logged in user sees versus the first page that every user sees.&amp;#160; When the manager is talking about the project, are they talking about the entirety of building the software, the Microsoft Project file, the Visual Studio project file, or some other meaning to them entirely.&amp;#160; It gets even worse when a word is used that has a completely different meaning in another language (which at least one &lt;a href="http://www.mono-project.com"&gt;project&lt;/a&gt; has run into).&amp;#160; Assuming you're programming only in the English language, you have somewhere in the range of &lt;a href="http://en.wikipedia.org/wiki/English_language#Number_of_words_in_English" target="_blank"&gt;475,000 to 600,000 words&lt;/a&gt; to work with.&amp;#160; Not only that, but more words are added to the collegiate dictionaries every year.&amp;#160; And then there are words that are commonly used that don't even exist in a standard dictionary.&amp;#160; So why must we overload the same words over and over again?&amp;#160; Stop being lazy and calling every application that serves out data or hosts another application a &amp;quot;service&amp;quot;.&amp;#160; Give it a unique name.&lt;/p&gt;  &lt;p&gt;Microsoft’s been getting taking flack about overly descriptive (but entirely accurate) developer product names.&amp;#160; Sure it’s easier to simply say “Astoria”, “Geneva”, or “Longhorn”, but unless you’ve heard of them before you have no clue what they’re actually for.&amp;#160; Now hearing “ADO.NET Data Services”, “Claims-based Identity Management”, or “Windows Vista”, you actually have some idea what’s being talked about without having to spend a lot of time digging into what the product actually is (albeit, not a much better idea in the case of Geneva…).&amp;#160; Sure we need to account for being able to talk about things abstractly in some cases, but we should be able to categorize whatever we’re talking about in a similar way that biologists &lt;a href="http://en.wikipedia.org/wiki/Biological_classification"&gt;categorize plants and animals&lt;/a&gt;.&amp;#160; IIS is a type of web server, which is a type of server, which is a type of computer, etc. StructureMap is a type of IoC containter, which is a .NET piece of software, which is a development tool.&amp;#160; Although there’s a lot of overlap when describing software, it seems like there could be an easier way to describe and categorize specific software.&lt;/p&gt;  &lt;p&gt;If you really think about it, each and every word only exists because a group of people have agreed on a general meaning for it.&amp;#160; Words like &amp;quot;blog&amp;quot; and &amp;quot;podcast&amp;quot; were created to sum up new trends in technology that had not been defined at the time.&amp;#160; All it takes is for somebody to come up with a word and others to start using it for it to catch on.&amp;#160; In much the same way &lt;a href="http://www.hanselman.com"&gt;Scott Hanselman&lt;/a&gt; wants to have a word that says “&lt;a href="http://www.hanselman.com/blog/FizzBinTheTechnicalSupportSecretHandshake.aspx"&gt;I’m a technical person and know what I’m talking about&lt;/a&gt;”, I’m think I’ll start using &lt;a href="http://en.wikipedia.org/wiki/Newspeak"&gt;Newspeak&lt;/a&gt; terminology to better describe parts of the software I write.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-4928491653694721624?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/4928491653694721624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=4928491653694721624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/4928491653694721624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/4928491653694721624'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/problem-of-developers-and-english.html' title='The Problem of Developers and the English Language'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-524327513592000902</id><published>2010-01-15T15:29:00.001-06:00</published><updated>2010-01-15T15:29:41.488-06:00</updated><title type='text'>Codemash: Analyzing and Improving ASP.NET Application Performance</title><content type='html'>&lt;p&gt;This was presented by &lt;a href="http://twitter.com/averyj" target="_blank"&gt;James Avery&lt;/a&gt;.&amp;#160; Talks about his experience with all the different sites he’s run, including TekPub.&amp;#160; Overall it wasn’t an extremely informative session, but still picked up a couple things worthwhile.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tricks really aren’t helpful.&amp;#160; &lt;/li&gt;    &lt;li&gt;Don’t pre-optimize.&amp;#160; Build it and then measure it.&lt;/li&gt;    &lt;li&gt;If you don’t want to corrupt the code base, spike it out and then measure it.&lt;/li&gt;    &lt;li&gt;A great process involves Measuring, Modifying, and Measuring again.&amp;#160; This gives you benchmarks to verify.&lt;/li&gt;    &lt;li&gt;Caching is essentially cheating.&lt;/li&gt;    &lt;li&gt;Used a tool called &lt;a href="http://www.pylot.org" target="_blank"&gt;Pylot&lt;/a&gt;.&amp;#160; It’s been written in Python.&amp;#160; XML based test runner to retrieve data.&amp;#160; It’s an extremely simplistic program.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;If you want to know if Pylot does X, the answer is “No”.&amp;#160; Well, mostly.&lt;/li&gt;      &lt;li&gt;Use this when nothing else is running against the system.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Another tool is Ants Profiler (costs money).&amp;#160; Or dotTrace.&amp;#160; Either tool for profiling your code.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Use in conjunction with SQL Profiler to see all the calls.&lt;/li&gt;      &lt;li&gt;The reason to combine with SQL Profiler is for when you find code that’s called a lot of times and is slow, check the SQL calls that are happening repeatedly. &lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Another tool is Fiddler or other network monitoring tools.&lt;/li&gt;    &lt;li&gt;Can make use of DataLoadOptions in Linq-To-SQL and the LoadWith&amp;lt;&amp;gt; method to specify tables that should be eager-loaded.&amp;#160; It won’t always work as Linq-to-SQL sometimes will ignore the recommendation.&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/1603231381798309901-524327513592000902?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/524327513592000902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=524327513592000902' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/524327513592000902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/524327513592000902'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-analyzing-and-improving-aspnet.html' title='Codemash: Analyzing and Improving ASP.NET Application Performance'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-7335153469929498464</id><published>2010-01-15T13:41:00.001-06:00</published><updated>2010-01-15T13:41:25.709-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash: Credit Crunch Code</title><content type='html'>&lt;h3&gt;Paying Back the Technical Debt&lt;/h3&gt;  &lt;p&gt;Presented by &lt;a href="http://www.garyshort.org" target="_blank"&gt;Gary Short&lt;/a&gt;.&amp;#160; The talk was about the shortcuts we have to make when coding and how we can start making up for them.&amp;#160; It’s great learning something from a guy who has a strong Scottish accent.&amp;#160; He is has an outstanding ability to present though.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ward Cunningham was the one who coined the term “technical debt” in 1992&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Came up with the term as he was doing work for a financial institution, so it was very similar to borrowing money.&lt;/li&gt;      &lt;li&gt;With financial debt, it can be like “virtual debt” in that you’re aren’t earning as much money as you could on the money that incurred the debt.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;By incurring the technical debt, you can cause the product to be shipped late (causing a bad brand name), a loss of market share, or loss of excitement to work on the product.&lt;/li&gt;    &lt;li&gt;Just as financial debt isn’t all bad, technical debt isn’t all bad.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;If you need to hit a milestone by a certain time to get the company buy in, it’s fine as long as you pay it back&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;The only safe amount of technical debt in a codebase is 0.&amp;#160; But that’s like saying a codebase has 0 bugs.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Really just need to get it to a point where you don’t notice the issue, even if it’s really there.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;You don’t want to have a logarithmic graph describing the technical debt.&amp;#160; You want a saw tooth graph describing it.&amp;#160; So every couple months take some time to pay it down.&lt;/li&gt;    &lt;li&gt;It’s difficult to calculate the technical debt.&amp;#160; He has a nice, complicated formula that factors in things like employee costs, hardware costs, software licenses and software brand costs.&lt;/li&gt;    &lt;li&gt;Waterfall methodology is an anti-pattern&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Because you’re making all decisions up front, the costs go up as the project goes further.&amp;#160; Since you can’t change, it’s an insane amount of cost.&lt;/li&gt;      &lt;li&gt;Because the subject matter expert has to go through a learning curve (no matter what they know), there’s going to be things that aren’t known up front.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Agile isn’t necessarily the fix to the Waterfall anti-pattern&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Try to incorporate elements of Agile into Waterfall so that the cost isn’t so high&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Not-Invented Here anti-pattern&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Development teams spend time developing software which is not core to the problem they are trying solve.&lt;/li&gt;      &lt;li&gt;Bunch of reasons why &lt;strong&gt;not&lt;/strong&gt; to use a 3rd party product.&lt;/li&gt;      &lt;li&gt;By having a developer working on a component that they find is harder than initially thought and buy the 3rd party product, they’ve incurred major technical debt.&lt;/li&gt;      &lt;li&gt;Buy the components if it truly will save time.&lt;/li&gt;      &lt;li&gt;Use open source if you can.&lt;/li&gt;      &lt;li&gt;If these don’t work, then work your own&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Objects that are in code together stay together anti-pattern&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The classic car example.&amp;#160; Car’s have no behaviors because it’s an inanimate object.&amp;#160; Actors perform behaviors on the object.&lt;/li&gt;      &lt;li&gt;It’s technical debt because it’s a simpler object graph.&amp;#160; We repay it later because of the cost of adding functionality.&lt;/li&gt;      &lt;li&gt;Because adding functionality becomes so hard, it damages the brand.&lt;/li&gt;      &lt;li&gt;It’s not horrible because it allows you to quickly get to market.&amp;#160; Just realize the cost it will incur.&amp;#160; Decide if the debt is worth it.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Sensitive Tests anti-pattern&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;tests that are sensitive to context/interface/database&lt;/li&gt;      &lt;li&gt;make sure tests are as isolated at possible.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;How to spot technical debt&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;technical debt is pretty much invisible.&lt;/li&gt;      &lt;li&gt;Take the astronomer approach to finding technical debt in the way that they find planets that can support human life.&lt;/li&gt;      &lt;li&gt;Using things like the burndown graph to find when issues are coming up.&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;The average productivity should stay pretty consistent&lt;/li&gt;        &lt;li&gt;If it’s going down, then technical debt is accumulating because it’s harder to add features&lt;/li&gt;        &lt;li&gt;the number of tests per feature should be pretty similar.&lt;/li&gt;        &lt;li&gt;if it’s increasing per feature, it’s showing how difficult adding the new features are becoming.&lt;/li&gt;        &lt;li&gt;if the average team morale is decreasing, it is a good sign things are becoming worse and becoming harder.&amp;#160; Measure this by having the team members rate their happiness on a 1-5 scale anonymously.&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Technical debt is a silent killer&lt;/li&gt;    &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?WardExplainsDebtMetaphor"&gt;http://c2.com/cgi/wiki?WardExplainsDebtMetaphor&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.martinfowler.com/bliki/TechnicalDebt.html"&gt;http://www.martinfowler.com/bliki/TechnicalDebt.html&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;On a side note.&amp;#160; Andy Hunt’s keynote over lunch was outstanding.&amp;#160; He talked about the mother of all bugs: the human mind.&amp;#160; It essentially covered all the psychological defects that exist in the human mind.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-7335153469929498464?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/7335153469929498464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=7335153469929498464' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/7335153469929498464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/7335153469929498464'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-credit-crunch-code.html' title='Codemash: Credit Crunch Code'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-7556920770840864319</id><published>2010-01-15T10:45:00.001-06:00</published><updated>2010-01-15T10:45:19.945-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash: 0-60 With Fluent NHibernate</title><content type='html'>&lt;p&gt;This was presented by &lt;a href="http://twitter.com/hudsonakridge" target="_blank"&gt;Hudson Akridge&lt;/a&gt;.&amp;#160; He contributes to Fluent NHibernate.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Automapping&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;the classes need to be public (classes were A and B)&lt;/li&gt;      &lt;li&gt;all properties need to be virtual&lt;/li&gt;      &lt;li&gt;in the configuration       &lt;br /&gt;        &lt;br /&gt;Fluently.Configure()        &lt;br /&gt;.Database(SQLiteConfiguration.Standard.InMemory())        &lt;br /&gt;.Mappings(mapping =&amp;gt; mapping.AutoMappings.Add(AutoMap.AssemblyOf&amp;lt;A&amp;gt;().Where(x=&amp;gt;x.Namespace == “…”))        &lt;br /&gt;.ExportTo(Directory.GetCurrentDirectory()))        &lt;br /&gt;.BuildConfiguration();&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Fluent Mapping&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Needs a parameterless constructor&lt;/li&gt;      &lt;li&gt;Nested Expression Exposition&lt;/li&gt;      &lt;li&gt;Nested Mapping&lt;/li&gt;      &lt;li&gt;Reveal using string based names&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;&lt;a href="http://www.fluentnhibernate.org"&gt;www.fluentnhibernate.org&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://github.com/jagregory/fluent-nhibernate"&gt;http://github.com/jagregory/fluent-nhibernate&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The talk was given to the Chicago ALT.NET group back in July 2009.&amp;#160; You can catch the video here: &lt;a title="http://chicagoalt.net/event/July2009Meeting060withFluentNHibernate" href="http://chicagoalt.net/event/July2009Meeting060withFluentNHibernate"&gt;http://chicagoalt.net/event/July2009Meeting060withFluentNHibernate&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/1603231381798309901-7556920770840864319?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/7556920770840864319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=7556920770840864319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/7556920770840864319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/7556920770840864319'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-0-60-with-fluent-nhibernate.html' title='Codemash: 0-60 With Fluent NHibernate'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-2128144324529961993</id><published>2010-01-15T09:34:00.001-06:00</published><updated>2010-01-15T09:34:42.108-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash: Software Design &amp; Testability</title><content type='html'>&lt;p&gt;This session was presented by &lt;a href="http://codebetter.com/blogs/jeremy.miller/default.aspx" target="_blank"&gt;Jeremy Miller&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Testability &amp;amp; Design is not about mock objects/interfaces.&amp;#160; It’s about finding/removing/preventing defects.&amp;#160; Better partitioning or responsibilities.&amp;#160; Boils down to “Divide &amp;amp; Conquer”.&lt;/li&gt;    &lt;li&gt;“I don’t code, I ship software”&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Take advice from Mary Poppendieck about optimizing the whole of the project, not just the code.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Good Code vs. Bad Code&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The quality of the code has a dramatic impact on how productive the developer can be.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Interesting quote from Michael Feathers: “I don’t care how good you think your design is.&amp;#160; If I can’t walk in and write a test for an arbitrary method of your in five minutes…”&lt;/li&gt;    &lt;li&gt;First causes of good design&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Feedback, Cycle Times, Batch Size&lt;/li&gt;      &lt;li&gt;Orthogonality&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Being able to focus on features independent of other features.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Reversibility&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;The ability to change a decision that’s been made about the code.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Understandability&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Is the code readable and can be followed easily?&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Writing Automated Tests&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Set the system into a known state using known inputs&lt;/li&gt;      &lt;li&gt;It has measurable outcomes&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;State based tests.&amp;#160; I.E. Calling a method to write a file results in a file actually being written.&lt;/li&gt;        &lt;li&gt;Interaction based tests. I.E. Verifying that a method is actually called.&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;What makes tests better&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Repeatable&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Running the same test over and over always has the same result&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Runs Fast&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;If you can’t run the test quickly, you won’t run them that often.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Easy to write&lt;/li&gt;      &lt;li&gt;Easy to understand&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;If you can’t quickly and easily glance at the unit test to verify what the test is aimed at, it’s not easy to understand&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Systems that are hard to test&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;invoicing rules engine&lt;/li&gt;      &lt;li&gt;rules defined in an xml file&lt;/li&gt;      &lt;li&gt;invoice data read from stored procedures&lt;/li&gt;      &lt;li&gt;no seams in the application to break it apart.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;How do I test&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;WorkflowProcessor&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Basic workflow logic&lt;/li&gt;        &lt;li&gt;State persisted to the database&lt;/li&gt;        &lt;li&gt;Sent emails at various times&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Things that are hard to test&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The database&lt;/li&gt;      &lt;li&gt;Active Directory&lt;/li&gt;      &lt;li&gt;Web Services&lt;/li&gt;      &lt;li&gt;Messaging&lt;/li&gt;      &lt;li&gt;Windows Services&lt;/li&gt;      &lt;li&gt;Remoting&lt;/li&gt;      &lt;li&gt;SCF&lt;/li&gt;      &lt;li&gt;WPF/WinForms&lt;/li&gt;      &lt;li&gt;System.Web Namespace&lt;/li&gt;      &lt;li&gt;External System&lt;/li&gt;      &lt;li&gt;Chatty APIs&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;“Isolate the ugly stuff.&amp;#160; That essentially comes down to anything written by Microsoft”&lt;/li&gt;    &lt;li&gt;Test small before testing big&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Verifying that the pieces actually fit together&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Start working on the pieces you know how they work.&lt;/li&gt;        &lt;li&gt;It’s just the small pieces you’re working on, not the entire system as a whole.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Code from the bottom up…&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;start with the small pieces&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;…or from the top down&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Use mock objects to flush out API and how things will fit together.&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Talked about Dependency Injection (with a rather strange bias towards StructureMap. Gee…wonder why…).&lt;/li&gt;    &lt;li&gt;Keep a short tail&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Can you pull it off a shelf and work with it without pulling down/in extra classes.&lt;/li&gt;      &lt;li&gt;Isolate the Churn&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Isolate when there’s a lot of change.&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-2128144324529961993?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/2128144324529961993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=2128144324529961993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2128144324529961993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2128144324529961993'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-software-design-testability.html' title='Codemash: Software Design &amp;amp; Testability'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-6761640833130053614</id><published>2010-01-14T15:29:00.001-06:00</published><updated>2010-01-14T15:29:57.937-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash: T4 Code Generation with Visual Studio 2008</title><content type='html'>&lt;p&gt;Presented by &lt;a href="http://twitter.com/steveandrews" target="_blank"&gt;Steve Andrews&lt;/a&gt;.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;What is it?&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Was originally a DSL for creating code based on your model.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Demo&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Need a template directive       &lt;br /&gt;&amp;lt;#@ template language=”C#v3.5” #&amp;gt;&lt;/li&gt;      &lt;li&gt;Output directive       &lt;br /&gt;&amp;lt;#@ output extension=”csv” #&amp;gt;        &lt;br /&gt;one,two,thee        &lt;br /&gt;four,five,six&lt;/li&gt;      &lt;li&gt;Expression blocks       &lt;br /&gt;&amp;lt;#= DateTime.Now.ToString() #&amp;gt;&lt;/li&gt;      &lt;li&gt;Statement blocks       &lt;br /&gt;&amp;lt;# for (int i = 1; i &amp;lt; 6; i++) { #&amp;gt;        &lt;br /&gt;&amp;lt;# } #&amp;gt;&lt;/li&gt;      &lt;li&gt;Class feature blocks       &lt;br /&gt;&amp;lt;# HelloWorld(); #&amp;gt;        &lt;br /&gt;&amp;lt;#+        &lt;br /&gt;private void HelloWorld()        &lt;br /&gt;{        &lt;br /&gt;}        &lt;br /&gt;#&amp;gt;&lt;/li&gt;      &lt;li&gt;Include directive       &lt;br /&gt;&amp;lt;#@ include file=”_IncludedFile.tt” #&amp;gt;        &lt;br /&gt;        &lt;br /&gt;remove the custom tool for the included file if you don’t want it to run.&lt;/li&gt;      &lt;li&gt;Assembly include directive       &lt;br /&gt;&amp;lt;#@ assembly name=”System.Xml” #&amp;gt;        &lt;br /&gt;&amp;lt;#= new System.Xml.XmlDocument().ToString() #&amp;gt;&lt;/li&gt;      &lt;li&gt;Import directive       &lt;br /&gt;&amp;lt;#@ assembly name=”System.Xml” #&amp;gt;        &lt;br /&gt;&amp;lt;#@ import namespace=”System.Xml” #&amp;gt;        &lt;br /&gt;&amp;lt;#= new XmlDocument().ToString() #&amp;gt;&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;T4 Toolbox&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Can generate multiple outputs per template&lt;/li&gt;      &lt;li&gt;Since the generator has to create a file by default with the same name, use it as a log of the output.&lt;/li&gt;      &lt;li&gt;Can create classes within the template that can extend Generator&lt;/li&gt;      &lt;li&gt;Can extend templates as well.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Custom Directive Processor&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Need to put create some registry keys for the custom directives&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Custom host for running T4.&lt;/li&gt;    &lt;li&gt;Debugging T4&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Registry setting that you have to change from 10 to 2 if using above .NET 3.0&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Have to say that I thought I knew quite a bit about T4, but really a great presentation overall.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-6761640833130053614?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/6761640833130053614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=6761640833130053614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/6761640833130053614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/6761640833130053614'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-t4-code-generation-with-visual.html' title='Codemash: T4 Code Generation with Visual Studio 2008'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-2176924077555373890</id><published>2010-01-14T13:51:00.001-06:00</published><updated>2010-01-14T13:51:09.095-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash: Powershell: Ten things you need to know</title><content type='html'>&lt;p&gt;Presented by &lt;a href="http://blogs.technet.com/metthewms" target="_blank"&gt;Matthew Hester&lt;/a&gt; and &lt;a href="http://www.aaronlerch.com" target="_blank"&gt;Aaron Lerch&lt;/a&gt;.&amp;#160; It’s interesting because much of the audience really hasn’t seemed to have even touched Powershell.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;What is it?&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Rich script environment&lt;/li&gt;      &lt;li&gt;Bulk operations&lt;/li&gt;      &lt;li&gt;Interactive environment&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;The Active Directory Administrative Center that ships with Windows 2008 R2 is all Powershell driven.&lt;/li&gt;    &lt;li&gt;When to use it&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;consistent, repeatable tasks&lt;/li&gt;      &lt;li&gt;talking with Active Directory, registry, WMI and others natively&lt;/li&gt;      &lt;li&gt;to create aliases to create commands that you’re used to.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Make use of commandlet (a verb-noun syntax) and the parameters (the name-argument pair).&lt;/li&gt;    &lt;li&gt;Making use of the pipeline&lt;/li&gt;    &lt;li&gt;Talked about the Powershell ISE that comes with version 2.&lt;/li&gt;    &lt;li&gt;Useful commands:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;get-module –listavailable&lt;/li&gt;      &lt;li&gt;help “command” –examples/-detailed/-full&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Providers&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Get-PSProvider&lt;/li&gt;      &lt;li&gt;Custom&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;DriveCmdletProvider&lt;/li&gt;        &lt;li&gt;ItemCmdletProvider&lt;/li&gt;        &lt;li&gt;ContainterCmdletProvider&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;The ShouldProcess capability means it handles the –whatif flag&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Use PSCmdlet when creating your customizing commandlets.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;System.Management.Automation is the assembly to reference&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;PSHost for hosting the powershell run space.&lt;/li&gt;    &lt;li&gt;The Windows Troubleshooting Pack is built on Powershell.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;On a side note, this was after lunch, where Hank Janssen gave a keynote on PHP and Microsoft.&amp;#160; Pretty interesting stuff.&amp;#160; It’s great to hear about the efforts that Microsoft does with the open source projects that are out there.&amp;#160; Although he didn’t really plan on some of his demos being that horrible with the crowd killing the internet connection.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-2176924077555373890?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/2176924077555373890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=2176924077555373890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2176924077555373890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2176924077555373890'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-powershell-ten-things-you-need.html' title='Codemash: Powershell: Ten things you need to know'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-5066528546433491327</id><published>2010-01-14T10:45:00.001-06:00</published><updated>2010-01-14T10:45:59.393-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash: Building maintainable ASP.NET MVC</title><content type='html'>&lt;p&gt;This was presented by &lt;a href="http://twitter.com/PhatBoyG"&gt;Chris Patterson&lt;/a&gt; from RelayHealth.&amp;#160; He’s an active open source developer, so that’s probably why his name sounds so familiar to me.&amp;#160; He’s also a Visual C# MVP.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Since much of the audience are not ASP.NET MVC programmers, he covered a lot of the basics.&lt;/li&gt;    &lt;li&gt;Talked about some of the MvcContrib/ASP.NET MVC 2 features.&lt;/li&gt;    &lt;li&gt;Controller should be the only thing that talks to the Domain Model.&amp;#160; The Controller, View Model, and View all have an idea of each other.&lt;/li&gt;    &lt;li&gt;View Models should only have data.&amp;#160; No behaviors.&amp;#160; It should be a flattened structure.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Overall the presentation was aimed at those who’ve never looked at the framework before.&amp;#160; Maybe if I hadn’t already done a project using this technology before it would be worthwhile to me.&amp;#160; But overall it wasn’t quite what the session abstract stated.&amp;#160; So that means it’s time to kick in the law of two feet and go find a session that I’ll actually learn something.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-5066528546433491327?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/5066528546433491327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=5066528546433491327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5066528546433491327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5066528546433491327'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-building-maintainable-aspnet.html' title='Codemash: Building maintainable ASP.NET MVC'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-482896193775944874</id><published>2010-01-14T09:51:00.001-06:00</published><updated>2010-01-14T09:51:03.760-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash: Agile Iteration 0</title><content type='html'>&lt;p&gt;This was presented by &lt;a href="http://twitter.com/kensipe"&gt;Ken Sipe&lt;/a&gt; from &lt;a href="http://www.perficient.com"&gt;Perficient&lt;/a&gt;.&amp;#160; It basically covered how to get Agile accepted into a business, starting out with the first iteration and what it all includes.&amp;#160; Overall the presentation was great, but he was a little scatter brained in actually presenting it.&amp;#160; It didn’t flow very well as it felt he was jumping back and forth quite a bit.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Talked about waterfall development being the standard way companies generally tackle development.&lt;/li&gt;    &lt;li&gt;Iterative process’s biggest usefulness is the feedback.&amp;#160; But companies don’t like it because they can’t plan long, long-term goals of when things will be delivered.&amp;#160; Since priorities can be shifted around, knowing what will be delivered is nearly impossible.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Talked about college experience when finding out you have a paper due in 3-6 months.&amp;#160; Most people finish it the night before/week before/weekend before.&amp;#160; When the instructor requires certain aspects of it at given points throughout the course, it’s an iterative approach.&amp;#160; You get feedback from the instructor earlier and can make the paper that much better.&lt;/li&gt;      &lt;li&gt;Similar approach with the NASA Apollo missions.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Finding the iterative length is really about what feels right for the company.&amp;#160; Longer iterations means less feedback.&amp;#160; Shorter iterations means not being able to get things done.&lt;/li&gt;    &lt;li&gt;Iterative delivery helps develops trust between the development staff and the business.&amp;#160; Building the trust is essentially actually doing what you say you’re going to do.&lt;/li&gt;    &lt;li&gt;Agile is not evolutionary, no documentation, no architecture, cowboy development.&lt;/li&gt;    &lt;li&gt;Pair programming is extreme of code reviews.&lt;/li&gt;    &lt;li&gt;Programming engages the logical side of the brain.&amp;#160; Taking a break causes it to disengage and lets the creative side tackle the problem.&amp;#160; Pair programming allows a full brain to tackle a problem.&lt;/li&gt;    &lt;li&gt;Pair programming is actually about 1.5 develops worth of work, not just 1.&lt;/li&gt;    &lt;li&gt;“Bus Number” – the number of people on the project that need to be hit by a bus before the project can’t continue forward because expertise is gone.&lt;/li&gt;    &lt;li&gt;Agile at the micro view:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Initial opening meeting&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;*everybody* is there to make sure everybody’s on the same vision of the project.&lt;/li&gt;        &lt;li&gt;Agree on acceptance criteria&lt;/li&gt;        &lt;li&gt;Agree on the priority&lt;/li&gt;        &lt;li&gt;Break down into groups to figure out what some resources already exist or come up with estimates&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Opening meeting&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Should be attended by Developers, DBA, User/BA, Architects, QA&lt;/li&gt;        &lt;li&gt;Using a BA or having limited contact with the user, generally a failing point is not meeting the acceptance criteria.&lt;/li&gt;        &lt;li&gt;Assign tasks.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Standup Meetings&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Can be sabotages by the Project Manager because they’re trying to get and provide too much information.&lt;/li&gt;        &lt;li&gt;Only pigs are allowed to talk.&amp;#160; Chickens don’t talk.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Closing meeting&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;What was accepted by the user?&lt;/li&gt;        &lt;li&gt;What is the velocity?&lt;/li&gt;        &lt;li&gt;What architecturally significant&amp;#160; has changed?&lt;/li&gt;        &lt;li&gt;It is a quality check of general &lt;/li&gt;        &lt;li&gt;Were the estimates accurate?&lt;/li&gt;        &lt;li&gt;Is the team performing as expected?&lt;/li&gt;        &lt;li&gt;Is QA catching bugs that weren’t functional bugs?&lt;/li&gt;        &lt;li&gt;Are functional bugs making to QA? Are the unit tests not being that effective?&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Agile at the macro view:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Starting is the hardest part.&amp;#160; Having a mentor who’s been through it is the greatest point&lt;/li&gt;      &lt;li&gt;Pre-iteration 0&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Project inception&lt;/li&gt;        &lt;li&gt;Stake holder level&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Business opportunity/concerns&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;Collection of stories&lt;/li&gt;        &lt;li&gt;Estimating ROI and project justifications&lt;/li&gt;        &lt;li&gt;Building up team/resources&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;co-ownership of code&lt;/li&gt;          &lt;li&gt;prepared to steal tasks&lt;/li&gt;          &lt;li&gt;pairing capable&lt;/li&gt;          &lt;li&gt;expected velocity.&amp;#160; Adjust story alignment and release plan.&lt;/li&gt;          &lt;li&gt;Team phases:&lt;/li&gt;          &lt;ul&gt;           &lt;li&gt;forming&lt;/li&gt;            &lt;ul&gt;             &lt;li&gt;excitement/optimism&lt;/li&gt;           &lt;/ul&gt;            &lt;li&gt;storming&lt;/li&gt;            &lt;ul&gt;             &lt;li&gt;resisting task, disunity&lt;/li&gt;           &lt;/ul&gt;            &lt;li&gt;norming&lt;/li&gt;            &lt;ul&gt;             &lt;li&gt;constructive criticism&lt;/li&gt;           &lt;/ul&gt;            &lt;li&gt;performing&lt;/li&gt;            &lt;ul&gt;             &lt;li&gt;self directed&lt;/li&gt;           &lt;/ul&gt;         &lt;/ul&gt;       &lt;/ul&gt;        &lt;li&gt;iteration sizing&lt;/li&gt;        &lt;li&gt;initial list of risks&lt;/li&gt;        &lt;li&gt;release plan&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;iteration 0&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;2 store development approaches&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Majority of the stories upfront with the major understanding that you will likely discover more&lt;/li&gt;          &lt;li&gt;sone stories upfront to prime with the intent that you’ll have a trailing analyst&lt;/li&gt;          &lt;li&gt;Either approach needs an Analyst, BA or PM to keep feeding stories into the next iteration.&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;Automate as many things as possible.&amp;#160; Not just in software, but bringing on new people to the team.&amp;#160; Take out as much manual work to a simple button click/one command line.&lt;/li&gt;        &lt;li&gt;Perform some spikes to learn about the new tools for the project&lt;/li&gt;        &lt;li&gt;Build system/continuous integration is a necessity.&lt;/li&gt;        &lt;li&gt;Set up reporting: burn down charts&lt;/li&gt;        &lt;li&gt;Get a story reposity/wiki going&lt;/li&gt;        &lt;li&gt;The general standards, annotations, and upfront patterns (MVC, presentation model, logging in all aspects…)&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;feature slip are those features that don’t get completed in an iteration, but were meant to be part of it.&amp;#160; Similar to RUP’s time slip.&lt;/li&gt;      &lt;li&gt;If you have humans doing regression testing, you will fail.&lt;/li&gt;      &lt;li&gt;Talked about different options in working with QA in the iterations.&amp;#160; Will post pictures later.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-482896193775944874?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/482896193775944874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=482896193775944874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/482896193775944874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/482896193775944874'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-agile-iteration-0.html' title='Codemash: Agile Iteration 0'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-5814571103852445176</id><published>2010-01-14T08:28:00.001-06:00</published><updated>2010-01-14T08:28:53.424-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash Keynote: Mary Poppendieck – Five Habits of Successful Lean Development</title><content type='html'>&lt;p&gt;What a way to kick off the actual part of the Codemash conference with a keynote from one of the major voices of the Lean development segment.&amp;#160; None other than Mary Poppendieck.&amp;#160; Some of the points of her talk:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Key tenants of Lean:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Eliminate Waste&lt;/li&gt;      &lt;li&gt;Focus on Learning&lt;/li&gt;      &lt;li&gt;Build Quality In&lt;/li&gt;      &lt;li&gt;Defer Commitment&lt;/li&gt;      &lt;li&gt;Deliver Fast&lt;/li&gt;      &lt;li&gt;Respect People&lt;/li&gt;      &lt;li&gt;Keep On Improving&lt;/li&gt;      &lt;li&gt;Optimize the Whole&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Think about the entire process, not just the software&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;The 5 Habits&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Purpose&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Many developers are only doing their job because somebody told them to do it.&amp;#160; Sure coding it fun, but do they really know &lt;em&gt;why&lt;/em&gt; they’re doing it?&lt;/li&gt;        &lt;li&gt;Keep the development staff near the customers to focus on what the end users actually NEED vs keeping them completely separate and all the requirements are tossed over the wall where the developed software is most likely never used.&lt;/li&gt;        &lt;li&gt;Essentially just get the developers involved in the business to better understand what the needs of the business are.&lt;/li&gt;        &lt;li&gt;Possibly have the developers actually do the job that they’re developing the software for to understand the pain points.&amp;#160; e.g. call center software.&lt;/li&gt;        &lt;li&gt;If nobody’s requesting new software features, it means nobody’s using the software.&amp;#160; It doesn’t mean the software is feature complete.&lt;/li&gt;        &lt;li&gt;That’s why open source software seems to be so easily programmed.&amp;#160; Those programming it are those that use it because they need to use it.&amp;#160; They know where the pain points are.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Passion&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Developers like getting passionate about their work.&amp;#160; If they’re not passionate about their purpose at the company, they tend to get passionate about the minutia of development tasks.&lt;/li&gt;        &lt;li&gt;Cost Center Disease – focus on cost reduction instead of delivering value.&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Typical places this is found: IT departments, government organizations, some consulting firms&lt;/li&gt;          &lt;li&gt;The problems include not being able to focus on giving better customer outcomes, no real engagement with customers.&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;Example of a passion – the Launchpad developers back when it was a for-pay development package.&amp;#160; Even though it was for-pay, it was very open source style based.&lt;/li&gt;        &lt;li&gt;Typically if you are very passionate about something (like programming) it’s hard to make a living at it because you enjoy it too much.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Persistence&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;There’s no substitute for being careful and doing really good work.&lt;/li&gt;        &lt;li&gt;The most accomplished people need around ten years of “deliberate practice” before becoming world-class.&amp;#160; This is also known as the ten-year rule.&lt;/li&gt;        &lt;li&gt;Identify a specific skill that needs improvement.&lt;/li&gt;        &lt;li&gt;Devise (or learn from a teacher) a focused exercise – designed to improve the skill.&lt;/li&gt;        &lt;li&gt;Practice repeatedly.&lt;/li&gt;        &lt;li&gt;Obtain immediate feedback – adjust accordingly.&lt;/li&gt;        &lt;li&gt;Focus on pushing the limits – expect repeated failures&lt;/li&gt;        &lt;li&gt;Practice regularly &amp;amp; intensely – perhaps 3 hours a day.&lt;/li&gt;        &lt;li&gt;Open source development is a good way to learn – you generally have a teacher, are challenged, get immediate feedback, and dedication to the project.&lt;/li&gt;        &lt;li&gt;Improvement kata&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Visualize perfection – visualize what the ideal world is&lt;/li&gt;          &lt;li&gt;Have a first hand grasp of the situation – understand how you can improve the situation&lt;/li&gt;          &lt;li&gt;Realize that there’s a huge gap between the first 2 steps – find the minor steps inbetween the 2 points&lt;/li&gt;          &lt;li&gt;understand obstacles that come up between the minor steps and overcome them.&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;Dijkstra’s Challenge&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;If you want more effective programmers, you will discover that they should not waste their time debugging – they should not introduce bugs to start with.&lt;/li&gt;          &lt;li&gt;Find as many bugs early so the “code freeze” phase can be brought down to less than 10% of the release cycle.&amp;#160; Typical is around 30% of the cycle, sometimes 50%.&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;      &lt;li&gt;Pride&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Story about a philosopher asking 3 stone cutters what they were doing.&amp;#160; “I’m cutting stones”, “I’m earning a living”, and “I’m building a cathedral”.&lt;/li&gt;        &lt;li&gt;Move responsibility and decision-making to lowest possible level.&amp;#160; &lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;“If you’re a manager, your job is to be lazy.&amp;#160; Have those lower than you helping drive decisions”&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;Litmus test for those with pride: how do people handle their frustration with their job? Do nothing, complain about it but overall do nothing, or find a way to fix it.&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Profit &lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;The examples given are large companies, consistently profitable, they dominate their industry and for a long time.&amp;#160; The front-line people are highly valued, expected to make local decisions and effectively engaged in delivering superior customer outcomes.&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Talked about Tandberg’s successful implementation of Lean&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Talked with really individual, front-line workers&lt;/li&gt;      &lt;li&gt;The workers knew by heart the 1-line pitch of company for what the company’s purpose was.&lt;/li&gt;      &lt;li&gt;The workers also knew exactly why they were doing their job.&amp;#160; They were passionate about what they did because they knew why they’re job was in place.&lt;/li&gt;      &lt;li&gt;&lt;a title="http://www.pvv.org/~oma/SoftwareDevelopmentAtTandberg_March2009.pdf" href="http://www.pvv.org/~oma/SoftwareDevelopmentAtTandberg_March2009.pdf"&gt;http://www.pvv.org/~oma/SoftwareDevelopmentAtTandberg_March2009.pdf&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Overall really great information presented.&amp;#160; If you ever have the chance to listen to Mary give a presentation, don’t miss out.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-5814571103852445176?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/5814571103852445176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=5814571103852445176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5814571103852445176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5814571103852445176'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-keynote-mary-poppendieck-five.html' title='Codemash Keynote: Mary Poppendieck – Five Habits of Successful Lean Development'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-9142586921376694647</id><published>2010-01-13T16:44:00.001-06:00</published><updated>2010-01-13T16:44:18.589-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash Pre-compiler: Software Craftsmanship</title><content type='html'>&lt;p&gt;This was presented by Steve Smith (&lt;a href="http://twitter.com/ardalis"&gt;@ardalis&lt;/a&gt; | &lt;a href="http://Codeproject.com"&gt;Codeproject.com&lt;/a&gt;) and Brendan Enrick (&lt;a href="http://twitter.com/brendoneus"&gt;@brendoneus&lt;/a&gt; | &lt;a href="http://NimblePros.com"&gt;NimblePros.com&lt;/a&gt;).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;What is It?      &lt;ul&gt;       &lt;li&gt;Software Craftsmanship Manifesto () &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Why practice?      &lt;ul&gt;       &lt;li&gt;Basically it’s like Microsoft Certification tests; memorize the techniques so that when it’s time to solve a problem, you have a number of techniques you know like the back of your hand rather than having to look it up each time. &lt;/li&gt;        &lt;li&gt;Using Kata’s helps for improving your “muscle” memory when it comes to tackling similar problems. &lt;/li&gt;        &lt;li&gt;If you’ve already explored the problem domain using one approach (strictly OO using .NET 2.0 way), you should already have the unit tests that, in theory, can be used when you rework them in the underlying logic (using LINQ). &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Kata’s practiced:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Bowling game (as &lt;a href="http://butunclebob.com/"&gt;Uncle Bob&lt;/a&gt; has tackled the kata).       &lt;ul&gt;       &lt;li&gt;the TDD approach that Uncle Bob took to tackle the problem &lt;/li&gt;        &lt;li&gt;Took an approach with &lt;a href="http://twitter.com/mletterle"&gt;Mike Letterle&lt;/a&gt; that might have been a little more complicated than it needed to be, but was a good exercise in thinking it through. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;A grocery shopping register.      &lt;ul&gt;       &lt;li&gt;having to account for discounts like “Buy &lt;code&gt;N&lt;/code&gt; and get the &lt;code&gt;N+1&lt;/code&gt;&lt;sup&gt;th&lt;/sup&gt; free” and “Buy &lt;code&gt;N&lt;/code&gt; for $&lt;code&gt;M&lt;/code&gt;”. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a href="http://imranontech.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/"&gt;FizzBuzz&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Overall it was a cool session, but more for talking with developers outside my normal circle and getting a different point of view in how to architect the code.&amp;#160; It was great taking a TDD approach to tackling these kata’s though.&amp;#160; Especially pairing with a Java developer on the Grocery store kata.&amp;#160; Kind of wish I would have gone to a different session to actually learn more content as I’m thinking I’ll probably end up in the coding room one of the days to pair with people just to learn more from them and to actually be able to do some pair programming as it’s such a foreign concept every place I’ve worked.&amp;#160; It’s amazing how much it helps to be able to think through the implications of a certain architecture before ever actually laying out the code.&amp;#160; Although if you have two developers that over think the&amp;#160; problem it can lead to issues.&amp;#160; Amazingly I was able to no do that at all today and instead focused on “this is what’s being asked for, so let’s actually deliver that”.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-9142586921376694647?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/9142586921376694647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=9142586921376694647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/9142586921376694647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/9142586921376694647'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-pre-compiler-software_13.html' title='Codemash Pre-compiler: Software Craftsmanship'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-3729895251592689368</id><published>2010-01-13T12:17:00.001-06:00</published><updated>2010-01-13T12:17:42.311-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash'/><title type='text'>Codemash Pre-compiler: Software Engineering Fundamentals Workshop: OOP, SOLID, and More</title><content type='html'>&lt;p&gt;It’s that time for Codemash again.&amp;#160; So I’ll be doing some stream of conscious type blog posts again.&amp;#160; If others find this information kind of interesting I’ll expand on it some more, but mostly it’s for my own recollection.&amp;#160; The first session I attended during the pre-compiler was “Software Engineering Fundamentals Workshop: OOP, SOLID, and More” presented by Jon Kruger.&amp;#160; He kindly has the slides up at &lt;a href="http://jonkruger.com/solid/OOP-SOLID-CodeMash.pptx"&gt;http://jonkruger.com/solid/OOP-SOLID-CodeMash.pptx&lt;/a&gt;.&amp;#160; Some of the points of his presentation:&lt;/p&gt;  &lt;p&gt;* Started out talking about OOP.&amp;#160; Good analogy between Legos and code.&amp;#160; Glued together Lego pieces are like tightly coupled code.&lt;/p&gt;  &lt;p&gt;* “Just because you are using an OO language does not mean that you are doing object-oriented programming.”&lt;/p&gt;  &lt;p&gt;* “Avoid Not-Invented-Here syndrome”.&amp;#160; Promote reuse of objects, not just methods. And not via copy-and-paste.&lt;/p&gt;  &lt;p&gt;* Great example of Encapsulation –&amp;gt; home electrical wiring.&amp;#160; You have abstraction/interface on top of abstraction/interface on top of abstraction/interface.&amp;#160; You only need to know what’s under the hood if you really HAVE to, otherwise go with the easiest interface.&lt;/p&gt;  &lt;p&gt;* Object-orient programming is about behavior, not just fields.&amp;#160; Encapsulation is about hiding the fields and the only interaction is via behaviors.&lt;/p&gt;  &lt;p&gt;* Rethink about object Inheritence by using composition.&amp;#160; It helps break down large methods.&amp;#160; It’s like going to a grocery store to choose what food is available to you vs. being a farmer and tied to what food you grow.&lt;/p&gt;  &lt;p&gt;* Easier programming does not mean you shouldn’t learn new techniques/programming languages/etc.&amp;#160; It’s sometimes FAR easier to learn something new to help you out overall.&lt;/p&gt;  &lt;p&gt;* The SOLID talk is very similar to what I presented to the ALL.NET group awhile back, but focused more on “Don’t do something that you really don’t need to do because it doesn’t fit your situation” and “Think before you implement.”&lt;/p&gt;  &lt;p&gt;I have to give kudos to Jon for integrating the pairing session into the session.&amp;#160; It was a great opportunity to take an existing (crappy) application and refactor it using the techniques he had just presented.&amp;#160; I paired with Curtis Mitchell which was a great time, despite the fact we didn’t get a chance to dig too far into actually fix much of the code.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-3729895251592689368?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/3729895251592689368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=3729895251592689368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/3729895251592689368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/3729895251592689368'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/codemash-pre-compiler-software.html' title='Codemash Pre-compiler: Software Engineering Fundamentals Workshop: OOP, SOLID, and More'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-3294022830848786211</id><published>2010-01-11T08:00:00.001-06:00</published><updated>2010-01-18T19:57:11.101-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Best Macro to use in Visual Studio</title><content type='html'>&lt;p&gt;I wrote this little macro awhile back, and after getting burned by yet another accidental hit of the &lt;kbd&gt;F1&lt;/kbd&gt; key and waiting the agonizing amount of time before the Help came up, I realized it's time to get this macro out there so I can "install" it wherever I'm at.  Since whenever I’m looking up documentation on a .NET class I copy the class name, go to Google, and generally the answer is within the first couple links.  So why not automate that.&lt;/p&gt;  &lt;p&gt;To add it to your Visual Studio macros, bring up the Macro Explorer panel (View –&amp;gt; Other Windows –&amp;gt; Macro Explorer; or &lt;kbd&gt;Alt&lt;/kbd&gt; + &lt;kbd&gt;F8&lt;/kbd&gt;). Edit a module and add sub to the module you want to.&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Public Sub SearchWord()&lt;br /&gt;        Dim objDocument As EnvDTE.Document = DTE.ActiveDocument&lt;br /&gt;        Dim sSearchText As String&lt;br /&gt;&lt;br /&gt;        Dim currentSelection As TextSelection = objDocument.Selection&lt;br /&gt;&lt;br /&gt;        If currentSelection.Text &lt;&gt; "" Then&lt;br /&gt;            sSearchText = currentSelection.Text&lt;br /&gt;        Else&lt;br /&gt;            Dim objTextDocument As EnvDTE.TextDocument&lt;br /&gt;            Dim objTextSelection As EnvDTE.TextSelection&lt;br /&gt;            Dim lineNumber As Integer&lt;br /&gt;            Dim colNumber As Integer&lt;br /&gt;&lt;br /&gt;            ' Get the text document&lt;br /&gt;            objTextDocument = CType(objDocument.Object, EnvDTE.TextDocument)&lt;br /&gt;            objTextSelection = objTextDocument.Selection&lt;br /&gt;            colNumber = objTextSelection.ActivePoint.DisplayColumn&lt;br /&gt;            lineNumber = objTextSelection.ActivePoint.Line&lt;br /&gt;&lt;br /&gt;            objTextSelection.WordLeft(False, 1)&lt;br /&gt;            objTextSelection.WordRight(True, 1)&lt;br /&gt;&lt;br /&gt;            sSearchText = objTextSelection.Text&lt;br /&gt;            objTextSelection.MoveToDisplayColumn(lineNumber, colNumber)&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;        System.Diagnostics.Process.Start("http://www.google.com/search?q=" + sSearchText)&lt;br /&gt;    End Sub&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Save the module and you can close out of the Macro editor.  Now back in Visual Studio, open up the keyboard options (Tools –&amp;gt; Options –&amp;gt; Environment –&amp;gt; Keyboard).  Remove the existing &lt;kbd&gt;F1&lt;/kbd&gt; binding by searching for “Help.F1Help” in the “Show commands containing” textbox and clicking the Remove button to unbind it.  Now search for the macro you just created.  Press the &lt;kbd&gt;F1&lt;/kbd&gt; key in the “Press shortcut keys” textbox and click “Assign”.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now whenever you hit F1 it will highlight the current word and search for it in Google in your default browser.  Pretty simple stuff!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;EDIT (2010-01-18):&lt;/span&gt; &lt;span style="font-style:italic"&gt;Based on feedback I updated the macro to not change the selected text if there's already something selected, and won't leave an item selected if you didn't have something selected already.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-3294022830848786211?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/3294022830848786211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=3294022830848786211' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/3294022830848786211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/3294022830848786211'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/best-macro-to-use-in-visual-studio.html' title='Best Macro to use in Visual Studio'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-8026178668604372565</id><published>2010-01-07T15:25:00.001-06:00</published><updated>2010-01-07T15:25:12.606-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='powershell'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><title type='text'>Speeding up podcasts within iTunes</title><content type='html'>&lt;p&gt;What started out as a simple &lt;a href="http://superuser.com/questions/81045/podcast-playback-faster-than-1x-speed-on-ipod"&gt;Superuser question&lt;/a&gt; became a long trek to find a solution.&amp;#160; The only &lt;a href="http://superuser.com/questions/81045/podcast-playback-faster-than-1x-speed-on-ipod/85584#85584"&gt;answer&lt;/a&gt; at the time pointed me to do batch processing through &lt;a href="http://audacity.sourceforge.net/"&gt;Audacity&lt;/a&gt;, but I was trying to avoid automating the GUI as much as possible.&amp;#160; Although I know how to make use of &lt;a href="http://www.autoitscript.com/autoit3/" target="_blank"&gt;AutoIT&lt;/a&gt; and &lt;a href="http://www.autohotkey.com/" target="_blank"&gt;AutoHotKey&lt;/a&gt; to automate a GUI application, it’s not the approach I wanted to take with this.&amp;#160; The machine I sync my iPod and iTunes with I use quite a bit so I don’t want to have miscellaneous windows popping up on me and worrying about my current activity accidentally overriding what the script is doing.&amp;#160; Yes, using the &lt;a href="http://developer.apple.com/sdk/itunescomsdk.html"&gt;iTunes COM SDK&lt;/a&gt; causes iTunes to open up if it isn’t already, but I’m okay with that since I keep iTunes open most of the time to update my podcasts so it doesn’t affect me very much.&lt;/p&gt;  &lt;p&gt;So all that being said, as you probably guessed since I actually posted this, I came up with a solution that doesn’t involve AutoIT/AutoHotKey.&amp;#160; Doing a little digging I found an alternative to Audacity (which only operates through a GUI) called &lt;a href="http://sox.sourceforge.net/Main/HomePage"&gt;SOX&lt;/a&gt; (which is command line driven).&amp;#160; In a similar vein that Audacity suffers, they can’t distribute compiled applications that work with MP3’s because of the wonderful licensing of the format.&amp;#160; Thankfully SOX is open source, and others have already dealt with this issue, so I’ll make use of their outstanding work.&amp;#160; If you really want to do the work yourself, take a look at the steps on this &lt;a href="http://www.codeproject.com/KB/aspnet/Compiling_SOX_with_Lame.aspx "&gt;Code Project article&lt;/a&gt;.&amp;#160; I attempted the steps, but ran into a number of issues when trying to compile everything myself.&amp;#160; It may have been my very rusty C++ skills, but who knows.&amp;#160; So instead, the author of that article published the output of the steps and that’s what I downloaded and made use of (the &lt;em&gt;sox.zip&lt;/em&gt; link).&amp;#160; It is a number of versions behind the current version of SOX, but for my needs it’s fine.&amp;#160; To follow what I’ve done, download that file as well, and put it somewhere on your machine.&lt;/p&gt;  &lt;p&gt;The next step was creating a Powershell script to get all the podcast tracks that iTunes has downloaded and modify them.&amp;#160; Not sure why, but this appears only only work in Powershell v2, so I accomplished that using the following script (note the line pointing to where Sox.exe exists), which I called “”SpeedUpPodcastsIniTunes.ps1”:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre&gt;# Comment that will be applied to all podcast files that will be updated.&lt;br /&gt;$modificationComment = &amp;quot;::Modified By Powershell Script::&amp;quot;&lt;br /&gt;&lt;br /&gt;# Location where sox.exe exists on your machine.&lt;br /&gt;$soxFile = &amp;quot;C:\Path\To\Sox.exe&amp;quot;&lt;br /&gt;&lt;br /&gt;# The file types to modify.  Make sure that Sox.exe can handle the file types&lt;br /&gt;$extension = &amp;quot;.mp3&amp;quot;&lt;br /&gt;&lt;br /&gt;# This is a list of all the podcasts that should have every file modified.  This is an&lt;br /&gt;# opt-in process for each podcast. The podcast names are case sensitive.&lt;br /&gt;# Format should be like the following:&lt;br /&gt;# ... = &amp;quot;Podcast 1&amp;quot;, &amp;quot;Podcast 2&amp;quot;, &amp;quot;Podcast 3&amp;quot;, ...&lt;br /&gt;#$podcastsToAffect = &amp;quot;.NET Rocks!&amp;quot;, &amp;quot;RunAs Radio&amp;quot;, &amp;quot;The Thirsty Developer - Podcast&amp;quot;&lt;br /&gt;$podcastsToAffect = &amp;quot;The Thirsty Developer - Podcast&amp;quot;,&lt;br /&gt;                    &amp;quot;.NET Rocks!&amp;quot;,&lt;br /&gt;                    &amp;quot;RunAs Radio&amp;quot;,&lt;br /&gt;                    &amp;quot;Hanselminutes&amp;quot;,&lt;br /&gt;                    &amp;quot;Herding Code&amp;quot;&lt;br /&gt;&lt;br /&gt;# The tempo speed is how fast to speed up the podcast.  A value of 1.0 is the same speed&lt;br /&gt;# it's currently at.  1.5 is 150% faster, so the overall length would be 66% of what it&lt;br /&gt;# currently is.&lt;br /&gt;$tempoSpeed = &amp;quot;1.5&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$itunes = new-object -com itunes.application&lt;br /&gt;if($itunes -ne $null)&lt;br /&gt;{&lt;br /&gt;	Write-Host &amp;quot;iTunes is running...&amp;quot;&lt;br /&gt;	# Sources.Kind == 1 (ITSourceKindLibrary)&lt;br /&gt;	$itunesLibrary = $itunes.Sources | Where-Object { $_.Kind -eq 1 }&lt;br /&gt;    Write-Host &amp;quot;Retrieving Podcasts&amp;quot;&lt;br /&gt;	$podcastsPlaylist = $itunesLibrary.Playlists | Select-Object $_ | Where-Object { [string]::Compare($_.Name, &amp;quot;podcasts&amp;quot;, $True) -eq 0 }&lt;br /&gt;	# Tracks.Kind == 1 (ITTrackKindFile)&lt;br /&gt;    Write-Host &amp;quot;Filtering Podcasts&amp;quot;&lt;br /&gt;	$downloadedTracks = $podcastsPlaylist.Tracks | Where-Object { ($_.Kind -eq 1) -and ($_.Podcast -eq $True) -and ($podcastsToAffect -contains $_.Album) } | Select-Object $_ | Where-Object { (([string]::IsNullOrEmpty($_.Lyrics) -eq $True) -or ($_.Lyrics.Contains($modificationComment) -ne $true)) -and ([System.IO.Path]::GetExtension($_.Location) -eq $extension) }&lt;br /&gt;&lt;br /&gt;    Write-Host &amp;quot;Processing...&amp;quot;&lt;br /&gt;	$downloadedTracks | ForEach-Object {&lt;br /&gt;		if($_ -ne $null){&lt;br /&gt;			$trackLocation = $_.Location;&lt;br /&gt;			$currentLyrics = [string]::Empty&lt;br /&gt;			if([string]::IsNullOrEmpty($_.Lyrics) -ne $True){&lt;br /&gt;				$currentLyrics = $_.Lyrics&lt;br /&gt;			}&lt;br /&gt;&lt;br /&gt;			$tempFile = [System.IO.Path]::GetTempFileName()&lt;br /&gt;			# GetTempFileName() actually creates the file, which we don't need&lt;br /&gt;			[System.IO.File]::Delete($tempFile)&lt;br /&gt;			# Need to give the temp file an appropriate extension because Sox.exe requires it.&lt;br /&gt;			$tempFile = $tempFile + $extension&lt;br /&gt;&lt;br /&gt;			Write-Host Converting `( $_.Name`)&lt;br /&gt;			&amp;amp; $soxFile $trackLocation $tempFile tempo $tempoSpeed &lt;br /&gt;			Write-Host Done!&lt;br /&gt;&lt;br /&gt;			# Need to delete the current file because Move() doesn't let you overwrite the file.&lt;br /&gt;			[System.IO.File]::Delete($trackLocation)&lt;br /&gt;			[System.IO.File]::Move($tempFile, $trackLocation)&lt;br /&gt;&lt;br /&gt;			# Update the Lyrics for tracking the files that have been changed.&lt;br /&gt;			$currentLyrics = $currentLyrics + &amp;quot;`r`n&amp;quot; + $modificationComment&lt;br /&gt;			$_.Lyrics = $currentLyrics&lt;br /&gt;&lt;br /&gt;			$_.UpdateInfoFromFile()&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	# clean up memory&lt;br /&gt;	[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$iTunes)&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You’ll notice that I’m making use of the Lyrics section of the podcast to track if it’s been modified by this script before.&amp;#160; I initially was using the Comments, but apparently some of the podcasts actually fill in that information and there’s a limit of 256 characters on the field.&amp;#160; My first trial runs ended up with a few “Cannot change the Comment” errors being thrown by the COM interop because of that limitation.&amp;#160; So far I haven’t run into an issue with the Lyrics section.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The final step is setting up a scheduled task to run this script on a schedule.&amp;#160; For the command on the scheduled task itself, it looks like this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;C:\Windows\system32\windowspowershell\v1.0\powershell.exe –NoProfile –NonInteractive “C:\Utils\Scripts\SpeedUpPodcastsIniTunes.ps1”&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And the Start In directory is set to `&lt;em&gt;C:\Windows\system32\windowspowershell\v1.0&lt;/em&gt;`.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So far it seems to fit my need pretty well.&amp;#160; It does have a noticeable lag when it’s filtering the podcasts, but not too bad.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The first time you run this, it’s advisable to delete all but the most recent track for a podcast.&amp;#160; It does take several minutes to convert the files, so even a handful of them can take a good deal of time.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-8026178668604372565?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/8026178668604372565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=8026178668604372565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8026178668604372565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8026178668604372565'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2010/01/speeding-up-podcasts-within-itunes.html' title='Speeding up podcasts within iTunes'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-3814872097819948904</id><published>2009-06-04T23:06:00.001-05:00</published><updated>2009-06-04T23:08:05.367-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Review'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><title type='text'>Switching to the @Mixero Twitter Client</title><content type='html'>&lt;p&gt;&lt;em&gt;*NOTE* I have only watched one of the video’s on Mixero’s site for features/usage, so this is nearly all from my own experience with the client after a single day.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I had heard about the &lt;a href="http://mixero.com/" target="_blank"&gt;Mixero&lt;/a&gt; &lt;a href="http://twitter.com" target="_blank"&gt;Twitter&lt;/a&gt; client what seems like a few weeks ago now (or about a week ago according to when I first tweeted about it), and this morning I was pleasantly surprised with an invite code for it.&amp;#160; Now I wouldn’t consider myself a heavy &lt;a href="http://twitter.com/kopelli" target="_blank"&gt;user of Twitter&lt;/a&gt;, but I seem to be more active among those I talk with in person regularly (outside of my friend &lt;a href="http://twitter.com/cjibo" target="_blank"&gt;Curt&lt;/a&gt;).&amp;#160; I like to see what people have on their minds and thus I enjoy watching the stream of tweets float on by.&amp;#160; Previously I’ve used &lt;a href="http://tweetdeck.com/beta/" target="_blank"&gt;TweetDeck&lt;/a&gt; to keep up on things, but I quickly hit a limit in the number of columns to effectively keep open at any point.&amp;#160; Considering that in TweetDeck a group only existed as long as it was visible, it was inefficient to remove a group for a short time because if I wanted to bring it back I’d have to recreate the whole thing.&amp;#160; Major pain.&amp;#160; Plus, even when I had the application full screened, the number of columns caused the horizontal scroll bar to appear.&amp;#160; Plus the notifications for @replies and direct messages wasn’t exactly noticeable unless you kept those columns open as well.&amp;#160; So that horizontal scroll bar was used far more than was necessary, often for no good reason.&lt;/p&gt;  &lt;p&gt;That’s part of the reason I’m digging Mixero so far.&amp;#160; The notifications section is just plain awesome.&amp;#160; Direct Messages and @replies appear as little speech bubbles off your avatar.&amp;#160; Pretty cool stuff right there.&amp;#160; When you have unread items in either, the icon visibly changes.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iq-Yj9q5eug/SiiZz8VeGjI/AAAAAAAAACk/IOKa-QEGdQc/image%5B3%5D.png?imgmax=800" width="96" height="68" /&gt;&lt;/p&gt;  &lt;p&gt;Like TweetDeck, you can create groups to easily manage your stream.&amp;#160; The nice thing in Mixero is that you can create groups, but not necessarily keep a visible display of that group’s updates open at all times.&amp;#160; So you can have a group set up for future knowledge.&amp;#160; Like people you know that generally talk about conferences, and you’re only interested in that information for a couple months out of the year.&amp;#160; Set up the group and forget about it until conference season comes up again.&amp;#160; You can also associate 48x48 pictures to a group as well.&amp;#160; They have a limited canned selection to choose from, but they also perform a Google search based on the group name and returns the first ~8 results to choose from as well.&amp;#160; These are seen in the Active List.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iq-Yj9q5eug/SiiZ0IC__1I/AAAAAAAAAC4/4XAKLMWZl8Q/s1600-h/image%5B22%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Mixero Client" border="0" alt="Mixero Client" align="right" src="http://lh6.ggpht.com/_iq-Yj9q5eug/SiiZ0ROgz3I/AAAAAAAAADA/0gwakkSzC2s/image_thumb%5B20%5D.png?imgmax=800" width="102" height="296" /&gt;&lt;/a&gt;An interesting feature of Mixero is the “Active List” and Contexts.&amp;#160; I haven’t quite found a good use for multiple contexts yet, because I like to have as much of the information available when I open the client without having to click and change things.&amp;#160; But with a context you have an associated Active List.&amp;#160; An Active list can hold a group or individual users, and it will give you and update of how many unread tweets there are from those groups/users.&amp;#160; Nice and easy way to see at a glance if there’s anything to read up on.&lt;/p&gt;  &lt;p&gt;The next cool feature of Mixero is when you open up a user or group’s status, you have the option of creating a new window that’s movable separate from the main client bar.&amp;#160; This means you can move a window full of updates wherever you want to on your screen.&amp;#160; Keep a couple important ones open at all times, cover your screen with windows (similar to TweetDeck running maximized), or only open up the groups as you read through them.&amp;#160; Because I like to clear groups of tweets at a time, I’ve gone with the “Cover your screen” approach.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_iq-Yj9q5eug/SiiZ01sKe5I/AAAAAAAAADE/DyUAa32eTjY/s1600-h/image%5B21%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_iq-Yj9q5eug/SiiZ1SxI1YI/AAAAAAAAADQ/-u7YWyNnTvE/image_thumb%5B19%5D.png?imgmax=800" width="506" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I haven’t really run into any bugs, per se, but more like “well that’s a strange way to behave”.&amp;#160; Like the difference a read update and an unread one is that the unread updates are in black text and the read updates are in ~56% gray text.&amp;#160; Personally I like TweetDeck's visible indicator of read/unread, but that may just be my familiarity with it talking.&lt;/p&gt;  &lt;p&gt;If they &lt;del&gt;steal&lt;/del&gt; &lt;ins&gt;gain insight from&lt;/ins&gt; some of TweetDeck's features, it will definitely become the key Twitter client for power users.&amp;#160; Start &lt;a href="http://twitter.com/mixero" target="_blank"&gt;following them on Twitter&lt;/a&gt; now and soon you may get an invitation code to start using the client as well.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-3814872097819948904?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/3814872097819948904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=3814872097819948904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/3814872097819948904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/3814872097819948904'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/06/switching-to-mixero-twitter-client.html' title='Switching to the @Mixero Twitter Client'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_iq-Yj9q5eug/SiiZz8VeGjI/AAAAAAAAACk/IOKa-QEGdQc/s72-c/image%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-796036230193643769</id><published>2009-05-30T23:47:00.001-05:00</published><updated>2009-05-30T23:47:02.302-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ChicagoCodeCamp'/><title type='text'>Chicago Code Camp Retrospective</title><content type='html'>&lt;p&gt;Today was a long day, because I made the trek down to the Chicago Code Camp.&amp;#160; Aside from the two hour drive each way, it was a good experience.&amp;#160; Here's a summary of the sessions.&lt;/p&gt;  &lt;h4&gt;Trends in Continuous Integration with Software Delivery&lt;/h4&gt;  &lt;p&gt;This was presented by &lt;a href="http://twitter.com/seanblanton" target="_blank"&gt;Sean Blanton&lt;/a&gt;.&amp;#160; Essentially it was talking about the benefits of having a build server in your environment that creates a build more than just a nightly build.&amp;#160; There was very little technical information in the session, as most of it was a higher level view of the need of &lt;abbr title="Continuous Integration"&gt;CI&lt;/abbr&gt;.&amp;#160; Of course the concept of build automation came up, but he also brought up about about workflow automation.&amp;#160; Essentially the &lt;a href="http://studios.thoughtworks.com/cruise-continuous-integration/deployment-pipelines" target="_blank"&gt;pipeline concept&lt;/a&gt; that &lt;a href="http://studios.thoughtworks.com/cruise-continuous-integration" target="_blank"&gt;Cruise&lt;/a&gt; uses is a good example of workflow automation.&amp;#160; A build happens and the outcome will determine the next action.&amp;#160; Run the unit tests, run integration tests, code coverage, email status/reports of the build somewhere, create installation package, deploy to another environment, etc.&amp;#160; All part of the workflow automation.&lt;/p&gt;  &lt;h4&gt;Guarding Your Code with Code Contracts&lt;/h4&gt;  &lt;p&gt;This was presented by &lt;a href="http://twitter.com/derikwhittaker" target="_blank"&gt;Derik Whittaker&lt;/a&gt;.&amp;#160; The topic was about the &lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx" target="_blank"&gt;Code Contracts&lt;/a&gt; project that came out of &lt;a href="http://msdn.microsoft.com/en-us/devlabs/default.aspx" target="_blank"&gt;Microsoft DevLabs&lt;/a&gt;.&amp;#160; It's going to be part of Visual Studio 2010, but is available now.&amp;#160; Of course it's still pretty early in development so the interface and functionality are a little clunky and are quite likely to change.&amp;#160; I recall reading an article about it not that long ago, but I can't seem to find it at the moment.&amp;#160; Overall the project seems awesome.&amp;#160; There's two extremely awesome things that Derik brought up in the presentation.&amp;#160; One was the ContractInvariantMethodAttribute.&amp;#160; What it does is insert a call to the method prior to any method returns for every other method in the class.&amp;#160; This comes in handy when you want to ensure that a class remains in a valid state after any method call.&amp;#160; And it saves the developer from having to manually add that call to every method.&amp;#160; The other awesome thing is that the contracts calls can undergo static analysis.&amp;#160; So being able to compile the code and see where there is violations to called methods is simply brilliant.&amp;#160; Granted they currently only show up as warnings in &lt;abbr title="Visual Studio"&gt;VS&lt;/abbr&gt;, but still awesome.&lt;/p&gt;  &lt;h4&gt;Testing GUI's&lt;/h4&gt;  &lt;p&gt;This was presented by &lt;a href="http://twitter.com/slagyr" target="_blank"&gt;Micah Martin&lt;/a&gt;.&amp;#160; During the session I re-read the abstract of the session and wished there was a little more detail about it.&amp;#160; Basically it dealt with reworking the UI in Ruby applications (both rich client and web apps) using a framework called &lt;a href="http://limelight.8thlight.com/" target="_blank"&gt;LimeLight&lt;/a&gt;.&amp;#160; While I'm pretty sure I'd never end up using the framework, Micah did a pretty good job with the presentation despite the feeling that nearly the entire audience was expecting something else.&amp;#160; About the only thing I got out of the session was a reminder that I still want to learn Ruby at some point.&lt;/p&gt;  &lt;h4&gt;MassTransit&lt;/h4&gt;  &lt;p&gt;This was presented by &lt;a href="http://twitter.com/drusellers" target="_blank"&gt;Dru Sellers&lt;/a&gt;.&amp;#160; Mass Transit is a messaging bus that promotes the &lt;a href="http://en.wikipedia.org/wiki/Publish/subscribe" target="_blank"&gt;publish/subscribe design pattern&lt;/a&gt; in a very decoupled way.&amp;#160; It's under development by Dru and &lt;a href="http://blog.phatboyg.com/" target="_blank"&gt;Chris Patterson&lt;/a&gt;.&amp;#160; Having read a few posts about it didn't really shed the light on what the project is or how it's meant to be used quite the same way that Dru explained it.&amp;#160; It was a very informal type of presentation, more like a group talk with Dru leading most of it.&amp;#160; While I can't currently see the need for a framework like it in most solutions I've worked with, it will be an interesting project to keep in mind for the future.&lt;/p&gt;  &lt;h4&gt;Developing Solid WPF Application&lt;/h4&gt;  &lt;p&gt;This was lead by &lt;a href="http://twitter.com/mjeaton" target="_blank"&gt;Michael Eaton&lt;/a&gt;.&amp;#160; Despite being the last session of the day, Michael managed to present some great material.&amp;#160; He essentially took a WPF application that would be very representative of how a WinForms programmer would approach it: everything in the code behind, very simple use of bindings, extremely painful to unit test in any fashion.&amp;#160; Taking this horrible code, attempts to refactor it to make better use WPF features like RoutedUICommands and better bindings.&amp;#160; As well as decoupling the code and attempting a &lt;abbr title="Model-View-Controller"&gt;MVC&lt;/abbr&gt; pattern.&amp;#160; While that pattern can work, he then went into how the &lt;abbr title="Model-View-ViewModel"&gt;MVVM&lt;/abbr&gt;.&amp;#160; Unfortunately he was doing a great job of explaining things that he went short on time.&amp;#160; Also being that late in the day it was hard to stay focused on the presentation, despite how great the material was.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-796036230193643769?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/796036230193643769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=796036230193643769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/796036230193643769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/796036230193643769'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/05/chicago-code-camp-retrospective.html' title='Chicago Code Camp Retrospective'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-2135167727089516483</id><published>2009-05-01T06:14:00.001-05:00</published><updated>2009-05-01T06:14:40.173-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Updating the Last Modified Date of a directory</title><content type='html'>&lt;p&gt;Working with a lot of compressed (.ZIP) folders can have some interesting side effects when you decompress them.&amp;#160; Windows will list all the folders (and subfolders) as having a last modified date of when you decompressed the file.&amp;#160; That may be well and good for most people, but it annoyed me to no end because I typically sort directories by the Last Modified Date as I work with the most recent files the most often.&amp;#160; Plus, downloading a file that hasn't been updated in a couple years and unzipping it can cause some confusion when you see the folder as being last modified today, but every file in it was created/modified a few years ago.&amp;#160; Why not have the folder actually reflect the date it was last modified by the files, not the OS?&amp;#160; That makes better sense to me, so I created a dead simple console app to do just that.&lt;/p&gt;  &lt;p&gt;The console application will recursively go down a directory structure and give you a status of the folders and the Last Modified Date's new value.&amp;#160; By default, it will go down a maximum of 300 folders.&amp;#160; That should more than cover most directory trees.&amp;#160; If you want to limit it to only a couple levels, you can call the application from the command line, passing in a number after the folder and it will recourse only that many levels.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_iq-Yj9q5eug/SfrZkw2Gs3I/AAAAAAAAACQ/o-nTwxn20IU/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/_iq-Yj9q5eug/SfrZlTpkpaI/AAAAAAAAACU/oSLEaUWITAI/image_thumb%5B7%5D.png?imgmax=800" width="632" height="272" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;One thing you'll notice in the output (more so if you run it in a console window rather than from the context menu that's part of the &lt;a href="#installer"&gt;installer&lt;/a&gt;) is that the path names are rarely wider than the screen.&amp;#160; There's a few different ways to accomplish this task, and since I'm not a fan of depending on system libraries in managed code, I took the approach of implementing the function myself based on code I found online.&amp;#160; I can't recall where I originally came across it, but I modified a couple logic errors that were in it.&amp;#160; Take a look at the &lt;font face="OCR A Extended"&gt;&lt;em&gt;DirectoryUpdater.CompactFilePath()&lt;/em&gt;&lt;/font&gt; method if you're interested.&lt;/p&gt;  &lt;p&gt;I also built a &lt;a href="http://wix.sourceforge.net/" target="_blank"&gt;Windows Installer Xml (WiX)&lt;/a&gt; installer because it's so much easier to just right-click on a folder and tell it to update the last modified date.&amp;#160; So as a custom action in the installer it creates the appropriate registry keys for the context action.&amp;#160; As I'm still extremely new to WiX, the only way to have it install them is to choose a Custom install and change the &amp;quot;Context Menu&amp;quot; item to &amp;quot;Will be installed on local hard drive&amp;quot;.&amp;#160; Hopefully will get that figured out at some point.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/_iq-Yj9q5eug/SfrZmI-f9AI/AAAAAAAAACY/anh2fnw2U9g/image%5B16%5D.png?imgmax=800" width="535" height="422" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_iq-Yj9q5eug/SfrZm4dviUI/AAAAAAAAACc/smSv48lFO6c/s1600-h/image%5B10%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://lh3.ggpht.com/_iq-Yj9q5eug/SfrZn--twwI/AAAAAAAAACg/EDecygAHo5I/image_thumb%5B6%5D.png?imgmax=800" width="580" height="443" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a name="source"&gt;Source code &lt;/a&gt;&lt;a href="http://cid-0abdbfd95d1b6d66.skydrive.live.com/self.aspx/.Public/DirectoryUpdateLastModified.zip" target="_blank"&gt;download from here&lt;/a&gt;.     &lt;br /&gt;&lt;a name="executable"&gt;Executable &lt;/a&gt;&lt;a href="http://cid-0abdbfd95d1b6d66.skydrive.live.com/self.aspx/.Public/DirectoryUpdateLastModified.exe" target="_blank"&gt;download from here&lt;/a&gt;.     &lt;br /&gt;&lt;a name="installer"&gt;MSI Installer &lt;/a&gt;&lt;a href="http://cid-0abdbfd95d1b6d66.skydrive.live.com/self.aspx/.Public/DirectoryUpdateLastModified%7C_0.1.0.0%7C_Setup.msi" target="_blank"&gt;download from here&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/1603231381798309901-2135167727089516483?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/2135167727089516483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=2135167727089516483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2135167727089516483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2135167727089516483'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/05/updating-last-modified-date-of.html' title='Updating the Last Modified Date of a directory'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_iq-Yj9q5eug/SfrZlTpkpaI/AAAAAAAAACU/oSLEaUWITAI/s72-c/image_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-8093939863508074058</id><published>2009-03-15T21:00:00.000-05:00</published><updated>2009-03-15T21:00:00.623-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Permanently Get Rid of "Unblock" Button on Downloaded Files</title><content type='html'>&lt;p&gt;I'm really surprised at myself for waiting so long before I removed this friction point from my daily environment.&amp;#160; Like almost all developers, we look for the path of least resistance when we're trying to get work done.&amp;#160; And I'm going to be generous and say that we're all smart enough to know that we take some level of risk with downloading and executing files from the Internet.&amp;#160; So why should we be bothered by Windows telling us that a file we just downloaded (especially intentionally just downloaded) may be unsafe and tries to protect us?&amp;#160; I don't care, I want to execute it without all the extra safety precautions.&amp;#160; I don't want to have to go into every file I download and click on the &amp;quot;Unblock&amp;quot; button so it will function as expected.&amp;#160; I've read some posts that this is unique to Internet Explorer only, but that's not so.&amp;#160; My browser of choice is Firefox (haven't had the desire to switch to Chrome yet) and it does the same thing.&amp;#160; This is especially true when downloading CHM help files as nothing loads because the content is blocked.&amp;#160; Even more so when you unzip a file that is still &amp;quot;blocked&amp;quot; and all the expanded files are now also &amp;quot;blocked.&amp;quot;&amp;#160; You end up with a bunch of file properties that look similar to this with that not so attractive &amp;quot;Unblock&amp;quot; button at the bottom: &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="475" alt="image" src="http://lh5.ggpht.com/_iq-Yj9q5eug/SbqJVlRoi5I/AAAAAAAAACE/eLoy4BXjBSk/image%5B9%5D.png?imgmax=800" width="378" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;So how can you permanently get rid of it? Well Windows is applying an NTFS stream to the file that keeps what zone the file is originally from.&amp;#160; The easiest way is to edit your Group Policy settings (normally handled by your domain settings if you're in a corporate network, but also exists on a personal machine).&amp;#160; Since this isn't normally something configured for home use, I'm not entirely sure which versions of Vista it can be found in.&amp;#160; The disclaimer on the setting says at least XP Professional SP2.&amp;#160; Anyway, you will need to run &lt;strong&gt;%windir%\System32\gpedit.msc&lt;/strong&gt; as an administrator.&amp;#160; Next, navigate to &lt;strong&gt;Local Computer Policy -&amp;gt; User Configuration -&amp;gt; Administrative Templates -&amp;gt; Windows Components -&amp;gt; Attachment Manager&lt;/strong&gt;.&amp;#160; The setting &amp;quot;&lt;em&gt;Do not preserve zone information in file attachments&lt;/em&gt;&amp;quot; is most likely at a status of &amp;quot;Not configured&amp;quot;.&amp;#160; You will want to go into the properties of it and change it to Enabled.&amp;#160; No restarts necessary to apply it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_iq-Yj9q5eug/SbqJXRtnZSI/AAAAAAAAACI/YjezwuXTWIg/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="302" alt="image" src="http://lh3.ggpht.com/_iq-Yj9q5eug/SbqJY5zBXmI/AAAAAAAAACM/h2o6z7Ydc3Q/image_thumb%5B2%5D.png?imgmax=800" width="466" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;From that point on, any file you download will no longer have to be &amp;quot;Unblocked.&amp;quot;&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-8093939863508074058?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/8093939863508074058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=8093939863508074058' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8093939863508074058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8093939863508074058'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/03/permanently-get-rid-of-button-on.html' title='Permanently Get Rid of &amp;quot;Unblock&amp;quot; Button on Downloaded Files'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_iq-Yj9q5eug/SbqJVlRoi5I/AAAAAAAAACE/eLoy4BXjBSk/s72-c/image%5B9%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-3689849184755174998</id><published>2009-03-12T22:08:00.002-05:00</published><updated>2009-03-12T22:11:55.659-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>The difference in random number generation in .NET</title><content type='html'>&lt;p&gt;The next project I plan on working on is going to rely heavily on a &lt;a href="http://en.wikipedia.org/wiki/Monte_Carlo_method" target="_blank"&gt;Monte Carlo method&lt;/a&gt; of populating the initial state.  Knowing this, I started digging into the different ways of generating random numbers in .NET.  Everybody immediately goes with &lt;a href="http://msdn.microsoft.com/en-us/library/system.random.aspx" target="_blank"&gt;System.Random&lt;/a&gt; when they're starting out since it's readily visible in a new class file.  This is all well and good, but you run into the issue that what it gives you is a pseudo-random number.  It's actually pretty interesting to pop open Reflector and look at what it's doing under the hood.  Granted it uses the system's ticks to seed the random number if you don't provide one yourself, but it does mean that processes (or even threads) creating an instance in the same tick will have the same random numbers.  Well that can be a problem...&lt;/p&gt;  &lt;p&gt;So how do we get a more *random* random number? That's where &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx" target="_blank"&gt;System.Security.Cryptography.RNGCryptoServiceProvider&lt;/a&gt; comes into the picture.  Digging into this class it's making an external call, so not quite as easy to figure out how it's getting it's randomness.  It really doesn't matter too much because it does come up with a better randomness.  The drawbacks of using it though are that the way to work with it is quite a bit different than the System.Random class, and it is quite a bit slower.  With the RNGCryptoServiceProvider you have to work with a byte array and do the conversions to whatever random type you want to work with.  So if you build out your classes to use System.Random and later want to switch to RNGCryptoServiceProvider you have your work cut out for you.  Or what about using RNGCryptoServiceProvider in production for "better" randomness, but use System.Random when you're unit/integration testing because you can control it?  There isn't a common interface to use in that case, but I've been tinkering around getting such an interface set most of the day.  Once I have it fleshed out more I'll post it up here.&lt;/p&gt;  &lt;p&gt;Now back to the slowness of RNGCryptoServiceProvider vs. Random.  Finding a few useful answers on Stack Overflow there was mention of it being slower, but never really gave any indication of how much worse it was.  I've seen too many statements like this and the difference really only came down to maybe a few hundred milliseconds (so not a noticeable problem in the applications I've worked on).  So I decided to toss together a test and find out just how much slower it is.  Here's what I did to test it:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ConsoleApplication1 &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Security.Cryptography; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    { &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args) &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        { &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            Stopwatch stopwatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stopwatch(); &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            RNGCryptoServiceProvider gen = &lt;span class="kwrd"&gt;new&lt;/span&gt; RNGCryptoServiceProvider(); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            Random generator = &lt;span class="kwrd"&gt;new&lt;/span&gt; Random(); &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            &lt;span class="rem"&gt;//Since I'm only working with int for both randomizers...&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] randomValues = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[ &lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(Int32) ];  &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            &lt;span class="rem"&gt;//step up the iterations by from 1 to 100,000,000; advancing by power of 10&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; iterations = 1; iterations &amp;lt;= Math.Pow(10,8); iterations *= 10)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            { &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                Console.WriteLine(String.Format(&lt;span class="str"&gt;"Iterations: {0}"&lt;/span&gt;, iterations));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;  &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                &lt;span class="rem"&gt;//Start the RNGCryptoServiceProvider timing&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                stopwatch.Reset(); &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                stopwatch.Start(); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; iterations; i++) &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                { &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                    gen.GetBytes(randomValues); &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                    BitConverter.ToInt32(randomValues, 0); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                } &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                stopwatch.Stop(); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                TimeSpan rngRandom = stopwatch.Elapsed; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                Console.WriteLine( &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                    String.Format(&lt;span class="str"&gt;"\tRNGCryptoServiceProvider:\t{0}"&lt;/span&gt;, stopwatch.Elapsed)); &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;                &lt;span class="rem"&gt;//Start the System.Random timing&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;                stopwatch.Reset(); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;                stopwatch.Start(); &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; iterations; i++) &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;                { &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;                    generator.Next(); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;                } &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                stopwatch.Stop(); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;                TimeSpan sysRandom = stopwatch.Elapsed;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;                Double speedFactor = Convert.ToDouble(rngRandom.Ticks) / Convert.ToDouble(sysRandom.Ticks); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;                Console.WriteLine( &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;                    String.Format(&lt;span class="str"&gt;"\tSystem.Random:           \t{0}\t~{1:0.00}x faster"&lt;/span&gt;, &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;                                    stopwatch.Elapsed,&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;                                    speedFactor));  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;                Console.WriteLine(); &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            } &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;            Console.ReadLine(); &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;        }  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;    }  &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;style type="text/css"&gt;&lt;br /&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;br /&gt;And here's the results:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://i592.photobucket.com/albums/tt2/Agent_9191/RandomNumberTimes.png" target="_blank"&gt;&lt;img style="border: 0px none ;" alt="image" src="http://lh6.ggpht.com/_iq-Yj9q5eug/SbnOI6rdt7I/AAAAAAAAABE/yJzIZKXrgn0/image%5B19%5D.png?imgmax=800" border="0" width="409" height="267" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The times varied a bit on my Core 2 Duo  2.50 GHz, 32-bit Vista laptop, but this isn't too far from the norm.  It wasn't until 100,000 iterations that it took more that 1/10 of a second to finish, but at that point System.Random was ~279.2 times faster!  The big thing is that even though the number of iterations are was growing by a factor of 10, RNGCryptoServiceProvider seemed to increase the time by more than a factor of 10.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So I guess the bottom line in the System.Random vs. RNGCryptoServiceProvider argument over slowness is in small numbers it doesn't greatly matter.  Now if you're going to be generating more than 100,000 numbers in a very tight loop, it might be worth sacrificing "true" randomness with speed.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-3689849184755174998?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/3689849184755174998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=3689849184755174998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/3689849184755174998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/3689849184755174998'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/03/difference-in-random-number-generation.html' title='The difference in random number generation in .NET'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_iq-Yj9q5eug/SbnOI6rdt7I/AAAAAAAAABE/yJzIZKXrgn0/s72-c/image%5B19%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-5280936689103672399</id><published>2009-01-09T13:41:00.001-06:00</published><updated>2009-01-09T13:41:39.366-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash2009'/><title type='text'>Code Mash session: A Programmer's Guide To User Experience</title><content type='html'>&lt;ul&gt;   &lt;li&gt;Look for most experience, honest, and knowledgeable people for coming up with UX&lt;/li&gt;    &lt;li&gt;When &amp;quot;interviewing&amp;quot; people for what they're looking for in the app, need to have a conversation.&amp;#160; Given through scenarios: &amp;quot;Process a credit card&amp;quot;, &amp;quot;Answer a support call&amp;quot;&lt;/li&gt;    &lt;li&gt;Put all scenarios into a very high level view into a specification document&lt;/li&gt;    &lt;li&gt;Give a one-sentence description of what the app does&lt;/li&gt;    &lt;li&gt;Group features together into sub-projects.&amp;#160; Go over these sub-projects with the users to see if they really fit together and make sense to the user.&lt;/li&gt;    &lt;li&gt;&amp;quot;Is this REALLY something we're really going to need?&amp;quot; &amp;lt;-- feature that you might want to take away/never show to the user&lt;/li&gt;    &lt;li&gt;&amp;quot;Is this something we CAN'T do without?&amp;quot;&lt;/li&gt;    &lt;li&gt;&amp;quot;Maybe we need it...&amp;quot; &amp;lt;-- nice to have's&lt;/li&gt;    &lt;li&gt;Use a sharpie marker for designing the interface so you don't get into the nitty-gritty details&lt;/li&gt;    &lt;li&gt;No laptop during the design phase.&amp;#160; Gets you really thinking about the UI from the user's perspective&lt;/li&gt;    &lt;li&gt;Use native controls for web pages because people know what the controls look like and know what to do with them.&lt;/li&gt;    &lt;li&gt;Typography is extremely important.&amp;#160; Serif fonts are useful for print/small text sizes (&amp;lt; 14pt), San Serif more important for headers.&lt;/li&gt;    &lt;li&gt;Black on White is not always readable.&amp;#160;&amp;#160;&amp;#160; Use a dark gray #333 or so&lt;/li&gt;    &lt;li&gt;1.5em line spacing helps improve readability&lt;/li&gt;    &lt;li&gt;Whitespace is helpful because it improves readability&lt;/li&gt;    &lt;li&gt;Blur the design.&amp;#160; Can you still tell what the point of the design is?&lt;/li&gt;    &lt;li&gt;Designing interfaces is the same as Agile methodology.&amp;#160; Iterations are necessary to build them out appropriately.&lt;/li&gt;    &lt;li&gt;Great way to verify usability when you toss the UI in front of the user&lt;/li&gt;    &lt;li&gt;Watching a user sometimes provides the best way to find out if the UI is really working.&lt;/li&gt;    &lt;li&gt;Paper prototyping can be the most useful that doesn't end up costing too much in terms of development time.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Overall the session was pretty decent.&amp;#160; A little short on length without the Q&amp;amp;A though.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-5280936689103672399?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/5280936689103672399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=5280936689103672399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5280936689103672399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5280936689103672399'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/01/code-mash-session-programmer-guide-to.html' title='Code Mash session: A Programmer&amp;#39;s Guide To User Experience'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-462817855954632702</id><published>2009-01-09T12:35:00.001-06:00</published><updated>2009-01-09T12:35:47.942-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash2009'/><title type='text'>Code Mash Keynote #3: JavaScript Will Save Us All</title><content type='html'>&lt;p&gt;The keynote was given by Eric Meyer.&amp;#160; After a few days of getting up MUCH earlier than I'm used to, I was mostly awake for keynote.&amp;#160; So overall here's some notes from it:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&amp;quot;How I learned to stop worrying and Love the DOM&amp;quot; &lt;/li&gt;    &lt;li&gt;Typeface.js &lt;/li&gt;    &lt;li&gt;Squirrelfish - JS engine in webkit. &lt;/li&gt;    &lt;li&gt;The canvas tag can do amazing things.&amp;#160; IE doesn't support canvas, but there's a JS that will convert it to VML &lt;/li&gt;    &lt;li&gt;dean.edwards.name/ie7 - fixes CSS issues of IE5 &amp;amp; IE6 &lt;/li&gt;    &lt;li&gt;Bluff - JS port of Graff graphing engine from Ruby &lt;/li&gt;    &lt;li&gt;Web browsers can soon become &amp;quot;Speaking Browsers&amp;quot; in that they will read off the content to the user &lt;/li&gt;    &lt;li&gt;Microformats are useful, but they're generally invisible to the user.&amp;#160; There's a Firefox plug-in that will pick them up, but it groups all of them on a page together and it isn't always obvious for the user to keep an eye on the bar.&lt;/li&gt;    &lt;li&gt;Processing.js is an interesting project that makes use of the canvas element&lt;/li&gt;    &lt;li&gt;Objective J came about as a way to carry Objective C to the browser&lt;/li&gt;    &lt;li&gt;280slides.com is a presentation software that's entirely web based&lt;/li&gt;    &lt;li&gt;IETF is the group that takes the &amp;quot;Innovate first, standard second&amp;quot; as opposed to W3C which is &amp;quot;Standardize first, innovate second&amp;quot;&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/1603231381798309901-462817855954632702?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/462817855954632702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=462817855954632702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/462817855954632702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/462817855954632702'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/01/code-mash-keynote-3-javascript-will.html' title='Code Mash Keynote #3: JavaScript Will Save Us All'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-1506472633634994401</id><published>2009-01-09T11:02:00.001-06:00</published><updated>2009-01-09T11:02:40.804-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash2009'/><title type='text'>Code Mash Open Space Session: Getting Started in Speaking</title><content type='html'>&lt;p&gt;Really great information from a group of about a dozen people including myself.&amp;#160; There was definitely a mix of people that have done several talks before, including larger conferences; some that have maybe spoke in front of coworkers or their user group once or twice and just wanted some more tips; and then those that like the idea of being a speaker, but not sure where to start.&amp;#160; Some keys points that were touched on:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Be passionate about what you're speaking on.&amp;#160; It's picked up on really quickly by the audience&lt;/li&gt;    &lt;li&gt;When writing up your abstract and bio, it's a difficult balance to make it interesting and show that you're a trusted source that is worthy of the audience's time&lt;/li&gt;    &lt;li&gt;Make sure to practice the speech, as well as prepare for possible failure points (bad hardware, code doesn't compile, etc.)&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/1603231381798309901-1506472633634994401?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/1506472633634994401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=1506472633634994401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/1506472633634994401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/1506472633634994401'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/01/code-mash-open-space-session-getting.html' title='Code Mash Open Space Session: Getting Started in Speaking'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-935703821434776553</id><published>2009-01-09T10:58:00.001-06:00</published><updated>2009-01-09T10:58:57.320-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash2009'/><title type='text'>Code Mash: Guerilla SOA on the WCF</title><content type='html'>&lt;p&gt;Presented by Joshua Graham. Part of Thought Works&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Thought Works -&amp;gt; Twist - Collaborative Test Automation&lt;/em&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SOA -&amp;gt; Same old architecture?&lt;/li&gt;    &lt;li&gt;ESB -&amp;gt; Erroneous Spaghetti Box?&lt;/li&gt;    &lt;li&gt;Agility -&amp;gt; Embracing change, designs that don't anticipate everything but facilitate change, enabling people to get things done&lt;/li&gt;    &lt;li&gt;Simple, Incremental, Planetary Scale, Integration Architecture&lt;/li&gt;    &lt;li&gt;SOAP was okay, but it had a LOT of downfalls because of tight coupling, versioning, etc.&amp;#160; It's why so many people go to REST&lt;/li&gt;    &lt;li&gt;Many people approach WCF the same way the approach DCOM.&amp;#160; There's a remote object I'll call methods on, get it's state, etc.&lt;/li&gt;    &lt;li&gt;Dynamic type of integration binding helps out a bit, but there's still a lot of overhead.&lt;/li&gt;    &lt;li&gt;Syntactic binding allows a more open connectivity between service and client&lt;/li&gt;    &lt;li&gt;What we wanted&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Not exposing domain model types&lt;/li&gt;      &lt;li&gt;Flexible content model&lt;/li&gt;      &lt;li&gt;No types mirroring content model&lt;/li&gt;      &lt;li&gt;consumer-driven contracts&lt;/li&gt;      &lt;li&gt;light XSD&lt;/li&gt;      &lt;li&gt;Schematron-style validation and message comprehension&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;[MatchAllEndpoints] attribute on a service class?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Overall not that great of a session.&amp;#160; The only &amp;quot;cool&amp;quot; part of the presentation is that he's using a Java client to talk to the service hosted in IIS.&amp;#160; Basically he presented a 100% pre-built solution that doesn't really go into the framework that much because it has one method that creates it's own SOAP message.&amp;#160; The one method processes the message and based on attributes/nodes that are present it will processes the message a certain way.&amp;#160; Defeats the purpose of using WCF because it does a lot of the work automatically.&amp;#160; Guess I'll have to hit on those points when I give my own presentation in March.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-935703821434776553?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/935703821434776553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=935703821434776553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/935703821434776553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/935703821434776553'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/01/code-mash-guerilla-soa-on-wcf.html' title='Code Mash: Guerilla SOA on the WCF'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-8741108567136451854</id><published>2009-01-08T08:20:00.001-06:00</published><updated>2009-01-08T08:20:37.531-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash2009'/><title type='text'>Code Mash Keynote #1: Venkat Subramanian</title><content type='html'>&lt;p&gt;So far there's been several shuffling from the printed schedule, including the order of the keynote speakers.&amp;#160; So the morning keynote for day 1 of Code Mash is Venkat Subramanian with the topic &amp;quot;Pointy-Haired Bosses and Pragmatic Programmers: Facts and Fallacies of Everyday Software Development.&amp;quot;&lt;/p&gt;  &lt;p&gt;Here's some summary points from the keynote:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The semicolon abuses the pinky.&lt;/li&gt;    &lt;li&gt;Often head fallacies as Best Practices.&amp;#160; Generally a good sign it should be questioned.&lt;/li&gt;    &lt;li&gt;Emotion, stress, bias, ignorance, impatience, past events, and intolerance all lead to fallacies about technology&lt;/li&gt;    &lt;li&gt;Asking the question &amp;quot;Why?&amp;quot; will help fix issues.&amp;#160; In general it helps to ask it about 5 times a day to really learn something.&lt;/li&gt;    &lt;li&gt;Fallacy: &amp;quot;More money &amp;amp; time will solve our problems&amp;quot;.&amp;#160; Having clear goals for a project is the best way to get things done.&lt;/li&gt;    &lt;li&gt;Service Packs sound much better than Patches.&amp;#160; You don't have a &amp;quot;problem&amp;quot;, you have a &amp;quot;challenge&amp;quot;.&amp;#160; Technologies aren't &amp;quot;stupid&amp;quot;, they're &amp;quot;interesting&amp;quot;&lt;/li&gt;    &lt;li&gt;The longer the project goes, the more prone it is for failure.&amp;#160; By 3 years it is almost certainly dead&lt;/li&gt;    &lt;li&gt;Big companies can afford to be stupid by spending and spending without shipping software.&amp;#160; Government is the only &amp;quot;company&amp;quot; that can afford that model&lt;/li&gt;    &lt;li&gt;&amp;quot;If your objective is to build what your customers wanted, you will fail.&amp;#160; You need to build what they still want&amp;quot;&lt;/li&gt;    &lt;li&gt;Fallacy: &amp;quot;It's got to be good because it's from this large vendor&amp;quot; &lt;/li&gt;    &lt;li&gt;&amp;quot;Using software because it's free is like getting into arranged marriage for the sake of money.&amp;#160; Where real love?&amp;quot;&lt;/li&gt;    &lt;li&gt;Molding-Colossus Problem: we complain that software is old so we ask vendors to fiddle with it.&lt;/li&gt;    &lt;li&gt;RDD - Resume Driven Design.&amp;#160; Using software because it will look better on your resume than what a project really needs&lt;/li&gt;    &lt;li&gt;Infatuation is fitting the technology to the problem&lt;/li&gt;    &lt;li&gt;Standardization before Innovation == BAD IDEA!&lt;/li&gt;    &lt;li&gt;Fallacy: &amp;quot;We're off-shoring because it will save us money.&amp;quot;&amp;#160; The gap in cost is closing in on 1:1.&amp;#160; Companies figured out they're methods are already failing, so they figured they might as well fail-for-less&lt;/li&gt;    &lt;li&gt;Huge turnover in staff in India off-shore companies&lt;/li&gt;    &lt;li&gt;&amp;quot;Hire smart skilled developers who can learn fast&amp;quot;.&amp;#160; &amp;quot;Small team of highly capable developers is better than large teams of below average developers&amp;quot;.&amp;#160; Off-shoring isn't bad, just take advantage of great talent world-wide.&lt;/li&gt;    &lt;li&gt;Fallacy: &amp;quot;Dynamic Languages are not safe.&amp;quot;&lt;/li&gt;    &lt;li&gt;C programmers are generally excited and say &amp;quot;I can't wait to get to work and see what this crap does today!&amp;quot;&lt;/li&gt;    &lt;li&gt;Java's 13 years old.&amp;#160; What do you expect of a 13 year old???? (in reference to having &amp;quot;2.0 - 1.1&amp;quot; result not be 0.9, but Groovy it works despite being on same JVM engine)&lt;/li&gt;    &lt;li&gt;Generics in Java is screwy because of the backwards compatibility.&lt;/li&gt;    &lt;li&gt;Royal Gorge Bridge is 1000ft above the Arkansas River.&amp;#160; It has a sign that says &amp;quot;No Fishing From Bridge&amp;quot;&lt;/li&gt;    &lt;li&gt;&amp;quot;Humans have a natural tendency to complicate and confuse&amp;quot;.&amp;#160; Especially noticeable at Starbucks with coffee sizes.&lt;/li&gt;    &lt;li&gt;Developers are like prehistoric cave artists.&amp;#160; As soon as the creator walks away, any special meaning to the symbols lose all meaning.&lt;/li&gt;    &lt;li&gt;&amp;quot;My code is not testable&amp;quot; == &amp;quot;My code and design sucks!&amp;quot;&lt;/li&gt;    &lt;li&gt;Unit testing == exercising&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Overall really good stuff, but his use of video, changing color schemes/fonts kind of hurt it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-8741108567136451854?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/8741108567136451854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=8741108567136451854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8741108567136451854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8741108567136451854'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/01/code-mash-keynote-1-venkat-subramanian.html' title='Code Mash Keynote #1: Venkat Subramanian'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-1039892912749604637</id><published>2009-01-07T22:38:00.001-06:00</published><updated>2009-01-07T22:38:17.907-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash2009'/><title type='text'>Code Mash Precompiler (Day 0) review</title><content type='html'>&lt;p&gt;I already posted about my TDD in .NET session from the beginning of the day.&amp;#160; It was really good information to pick up.&amp;#160; It didn't trigger the light bulb for fully understanding TDD like I was hoping for, but it definitely brightened the topic quite a bit for me.&amp;#160; Guess I'll have to start digging into that more to grok it much better.&lt;/p&gt;  &lt;p&gt;In the afternoon there really wasn't really any particular session that seemed absolutely appealing to me.&amp;#160; I've apparently haven't spotted where the Open Spaces sessions are happening so I took the law-of-two-feet approach.&amp;#160; I started out in the Kanban 101 session presented by David Laribee.&amp;#160; Decided on that one because, well, David Laribee is notably known for naming ALT.NET (not creating it, but giving all the principles a collective name).&amp;#160; Overall the session didn't provide me much additional knowledge.&amp;#160; The biggest useful piece of knowledge came from him giving a cursory overview of Mary Poppendieck's Value Stream Mapping session.&amp;#160; That's definitely a topic I want to spend more time digging into as it helps analyze a process and point out where bottlenecks are in resources, be they human or material.&amp;#160; It provides good documentation to take to management when you're fighting for additional resources to increase value in a team so more revenue can be brought into the company.&amp;#160; The other part of that session I caught dealt with setting up and using a Kanban board to track progress of items in the backlog.&amp;#160; I've seen this before and understand how they work, so while the in person explanation was interesting, it didn't help out that much.&lt;/p&gt;  &lt;p&gt;While floating in and out of the Kanban session I wound up in the Windows Azure session.&amp;#160; Basically caught enough information to see that the UI for managing your slice of the cloud isn't impressive nor crappy; that the technology aspect of Azure is pretty solidly laid out and growing, but the political aspect still has a LOT to take into account before pricing &amp;amp; SLA's start being defined; that Azure was another one of Microsoft's &amp;quot;we've been toying with this idea, what do you developers think?&amp;quot; sort of programs; and all the examples they were going to run through are available from Azure's website.&amp;#160; The only useful piece of information I walked away with from the session was what steps to take to get your named bumped up in the queue of people being let into the closed testing of the live cloud.&lt;/p&gt;  &lt;p&gt;By the end of the sessions most of the sponsors had started showing up and getting things set up.&amp;#160; And they're evil I tell you.&amp;#160; Pure evil.&amp;#160; They had Rock Band 2 set up.&amp;#160; &lt;a href="http://twitpic.com/10kn6" target="_blank"&gt;Here's a picture&lt;/a&gt; of people getting into it after I rocked out a few songs.&lt;/p&gt;  &lt;p&gt;After the dinner Carl Franklin and Richard Campbell got things set up for recording the panel discussion for an episode of &lt;a href="http://www.dotnetrocks.com/" target="_blank"&gt;.NET Rocks&lt;/a&gt;.&amp;#160; Richard gave a great retelling of the &lt;a href="http://twitpic.com/10lqv" target="_blank"&gt;story of Goliath&lt;/a&gt; and the magnets it had in it (first told on an episode of &lt;a href="http://mondays.pwop.com" target="_blank"&gt;Mondays&lt;/a&gt;).&amp;#160; I can't find which show it was, otherwise I'd link to it because it's a great story.&amp;#160; Then began the panel discussion on RIA.&amp;#160; The funny part was keeping an eye on twitter tags for Code Mash (&lt;a href="http://search.twitter.com/search?q=%23codemash" target="_blank"&gt;#codemash&lt;/a&gt; and &lt;a href="http://search.twitter.com/search?q=%23codemash2009" target="_blank"&gt;#codemash2009&lt;/a&gt;) you could see that every one of the panel guys had sent at least one tweet while the recording was going on.&amp;#160; And they were given a bottle of bourbon as a gift which they started off started drinking during the show (I'm sure it will be in the show when it's published).&amp;#160; The part you'll miss out on when you listen to the show is that when there was a few glasses worth of bourbon left in the bottle Carl kept looking around the audience and gesturing for people to have a glass.&amp;#160; That was too funny.&lt;/p&gt;  &lt;p&gt;To finish off the day I made my way around the sponsor booths again and surrendered my contact information to even more companies.&amp;#160; Hey, they have awesome swag that'd be cool to win, but having about a 1/400 chance of winning I doubt I'll actually win anything.&amp;#160; And had another go at Rock Band.&lt;/p&gt;  &lt;p&gt;I'm looking forward to the sessions tomorrow, which I'm sure there's going to be much more to cover since there'll be 5 sessions to attend.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-1039892912749604637?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/1039892912749604637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=1039892912749604637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/1039892912749604637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/1039892912749604637'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/01/code-mash-precompiler-day-0-review.html' title='Code Mash Precompiler (Day 0) review'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-1230893480164055156</id><published>2009-01-07T11:26:00.001-06:00</published><updated>2009-01-07T11:26:16.745-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeMash2009'/><title type='text'>Code Mash 2009: TDD in .NET</title><content type='html'>&lt;p&gt;This will start my &amp;quot;blogging on the go&amp;quot; posts with primarily notes from the sessions I'm attending.&amp;#160; This class was pretty useful for digging into TDD if you're at least familiar with unit testing.&amp;#160; The lecture was primarily less than an hour with the vast majority of it being a really large pair programming session.&amp;#160; The instructor was Phillip Japikse.&amp;#160; Really good stuff&lt;/p&gt;  &lt;p&gt;* 2 main type of testing: state-based testing; interaction-based testing&lt;/p&gt;  &lt;p&gt;* &amp;quot;Software Defect Reduction Top 10 List&amp;quot; IEEE Computer January 2001&lt;/p&gt;  &lt;p&gt;* state-based - initialize, provide initial data, interact with it, assert something changed (or did not), must test for both Happy &amp;amp; Unhappy paths&lt;/p&gt;  &lt;p&gt;* Interaction-based - verify behavior of SUT, mock the object, ensure behavior acts &lt;/p&gt;  &lt;p&gt;* Code Coverage - rough measure of what's tested.&amp;#160; Just another metric.&amp;#160; Roughly 80%&lt;/p&gt;  &lt;p&gt;* Dependency Injection is also known as IoC.&amp;#160; Doesn't really cover the differences though.&amp;#160; Basically covers it's for separating instantiation/implementation.&lt;/p&gt;  &lt;p&gt;* Constructor Injection; Setter Injection; Interface Injection&lt;/p&gt;  &lt;p&gt;* SWAG = Scientific Wild Ass Guess&lt;/p&gt;  &lt;p&gt;* Pre-requirements for TDD: Need requirements, ready access to the Product Owner, Source Control System&lt;/p&gt;  &lt;p&gt;* no bugs, write opportunities for other developers to fix&lt;/p&gt;  &lt;p&gt;* when refactoring, eliminate duplicate code or anything that isn't self-documenting if it's complex.&lt;/p&gt;  &lt;p&gt;* writing tests - Name should describe the action of the SUT&lt;/p&gt;  &lt;p&gt;* Add the correct Assertions&lt;/p&gt;  &lt;p&gt;* Flush out the code to enable the build&lt;/p&gt;  &lt;p&gt;* keep list of tests close to workstation - useful to write ideas about other tests on piece of paper (To Do items).&amp;#160; Keeps focus on current work.&amp;#160; Go for easiest ones first.&amp;#160; fresh sheet of paper every day, with not-done items as first items&lt;/p&gt;  &lt;p&gt;* possibly leave the last test in a failed state to get you back into the mindset.&amp;#160; Helps jog the memory&lt;/p&gt;  &lt;p&gt;* TDD should be applied to any code you actually write.&amp;#160; TED should be for Generated Code (somewhat...)&lt;/p&gt;  &lt;p&gt;* FTW: QA team can actually come up with value-adding issues.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-1230893480164055156?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/1230893480164055156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=1230893480164055156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/1230893480164055156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/1230893480164055156'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2009/01/code-mash-2009-tdd-in-net.html' title='Code Mash 2009: TDD in .NET'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-2942250552139759977</id><published>2008-10-04T17:21:00.001-05:00</published><updated>2008-10-04T17:21:03.434-05:00</updated><title type='text'>Preventive Maintenance</title><content type='html'>&lt;p&gt;As I'm sitting here waiting for the numbness from my root canal earlier to wear off, I'm thinking about the preventive maintenance I could have performed to prevent needing it.&amp;#160; The standard stuff comes to mind of brush on a more regular basis, floss or use mouthwash, visit the dentist at least twice a year.&amp;#160; You know, the basics.&amp;#160; Stuff that is fairly common knowledge, but it's a matter of taking the time out of an already busy schedule to do the work necessary.&lt;/p&gt;  &lt;p&gt;How does this apply to software?&amp;#160; If you think about it, it parallels pretty well.&amp;#160; Having to fix a bug in production is much the same as spending time in the dentist chair getting a cavity fixed (or in my case, a root canal).&amp;#160; Even worse is a full outage due to a error lingering in the code base that could have been prevented early on.&amp;#160; Code audits done every week or two is similar to brushing and flossing daily to prevent rot.&amp;#160; Checking with users a few times a year ensures the product is still fitting their needs and performing as they expect.&amp;#160; Granted your dentist doesn't come to you checking if everything is okay, but a couple check ups a year still prevents bigger problems.&lt;/p&gt;  &lt;p&gt;It even applies to IT professionals.&amp;#160; Sure everybody does backups because it needs to be done, but how often are the backups checked by restoring from them?&amp;#160; If a system winds up becoming corrupted and a backup fails, it's the same as having to have a tooth pulled.&amp;#160; Both have to be replaced entirely.&amp;#160; On a more regular basis they should be verifying the systems are running as expected.&amp;#160; No excessive CPU spikes, adequate free disk space, no bloated memory usage.&lt;/p&gt;  &lt;p&gt;Just as a toothbrush and floss help with regular maintenance of your teeth, tools like unit testing and system monitoring help with hardware and software maintenance.&amp;#160; The real question is, how often do you practice your IS &amp;amp; IT maintenance?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-2942250552139759977?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/2942250552139759977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=2942250552139759977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2942250552139759977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2942250552139759977'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2008/10/preventive-maintenance.html' title='Preventive Maintenance'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-6541364035800598615</id><published>2008-08-21T09:18:00.004-05:00</published><updated>2008-08-21T10:38:46.852-05:00</updated><title type='text'>The joys of Apache webserver and modules</title><content type='html'>I've been fighting an issue with Apache 2.2.8 on Ubuntu 8.04.1 (Codename Hardy Heron) to get my Subversion repository to authenticate over LDAP for work.  We had previously set it up on Apache 2.0 on Gentoo.  It was a week long battle, but we got it working.  I figured that since we figured it out on there it should be a pretty straight forward approach this time around.  Yeah, that was wishful thinking!&lt;br /&gt;&lt;br /&gt;Doing the standard Google searches I came across the step by step guides of how to configure it (most were building from scratch).  With the beauty of apt-get I had everything I needed in no time at all (Seriously wish there was a Windows alternative to that...).  I created the repository for Subversion, configured Apache and Subversion to start up automatically, and added in the Subversion modules to Apache (which threw me off as it was a link in /etc/apache2/mods-enabled to /etc/apache2/mods-available).  Restart Apache and everything still worked so it was time to configure a location for the repository.  So following the standard layout I found on every other Google search I set it to the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Location /repos&amp;gt;&lt;br /&gt;  DAV svn&lt;br /&gt;  SVNPath /path/to/repository&lt;br /&gt;  AuthType Basic&lt;br /&gt;  AuthLDAPEnabled on&lt;br /&gt;  AuthLDAPAuthoritative on&lt;br /&gt;&lt;br /&gt;  Options Indexes FollowSymLinks&lt;br /&gt;  AllowOverride None&lt;br /&gt;  order allow,deny&lt;br /&gt;  allow from all&lt;br /&gt;&lt;br /&gt;  AuthName "Subversion Repository"&lt;br /&gt;  AuthLDAPBindDN "cn=Subversion User,dc=domain,dc=com"&lt;br /&gt;  AuthLDAPBindPassword UserPassword&lt;br /&gt;  AuthLDAPUrl "ldap://domain.com:389/dc=domain,dc=com?sAMAccountName?sub?(objectclass=user)"&lt;br /&gt;&lt;br /&gt;  Require valid-user&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I go to restart and I get a marvelous error message of:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Invalid command 'AuthLDAPEnabled', perhaps misspelled or defined by a module not  included in the server configuration&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It wasn't until some repetitive googling later that I came across this amazing post that provided some insite:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linuxforums.org/forum/servers/124011-apache-ldap-authentication.html"&gt;http://www.linuxforums.org/forum/servers/124011-apache-ldap-authentication.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With a little ingenuity, I figured out the correct set up for us was this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Location /repos&amp;gt;&lt;br /&gt;  DAV svn&lt;br /&gt;  SVNPath /path/to/repository&lt;br /&gt;  AuthBasicProvider ldap&lt;br /&gt;  AuthType Basic&lt;br /&gt;#   AuthLDAPEnabled on&lt;br /&gt;  AuthzLDAPAuthoritative on&lt;br /&gt;&lt;br /&gt;  Options Indexes FollowSymLinks&lt;br /&gt;  AllowOverride None&lt;br /&gt;  order allow,deny&lt;br /&gt;  allow from all&lt;br /&gt;&lt;br /&gt;  AuthName "Subversion Repository"&lt;br /&gt;  AuthLDAPBindDN "cn=Subversion User,dc=domain,dc=com"&lt;br /&gt;  AuthLDAPBindPassword UserPassword&lt;br /&gt;  AuthLDAPUrl "ldap://domain.com:389/dc=domain,dc=com?sAMAccountName?sub?(objectclass=user)"&lt;br /&gt;&lt;br /&gt;  Require valid-user&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now to actually continue on with why I had to set up another Subversion server...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-6541364035800598615?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/6541364035800598615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=6541364035800598615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/6541364035800598615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/6541364035800598615'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2008/08/joys-of-apache-webserver-and-modules.html' title='The joys of Apache webserver and modules'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-8675677439496966008</id><published>2007-09-14T11:20:00.000-05:00</published><updated>2007-09-14T11:41:11.060-05:00</updated><title type='text'>Highly Dorky Nerd King</title><content type='html'>So came across this interesting little test via &lt;a href="http://feeds.feedburner.com/AContinuousLearnersWeblog"&gt;Continous Learner RSS&lt;/a&gt; (&lt;a href="http://spietrek.blogspot.com/2007/09/nerd-test.html"&gt;http://spietrek.blogspot.com/2007/09/nerd-test.html&lt;/a&gt;).  So I'm a nerd and I'm proud!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nerdtests.com/nt2ref.html"&gt;&lt;img src="http://www.nerdtests.com/images/badge/nt2/14a33d74ccd8003f.png" alt="NerdTests.com says I'm a Highly Dorky Nerd King.  What are you?  Click here!" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-8675677439496966008?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/8675677439496966008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=8675677439496966008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8675677439496966008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/8675677439496966008'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2007/09/highly-dorky-nerd-king.html' title='Highly Dorky Nerd King'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-5290398092578652111</id><published>2007-07-19T20:58:00.000-05:00</published><updated>2007-07-19T21:30:12.260-05:00</updated><title type='text'>TV costs you at least $10,000/year</title><content type='html'>Came across an article about how &lt;a href="http://www.savingadvice.com/blog/2007/07/17/101625_how-dumping-tv-allowed-me-to-quit-my-job-create-an-online-business-and-fund-my-retirement-account.html"&gt;TV costs you more than you may currently realize&lt;/a&gt;.  In all honesty I never thought about it in terms of my worth, but I made the move to drop the expense of TV over two years ago.  I ended up becoming a big fan of Blockbuster Online because at the time I had a store just a couple miles down the road from me.  When they switched their business model to allow for the in store movie exchange I became hooked.  Forget about Netflix where I might be able to see three movies a week, with Blockbuster I'm able to catch up on six a week (three from my online queue and three from the store).  Lately I've been so busy with work that I don't even bother with trading the movies in at the store.&lt;br /&gt;&lt;br /&gt;Although I haven't gone in the direction of making use of this extra free time from lack of TV, I do value the time away to not let my brain just rot.  I've also noticed a funny thing about society in my lack of TV viewing:  people form a lot of conversation around what's on TV.  There's been several times when coworkers have asked me if I saw a TV show or even a commercial that was on the night before.  That's when I remind them of my TV viewing habits and the conversation falls into silence.  Some point me to Youtube to catch the commercial, but that I've tried to avoid as well.  User generated content is all well and good, but the quality of that content leaves a lot to be desired and how much of it is actually education or beneficial in some way?  I'd have to say almost none, but I'd be happy if somebody could prove me wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-5290398092578652111?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/5290398092578652111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=5290398092578652111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5290398092578652111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5290398092578652111'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2007/07/tv-costs-you-at-least-10000year.html' title='TV costs you at least $10,000/year'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-483782137387461972</id><published>2007-07-14T11:21:00.000-05:00</published><updated>2007-07-14T11:49:47.106-05:00</updated><title type='text'>Login experiences for the standard end user</title><content type='html'>So I was making my way through my long self made RSS feed of webpages to read through and several of the pages were ones that require me to create an account on the site.  Now in true Web 2.0 experience some of them allow you to browse around the site, even start adding personalized content without creating an account first.  This in and of itself is a very cool trick I wish more content driven websites would embrace.  But this isn't the point that I'm trying to make.  The point is when it actually came time to create that account.  Many people pick out a username for an online account and then stick with it at every other website they create an account at.  This would be all well and good except there's no standards on what are valid characters in usernames and even passwords.  I can't use symbols in my username or my password?  Or numbers?  Okay then, I'll just stick with something like 'password' to log into my account since you're asking to have my information stolen easily.  Seriously, it's not that hard to accommodate those characters.  And especially in the password since the site should be using some sort of cryptography anyways so that anybody going into the database can't see the password in plain text or be able to reverse the password.&lt;br /&gt;&lt;br /&gt;For the username I can't see a purpose for explicitly denying symbols and in some cases numbers either.  Unless the site is making use of symbols behind the scenes to state that a username has special attributes to it, there's no reason to deny the symbols.  And if the site is doing this, they really need to reevaluate what they're trying to achieve because this kind of programming trickery just leads to headaches down the road.&lt;br /&gt;&lt;br /&gt;So one solution that I've come across that works much better than remembering odd combinations of nonstandard usernames is to use a common email address as the username.  Since I've come to focus all my email through one solution (namely &lt;a href="http://gmail.com/"&gt;Gmail&lt;/a&gt;), it's easier to remember what email address to use.  Plus with a number of sites that send out the occasional reminders or notifications to the email address I can go to the site and be able to remember right away what the username and (generally) password are for it.  What gets annoying is when sites explicitly make use of the email as the username, but don't label the text box as such.  One of those tips that most developers keep overlooking: &lt;i&gt;if it is hard to use, it will hardly be used&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-483782137387461972?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/483782137387461972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=483782137387461972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/483782137387461972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/483782137387461972'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2007/07/login-experiences-for-standard-end-user.html' title='Login experiences for the standard end user'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-5163299663031482603</id><published>2007-02-07T23:34:00.000-06:00</published><updated>2007-01-14T11:57:51.302-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gripe'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>And people wonder why politicians aren't considered intellectual...</title><content type='html'>Okay, I just found found this &lt;a href="http://techdirt.com/articles/20070207/064102.shtml"&gt;article on Tech Dirt&lt;/a&gt; that's talking about a proposed &lt;a href="http://www.wnbc.com/news/10948106/detail.html"&gt;bill in New York&lt;/a&gt; that'd ban people from using an electronic device while crossing the street.  Are you kidding me?  A couple people kindly remove themselves from the gene pool (without even trying for a &lt;a href="http://www.darwinawards.com/"&gt;Darwin Award&lt;/a&gt;) and this is the way to "fix" the problem.  Anybody who is backing this bill is saying that people are too stupid to pay attention to their surroundings.  While their at it why don't they propose that all cars should have audio distractions removed from them before they can be sold in the US.  Even better, anything that can cause a driver to take their eyes off the road (like a billboard) should be illegal.  That way there's absolutely NO possible way people can be distracted and cause injury to somebody else with a vehicle.&lt;br /&gt;&lt;br /&gt;Seriously people, what is this world coming to?  Has common sense really been tossed out the window?  I like to think that with the advancing sciences that humanity is getting smarter, but things like this really make me question that...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-5163299663031482603?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/5163299663031482603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=5163299663031482603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5163299663031482603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/5163299663031482603'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2007/02/and-people-wonder-why-politicians-arent.html' title='And people wonder why politicians aren&apos;t considered intellectual...'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1603231381798309901.post-2828929888089299577</id><published>2007-01-05T20:28:00.000-06:00</published><updated>2007-01-05T20:34:06.999-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='1984'/><category scheme='http://www.blogger.com/atom/ns#' term='quote'/><title type='text'>Quote from 1984</title><content type='html'>[on the subject of Newspeak] "It's a beautiful thing, the destruction of words.  Of course the great wastage is in the verbs and adjectives, but there are hundreds of nouns that can be got rid of as well.  It isn't only the synonyms; there are also the antonyms.  After all, what justification is there for a word which is simply the opposite of some other words?  A word contains its opposite in itself.  Take 'good,' for instance.  If you have a word like 'good,' what need is there for a word like 'bad'?  'Ungood' will do just as well--better, because it's an exact opposite, which the other is not.  Or again, if you want a stronger version of 'good,' what sense is there in having a whole string of vague useless words like 'excellent' and 'splendid' and all the rest of them?  'Plusgood' covers the meaning, or 'doubleplusgood' if you want something stronger still.  Of course we use those forms already, but in the final version of Newspeak there'll be nothing else.  In the end the whole notion of goodness and badness will be covered in only six words--in reality, only one word."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1603231381798309901-2828929888089299577?l=sleeplessmonkey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sleeplessmonkey.blogspot.com/feeds/2828929888089299577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1603231381798309901&amp;postID=2828929888089299577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2828929888089299577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1603231381798309901/posts/default/2828929888089299577'/><link rel='alternate' type='text/html' href='http://sleeplessmonkey.blogspot.com/2007/01/quote-from-1984.html' title='Quote from 1984'/><author><name>Steve</name><uri>http://www.blogger.com/profile/08355995481107234014</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_iq-Yj9q5eug/TBbWOes58uI/AAAAAAAAAEI/7IZmYcJBJng/S220/avatarpic-l.jpg'/></author><thr:total>0</thr:total></entry></feed>
