<?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-5940180558573941982</id><updated>2012-02-16T09:28:37.777-05:00</updated><category term='alias'/><category term='logging'/><category term='ebooks'/><category term='hotmail'/><category term='CodingBestPractices'/><category term='intro'/><category term='ipad'/><category term='instance'/><category term='temporal'/><category term='mssql'/><category term='publishing'/><category term='c#'/><category term='hard drives'/><category term='sqlserver'/><category term='sharepoint'/><category term='iphone'/><category term='excel'/><category term='WebParts'/><category term='source code analysis'/><category term='ipod'/><category term='log4net'/><category term='microsoft'/><category term='winxp'/><category term='asp.net'/><category term='.net'/><category term='performance'/><category term='PersonalDevelopment'/><category term='moss'/><category term='gmail'/><category term='itunes'/><category term='database'/><category term='google'/><category term='ndepend'/><title type='text'>BigJimInDC</title><subtitle type='html'>Those seeking the truth are not just friends, but brothers!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-4624774674169041626</id><published>2010-03-19T10:45:00.001-04:00</published><updated>2010-03-19T10:45:08.140-04:00</updated><title type='text'>The Application of Pareto's Principle to the Adoption of Agile Practices - Part 1 of N</title><content type='html'>&lt;span style="font-size:85%;"&gt;Starting this evening, I will be attending the &lt;a style="font-weight: bold;" href="http://wiki.agilecoachcamp.org/tiki-index.php?page=NorthCarolina2010"&gt;Agile Coach Camp in Durham, NC&lt;/a&gt;.  As the only registration fee for attending the ACC is to submit a position paper on a topic of interest to you, I submitted the following abstract.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;The Application of Pareto's Principle to the Adoption of Agile Practices&lt;/span&gt;&lt;br /&gt;If you believe in Pareto's Principle (otherwise known as the 80-20  Rule), then you believe that it can be applied literally everywhere. At  its heart, Agile practices are about doing what works and ignoring the  rest (at least until the time is right). In a world where people are  constantly searching for silver bullets, getting distracted by zealot  turf wars, and feeling the crunch of deadlines, novice adopters of Agile  practices need to learn what out of"agile" is immediately important for  their situation, and what they can safely ignore until a latter point  in time.&lt;/blockquote&gt;So I figure why not put some more concrete thoughts together before the ACC starts.  This post is the first of probably a couple posts on this topic, with probably at least one being a follow-up if my topic gets accepted as a discussion topic.  Seeing how I average roughly 5 hits/month on this blog, it wouldn't hurt to get a little more traffic!&lt;br /&gt;&lt;br /&gt;I also want to emphasize one important point to avoid having to defend a position that I'm &lt;span style="font-weight: bold; font-style: italic;"&gt;not &lt;/span&gt;taking.  This opinion of mine revolves around the &lt;span style="font-weight: bold; font-style: italic;"&gt;adoption&lt;/span&gt; of agile practices.  It in no way is an attempt to water down agile, as every individual practice discussed below certainly adds value and should be part of the full vision for any team attempting to &lt;span style="font-weight: bold; font-style: italic;"&gt;go agile&lt;/span&gt;.  This opinion simply revolves around the idea of getting the most bang for your buck up front so that you can get all of the nay-sayers on board the agile train sooner than later.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Review of the 80-20 Rule&lt;/span&gt;&lt;br /&gt;The &lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/Pareto_principle"&gt;80-20 Rule&lt;/a&gt; is typically explained as for any given "effort", the first 80% of the results you are looking for will be accomplished with only 20% of your time and energy, while the final 20% of the results will take 80% of your time and energy.  When applying this to the adoption of agile practices in software development efforts, the gist is that only 20% of the ideas/topics will get you 80% of what you were looking for when you decided to start using agile practices.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Review of Agile topics&lt;/span&gt;&lt;br /&gt;For the sake of discussion, I'm going to use part of &lt;a style="font-weight: bold;" href="http://jamesshore.com/Agile-Book/"&gt;James Shore&lt;/a&gt;'s table of contents from his book The Art of Agile Development.  The following is Part II - Practicing XP from his ToC, as these are the concrete practices that his book discusses:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;5.  Thinking&lt;/span&gt; (1. Pair Programming, 2. Energized Work, 3. Informative Workspace, 4. Root-Cause Analysis, 5. Retrospectives&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;6. Collaborating&lt;/span&gt; (1. Trust, 2. Sit Together, 3. Real Customer Involvement, 4. Ubiquitous Language, 5. Stand-Up Meetings, 6. Coding Standards, 7. Iteration Demo, 8. Reporting)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;7. Releasing&lt;/span&gt; (1. "Done Done", 2. No Bugs, 3. Version Control, 4. Ten-Minute Build, 5. Continuous Integration, 6. Collective Code Ownership, 7. Documentation)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;8. Planning&lt;/span&gt; (1. Vision, 2. Release Planning, 3. The Planning Game, 4. Risk Management, 5. Iteration Planning, 6. Slack, 7. Stories, 8. Estimating)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;9. Developing&lt;/span&gt; (1. Incremental Requirements, 2. Customer Tests, 3. Test-Driven Development, 4. Refactoring, 5. Simple Design, 6. Incremental Design and Architecture, 7. Spike Solutions, 8. Performance Optimization, 9. Exploratory Testing)&lt;/blockquote&gt;The above chunk of his ToC represents a total of 37 practices across 5 concepts areas.  As this opinion paper is not about paraphrasing James Shore's book, I will not make any attempt to describe any of the above practices any more than is necessary to make my points.  If you are unfamiliar with any of the valuable practices that he describes, buy and read the book.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My 20% - Take 1&lt;/span&gt;&lt;br /&gt;Seeing how James broke out the 37 practices into 5 concept areas, that makes it easy for me to make my first arbitrary application of the 80-20 Rule and grab &lt;span style="font-weight: bold;"&gt;Chapter 7 (Releasing)&lt;/span&gt; from above as the one concept area that you will get the biggest bang for your buck on.  As software developers we get paid to produce working software.  I've seen many a team over the past 15 years get caught up when releasing new versions of their software.  Some developers spent days to weeks just trying to get the code to compile.  Others had to "wing it" during the deployment of the code to a test server (the consummate "it worked on my machine" excuse).  If you can't look at your current situation and proudly say we have the whole release process down pat and can consistently get new releases out with minimal effort, then start with this chapter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My 20% - Take 2&lt;/span&gt;&lt;br /&gt;Given the first application of the 80-20 Rule above to the 5 concept areas, this second application of the rule is going to be across the 37 practices (20% of 37 = 7.4 practices).  My list of the 8 practices out of James Shore's 37 practices are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#1 - Thinking - Root-Cause Analysis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;James Shore's 99 words description:&lt;br /&gt;&lt;/span&gt;&lt;blockquote class="ninetynine_words"&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;When mistakes occur, blame your process, not people.  Root-cause  analysis helps.  What allowed the mistake to happen?  What will prevent  them in the future?  Assume people will continue to make mistakes and  build fault-tolerance into your improvements.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;One approach: ask "why" five times.  Use it for every problem you  encounter, from the trivial to the significant.  You can apply some  solutions yourself.  Some will require team discussion, and others need  coordination with the larger organization.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;When mistakes become rare, avoid over-applying root-cause analysis.   Balance the risk of error against the cost of more process overhead.&lt;/span&gt;&lt;/p&gt;  &lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;My take on it:&lt;br /&gt;&lt;blockquote&gt;This practice is actually a twist on the 80-20 Rule in that it focuses you in on the issue that actually does need to be worked on rather than the issue that you either think needs to be worked on or worse case, the issue that you simply would like to work on.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;#2 - Collaborating - Trust&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;James Shore's 99 words description:&lt;br /&gt;&lt;blockquote&gt;For maximum productivity, team members must rely on each other for help. They must take joint responsibility for their work. Trust is essential. To improve trust, foster empathy. Learn about your teammates' joys and concerns. Sitting together helps, as does eating together. Preserve productive teams by keeping them together for multiple projects.&lt;br /&gt;&lt;br /&gt;  Organizational trust is also essential. Be energetic, deliver on your commitments, and be honest about problems. Show that you care about your stakeholders' goals. Promote your work through friendly openness. Always be honest about your achievements. Avoid the temptation to whitewash problems or misrepresent partially-done work.&lt;br /&gt;&lt;/blockquote&gt;My take on it:&lt;br /&gt;&lt;blockquote&gt;In life as a whole a lack of trust leads to a constant downward spiral of every relationship.  In agile, we are talking about teams, including both developers and customers, and therefore we are talking about relationships.  Without trust, the process is going to fail.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;#3 - Collaborating - Real Customer Involvement&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;James Shore's 99 words description:&lt;br /&gt;&lt;blockquote&gt;To widen your perspective, involve real customers. The best approach depends on your market.&lt;br /&gt;&lt;br /&gt;  Personal development: you are the real customer. Congratulations. Go forth and write algorithms.&lt;br /&gt;&lt;br /&gt;  In-house custom development: turn your real customers into on-site customers.&lt;br /&gt;&lt;br /&gt;  Outsourced custom development: get real customers to be on-site customers. If you can't, stay in touch and meet face-to-face frequently.&lt;br /&gt;&lt;br /&gt;  Vertical-market and horizontal-market software: beware of giving one customer too much control. Appoint a product manager to understand customer needs. Create opportunities to solicit feedback. Examples: customer review board, beta releases, and user experience testing.&lt;br /&gt;&lt;/blockquote&gt;My take on it:&lt;br /&gt;&lt;blockquote&gt;In my corner of the world, teams of "consultants" attack projects with little to no subject matter expertise but armed with years of experience in producing working software.  This demands that customers are involved throughout the process, as only the customers have the subject matter expertise necessary for the project's success.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;#4 - Releasing - "Done Done"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;James Shore's 99 words description:&lt;br /&gt;&lt;blockquote&gt;A story is only complete when on-site customers can use it as they intended. In addition to coding and testing, completed stories are designed, refactored, and integrated. The build script builds, installs, and migrates data for the story. Bugs have been identified and fixed (or formally accepted), and customers have reviewed the story and agree it's complete.&lt;br /&gt;&lt;br /&gt;   To achieve this result, make progress on everything each day. Use test-driven development to combine testing, coding, and design. Keep the build up to date and integrate continuously. Demonstrate progress to your customers and incorporate their feedback as you go.&lt;br /&gt;&lt;/blockquote&gt;My take on it:&lt;br /&gt;&lt;blockquote&gt;Seeing how I called out &lt;span style="font-weight: bold; font-style: italic;"&gt;Releasing&lt;/span&gt; as the single most important concept area, I'm going to go forward and proclaim that this particular practice is the single most important practice of all.  Teams must be able to demonstrate progress daily and the sub-practices of test driven development and continuous integration are fundamental to enabling that.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;#5 - Planning - Vision&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;James Shore's 99 words description:&lt;br /&gt;&lt;blockquote&gt;Every project needs a single vision, and the product manager must unify, communicate, and promote that vision.&lt;br /&gt;&lt;br /&gt;   Distance between visionaries and the product manager increases error and waste. If you only have one visionary, the best approach is for him to be product manager. Alternatively, use the visionary's protogé.&lt;br /&gt;&lt;br /&gt;   Some projects have multiple visionaries. They need to combine their ideas into a unified vision. The product manager facilitates discussion and consensus.&lt;br /&gt;&lt;br /&gt;   Document the vision with what success is, why it's important, and how you know you've achieved it. Post it prominently and involve your visionaries in planning and demos.&lt;br /&gt;&lt;/blockquote&gt;My take on it:&lt;br /&gt;&lt;blockquote&gt;Without a vision, a team can never confidently answer the question "is this topic important?"  And without being able to answer that question, teams can get caught up in building software that they &lt;span style="font-weight: bold; font-style: italic;"&gt;think &lt;/span&gt;is needed, without being able to justify it.  That ultimately leads to lost productivity when they incorrectly answer that question.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;#6 - Planning - Release Planning&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;James Shore's 99 words description:&lt;br /&gt;&lt;blockquote&gt;Maximize your return on investment by:&lt;br /&gt;&lt;br /&gt;      1. working on one project at a time;&lt;br /&gt;      2. releasing early and often;&lt;br /&gt;      3. adapting your plans;&lt;br /&gt;      4. keeping your options open; and&lt;br /&gt;      5. planning at the last responsible moment.&lt;br /&gt;&lt;br /&gt;   Use timeboxing to control your schedule. Set the release date, then manage scope to meet that date. This forces important prioritization decisions and makes the endpoint clear.&lt;br /&gt;&lt;br /&gt;   Prioritized Minimum Marketable Features (MMFs) and stories form the body of your plan. Demonstrate your progress as you develop and use that feedback to revise your plan.&lt;br /&gt;&lt;br /&gt;   To minimize rework, develop the details of your requirements at the last responsible moment.&lt;br /&gt;&lt;/blockquote&gt;My take on it:&lt;br /&gt;&lt;blockquote&gt;Some adopters of agile think that agile is all about "no documentation and no planning".  They couldn't be more wrong, and thus why I'm including this practice.  As James Shore points out, agile planning is about planning and adapting to changes.&lt;br /&gt;&lt;br /&gt;This is in contrast to project managers of the past who created a project plan in MS Project at the beginning of the project and God help you if you as a developer created a situation where that project manager had to open MS Project after the project started to adjust the plan based on new information.&lt;br /&gt;&lt;br /&gt;While I don't believe that there is anything particularly wrong with using MS Project, when using it in an agile environment the project manager maintaining the plan &lt;span style="font-weight: bold; font-style: italic;"&gt;must &lt;/span&gt;update it weekly.  If they don't do this, then they need to either throw out agile or throw out MS Project.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;#7 - Developing - Test Driven Development (TDD)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;James Shore's short description:&lt;br /&gt;&lt;blockquote&gt;We produce well-designed, well-tested, and well-factored code in small, verifiable steps.&lt;/blockquote&gt;My take on it:&lt;br /&gt;&lt;blockquote&gt;From a code construction point of view, if your team is not already using TDD, adopting TDD will raise the level of quality of the software that your teams are delivering.  Simple as that.&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;#8 - Developing - Incremental Requirements&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;James Shore short description:&lt;br /&gt;&lt;blockquote&gt;We define requirements in parallel with other work via living requirements documents and working incrementally.&lt;/blockquote&gt;My take on it:&lt;br /&gt;&lt;blockquote&gt;Even in the best of the waterfall projects of days gone by that I worked on (and apparently even on the ones that I didn't), the up front requirements phase &lt;span style="font-weight: bold; font-style: italic;"&gt;never &lt;/span&gt;produced a &lt;span style="font-weight: bold; font-style: italic;"&gt;complete &lt;/span&gt;set of requirements.  The agile practice of incremental requirements simply accepts that as a fact and creates a solution framework for continually dealing with it as the norm, rather than treating it as &lt;span style="font-weight: bold; font-style: italic;"&gt;scope creep&lt;/span&gt; and denouncing it as something unexpected and bad.&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Closing Thoughts&lt;/span&gt;&lt;br /&gt;Hopefully this sparks some level of discussion for this weekend's Agile Coach Camp.  If not oh well...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-4624774674169041626?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/4624774674169041626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=4624774674169041626' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/4624774674169041626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/4624774674169041626'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2010/03/application-of-paretos-principle-to.html' title='The Application of Pareto&apos;s Principle to the Adoption of Agile Practices - Part 1 of N'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-1390998532081652389</id><published>2010-01-27T16:30:00.002-05:00</published><updated>2010-01-27T16:40:12.220-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ebooks'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>Apple iPad and Text Books</title><content type='html'>I'm probably not going to be the first one to mention this, but I want to go on record as early as possible that the single "killer app" for the newly released &lt;a href="http://www.apple.com/ipad/"&gt;iPad&lt;/a&gt; is college text books.&lt;br /&gt;&lt;br /&gt;I've been an &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; 3GS owner since the day it was released and have loved every second of it.  That is in stark contrast to the prior years of owning Palm and Windows Mobile phones, of which to say were terrible is in understatement.  I've also been a huge &lt;a href="http://www.apple.com/ipod/"&gt;iPod&lt;/a&gt; supporter for years now too, having recently bought my third one.&lt;br /&gt;&lt;br /&gt;That said, I personally don't see any use for the new iPad.  I currently use my iPhone for email and web surfing, and could see where using an iPad would be nicer, given its bigger screen.  But I would never take the iPad anywhere other than the living room couch with me, as the form factor is simply too big (compared to the iPhone which nicely fits in my pants or jacket pocket).  And since I can type on a regular keyboard at over 60 words per minute, I don't think that the iPad and its 10" screen is going to replace my regular desktop/laptop with its 24" screen anytime soon either.&lt;br /&gt;&lt;br /&gt;But back to the college text book thing... if Apple were to be able to pull off selling college text books (and K-12 text books too) for use on this thing at say 25-50% the normal price of hard copy text books, the iPad would pay for itself in one or two semesters.  And students get to stop carrying around the back breaking backpacks filled with the text books that they currently have too.  And that's not even taking into account the added technological aspects of having ebooks that you can mark up as you please.  Now THAT would lead to Apple selling millions upon millions of these things.  Maybe that current stock price of $208 is low after all...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-1390998532081652389?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/1390998532081652389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=1390998532081652389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/1390998532081652389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/1390998532081652389'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2010/01/apple-ipad-and-text-books.html' title='Apple iPad and Text Books'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-785741551770759002</id><published>2010-01-08T12:50:00.001-05:00</published><updated>2010-01-08T14:52:52.523-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='source code analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='ndepend'/><title type='text'>Review of NDepend</title><content type='html'>&lt;span style="font-weight: bold;"&gt;DISCLAIMER&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Patrick Smacchia, the creator of &lt;a href="http://www.ndepend.com/"&gt;NDepend&lt;/a&gt;, offered me a free license for NDepend Pro if I took the time to review the product and write this review on my blog.  While I have not used NDepend prior to doing this review, given the fact that I have been reading &lt;a href="http://codebetter.com/blogs/patricksmacchia/"&gt;Patrick's blog&lt;/a&gt; for quite some time now, along with the fact that I'm a big fan of static code analysis (for the regular identification of problematic areas in your source code), I happily agreed to his offer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;THE REVIEW&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Installation&lt;/span&gt;&lt;br /&gt;The installation of NDepend is a simple unzip and xcopy to your desired location.  Seriously as simple as it gets.  Once it's there, fire up the VisualNDepend executable and point it at some .NET/C# assemblies you have.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Analysis&lt;/span&gt;&lt;br /&gt;I decided to run NDepend against a code base that had been handed down to me from a number of prior developers.  While the customer is happy and the application has been running in a production environment for a couple of years now, the application is also a serious &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=101998"&gt;legacy code&lt;/a&gt; development situation, and a great sample project to see what NDepend has to offer for people in my shoes.&lt;br /&gt;&lt;br /&gt;So after loading up the half dozen assemblies in the given application, NDepend made quick work of analyzing everything and producing a nice HTML report.  It also shows the results in the Visual NDepend results browser, allowing you to quickly navigate around your code base.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Usage Scenarios&lt;/span&gt;&lt;br /&gt;After immediately showing a peer of mine the tool what it does, I started rattling off to him the following list of scenarios that describe how I think NDepend can be useful to developers.&lt;br /&gt;&lt;br /&gt;#1 - Newbie - Never used NDepend before and barely understands static analysis or any of the metrics used by NDepend.&lt;br /&gt;&lt;br /&gt;In this scenario, much like in my code base above, NDepend will quickly point out problematic areas of your source code so that you can immediately start addressing those issues.&lt;br /&gt;&lt;br /&gt;Now I'm sure that plenty of readers will immediately start screaming that &lt;a href="http://www.ndepend.com/Metrics.aspx"&gt;the metrics&lt;/a&gt; aren't useful.&lt;br /&gt;&lt;br /&gt;In response, I say that when you're reviewing a code base, and the documentation says that a &lt;a href="http://www.ndepend.com/Metrics.aspx#CC"&gt;Cyclomatic Complexity&lt;/a&gt; rating above 15 means that a method is complex, and above 30 is nearly impossible to comprehend, that if you're staring at a list of 20 methods with a rating above 30, including 5 with a rating above 40 and 1 with a rating above 80, you can't for a second argue with me that the tool isn't immediately useful in helping focus you in on the sections of your code base that you REALLY might want to stop and clean up.  In other words, this is all about quickly focusing you in on the sections of your code base that just aren't good, no matter what your opinion is on the specific threshold for a particular metric.&lt;br /&gt;&lt;br /&gt;#2 - Novice/Intermediate - You're familiar with the tool and the concepts and your code base is generally ok per the tool.&lt;br /&gt;&lt;br /&gt;In this case, you're looking at integrating NDepend into your (hopefully pre-existing) continuous integration environment so as to ensure constant feedback to yourself and/or your team regarding the "health" of your code base.  The value here is that NDepend comes with pre-existing plug-ins for NAnt, MSBuild, and CruiseControl.NET which means you can very quickly get NDepend integrated into your automated process.&lt;br /&gt;&lt;br /&gt;#3 - Expert - You're already highly automated and compliant, but feel the itch for more.&lt;br /&gt;&lt;br /&gt;In this case, NDepend really shines given the existence of CQL, it's own built in query language, that allows you to run queries against the metrics that it collected during the analysis phase.  All of the functionality that #1 and #2 are leveraging is simply based on a set of pre-built CQL queries.  But for the expert who is obsessed with perfection, automating their perfection seeking is even better.  And being able to either tweak the pre-built queries, or better yet, build a series of custom queries is priceless.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gripes&lt;/span&gt;&lt;br /&gt;It wouldn't be right to review something and not offer some advice.  That is what I get paid for in my real job!  Anyway, one big thing that jumped out at me that was annoying was that I quickly found myself lost in the UI.  I think that this is due to the specific UI controls and the docking layout stuff that is used by NDepend to try and organize the eleven navigation and results windows.  I actually got things so messed up that thankfully NDepend has a "Reset Views" menu item that puts things back to how they were when I first launched it.  I also found that once I got the set of windows that I found useful (for scenario #1 above) in view and the rest hidden, things were much smoother.&lt;br /&gt;&lt;br /&gt;I think that to help resolve this in general, it would be nice to have a set of additional pre-built views, as there are a couple of task specific ones that already exist, that fit more in line with the three usage scenarios above.&lt;br /&gt;&lt;br /&gt;I'd list price as an issue here too, but more from the point of view that I think Microsoft should simply pay Patrick a chunk of change and integrate NDepend into Visual Studio.  Now that we've finally got people on board with automated unit testing (hopefully you're already doing this), now's the time for fully automating and enforcing code quality metrics!  Unfortunately, unless a developer already knows about and has respect for static analysis, they probably aren't going to hunt down and pay a couple hundred dollars for a tool like NDepend.  And then you have teams such as the one I'm currently on that simply doesn't have the budget for ANY tools, so we aren't going to use it either.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;So in the end, NDepend simply rocks!  While I had issues with the UI, that's something that after 5-10 minutes of use you don't really even notice.  The immediate impact that NDepend can have on a code base is priceless.  Just think, all of those code reviews everyone says they should be doing but never have the time to do can now be automated, and team members are simply responsible for maintaining the code quality ratings of the code they write.&lt;br /&gt;&lt;br /&gt;Thanks to Patrick for giving me the chance to review what turned out to be a great tool.  Using NDepend coupled with &lt;a href="http://www.jetbrains.com/resharper/index.html"&gt;ReSharper&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/FxCop"&gt;FxCop&lt;/a&gt;, code bases simply have no excuse to end up in the mess that so many of them are today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-785741551770759002?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/785741551770759002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=785741551770759002' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/785741551770759002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/785741551770759002'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2010/01/review-of-ndepend.html' title='Review of NDepend'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-4717868292236655390</id><published>2009-09-18T17:13:00.003-04:00</published><updated>2009-09-18T17:20:53.804-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='temporal'/><title type='text'>Developing Temporal/Time-Based Database Solutions</title><content type='html'>Since I've already gotten a couple of requests for this information, I guess it's time for another blog post.&lt;br /&gt;&lt;br /&gt;The following is based on my research on the subject, after having developed a temporal/append-only solution a couple of years ago (before knowing what it was called by academics).  Considering that Professor Richard Snodgrass of the University of Arizona is THE person that I've come across that has written the most on the subject, you should check out his list of publications on the subject here first:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.arizona.edu/people/rts/publications.html"&gt;http://www.cs.arizona.edu/people/rts/publications.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The key one from what I've read so far is "&lt;span style="font-style: italic;"&gt;Developing Time-Oriented Database Applications in SQL&lt;/span&gt;".   Most, including this one, are available as electronic downloads.&lt;br /&gt;&lt;br /&gt;I've also noticed that Joe Celko (&lt;a href="http://www.celko.com/books.htm"&gt;http://www.celko.com/books.htm&lt;/a&gt;) has written on the topic in his book titled "&lt;span style="font-style: italic;"&gt;Joe Celko's Thinking In Sets - Auxiliary, Temporal, and Virtual Tables in SQL&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Now that I've apparently gotten some people's attention on this subject, perhaps it's time for me to start a series of blog posts on the subject...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-4717868292236655390?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/4717868292236655390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=4717868292236655390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/4717868292236655390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/4717868292236655390'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2009/09/developing-temporaltime-based-database.html' title='Developing Temporal/Time-Based Database Solutions'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-6651672608420340412</id><published>2009-08-31T16:52:00.003-04:00</published><updated>2009-08-31T17:23:00.871-04:00</updated><title type='text'>Temporal Database Design, Soft Deletes, and Ayende's Razor</title><content type='html'>&lt;span style="font-size:85%;"&gt;This is a formal follow-up to a post on Ayende's blog on "&lt;a href="http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx"&gt;Avoiding Soft Delete's&lt;/a&gt;" in your database where I question the lack of temporal database solutions being applied to these types of problems.&lt;br /&gt;&lt;br /&gt;After Oren claimed the following, I felt it necessary to expand on it in a blog post of my own, rather than continuing to clutter his comments, and hopefully finally bring some traffic to my own blog :-)&lt;br /&gt;&lt;/span&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;p&gt;    &lt;span style="font-size:85%;"&gt;&lt;a id="viewpost_ascx_TitleUrl" title="Title of this entry." class="TitleLinkStyle" href="http://ayende.com/Blog/archive/2009/08/31/ayendersquos-razor.aspx"&gt;Ayende’s Razor&lt;/a&gt;&lt;/span&gt;   &lt;/p&gt;   &lt;p&gt;&lt;span style="font-size:85%;"&gt;This is a response to a &lt;a href="http://ayende.com/Blog/archive/2009/08/30/11054.aspx#33938"&gt;comment on another post&lt;/a&gt;:&lt;/span&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;span style="font-size:85%;"&gt;Oren, in all seriousness, I thought that problems that were "(a) complex, (b) hard to understand (c) hard to optimize" were the kinds that folks like you and I get paid to solve...&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;span style="font-size:85%;"&gt;Given two solutions the match the requirements of the problem, the simpler one is the better.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;I could just as well call that statement "Jim's Razor", as I believe in it as much as you do Oren, so no arguments there.&lt;br /&gt;&lt;br /&gt;But in the same vane, "wise" (i.e., experienced) software architects/developers strategically chose RDBMS's over flat text files for the same class of reasons that I believe we should be making temporal database concerns first-class citizens of the modern IT toolbox.  The "additional features/functionality" gained by employing temporal databases, while never stated up front in requirements, would be priceless in the long run for business systems.  Those features include, but are not limited to:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;automatic audit logging, since nothing is ever UPDATE'd or DELETE'd, you've got a constant trail of changes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;automatic support for infinite undo/roll-back support of data, as you simply load a prior version and then save as usual&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;automatic support for labeling of versions, much like in source/version control systems, at an individual record level, table level, &lt;/span&gt;&lt;span style="font-size:85%;"&gt;"aggregate root level", or database level &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;automatic support for "back querying" a system, in search of what the situation looked like last month, last year, etc. (though raising this "aspect", as in AOP, to the ORM level would be crucial)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;IMHO, switch/case statements are generally simpler than polymorphism (demonstrated by how switch/case statements are typically taught before polymorphism in academic settings), but we all know why polymorphism in the long run is the better strategy, and therefore why as soon as we see switch/case statements propagating their way into our code bases, we typically change to a polymorphic strategy.&lt;br /&gt;&lt;br /&gt;Again, the goal in my eyes is to raise temporal database concepts to the level of first class citizens in the IT world, as opposed to the back water, academic debates that they are today.  The major players like Microsoft with SQL Server have never bothered to implement the temporal extensions to ANSI-94 (yes, from 1994 - &lt;a style="font-weight: bold;" href="http://www.cs.arizona.edu/%7Erts/sql3.html"&gt;see this&lt;/a&gt;).  Interestingly enough Oracle has implemented some of them via Oracle 9i and 10g, but per the work of Snodgrass and friends, still have room to perfect things.&lt;br /&gt;&lt;br /&gt;This is also where the "minor players", i.e., the open source software community via projects such as NHibernate could step in and heavily promote something like this.  In the same line of thinking of not wanting to constantly roll your own ORM, thus why you chose something such as NHibernate, needing to roll your own temporal solution for every project should be equally unnecessary.&lt;br /&gt;&lt;br /&gt;In closing, for all of the "pain" of implementing something as complex as this topic would be, I'd love to see a platform such as Microsoft Dynamics (MS CRM) implement this all the way from the database through to the GUI, as it would clearly represent a paradigm shift in business information systems development.  Of course perhaps I should just start a company to do just this...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-6651672608420340412?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/6651672608420340412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=6651672608420340412' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/6651672608420340412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/6651672608420340412'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2009/08/temporal-database-design-soft-deletes.html' title='Temporal Database Design, Soft Deletes, and Ayende&apos;s Razor'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-5320732874778596457</id><published>2009-08-03T11:11:00.003-04:00</published><updated>2009-08-03T11:49:37.833-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alias'/><category scheme='http://www.blogger.com/atom/ns#' term='mssql'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver'/><category scheme='http://www.blogger.com/atom/ns#' term='instance'/><title type='text'>MS SQL Server Named Instances and Aliases For Heterogeneous Developer Environments</title><content type='html'>&lt;span style="font-family: verdana;font-size:85%;" &gt;On the team that I'm working with, we're supporting MS SQL Server 2000, 2005, and 2008. Depending on when the particular developer joined the team, and thus when they installed the various pieces of software on their development workstation, any of the above listed versions might be the default instance (i.e., "(local)"), while the others might be installed as named instances (i.e., "(local)\SQL2008" or "(local)\SQL2K5").&lt;br /&gt;&lt;br /&gt;Every once in a while, a developer has to work on a project with a database installed to a local database server that is on a named instance other than the rest of the development team.  With the database server name stored in .config files, altering this for each developer just doesn't make much sense.  Thankfully, MS SQL Server has a very simple and straightforward solution for this - aliases.&lt;br /&gt;&lt;br /&gt;By using aliases, an application under development can be configured to use an alias in the .config file, and each developer simply needs to create a alias on their workstation pointing to their particular named instance.&lt;br /&gt;&lt;br /&gt;Anyway, you can either decipher what &lt;a href="http://support.microsoft.com/kb/265808"&gt;MSFT KB Article 265808&lt;/a&gt; has to say, or just follow the step-by-step instructions here (for MS SQL Server 2005):&lt;br /&gt;&lt;br /&gt;#1 - Open SQL Server Configuration Manager&lt;br /&gt;&lt;br /&gt;#2 - Confirm that TCP/IP is enabled for the named instance for which you are creating the alias.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cQ75yfd-gqE/SncB2Q9MgfI/AAAAAAAAABs/9ZMpPUhH9Bw/s1600-h/MSSQL-NIA-1.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 261px;" src="http://3.bp.blogspot.com/_cQ75yfd-gqE/SncB2Q9MgfI/AAAAAAAAABs/9ZMpPUhH9Bw/s400/MSSQL-NIA-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5365759512811438578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;#3 - Confirm that "Listen All" is set to "Yes" for TCP/IP for that instance.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cQ75yfd-gqE/SncB2lz9iDI/AAAAAAAAAB0/OqhVzzQQCdM/s1600-h/MSSQL-NIA-2.jpg"&gt;&lt;img style="cursor: pointer; width: 360px; height: 400px;" src="http://1.bp.blogspot.com/_cQ75yfd-gqE/SncB2lz9iDI/AAAAAAAAAB0/OqhVzzQQCdM/s400/MSSQL-NIA-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5365759518409852978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;#4 - Take note of the port number listed next to the "TCP Dynamic Ports" setting under the "IPAll" section.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cQ75yfd-gqE/SncB22MCg7I/AAAAAAAAAB8/GNe9EOCGRBM/s1600-h/MSSQL-NIA-3.jpg"&gt;&lt;img style="cursor: pointer; width: 360px; height: 400px;" src="http://3.bp.blogspot.com/_cQ75yfd-gqE/SncB22MCg7I/AAAAAAAAAB8/GNe9EOCGRBM/s400/MSSQL-NIA-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5365759522805810098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;#5 - Right-click the "Aliases" node and select "New Alias..."&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cQ75yfd-gqE/SncB3DHbkMI/AAAAAAAAACE/VnYkrDNjRV4/s1600-h/MSSQL-NIA-4.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 261px;" src="http://1.bp.blogspot.com/_cQ75yfd-gqE/SncB3DHbkMI/AAAAAAAAACE/VnYkrDNjRV4/s400/MSSQL-NIA-4.jpg" alt="" id="BLOGGER_PHOTO_ID_5365759526276141250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;#6 - Fill in the details for the new alias.&lt;br /&gt;&lt;/span&gt;&lt;ul style="font-family: verdana;"&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Alias Name - I like the idea of choosing a name for the alias that a) isn't already a name on the network (obviously) and b) is named for the application that we are developing.  It is irrelevant that you have 2, 5, 10, or 500 aliases all pointing to the same database server (web hosting services have done this for years when hosting hundreds of websites on a single server).&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Port No. - This is the value from "TCP Dynamic Ports" in step #4 above.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Protocol - Confirm TCP/IP is selected.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Server - This is the database server name you would "normally" use to connect to the particular database server.  Note that the SQL Server "(local)" alias works as part of this solution, and in conjunction with or without a named instance name, is what should go in this box.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cQ75yfd-gqE/SncB3VDawsI/AAAAAAAAACM/8azb_1s_XoQ/s1600-h/MSSQL-NIA-5.jpg"&gt;&lt;img style="cursor: pointer; width: 360px; height: 400px;" src="http://1.bp.blogspot.com/_cQ75yfd-gqE/SncB3VDawsI/AAAAAAAAACM/8azb_1s_XoQ/s400/MSSQL-NIA-5.jpg" alt="" id="BLOGGER_PHOTO_ID_5365759531091149506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NOTE #1 - Aliases are "local" to the specific workstation they are created on.  In other words, every developer on the team will need to create the alias on their individual computer.&lt;br /&gt;&lt;br /&gt;NOTE #2 - Yes, the dev team could standardize the way software is installed on their computers.  But on my team, we get paid to do what our client wants us to do, and not to arbitrarily streamline" and tweak every last detail of our development environment.  Besides, using aliases just works, and unless someone can comment on why this is technically a bad idea, I'm not going to ever condone wasting my client's money.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-5320732874778596457?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/5320732874778596457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=5320732874778596457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/5320732874778596457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/5320732874778596457'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2009/08/ms-sql-server-named-instances-and.html' title='MS SQL Server Named Instances and Aliases For Heterogeneous Developer Environments'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_cQ75yfd-gqE/SncB2Q9MgfI/AAAAAAAAABs/9ZMpPUhH9Bw/s72-c/MSSQL-NIA-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-5585902614253686873</id><published>2009-06-29T20:40:00.003-04:00</published><updated>2009-06-29T20:45:39.499-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hotmail'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Hotmail.com and Live.com email access to your iPhone</title><content type='html'>So being the proud new owner of an iPhone 3GS after years of dealing with the inferior Windows Mobile and Palm platforms, I'm also learning the ins and outs of "things that should be easy".&lt;br /&gt;&lt;br /&gt;Take for instance the fact that MSFT only offers crippled POP3 access to Hotmail/Live.com, thus making those nearly worthless on the iPhone.  Thankfully the fine folks at FluentFactory make just the thing to make Hotmail/Live.com mail on the iPhone nearly what it should be (for those of us with a many, many year history with our Hotmail accounts).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://fluentfactory.com/mboxmail/"&gt;http://fluentfactory.com/mboxmail/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But that said, looking at what Google has to offer for synching to the iPhone, I can't help myself from laughing!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/mobile/apple/sync.html"&gt;http://www.google.com/mobile/apple/sync.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The following paragraph copied from that page is the key:&lt;br /&gt;&lt;p style="margin-left: 40px;"&gt;&lt;strong&gt;&lt;span class="new"&gt;Important!&lt;/span&gt;&lt;/strong&gt; Google Sync uses the Microsoft© Exchange ActiveSync© protocol. When setting up a new Exchange ActiveSync account on your iPhone, all existing Contacts and Calendar events will be removed from your phone. Please make sure to back up any important data before you set up Google Sync. &lt;/p&gt; Pretty sweet when Google licenses ActiveSync from MSFT for connecting GMail for use on the iPhone, while MSFT refuses to offer the same functionality for Hotmail/LiveMail users, even the paid ones like me!  WTF MSFT?!?!?!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-5585902614253686873?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/5585902614253686873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=5585902614253686873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/5585902614253686873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/5585902614253686873'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2009/06/hotmailcom-and-livecom-email-access-to.html' title='Hotmail.com and Live.com email access to your iPhone'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-3963986035401091065</id><published>2008-10-28T15:34:00.002-04:00</published><updated>2008-10-28T15:38:34.599-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PersonalDevelopment'/><title type='text'>Touch Typing - i.e., eaking seconds and minutes out of your day</title><content type='html'>&lt;div&gt;&lt;span style="font-family:Tahoma;font-size:85%;"&gt;&lt;span class="180392219-28102008"&gt;After being forwarded a link to &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Tahoma;font-size:85%;"&gt;&lt;span class="180392219-28102008"&gt;&lt;a style="font-weight: bold;" href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html"&gt;Stevey's Blog Rants: Programming's Dirtiest Little Secret&lt;/a&gt; today, I figured I'd do a blog post on this topic too.  IMHO, if you sit in front of a computer all day long, especially as a computer programmer, and can't touch type faster than 60wpm, start practicing for 30 minutes  a day with one of these tools until you can.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;a title="http://www.keybr.com/" href="http://www.keybr.com/"&gt;&lt;span title="http://www.keybr.com/"   style="font-family:Tahoma;font-size:85%;"&gt;http://www.keybr.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Tahoma;"&gt;&lt;span style="font-size:85%;"&gt; &lt;span class="180392219-28102008"&gt;  (&lt;span style="font-family:Tahoma;font-size:85%;"&gt;&lt;span class="180392219-28102008"&gt;This is the one that I like the best, but a few more  follow.&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Tahoma;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="180392219-28102008"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Tahoma;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="180392219-28102008"&gt;&lt;a title="http://typera.tk/" href="http://typera.tk/"&gt;http://typera.tk/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Tahoma;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="180392219-28102008"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Tahoma;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="180392219-28102008"&gt;&lt;a title="http://play.typeracer.com/" href="http://play.typeracer.com/"&gt;http://play.typeracer.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Tahoma;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="180392219-28102008"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Tahoma;font-size:85%;"&gt;&lt;a title="http://www.touch-typing-tutor.com/" href="http://www.touch-typing-tutor.com/"&gt;http://www.touch-typing-tutor.com/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;span style="font-family:Tahoma;font-size:85%;"&gt;&lt;a title="http://www.typingweb.com/" href="http://www.typingweb.com/"&gt;http://www.typingweb.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-3963986035401091065?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/3963986035401091065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=3963986035401091065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/3963986035401091065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/3963986035401091065'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2008/10/touch-typing-ie-eaking-seconds-and.html' title='Touch Typing - i.e., eaking seconds and minutes out of your day'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-6002969313646676079</id><published>2008-09-30T15:45:00.005-04:00</published><updated>2008-09-30T16:01:43.663-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodingBestPractices'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Incorrectly Storing Objects In The ASP.NET Session</title><content type='html'>In an effort to keep this from happening to someone else, I figured I'd write about it today.  I'm surely not the first person to ever write about this, so I'm not claiming to have found something novel.  I've personally never written a web application that needed to utilize the &lt;a href="http://msdn.microsoft.com/en-us/library/ms178581.aspx"&gt;&lt;span style="font-weight: bold;"&gt;ASP.NET Session&lt;/span&gt;&lt;/a&gt; object, but apparently other folks have not learned that.&lt;br /&gt;&lt;br /&gt;Anyway, the following chunk of code was being used to store a reference to the "domain object" currently being viewed/edited.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;namespace Your.Web&lt;br /&gt;{&lt;br /&gt; /// &amp;lt;summary&amp;gt;&lt;br /&gt; /// Summary description for ContainerBase.&lt;br /&gt; /// &amp;lt;/summary&amp;gt;&lt;br /&gt; public class ContainerBase : Page&lt;br /&gt; {&lt;br /&gt;     public virtual IDomainObject DomainObject&lt;br /&gt;     {&lt;br /&gt;         get&lt;br /&gt;         {&lt;br /&gt;             if (Session["DomainObject"] != null)&lt;br /&gt;             {&lt;br /&gt;                 return (IDomainObject) Session["DomainObject"];&lt;br /&gt;             }&lt;br /&gt;             else&lt;br /&gt;             {&lt;br /&gt;                 return null;&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;         set { Session["DomainObject"] = value; }&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The result of doing this is that by opening one "domain object" (DO1) for editing in a window (W1), hitting CTRL-N to open a new window (W2) that by default will still show DO1, navigating to a new domain object (DO2) in W2, then switching back to W1 and clicking the Save button without any other operations, the edits in W1 that should be being applied to DO1 are actually being applied to DO2.  Dooh!!!!  That eliminates a user's ability to have two or more web browser windows open at a time.  MS-DOS, here we come!&lt;br /&gt;&lt;br /&gt;Moral of the story, don't use the Session object, unless you really truly have read everything there is about using it and are still convinced that you should still use it.  And even then, you're probably still wrong!&lt;br /&gt;&lt;br /&gt;For further reading, see the &lt;a style="font-weight: bold;" href="http://msdn.microsoft.com/en-us/library/ms972429.aspx"&gt;ASP.NET Session State Overview&lt;/a&gt; on MSDN.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-6002969313646676079?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/6002969313646676079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=6002969313646676079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/6002969313646676079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/6002969313646676079'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2008/09/incorrectly-storing-objects-in-aspnet.html' title='Incorrectly Storing Objects In The ASP.NET Session'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-4786275982295016745</id><published>2008-09-26T11:29:00.005-04:00</published><updated>2008-09-26T12:12:13.104-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodingBestPractices'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>The Overuse of the StringBuilder class in .NET</title><content type='html'>So this friend of mine Adam wrote &lt;a href="http://www.sharepointsecurity.com/blog/sharepoint/sharepoint-2007-development/building-sharepoint-view-queries-with-caml/"&gt;&lt;span style="font-weight: bold;"&gt;this post&lt;/span&gt;&lt;/a&gt; today.  The main point of the post I love, as it correctly abstracts the creation of the query string behind a class and away from the rest of the code that is consuming the query results.  Why I'm writing this post is that while his post was not directly having to do with the &lt;a style="font-weight: bold;" href="http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx"&gt;StringBuilder&lt;/a&gt; class, IMHO, he is displaying what I believe is indicative of the over zealous use of the StringBuilder class.&lt;br /&gt;&lt;br /&gt;For the sake of convenience, this is how he wrote it:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;private static string BuildDefaultViewQuery()&lt;br /&gt;{&lt;br /&gt; var builder = new StringBuilder();&lt;br /&gt; builder.Append("&amp;lt;Where&amp;gt;");&lt;br /&gt; builder.Append("&amp;lt;Eq&amp;gt;&amp;lt;FieldRef Name='DefaultView' /&amp;gt;&amp;lt;Value Type='Boolean'&amp;gt;");&lt;br /&gt; builder.Append("1");&lt;br /&gt; builder.Append("&amp;lt;/Value&amp;gt;&amp;lt;/Eq&amp;gt;&amp;lt;/Where&amp;gt;");&lt;br /&gt; return builder.ToString();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This is how I would have written the guts of this method:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;private static string BuildDefaultViewQuery()&lt;br /&gt;{&lt;br /&gt; return String.Format(@"&lt;br /&gt;         &amp;lt;Where&amp;gt;&lt;br /&gt;             &amp;lt;Eq&amp;gt;&lt;br /&gt;                 &amp;lt;FieldRef Name='DefaultView' /&amp;gt;&lt;br /&gt;                 &amp;lt;Value Type='Boolean'&amp;gt;{1}&amp;lt;/Value&amp;gt;&lt;br /&gt;             &amp;lt;/Eq&amp;gt;&lt;br /&gt;         &amp;lt;/Where&amp;gt;",&lt;br /&gt;     1);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;I just happen to think that there is too much "noise" when using a StringBuilder for this kind of stuff.  Yes, if you're looping through a potentially large set of data and producing a potentially large string as a result, then by all means, use a StringBuilder, as that is what you should be doing.  But if you're just building a relatively static string, with a handful of "variables" inserted into the string, use &lt;a href="http://msdn.microsoft.com/en-us/library/system.string.format.aspx"&gt;&lt;span style="font-weight: bold;"&gt;String.Format()&lt;/span&gt;&lt;/a&gt; in conjunction with a string that supports line breaks (i.e., using the @"" syntax).  The resulting code is so much easier to read and understand what is really going on besides the building of a string.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-4786275982295016745?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/4786275982295016745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=4786275982295016745' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/4786275982295016745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/4786275982295016745'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2008/09/overuse-of-stringbuilder-class-in-net.html' title='The Overuse of the StringBuilder class in .NET'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-959745978461360288</id><published>2008-09-24T15:09:00.004-04:00</published><updated>2008-09-26T12:13:13.137-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='moss'/><title type='text'>SharePoint/MOSS 2007 External Third Party Desktop Application Integration</title><content type='html'>&lt;span style="font-size:100%;"&gt;Today I was presented a scenario where a client wanted to integrate a non-Microsoft Office desktop application into their Microsoft Office SharePoint Server 2007 (MOSS) environment such that documents created/edited in that app and stored in MOSS document libraries were able to be directly opened into that app ready for editing, and ultimately saved back to the document library.&lt;br /&gt;&lt;br /&gt;Since Google'ing the answer to this scenario took me more than 30 seconds to find, here is the answer.&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Inside SharePoint - Integrating "Office" Applications&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://technet.microsoft.com/en-us/magazine/cc565180.aspx"&gt;http://technet.microsoft.com/en-us/magazine/cc565180.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here are some more useful links:&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Text Files, Associations, and SharePoint&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://weblogs.asp.net/bsimser/archive/2005/01/24/359911.aspx"&gt;http://weblogs.asp.net/bsimser/archive/2005/01/24/359911.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Sharepoint Beef #3 : Melt-in-your-mouth Native Apps support issue resolved&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://weblogs.asp.net/dburke/archive/2004/01/13/58330.aspx"&gt;http://weblogs.asp.net/dburke/archive/2004/01/13/58330.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;SharePoint.OpenDocuments Control&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://msdn.microsoft.com/en-us/library/ms454230.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms454230.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;How to enable the “Edit in Microsoft Office XXXXX” feature for Office 2007 documents&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://www.syntergy.com/sharepoint/products/tips/"&gt;http://www.syntergy.com/sharepoint/products/tips/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;DocIcon.xml - Adding Notepad and WordPerfect as applications&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://www.sharepointblogs.com/korry/archive/2006/03/16/docicon-xml-adding-notepad-and-wordperfect-as-applications.aspx"&gt;http://www.sharepointblogs.com/korry/archive/2006/03/16/docicon-xml-adding-notepad-and-wordperfect-as-applications.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Adding a Document Template, File Type, and Editing Application to a Site Definition&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://msdn.microsoft.com/en-us/library/ms868275.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms868275.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;PDF Integration in SharePoint&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://www.specialinvestigations.org/blog/CommentView,guid,1a6f8f2b-55a1-4421-bf11-b1256ea418dc.aspx"&gt;http://www.specialinvestigations.org/blog/CommentView,guid,1a6f8f2b-55a1-4421-bf11-b1256ea418dc.aspx&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.portalsolutions.net/Blog/Lists/Posts/Post.aspx?ID=40"&gt;http://www.portalsolutions.net/Blog/Lists/Posts/Post.aspx?ID=40&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Customizing the Shortcut Menu for List Items&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://msdn.microsoft.com/en-us/library/ms868274.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms868274.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;Customizing SharePoint Context Menus&lt;/span&gt;&lt;br /&gt;  &lt;a href="http://blogs.msdn.com/bowerm/articles/175691.aspx"&gt;http://blogs.msdn.com/bowerm/articles/175691.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-959745978461360288?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/959745978461360288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=959745978461360288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/959745978461360288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/959745978461360288'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2008/09/sharepointmoss-2007-external-third.html' title='SharePoint/MOSS 2007 External Third Party Desktop Application Integration'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-8412970610482201749</id><published>2007-12-13T14:45:00.000-05:00</published><updated>2007-12-13T14:45:02.629-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='hard drives'/><title type='text'>HDD and Thumb Drive Performance Comparison</title><content type='html'>So, since I tend to be a speed freak of sorts, I wanted to see just how well, or not, my storage devices perform. In my Dell Precision M90 laptop, I've got a &lt;a href="http://www.amazon.com/gp/search?ie=UTF8&amp;amp;keywords=ST910021AS&amp;amp;tag=bi0b4-20&amp;amp;index=electronics&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;Seagate - Momentus 100GB&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=bi0b4-20&amp;amp;l=ur2&amp;amp;o=1" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt; drive, then a  &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2FWestern-Digital-WDXMS2500TN-Passport-Portable%2Fdp%2FB000RY2PLQ%3Fie%3DUTF8%26s%3Delectronics%26qid%3D1197574459%26sr%3D1-1&amp;amp;tag=bi0b4-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;Western Digital Passport 250GB&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=bi0b4-20&amp;amp;l=ur2&amp;amp;o=1" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt; USB external drive, and finally a  &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;amp;location=http%3A%2F%2Fwww.amazon.com%2FPNY-USB-Flash-Drive-P-FD16GU20-RF%2Fdp%2FB000NJUI8C%3Fie%3DUTF8%26s%3Delectronics%26qid%3D1197574320%26sr%3D8-1&amp;amp;tag=bi0b4-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=9325"&gt;PNY Attaché 16GB USB&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=bi0b4-20&amp;amp;l=ur2&amp;amp;o=1" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt; thumb drive.&lt;br /&gt;&lt;br /&gt;The following are the screen shots from &lt;a href="http://www.hdtune.com/"&gt;HD Tune&lt;/a&gt; that indicate how each performed:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cQ75yfd-gqE/R2GKg7uMdzI/AAAAAAAAAAc/7BWQNgIt1X8/s1600-h/HDTune+Benchmark+-+PNY+USB+2.0+FD+-+2007-12-06.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_cQ75yfd-gqE/R2GKg7uMdzI/AAAAAAAAAAc/7BWQNgIt1X8/s400/HDTune+Benchmark+-+PNY+USB+2.0+FD+-+2007-12-06.png" alt="" id="BLOGGER_PHOTO_ID_5143544547825710898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cQ75yfd-gqE/R2GKK7uMdxI/AAAAAAAAAAM/6hgN3qXs2Rw/s1600-h/HDTune+Benchmark+-+ST910021AS+-+2007-12-06.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_cQ75yfd-gqE/R2GKK7uMdxI/AAAAAAAAAAM/6hgN3qXs2Rw/s400/HDTune+Benchmark+-+ST910021AS+-+2007-12-06.png" alt="" id="BLOGGER_PHOTO_ID_5143544169868588818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cQ75yfd-gqE/R2GKZLuMdyI/AAAAAAAAAAU/RzxBeA923Sk/s1600-h/HDTune+Benchmark+-+WD2500BEVExternal+-+2007-12-06.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_cQ75yfd-gqE/R2GKZLuMdyI/AAAAAAAAAAU/RzxBeA923Sk/s400/HDTune+Benchmark+-+WD2500BEVExternal+-+2007-12-06.png" alt="" id="BLOGGER_PHOTO_ID_5143544414681724706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All in all, I'm fairly pleased.  My primary desire is to simply have capacity.  But when you start storing GB sized database files and virtual machines, better performance can mean a lot!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-8412970610482201749?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/8412970610482201749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=8412970610482201749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/8412970610482201749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/8412970610482201749'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/12/hdd-and-thumb-drive-performance.html' title='HDD and Thumb Drive Performance Comparison'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_cQ75yfd-gqE/R2GKg7uMdzI/AAAAAAAAAAc/7BWQNgIt1X8/s72-c/HDTune+Benchmark+-+PNY+USB+2.0+FD+-+2007-12-06.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-5296991029643040968</id><published>2007-10-23T18:00:00.000-04:00</published><updated>2008-09-26T12:13:52.162-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='WebParts'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Automatic Updating of AssemblyFileVersion in C# Projects</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;&lt;/span&gt;So my good buddy and co-worker &lt;a href="http://www.wildwires.com/blog/"&gt;&lt;span style="font-weight: bold;"&gt;Stacy Draper&lt;/span&gt;&lt;/a&gt; and I put together a solution today to handle versioning of .NET assemblies used for SharePoint web part development.  Maybe this has been done before, maybe even better than this, but a quick Google search didn't turn up squat for us, or at least anything we liked, so we created our own solution.&lt;br /&gt;&lt;br /&gt;The general problem revolves around the fact that the &lt;span style="font-family: courier new;"&gt;AssemblyVersion &lt;/span&gt;attribute in .NET assemblies is used by other assemblies when referencing strong named/signed assemblies stored in the GAC.  Now you don't have to put your SharePoint assemblies in the GAC, but in most all cases, it simply makes the most sense.  If you change the &lt;span style="font-family: courier new;"&gt;AssemblyVersion &lt;/span&gt;of an already installed and used over and over and over again web part, you're in a world of hurt if you arbitrarily change the &lt;span style="font-family: courier new;"&gt;AssemblyVersion &lt;/span&gt;to something new.  At that point, you're faced with having to update 10's to 100's to 1000's of web part pages that reference the original web part.   That's not to say there aren't times when it makes sense to do so, but for day to day development and deployment scenarios where it really isn't a new version of the web part, but itis an updated version of the code, you still want to be able to have a very noticeable way to see what version is currently installed on your portal.&lt;br /&gt;&lt;br /&gt;So that takes us to what Stacy and I whipped up today.  I created a script that updates your &lt;span style="font-family: courier new;"&gt;AssemblyInfo.cs&lt;/span&gt; file, setting the &lt;span style="font-family: courier new;"&gt;AssemblyFileVersion &lt;/span&gt;attribute to a time-stamped version number, based off of the &lt;span style="font-family: courier new;"&gt;AssemblyVersion &lt;/span&gt;attribute's value, of when the assembly was built.  Stacy created a script that updates the &lt;span style="font-family: courier new;"&gt;feature.xml&lt;/span&gt; file that is part of the SharePoint feature with the new version number of the &lt;span style="font-family: courier new;"&gt;AssemblyFileVersion &lt;/span&gt;to be displayed within the description of the feature.  This is so you can also see that version info from within SharPoint, in addition to viewing the file properties.   Both of these scripts are then configured to run in your pre-build events for your C# project.  What follows is my pre-build commands and the content of my VBS script.  I place my VBS file in a folder named UTIL inside my C# project.  See Stacy's blog for his stuff.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;CD "$(ProjectDir)UTIL"&lt;br /&gt;cscript /nologo UpdateAssemblyFileVersion.vbs "$(ProjectDir)Properties\AssemblyInfo.cs"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;'------------------------------------------------------------------------------&lt;br /&gt;'--- UpdateAssemblyFileVersion.vbs&lt;br /&gt;'------------------------------------------------------------------------------&lt;br /&gt;'--- Author - Jim Sally&lt;br /&gt;'--- Date   - 2007.10.23&lt;br /&gt;'------------------------------------------------------------------------------&lt;br /&gt;'--- This updates the AssemblyFileVersion attribute in the AssemblyInfo.cs file&lt;br /&gt;'--- of a given C# project.  The AssemblyFileVersion is updated to contain the&lt;br /&gt;'--- first two digits of the AssemblyVersion, with YMMDD.HHmm as the last two&lt;br /&gt;'--- digits.&lt;br /&gt;'------------------------------------------------------------------------------&lt;br /&gt;Option Explicit&lt;br /&gt;&lt;br /&gt;Dim fileHeader&lt;br /&gt;fileHeader = "UpdateAssemblyFileVersion.vbs :: "&lt;br /&gt;&lt;br /&gt;EnsureCommandLineArgumentExists&lt;br /&gt;EnsureAssemblyInfoFileExists WScript.Arguments(0)&lt;br /&gt;UpdateAssemblyFileVersion WScript.Arguments(0)&lt;br /&gt;&lt;br /&gt;Private Sub EnsureCommandLineArgumentExists()&lt;br /&gt;    If WScript.Arguments.Count &amp;lt;&amp;gt; 1 Then&lt;br /&gt;       WScript.Echo fileHeader &amp;amp; "You must supply the path to the AssemblyInfo.cs file as the only argument on the command line"&lt;br /&gt;       WScript.Quit 1&lt;br /&gt;    End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub EnsureAssemblyInfoFileExists(AssemblyInfoFileName)&lt;br /&gt;    Dim fso&lt;br /&gt;&lt;br /&gt;    Set fso = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;    If Not fso.FileExists(AssemblyInfoFileName) Then&lt;br /&gt;       WScript.Echo fileHeader &amp;amp; "AssemblyInfo.cs does not exist at the path provided -&amp;gt; " &amp;amp; AssemblyInfoFileName&lt;br /&gt;       WScript.Quit 1&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;    Set fso = Nothing&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub UpdateAssemblyFileVersion(AssemblyInfoFileName)&lt;br /&gt;    Dim assemblyInfo, newAssemblyInfo&lt;br /&gt;&lt;br /&gt;    assemblyInfo = GetContentsOfAssemblyInfoFile(AssemblyInfoFileName)&lt;br /&gt;    newAssemblyInfo = UpdateAssemblyInfoText(assemblyInfo)&lt;br /&gt;&lt;br /&gt;    If newAssemblyInfo &amp;lt;&amp;gt; assemblyInfo Then&lt;br /&gt;       SaveContentsOfAssemblyInfoFile AssemblyInfoFileName, newAssemblyInfo&lt;br /&gt;    End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Function GetContentsOfAssemblyInfoFile(AssemblyInfoFileName)&lt;br /&gt;    Dim fso, file&lt;br /&gt;&lt;br /&gt;    Set fso = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;    Set file = fso.OpenTextFile(AssemblyInfoFileName)&lt;br /&gt;    GetContentsOfAssemblyInfoFile = file.ReadAll()&lt;br /&gt;    file.Close&lt;br /&gt;&lt;br /&gt;    Set file = Nothing&lt;br /&gt;    Set fso = Nothing&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Sub SaveContentsOfAssemblyInfoFile(AssemblyInfoFileName, infoText)&lt;br /&gt;    Dim fso, file&lt;br /&gt;&lt;br /&gt;    Set fso = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;    Set file = fso.CreateTextFile(AssemblyInfoFileName, true)&lt;br /&gt;    file.Write(infoText)&lt;br /&gt;    file.Close&lt;br /&gt;&lt;br /&gt;    Set file = Nothing&lt;br /&gt;    Set fso = Nothing&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Function UpdateAssemblyInfoText(AssemblyInfoText)&lt;br /&gt;    Dim posAV, posAFV, posEolAV, posEolAFV, aNAV&lt;br /&gt;    Dim originalAssemblyVersionText, originalAssemblyFileVersionText, newAssemblyFileVersionText&lt;br /&gt;&lt;br /&gt;    posAV = InStr(AssemblyInfoText, "AssemblyVersion")&lt;br /&gt;    posAFV = InStr(AssemblyInfoText, "AssemblyFileVersion")&lt;br /&gt;&lt;br /&gt;    If Not IsNull(posAV) And Not IsNull(posAFV) And posAV &amp;gt; 0 And posAFV &amp;gt; 0 Then&lt;br /&gt;       posEolAV = InStr(posAV, AssemblyInfoText, "]")&lt;br /&gt;       posEolAFV = InStr(posAFV, AssemblyInfoText, "]")&lt;br /&gt;&lt;br /&gt;       originalAssemblyVersionText = Mid(AssemblyInfoText, posAV, posEolAV - posAV)&lt;br /&gt;       originalAssemblyFileVersionText = Mid(AssemblyInfoText, posAFV, posEolAFV - posAFV)&lt;br /&gt;&lt;br /&gt;       aNAV = Split(Split(originalAssemblyVersionText, """")(1), ".")&lt;br /&gt;       newAssemblyFileVersionText = "AssemblyFileVersion(""" &amp;amp; GetNewFileVersionNumber(aNAV) &amp;amp; """)"&lt;br /&gt;&lt;br /&gt;       If originalAssemblyFileVersionText &amp;lt;&amp;gt; newAssemblyFileVersionText Then&lt;br /&gt;           UpdateAssemblyInfoText = Replace(AssemblyInfoText, originalAssemblyFileVersionText, newAssemblyFileVersionText)&lt;br /&gt;&lt;br /&gt;           WScript.Echo fileHeader &amp;amp; "Updated attribute from '" &amp;amp; originalAssemblyFileVersionText &amp;amp; "' to '" &amp;amp; newAssemblyFileVersionText &amp;amp; "'"&lt;br /&gt;           WScript.Echo&lt;br /&gt;       Else&lt;br /&gt;           WScript.Echo fileHeader &amp;amp; "AssemblyFileVersion attribute already '" &amp;amp; newAssemblyFileVersionText &amp;amp; "'"&lt;br /&gt;           WScript.Echo&lt;br /&gt;           WScript.Quit&lt;br /&gt;       End If&lt;br /&gt;    Else&lt;br /&gt;       WScript.Echo fileHeader &amp;amp; "AssemblyVersion or AssemblyFileVersion attribute not found"&lt;br /&gt;       WScript.Echo&lt;br /&gt;       WScript.Quit 1&lt;br /&gt;    End If&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function GetNewFileVersionNumber(versionArray)&lt;br /&gt;    GetNewFileVersionNumber = versionArray(0) &amp;amp; "." &amp;amp; versionArray(1) &amp;amp; "." &amp;amp; GetVersionYMMDD() &amp;amp; "." &amp;amp; GetVersionHHmm()&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function GetVersionYMMDD()&lt;br /&gt;    Dim y, m, d&lt;br /&gt;&lt;br /&gt;    y = right(year(now()),1)&lt;br /&gt;    If y = 0 Then&lt;br /&gt;       y = 10&lt;br /&gt;    ElseIf y &amp;gt; 6 Then&lt;br /&gt;       m = (y - 6) * 12&lt;br /&gt;       y = 6&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;    m = Right("00" &amp;amp; (m + Month(now)), 2)&lt;br /&gt;    d = Right("00" &amp;amp; Day(now), 2)&lt;br /&gt;&lt;br /&gt;    GetVersionYMMDD = y &amp;amp; m &amp;amp; d&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function GetVersionHHmm()&lt;br /&gt;    GetVersionHHmm = Right("00" &amp;amp; Hour(Now()), 2) &amp;amp; Right("00" &amp;amp; Minute(Now()), 2)&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-5296991029643040968?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/5296991029643040968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=5296991029643040968' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/5296991029643040968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/5296991029643040968'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/10/automatic-updating-of.html' title='Automatic Updating of AssemblyFileVersion in C# Projects'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-7934001186533468061</id><published>2007-10-05T12:01:00.000-04:00</published><updated>2007-10-05T12:24:31.640-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='moss'/><title type='text'>Missing MOSS 2007 Functionality</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;So having been using &lt;a href="http://office.microsoft.com/sharepointserver"&gt;MOSS 2007&lt;/a&gt; for the past 3 months now, I figured I'd put my own stake in the ground as to some things that would be quite handy to be built into the product.  Yes, there are probably ways to do some custom webparts to handle some of these, but IMHO, these are pieces of functionality that should be part of the base product.  Hopefully they make it into the next version...&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol  style="font-family:verdana;"&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;List View Security&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;This follows some of the same logic behind the use of a database VIEW.  An administrator should be able to create a SharePoint list view with a row-level filter and then secure the list of views to the appropriate folks (to the point of hiding views a user doesn't have access to use).&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;This would allow various business scenarios to be simply handled via view security.  For instance&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;hiding items based on the state/status code of an item to augment workflows&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;storing heterogeneous content types, but securing which are visible to whom&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;List Item Column Security&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;This is very similar to the view security above, but at a column-level, rather than row-level (vertical security versus horizontal security).  In fact, this could work very similarly to how views currently work, but could be called &lt;span style="font-style: italic; font-weight: bold;"&gt;item views&lt;/span&gt;, instead of &lt;span style="font-style: italic; font-weight: bold;"&gt;list views&lt;/span&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Yes, you could write custom ASPX pages to handle this, but the point of this functionality is to give a non-developer the ability to create this kind of functionality.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Custom Attributes On Lists&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;This is more or less a property bag (key/value pair bucket) that can be populated via the GUI by an end user, or via the API.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;This would be primarily useful to a developer who wants to track/manipulate additional details about a list, but enable end-users to make changes to those values when necessary.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-7934001186533468061?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/7934001186533468061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=7934001186533468061' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/7934001186533468061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/7934001186533468061'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/10/missing-moss-2007-functionality.html' title='Missing MOSS 2007 Functionality'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-817938744046910818</id><published>2007-08-30T17:16:00.000-04:00</published><updated>2007-08-30T17:34:15.434-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='excel'/><title type='text'>Programmatically Accessing Excel Data via .NET on 64-bit servers</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;So it turns out that using ADO.NET to access MS Excel worksheet data in an ASP.NET application running on the 64-bit version of Windows Server 2003 does not quite work as expected.  This also goes for any 64-bit .NET code.  In short, the Microsoft.Jet.OLEDB.4.0 provider is a 32-bit driver that does not work when directly used by 64-bit code.  The following post from a Microsoft employee&lt;/span&gt; describes the issue:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;a href="http://forums.asp.net/p/1128266/1781961.aspx"&gt;&lt;span style="font-family:verdana;"&gt;Connect to Excel. Using x64 (64-bit) platform. Compiled as x64&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;"Since there are no 64-bit OleDb drivers for anything other than SQL Server, therefore, we cannot write 64-bit apps which interface with databases directly.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;What you need to do is split your application into a 32 bit part and a 64 bit part, use COM interop to cross the 64/32 bit boundary. For instance, drop the code (just a simple class library compiled as 32 bit) that retrieves the Excel data into a COM+ (System.EnterpriseServices) as a "server type" application, and call those server methods from your 64 bit Windows service. This is exactly why System.EnterpriseServices are made for."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;To restate the above in a list of to do items:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;Refactor the Excel access code into a class by itself in a class library by itself&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Make sure that this new class inherits from &lt;a href="http://msdn2.microsoft.com/en-us/library/7c05y13x%28VS.71%29.aspx"&gt;System.EnterpriseServices.ServicedComponent&lt;/a&gt; so that it can be hosted within COM+ (Component Services)&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Make sure the new ServicedComponent's class library is compiled in 32-bit mode&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Alter the calling code (ASP.NET web page, control, web part, etc.) to call the new ServicedComponent for the Excel data retrieval routines&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Install the new ServicedComponent into Component Services&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-817938744046910818?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/817938744046910818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=817938744046910818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/817938744046910818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/817938744046910818'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/08/programmatically-accessing-excel-data.html' title='Programmatically Accessing Excel Data via .NET on 64-bit servers'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-4827317553056524115</id><published>2007-08-30T14:41:00.001-04:00</published><updated>2007-08-30T15:27:52.155-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='log4net'/><title type='text'>Using Log4Net in 4 Simple Steps</title><content type='html'>First off, yes, this is a complete rip-off from &lt;a href="http://www.axisebusiness.com/adnano/PermaLink,guid,586ef616-00b8-4ef2-a787-e03fbfb0de6c.aspx"&gt;this blog post&lt;/a&gt;, but with value added in that this represents my personal preference when using log4net.  This is a simple four step process of adding logging to an application.  I prefer log4net over the MS logging application block, primarily as log4net has zero dependencies and NHibernate already references it.  IMHO, if you're doing ANY kind of logging, reference log4net into your project and use it instead of Trace.WriteLine() or Debug.WriteLine().&lt;br /&gt;&lt;p class="MsoNormal" style=""&gt;&lt;b&gt;Step 1. Add the following in the AssemblyInfo.cs&lt;/b&gt;&lt;/p&gt;  &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;[assembly: log4net.Config.XmlConfiguratorAttribute(&lt;br /&gt;                         ConfigFile = "log4net.xml", Watch = true)]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Step 2. Create the log4net.xml file and add the following to the new file&lt;/b&gt;&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal"&gt;With respect to the location of this file and SharePoint, this file can exist in the root of the wss root, next to the relevant web.config file for the given site.&lt;span style=""&gt;  &lt;/span&gt;In general, this should sit next to the app.config or web.config file for the given application.&lt;/p&gt;                                                          &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;log4net&amp;gt;&lt;br /&gt;&amp;lt;appender name="GeneralLog" type="log4net.Appender.RollingFileAppender"&amp;gt;&lt;br /&gt; &amp;lt;file value="${TEMP}\\Logs\\AppName_${COMPUTERNAME} " /&amp;gt;&lt;br /&gt; &amp;lt;appendToFile value="true" /&amp;gt;&lt;br /&gt; &amp;lt;rollingStyle value="Composite" /&amp;gt;&lt;br /&gt; &amp;lt;staticLogFileName value="false" /&amp;gt;&lt;br /&gt; &amp;lt;datePattern value=".yyyyMMdd.'log'" /&amp;gt;&lt;br /&gt; &amp;lt;maxSizeRollBackups value="10" /&amp;gt;&lt;br /&gt; &amp;lt;maximumFileSize value="5MB" /&amp;gt;&lt;br /&gt; &amp;lt;lockingModel type="log4net.Appender.FileAppender+MinimalLock" /&amp;gt;&lt;br /&gt; &amp;lt;layout type="log4net.Layout.PatternLayout"&amp;gt;&lt;br /&gt;     &amp;lt;conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" /&amp;gt;&lt;br /&gt; &amp;lt;/layout&amp;gt;&lt;br /&gt;&amp;lt;/appender&amp;gt;&lt;br /&gt;&amp;lt;appender name="DebugAppender" type="log4net.Appender.DebugAppender"&amp;gt;&lt;br /&gt; &amp;lt;layout type="log4net.Layout.PatternLayout"&amp;gt;&lt;br /&gt;     &amp;lt;conversionPattern value="%d [%t] %-5level %logger - %message%newline" /&amp;gt;&lt;br /&gt; &amp;lt;/layout&amp;gt;&lt;br /&gt;&amp;lt;/appender&amp;gt;&lt;br /&gt;&amp;lt;root&amp;gt;&lt;br /&gt; &amp;lt;level value="ALL" /&amp;gt;&lt;br /&gt; &amp;lt;appender-ref ref="GeneralLog" /&amp;gt;&lt;br /&gt; &amp;lt;appender-ref ref="DebugAppender" /&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&amp;lt;!-- Print only messages of level ERROR or above in the package NHibernate --&amp;gt;&lt;br /&gt;&amp;lt;logger name="NHibernate" additivity="true"&amp;gt;&lt;br /&gt; &amp;lt;level value="ERROR" /&amp;gt;&lt;br /&gt;&amp;lt;/logger&amp;gt;&lt;br /&gt;&amp;lt;/log4net&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Step 3. Add the following at the top of your class&lt;/b&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;private static readonly log4net.ILog log = log4net.LogManager.GetLogger(&lt;br /&gt;                System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p class="MsoNormal" style="color: rgb(0, 0, 0);"&gt;&lt;b&gt;Step 4. Add the following line in the code where you want logging to be done&lt;/b&gt;&lt;/p&gt;  &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;log.Info("Program Started " + DateTime.Now.ToString ());&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b style=""&gt;References&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;    &lt;p class="MsoNormal"&gt;Apache log4net Home Page - &lt;a href="http://logging.apache.org/log4net/"&gt;http://logging.apache.org/log4net/&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/5940180558573941982-4827317553056524115?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/4827317553056524115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=4827317553056524115' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/4827317553056524115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/4827317553056524115'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/08/using-log4net-in-4-simple-steps.html' title='Using Log4Net in 4 Simple Steps'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-8975408585779025422</id><published>2007-07-28T13:28:00.000-04:00</published><updated>2007-07-28T13:40:26.766-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Potential solutions to the prior mentioned hack about KB928365 and ASP.NET Request Header modification</title><content type='html'>As "Anonymous" asked about my referenced solutions to the hack to resolve issues with MS KB928365, I figured instead of simply writing a follow-up comment, I would simply create a follow-up post.  That said, I can imagine at least two primary solutions to this, each depending on your exact situation.&lt;br /&gt;&lt;br /&gt;First off, with regards to my situation, I can create a provider pattern solution for looking up the enterprise provided AUTHID, such that if I want to fake it, my code isn't directly coupled to a value out of the header, but simply an interface that provides an AUTHID.  I would then create two separate implementations of the interface.  The first implementation would be the DEV simulation implementation, which would read the AUTHID out of the XML configuration file that we are currently using to inject into the request headers (for use in DEV).  The second interface implementation would be one that reads the value off of the request headers (for use in PROD).  You then configure which one is in use via your web.config, or via your Dependency Injection (DI) or Inversion of Control (IoC) framework (i.e., StructureMap, Windsor, Spring.NET).&lt;br /&gt;&lt;br /&gt;Second, if you don't have that level of control of the situation, you are probably stuck with having to create a custom reverse proxy server to sit in front of your application that injects the AUTHID before making the request directly to your application.&lt;br /&gt;&lt;br /&gt;Overall, the first solution is an order of magnitude more desirable.  It is very much the "proper" object oriented approach, as it creates a loosely coupled solution that can be easily reconfigured, and more importantly, tested.  And I would also highly recommend against even considering deploying the second solution in a production environment.  It should only be used for simulating things for development purposes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-8975408585779025422?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/8975408585779025422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=8975408585779025422' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/8975408585779025422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/8975408585779025422'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/07/potential-solutions-to-prior-mentioned.html' title='Potential solutions to the prior mentioned hack about KB928365 and ASP.NET Request Header modification'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-8908317409142831283</id><published>2007-07-13T20:51:00.000-04:00</published><updated>2007-07-13T20:59:12.864-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Blogs vs. Articles</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;a href="http://ayende.com/Blog/archive/2007/07/13/Blog-Posts-vs.-Articles.aspx"&gt;I love this post!&lt;/a&gt;  It's posts like this one that I &lt;span style="font-family:verdana;"&gt;swear &lt;/span&gt;&lt;/span&gt;&lt;span class="entry-author-name"  style="font-family:verdana;"&gt;&lt;a href="http://ayende.com/Blog/"&gt;Ayende Rahien&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:verdana;"&gt;and &lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;Jeremy Miller&lt;/a&gt; &lt;/span&gt;are my long lost brothers.  Week after week, those two get down in writing what I've been thinking about for quite some time, but until recently, didn't even bother to have a blog to write in myself.&lt;br /&gt;&lt;br /&gt;Overall, Nielsen is simply incorrect, much as &lt;a href="http://www.knowing.net/PermaLink,guid,e5aadb98-0a69-44e3-94cb-0afa583b0c0e.aspx"&gt;O'Brien points out&lt;/a&gt;.  Roughly 10 years ago, as a new college grad, I spent some time in the publishing world as a Technical Editor on a number of articles and two books.  I did it, because I thought wow, there could be my name in print.  But just doing those few jobs, not even being the author, I quickly came to realize all of the same things Larry points out in his post, so I stopped pursuing the publishing world any further.&lt;br /&gt;&lt;br /&gt;Since then, second to a few choice books most folks are aware of, blogs have become the primary source of learning on my end.  The amount of posts that I queue up daily in Google Reader as Starred Posts and then read while commuting to work, in elevators, at lunch, in waiting rooms, in conference rooms, etc on my WM5 Smartphone makes keeping up with this stuff seamless.  Toting around magazines, print-outs, and/or books just isn't practical these days.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-8908317409142831283?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/8908317409142831283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=8908317409142831283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/8908317409142831283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/8908317409142831283'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/07/blogs-vs-articles.html' title='Blogs vs. Articles'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-5422782680149453792</id><published>2007-07-13T12:40:00.000-04:00</published><updated>2007-07-13T12:57:08.995-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>MS KB928365, ASP.NET Request.Headers.Add() Hack No Longer Works</title><content type='html'>&lt;span style="font-family: verdana;"&gt;So a project that I am currently a part of is using an ASP.NET 2.0 HttpModule to add some additional values to the incoming HTTP request's headers in the DEV environment (i.e., our local disconnected laptops) to simulate what an enterprise single-sign-on  solution is performing in the production environment.  It has worked like a charm.  That is until I installed the new security update for the .NET Framework 2.0 release this past Wednesday, July 10, MS &lt;a style="font-weight: bold;" href="http://support.microsoft.com/kb/928365/"&gt;KB928365&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Apparently &lt;a style="font-weight: bold;" href="http://forums.asp.net/p/979853/1250479.aspx"&gt;this "hack"&lt;/a&gt; &lt;/span&gt;&lt;span style="font-family: verdana;"&gt;has been disabled with the release of this security update.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;&lt;a href="http://forums.asp.net/p/979853/1250479.aspx"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;When attempting to call Headers.Add(), with or without the above hack in place, you will now receive a &lt;a style="font-weight: bold;" href="http://msdn2.microsoft.com/en-us/library/system.platformnotsupportedexception.aspx"&gt;PlatformNotSupported&lt;/a&gt; exception.&lt;br /&gt;&lt;br /&gt;All in all, this post is by no means a rant against the security update, but simply an attempt to add a quick answer to the "Google answer machine" for those searching.  I am also already aware of a number of other potentially better solutions than the one currently in place for simulating those user accounts, but for now, simply uninstalling the above referenced security update gets the team back working again.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-5422782680149453792?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/5422782680149453792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=5422782680149453792' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/5422782680149453792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/5422782680149453792'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/07/ms-kb928365-aspnet-requestheadersadd.html' title='MS KB928365, ASP.NET Request.Headers.Add() Hack No Longer Works'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-7787615398474714188</id><published>2007-06-12T17:00:00.000-04:00</published><updated>2007-06-12T17:06:09.978-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='winxp'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><title type='text'>Using Multiple iPods on a Single Windows Computer</title><content type='html'>So I got a new laptop a week ago, and in the process was determined to figure out a better way to sync both my girlfriend Anne's 4GB iPod Nano and my 60GB iPod Photo using the single laptop.&lt;br /&gt;&lt;br /&gt;With the last laptop, I created an additional user account to be used just for managing the iTunes library for my iPod.  Anytime I needed to sync my iPod, I logged off my "primary" user account and then back in with a "secondary" user account used just for managing my iTunes library.  I was convinced that there had to be a better way, but simply hadn't spent the time trying to find it.  With the new laptop in hand, I was determined to find out what the answer was.&lt;br /&gt;&lt;br /&gt;After Google'n for an answer, I found a number of solutions similar to the following ones:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lifehacker.com/software/itunes/multiple-libraries-in-itunes-7-202302.php"&gt;http://lifehacker.com/software/itunes/multiple-libraries-in-itunes-7-202302.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.allthingsmarked.com/2006/09/13/howto-manage-multiple-libraries-in-itunes-7/"&gt;http://www.allthingsmarked.com/2006/09/13/howto-manage-multiple-libraries-in-itunes-7/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mcelhearn.com/article.php?story=20050124101441405"&gt;http://www.mcelhearn.com/article.php?story=20050124101441405&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But none of them struck me as what I wanted the solution to be.&lt;br /&gt;&lt;br /&gt;I then remembered the &lt;a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/runas.mspx?mfr=true"&gt;RUNAS&lt;/a&gt; functionality built into Windows XP, which in short, allows you to execute any given program under a different security context (i.e., using a different user account than the one you are currently logged in with).  I then gathered that I should be able to run an instance of iTunes using RUNAS via a secondary user account.&lt;br /&gt;&lt;br /&gt;So I created the secondary user account that I would use for managing &lt;span style="font-style: italic; font-weight: bold;"&gt;my&lt;/span&gt; iTunes library, logged in with the secondary user account, and launched iTunes to ensure everything was working as expected.  I then imported my iTunes library from the old laptop, etc.  I then logged back in with my primary user account for the laptop and used RUNAS to launch iTunes with the secondary user account.&lt;br /&gt;&lt;br /&gt;In short, it worked perfectly!  The only hick-up of sorts was trying to figure out how to get the "Run as..." option to show up on the context menu for the iTunes icon on my Windows Desktop.  The trick is to hold down the shift key while right-clicking the icon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-7787615398474714188?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/7787615398474714188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=7787615398474714188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/7787615398474714188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/7787615398474714188'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/06/using-multiple-ipods-on-single-windows.html' title='Using Multiple iPods on a Single Windows Computer'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5940180558573941982.post-8284927098158905287</id><published>2007-06-12T16:30:00.000-04:00</published><updated>2007-06-12T16:27:07.953-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intro'/><title type='text'>It was bound to eventually happen...</title><content type='html'>&lt;font face="trebuchet ms"&gt;...that I would start a blog.&lt;br /&gt;&lt;br /&gt;Anyway, I've spent better than the past 5 years now reading other people's blogs, and steering clear of starting my own.  I still don't think I have the time to offer a lot of content, but hopefully what I do post will be more useful than this obligatory intro.  The only real reason I decided to start this was to give myself somewhere to post write-ups on random topics that I couldn't find an answer to via Google.  Hopefully posting those write-ups here will save someone else some time some day.&lt;br /&gt;&lt;br /&gt;In the mean time, you can keep yourself busy reading my &lt;a href="http://www.google.com/reader/shared/07124314113009710552"&gt;Google Reader Shared Posts&lt;/a&gt;. &lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5940180558573941982-8284927098158905287?l=bigjimindc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bigjimindc.blogspot.com/feeds/8284927098158905287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5940180558573941982&amp;postID=8284927098158905287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/8284927098158905287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5940180558573941982/posts/default/8284927098158905287'/><link rel='alternate' type='text/html' href='http://bigjimindc.blogspot.com/2007/06/it-was-bound-to-eventually-happen.html' title='It was bound to eventually happen...'/><author><name>BigJimInDC</name><uri>http://www.blogger.com/profile/17164195823642206919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/21/buddyicons/25294855@N00.jpg?1138398443'/></author><thr:total>0</thr:total></entry></feed>
