<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Mobius Development</title><subtitle type="html"></subtitle><id>tag:blogger.com,1999:blog-35507329</id><updated>2010-06-28T08:18:43-07:00</updated><author><name>John</name><email>john@mobiusdevelopment.com</email></author><generator>Blogger</generator><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/feed.xml" /><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/feed.xml" /><link rel="alternate" type="text/html" href="http://www.mobiusdevelopment.com/" /><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">92</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">500</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-35507329.post-8850083754148647620</id><title type="text">MSDN Virtual Lab: Using SharePoint 2010 with Visual Studio Professional 2010</title><published>2010-06-28T08:17:00-07:00</published><updated>2010-06-28T08:18:43-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8850083754148647620" /><link rel="alternate" type="text/html" title="MSDN Virtual Lab: Using SharePoint 2010 with Visual Studio Professional 2010" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8850083754148647620" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;style type="text/css"&gt;#previewdiv {  height: 150px;  width: 750px;}&lt;/style&gt;&lt;div id="PreviewDiv"&gt;&lt;br /&gt;                            &lt;h5&gt;&lt;br /&gt;                                &lt;a href="http://www.microsoftbroadcaster.com/en-us/Content/Link/10050?WT.z_cType=VL&amp;amp;WT.z_cSource=WWE" target="_blank"&gt;&lt;br /&gt;                                    MSDN Virtual Lab: Using SharePoint 2010 with Visual Studio Professional 2010 (Level 100)&lt;/a&gt;&lt;br /&gt;                            &lt;/h5&gt;&lt;br /&gt;                            &lt;br /&gt;                            &lt;br /&gt;                          &lt;a href="http://www.microsoftbroadcaster.com/en-us/Content/Media/10050?WT.z_cType=VL&amp;amp;WT.z_cSource=WWE" target="_blank"&gt;&lt;br /&gt;                          &lt;img height="50px" width="50px" style="float: left; margin: 2px" src="http://www.microsoftbroadcaster.com/App_Themes/MS/images/virtuallab.png"&gt;&lt;/a&gt;&lt;br /&gt;                           &lt;br /&gt;                           &lt;p&gt;&lt;br /&gt;                                In this lab, you will be using Visual Studio 2010’s SharePoint 2010 project system to create and debug a Visual Web Part. You then will use the SharePoint Business Connectivity Services (BCS) to create a SharePoint list that exposes external data.&lt;br /&gt;                            &lt;/p&gt;&lt;br /&gt;                        &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-8850083754148647620?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4559995838276349553</id><title type="text">MSDN Webcast: SharePoint Server 2010: Developing with Data Technologies in SharePoint 2010</title><published>2010-06-25T06:51:00-07:00</published><updated>2010-06-25T06:52:30-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4559995838276349553" /><link rel="alternate" type="text/html" title="MSDN Webcast: SharePoint Server 2010: Developing with Data Technologies in SharePoint 2010" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4559995838276349553" /><category term="Webcast" scheme="http://www.blogger.com/atom/ns#" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;div&gt;&lt;style type="text/css"&gt;#previewdiv {  height: 150px;  width: 750px;}&lt;/style&gt;&lt;div id="PreviewDiv"&gt;&lt;/div&gt;&lt;div&gt;                            &lt;h5&gt;&lt;/div&gt;&lt;div&gt;                                &lt;a href="http://www.microsoftbroadcaster.com/en-us/Content/Link/10149?WT.z_cType=WC&amp;amp;WT.z_cSource=WWE" target="_blank"&gt;&lt;/div&gt;&lt;div&gt;                                    MSDN Webcast: SharePoint Server 2010 (Part 8 of 8): Developing with Data Technologies in SharePoint 2010 (Level 100)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;                            &lt;/h5&gt;&lt;/div&gt;&lt;div&gt;                            &lt;/div&gt;&lt;div&gt;                            &lt;/div&gt;&lt;div&gt;                          &lt;a href="http://www.microsoftbroadcaster.com/en-us/Content/Media/10149?WT.z_cType=WC&amp;amp;WT.z_cSource=WWE" target="_blank"&gt;&lt;/div&gt;&lt;div&gt;                          &lt;img height="50px" width="50px" style="float: left; margin: 2px" src="http://www.microsoftbroadcaster.com/App_Themes/MS/images/webcast.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;                           &lt;/div&gt;&lt;div&gt;                           &lt;p&gt;&lt;/div&gt;&lt;div&gt;                                Microsoft SharePoint Server 2010 has several new and improved ways to work with data in SharePoint data lists. LINQ for SharePoint lets a developer work with data from SharePoint lists in a strongly typed way that preserves relationships between lists. Second, new integration of Microsoft ADO.NET data services provide a way to get data from SharePoint remotely us...&lt;/div&gt;&lt;div&gt;                            &lt;/p&gt;&lt;/div&gt;&lt;div&gt;                        &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4559995838276349553?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2543226725125208132</id><title type="text">Building Facebook Apps with Windows Azure</title><published>2010-06-12T07:08:00-07:00</published><updated>2010-06-12T07:17:43-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2543226725125208132" /><link rel="alternate" type="text/html" title="Building Facebook Apps with Windows Azure" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2543226725125208132" /><category term="Facebook" scheme="http://www.blogger.com/atom/ns#" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="Azure" scheme="http://www.blogger.com/atom/ns#" /><category term="CapArea" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I had a great time presenting at &lt;a href="http://novacodecamp.org"&gt;NoVA Code Camp 2010&lt;/a&gt;. I always love to see what other developers are doing and spread my wings into new technology. Unfortunately, my speaking slot was during the second half of the US v England World Cup match. ESPN3 FTW!!!!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I presented on the &lt;a href="http://facebookazuretoolkit.codeplex.com/"&gt;Windows Azure Toolkit for Facebook&lt;/a&gt;. This is an application toolkit and template created by &lt;a href="http://www.thuzi.com/"&gt;Thuzi &lt;/a&gt;and hosted on CodePlex. Their CTO &lt;a href="http://twitter.com/JimZim"&gt;Jim Zimmerman&lt;/a&gt; provided a &lt;a href="http://live.visitmix.com/MIX10/Sessions/EX23"&gt;great overview at Mix 2010&lt;/a&gt;. This presentation focused on the why and how of building and deploying to Facebook and Azure. In doing my background for this presentation, I really began to see Facebook as a development platform and as another tool for certain web applications. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://click.officeliveemail.com/?ju=fe4d1c78706303747411&amp;amp;ls=fdf417777667057b72107571&amp;amp;m=fef012797d6206&amp;amp;l=fec51c7677610478&amp;amp;s=fe2a1c7273650674731473&amp;amp;jb=feca157277620574&amp;amp;t="&gt;View presentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://delicious.com/jwmiller5/novacc2010"&gt;View related links&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2543226725125208132?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5593474193748954615</id><title type="text">Practice Questions for 70-573, Stabilizing and Deploying SharePoint Components</title><published>2010-05-26T05:07:00-07:00</published><updated>2010-05-26T05:07:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5593474193748954615" /><link rel="alternate" type="text/html" title="Practice Questions for 70-573, Stabilizing and Deploying SharePoint Components" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5593474193748954615" /><category term="certification" scheme="http://www.blogger.com/atom/ns#" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I'll be posting practice questions for the &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-573"&gt;70-573 Microsoft SharePoint 2010 TS: Application Development&lt;/a&gt; certification all week. I haven't seen the test, and I apologize if these questions aren't representative of the actual exam, however, they focus on the topics outlined by Microsoft.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;You are developing a sandboxed solution to deploy to a hosted SharePoint 2010 instance. You are debugging against a remote SharePoint development instance and none of the breakpoints you set are being hit. What should you do to enable debugging?&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Attach the debugger to the w3wp process on the remote SharePoint machine.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Attach the debugger to the owstimer process on the remote SharePoint machine.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Attach the debugger to the VSSPHOSTV4 process on the local machine.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Attach the debugger to the SPUCHostService process on the remote machine.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5593474193748954615?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-1506543082230259215</id><title type="text">MSDN Virtual Lab: LINQ to SharePoint</title><published>2010-05-25T09:03:00-07:00</published><updated>2010-05-25T09:52:32-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1506543082230259215" /><link rel="alternate" type="text/html" title="MSDN Virtual Lab: LINQ to SharePoint" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1506543082230259215" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="LINQ" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;style type="text/css"&gt;#previewdiv {  height: 250px;  width: 750px;}&lt;/style&gt;&lt;div id="PreviewDiv"&gt;&lt;br /&gt;                            &lt;h5&gt;&lt;br /&gt;                                &lt;a href="http://www.microsoftbroadcaster.com/en-us/Content/Link/9066?WT.z_cType=AR&amp;amp;WT.z_cSource=WWE" target="_blank"&gt;&lt;br /&gt;                                    MSDN Virtual Lab: LINQ to SharePoint 2010 (Level 100)&lt;/a&gt;&lt;br /&gt;                            &lt;/h5&gt;&lt;br /&gt;                            &lt;br /&gt;                            &lt;br /&gt;                           &lt;p&gt;&lt;br /&gt;                                LINQ to&amp;nbsp;SharePoint is&amp;nbsp;a technology&amp;nbsp;for querying&amp;nbsp;SharePoint lists&amp;nbsp;that relieves&amp;nbsp;the developer&amp;nbsp;from having&amp;nbsp;to write&amp;nbsp;CAML queries.&amp;nbsp;In this&amp;nbsp;lab...&lt;br /&gt;                            &lt;/p&gt;&lt;br /&gt;                        &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-1506543082230259215?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7907036142389911187</id><title type="text">Practice Questions for 70-573, Working with SharePoint Data</title><published>2010-05-25T05:31:00-07:00</published><updated>2010-05-25T05:31:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7907036142389911187" /><link rel="alternate" type="text/html" title="Practice Questions for 70-573, Working with SharePoint Data" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7907036142389911187" /><category term="certification" scheme="http://www.blogger.com/atom/ns#" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I'll be posting practice questions for the &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-573"&gt;70-573 Microsoft SharePoint 2010 TS: Application Development&lt;/a&gt; certification for the next week. I haven't seen the test, and I apologize if these questions aren't representative of the actual exam, however, they focus on the topics outlined by Microsoft.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;You are developing a custom web part that will allow users to explore a large dataset stored across several SharePoint lists. Your team has decided to use LINQ to SharePoint to build the queries to these lists. You start writing the query and you do not get Intellisense in Visual Studio 2010 to choose the fields to include in the query. Choose two choices from below to fix this problem. Each answer is part of the solution.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Add a reference to System.Data.Linq&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add a reference to Microsoft.SharePoint.Linq&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Open a Visual Studio Command Prompt and run SPMetal.exe /web:http://yoursite/ namespace:SolutionNameSpace /code:Entity.cs&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create an Entity Framewok Model called Entity and add the SharePoint fields that you need to the Model.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7907036142389911187?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-1586131254047749033</id><title type="text">Practice Questions for 70-573, Developing Business Logic</title><published>2010-05-24T05:48:00-07:00</published><updated>2010-05-24T05:48:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1586131254047749033" /><link rel="alternate" type="text/html" title="Practice Questions for 70-573, Developing Business Logic" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1586131254047749033" /><category term="certification" scheme="http://www.blogger.com/atom/ns#" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;div&gt;I'll be posting practice questions for the &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-573"&gt;70-573 Microsoft SharePoint 2010 TS: Application Development&lt;/a&gt; certification for the next week. I haven't seen the test, and I apologize if these questions aren't representative of the actual exam, however, they focus on the topics outlined by Microsoft.&lt;/div&gt;&lt;div&gt;&lt;hr /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Your company tracks client contracts through the project lifecycle in a custom SharePoint list. When a contract is entered by a user, they want to add additional metadata to indicate that this version was the original contract version, and the list item can be modified in the future if necessary. The additional metadata is stored in several external systems and will be collected via WCF services. What is the best way to create an Event Receiver to implement this business logic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;pre&gt;&lt;br /&gt;    public class ContractEventReceiver : SPItemEventReceiver&lt;br /&gt;    {&lt;br /&gt;        public override void ItemUpdated(SPItemEventProperties properties)&lt;br /&gt;        {&lt;br /&gt;            this.DisableEventFiring();&lt;br /&gt;            properties.ListItem.Update();&lt;br /&gt;            MarkContractListItem();&lt;br /&gt;            this.EnableEventFiring();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;pre&gt;&lt;br /&gt;    public class ContractEventReceiver : SPItemEventReceiver&lt;br /&gt;    {&lt;br /&gt;        public override void ItemUpdated(SPItemEventProperties properties)&lt;br /&gt;        {&lt;br /&gt;            this.EventFiringEnabled = false;&lt;br /&gt;            properties.ListItem.Update();&lt;br /&gt;            MarkContractListItem();&lt;br /&gt;            this.EventFiringEnabled = true;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;pre&gt;&lt;br /&gt;    public class ContractEventReceiver : SPItemEventReceiver&lt;br /&gt;    {&lt;br /&gt;        public override void ItemUpdating(SPItemEventProperties properties)&lt;br /&gt;        {&lt;br /&gt;              MarkContractListItem();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;pre&gt;&lt;br /&gt;    public class ContractEventReceiver : SPItemEventReceiver&lt;br /&gt;    {&lt;br /&gt;        public override void ItemUpdating(SPItemEventProperties properties)&lt;br /&gt;        {&lt;br /&gt;            this.EventFiringEnabled = false;&lt;br /&gt;            MarkContractListItem();&lt;br /&gt;            this.EventFiringEnabled = true;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-1586131254047749033?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2878764226130311419</id><title type="text">Practice Questions for 70-573, Working with the SharePoint User Interface</title><published>2010-05-23T10:00:00-07:00</published><updated>2010-05-23T10:00:01-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2878764226130311419" /><link rel="alternate" type="text/html" title="Practice Questions for 70-573, Working with the SharePoint User Interface" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2878764226130311419" /><category term="certification" scheme="http://www.blogger.com/atom/ns#" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;div&gt;I'll be posting practice questions for the&lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-573"&gt; 70-573 Microsoft SharePoint 2010 TS: Application Development&lt;/a&gt; certification for the next week. I haven't seen the test, and I apologize if these questions aren't representative of the actual exam, however, they focus on the topics outlined by Microsoft.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You need to create a custom web part using a third-party GridControl your company has purchased. This web part will be deployed to a hosted SharePoint installation as a sandboxed solution. How should you create this web part?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Create a Visual Web Part. Drag the GridControl onto the canvas and set the appropriate properties.&lt;/li&gt;&lt;li&gt;Create a Web Part. Override the Render() method to render the custom GridControl.&lt;/li&gt;&lt;li&gt;Create a Web Part. Override the CreateChildControls() method to add the custom GridControl to the Controls collection.&lt;/li&gt;&lt;li&gt;Create a Web Part. Override the RenderControl() method to render the custom GridControl&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2878764226130311419?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4284772690996278923</id><title type="text">Practice Questions for 70-573, Working with the SharePoint User Interface</title><published>2010-05-22T07:42:00-07:00</published><updated>2010-05-22T07:51:15-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4284772690996278923" /><link rel="alternate" type="text/html" title="Practice Questions for 70-573, Working with the SharePoint User Interface" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4284772690996278923" /><category term="certification" scheme="http://www.blogger.com/atom/ns#" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I'll be posting practice questions for the &lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-573"&gt;70-573 Microsoft SharePoint 2010 TS: Application Development certification&lt;/a&gt; for the next week. I haven't seen the test, and I apologize if these questions aren't representative of the actual exam, however, they focus on the topics outlined by Microsoft.&lt;br /&gt;&lt;br /&gt;You are trying to add a dialog box to popup from a custom ribbon button. You created the following javascript code snippet. What is the final line that needs to be added?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;....[START CODE SNIPPET]&lt;/i&gt;&lt;br /&gt;            var options = {            &lt;br /&gt;              url: '/_layouts/Custom/CustomPage.aspx?items=' + customItems + '&amp;amp;source=' + SP.ListOperation.Selection.getSelectedList(),&lt;br /&gt;              tite: 'Custom Action',&lt;br /&gt;              allowMaximize: false,&lt;br /&gt;              showClose: false,&lt;br /&gt;              width: 800,&lt;br /&gt;              height: 600,&lt;br /&gt;              dialogReturnValueCallback: demoCallback };&lt;br /&gt;&lt;b&gt;&lt;i&gt;               [YOUR CODE GOES HERE]&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt;[END CODE SNIPPET]....&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;SP.UI.ModalDialog.showModalDialog(options);&lt;/li&gt;&lt;li&gt;SP.UI.ModalDialog.showPopupDialog(url);&lt;/li&gt;&lt;li&gt;SP.UI.ModalDialog.commonModalDialogOpen(url, options, demoCallback, args);&lt;/li&gt;&lt;li&gt;SP.UI.ModalDialog.showWaitScreenWithNoClose(title, message, height, width);&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;          &lt;br /&gt;            &lt;your code="" goes="" here=""&gt;&lt;/your&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4284772690996278923?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3241721793420902526</id><title type="text">MSDN Webcast: SharePoint 2010 and Windows Azure (Level 300)</title><published>2010-05-14T04:51:00-07:00</published><updated>2010-06-25T07:14:53-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3241721793420902526" /><link rel="alternate" type="text/html" title="MSDN Webcast: SharePoint 2010 and Windows Azure (Level 300)" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3241721793420902526" /><category term="Webcast" scheme="http://www.blogger.com/atom/ns#" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="Azure" scheme="http://www.blogger.com/atom/ns#" /><category term="SharePoint2010" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;style type="text/css"&gt;#previewdiv {  height: 150px;  width: 750px;}&lt;/style&gt;&lt;div id="PreviewDiv"&gt;&lt;br /&gt;                           &lt;h5&gt;&lt;br /&gt;                               &lt;a href="http://www.microsoftbroadcaster.com/en-us/Content/Link/8490?WT.z_cType=WC&amp;amp;WT.z_cSource=WWE" target="_blank"&gt;&lt;br /&gt;                                   MSDN Webcast: SharePoint 2010 and Windows Azure (Level 300)&lt;/a&gt;&lt;br /&gt;                           &lt;/h5&gt;&lt;br /&gt;                          &lt;br /&gt;                          &lt;br /&gt;                         &lt;a href="http://www.microsoftbroadcaster.com/en-us/Content/Media/8490?WT.z_cType=WC&amp;amp;WT.z_cSource=WWE" target="_blank"&gt;&lt;br /&gt;                         &lt;img height="50px" width="50px" style="float: left; margin: 2px" src="http://www.microsoftbroadcaster.com/App_Themes/MS/images/webcast.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;                         &lt;br /&gt;                          &lt;p&gt;&lt;br /&gt;                               Windows Azure is playing an increasingly more important role in the integration of cloud-based solutions and services into the design and deployment of solutions. What does this mean for Microsoft Sha...&lt;br /&gt;                           &lt;/p&gt;&lt;br /&gt;                       &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3241721793420902526?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5909597467215748132</id><title type="text">Speaking off the cuff</title><published>2010-04-23T07:01:00-07:00</published><updated>2010-04-23T09:12:17-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5909597467215748132" /><link rel="alternate" type="text/html" title="Speaking off the cuff" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5909597467215748132" /><category term="Toastmasters" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;Have you ever been asked for your opinion about something, only to have your mind go blank? Have you given your opinion, but it was so disorganized that the point you were trying to make was lost?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.toastmasters.org/"&gt;Toastmasters &lt;/a&gt;hones these skills at every meeting with &lt;a href="http://www.toastmasters.org/MagazineItems/TableTopics.aspx"&gt;Table Topics&lt;/a&gt;. There are as many table topics as there are conversations. They can range for serious political or spiritual discussions, to humorous stories, to personal statements. These are generally open ended questions like &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;My favorite sports memory is ... &lt;/li&gt;    &lt;li&gt;This weekend I will ... &lt;/li&gt;    &lt;li&gt;I was unprepared for ... &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Although many of these topics can be light-hearted, it offers everyone a chance to speak as Table Topics are usually only one to two minutes long. These skills can be directly transferred to your career in your "elevator pitch" for a new role or persuasion skills in your next meeting. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5909597467215748132?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2854359608917314060</id><title type="text">Visualizing Survey Results with Wordle</title><published>2010-03-15T09:14:00-07:00</published><updated>2010-03-15T09:24:49-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2854359608917314060" /><link rel="alternate" type="text/html" title="Visualizing Survey Results with Wordle" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2854359608917314060" /><category term="visualization" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;&lt;em&gt;Statistical surveys are used to collect quantitative information about items in a population. Surveys of human populations and institutions are common in political polling and government, health, social science and marketing research - &lt;a href="http://en.wikipedia.org/wiki/Statistical_survey" target="_blank"&gt;from Wikipedia&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;We have all filled out surveys. We score our customer service, job satisfaction, political beliefs and more. Surveys are an excellent tool for collecting &lt;strong&gt;quantitative data&lt;/strong&gt; from a large set of people. As more people respond, we can use statistical analysis to predict the entire population's response with increasing precision. This capability leads survey designers to prefer numeric scores. The canonical example is the 1 to 5, Strongly Disagree to Strongly Agree. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/images/VisualizingSurveyResultswithWordle_96FE/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 30px 0px 0px; border-right-width: 0px" height="155" alt="image" src="http://www.mobiusdevelopment.com/dev/images/VisualizingSurveyResultswithWordle_96FE/image_thumb.png" width="662" align="left" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/images/VisualizingSurveyResultswithWordle_96FE/image_3.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="254" alt="image" src="http://www.mobiusdevelopment.com/dev/images/VisualizingSurveyResultswithWordle_96FE/image_thumb_3.png" width="659" border="0" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;These constrained answers make it easy to compare scores and aggregate data, but for complex issues with interdependencies, these questions are irrelevant. Can anyone have a 3.8 agreement factor about their child's education? Are you sure your customers have a 4.4 out of 5 positive feeling about your brand? Some survey designers try to include several factors to allow for more nuanced rankings. How can we encourage users to give us the answers to the issues burning deep in their souls while not creating a list of essays for reviewers to read, rank, and aggregate? &lt;strong&gt;&lt;em&gt;Is there a good way to quantify qualitative data?&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;On a recent client engagement, we were analyzing a survey including broad, open-ended questions with no restriction on answers. How do you quantify &amp;quot;What is the best part of your job?&amp;quot; Enter &lt;a href="http://www.wordle.net/" target="_blank"&gt;Wordle&lt;/a&gt;. This site allows you to enter any test you like, and it will provide the word count, remove common terms (at, of, the, and), and provide a visualization of the relevant terms? When I was working with another developer on it, &lt;strong&gt;we found the flow from the question to the most common answers impossible to resist&lt;/strong&gt;. Our eyes were immediately drawn to the leading answers. Our clients agreed and found the output easy to understand.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/images/VisualizingSurveyResultswithWordle_96FE/demo_wordmap.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="389" alt="demo_wordmap" src="http://www.mobiusdevelopment.com/dev/images/VisualizingSurveyResultswithWordle_96FE/demo_wordmap_thumb.png" width="517" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Wordle runs as a Java applet on your local machine. This means that your anonymous, personal survey results are processed on your local machine and no information is sent back to a central server for storage. The word counts are also available if someone wants to have the specific number of times a topic or word was mentioned.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Disclaimer: I am in no way affiliated with Wordle, I just used it and found it was a perfect fit for our needs.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2854359608917314060?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-737663234322394849</id><title type="text">Satchmo on Software</title><published>2010-03-07T14:18:00-08:00</published><updated>2010-03-07T14:19:28-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=737663234322394849" /><link rel="alternate" type="text/html" title="Satchmo on Software" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=737663234322394849" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;Since moving the the DC region, I've taken an interest in jazz. I was listening to a &lt;a href="http://www.wcpn.org/WCPN/jazztracks/28795" target="_blank"&gt;podcast&lt;/a&gt; over the weekend and learning about the life of &lt;a href="http://en.wikipedia.org/wiki/Louis_Armstrong" target="_blank"&gt;Louis Armstrong&lt;/a&gt;. He is recognized as a foundational influence in jazz shifting focus from collective improvisation to solo performers. According to many critics his creative leadership was waning by the mid 1950s. The host on the show said that he spent the rest of his life &lt;em&gt;&amp;quot;exploring the beauty of the craft he helped create&amp;quot;&lt;/em&gt;. I'm not nearly knowledgeable enough about jazz to comment on the timeline but the comment stuck with me.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="margin: 0px 20px 0px 0px" src="http://farm3.static.flickr.com/2144/1526875986_378b6debe7.jpg" align="left" /&gt;&lt;/p&gt;  &lt;p&gt;As as software developer, there is a steady pressure to keep learning about the industry and experiment with new tools and technologies. I'm far too young to think that I will be able to retire with the knowledge I have now, so it's a given that I'll have to reinvent myself multiple times even if I keep the same job title. Does this mean that even if I deliver hit after hit for my clients that at some point I'll be ushered off stage as my jazz looses popularity to some new R&amp;amp;B sounds? Is there an option for me to explore the music that I'm working with now? &lt;/p&gt;  &lt;p&gt;I recently wrote a script to combine and format text files. There's nothing exciting about the technology. There was no differentiation between the script I wrote recently, and my first programming assignments in high school. Was I really going to deliver work that could have been written by a freshman???&lt;/p&gt;  &lt;p&gt;As I meditated on this, I realized that I could comment the code and refactor it so that next time a one-off request comes through, someone else could modify my code and reuse it. I added some logging so that the results could be independently verified and analyzed. I made a simple User Interface for selecting folders and files. The end result is still the same, but I feel that the product is now &lt;a href="http://www.businessdictionary.com/definition/fitness-for-use.html" target="_blank"&gt;fit for use&lt;/a&gt;. It is in no way revolutionary, but for our current needs, it fits perfectly. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;From February 1 to May 2, 1964 the Beatles held the #1 Billboard spot with hits including &amp;quot;I Want to Hold Your Hand&amp;quot;, &amp;quot;She Loves You&amp;quot;, and &amp;quot;Can't Buy Me Love&amp;quot;. On May 9, 1964 Louis Armstrong ends the Beatles 14 week streak atop the Billboard charts with &lt;a href="http://en.wikipedia.org/wiki/Hello,_Dolly!_(song)" target="_blank"&gt;&amp;quot;Hello, Dolly&amp;quot;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-737663234322394849?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-6606061711864093486</id><title type="text">Book Review: 97 Things Every Programmer Should Know</title><published>2010-02-11T07:29:00-08:00</published><updated>2010-02-11T07:33:31-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6606061711864093486" /><link rel="alternate" type="text/html" title="Book Review: 97 Things Every Programmer Should Know" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6606061711864093486" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;As the title suggests, &lt;a href="http://www.amazon.com/gp/product/0596809484?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0596809484"&gt;97 Things Every Programmer Should Know&lt;/a&gt;&lt;img style="margin: 0px; border-top-style: none! important; border-right-style: none! important; border-left-style: none! important; border-bottom-style: none! important" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0596809484" width="1" border="0" /&gt; is a buffet table of delicious best practices including small functions, unit and performance testing, version control, command line tools and more. However, just as many chapters focus on personal traits such as perseverance, reflection, professionalism, continuous learning and other traits that only apply to the reader. Finally, there are stories from the trenches such as the importance of realistic test data, (there are a lot of error message that lead to &lt;a href="http://www.urbandictionary.com/define.php?term=CLM:+Career+Limiting+Move" target="_blank"&gt;&amp;quot;career limiting&amp;quot; events&lt;/a&gt;) as well as requirements gathering and project management.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;From Chapter 25&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;It was getting late. I was throwing in some placeholder data to test the page      &lt;br /&gt;layout I&amp;#8217;d been working on. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;em&gt;I appropriated the members of The Clash for the names of users. Company      &lt;br /&gt;names? Song titles by the Sex Pistols would do. Now I needed some stock ticker       &lt;br /&gt;symbols&amp;#8212;just some four-letter words in capital letters.       &lt;br /&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;I used &lt;strong&gt;those&lt;/strong&gt; four-letter words.       &lt;br /&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;It seemed harmless. Just something to amuse myself, and maybe the other      &lt;br /&gt;developers the next day before I wired up the real data source.       &lt;br /&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The following morning, a project manager took some screenshots for a      &lt;br /&gt;presentation.&lt;/em&gt;&lt;/p&gt; &lt;iframe style="width: 120px; height: 240px" marginwidth="0" marginheight="0" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=earlieeducat-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=10FE9736YVPPT7A0FBG2&amp;amp;asins=0596809484" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;This book is an easy read, since each chapter is a maximum of 4-5 pages. This makes it a great book to read on the train, or as part of a &lt;a href="http://en.wikipedia.org/wiki/Brown_bag_seminars" target="_blank"&gt;brown bag session&lt;/a&gt; at work. However, none of these chapters provides enough background to start a new development exercise. For that reason, I would suggest this book to new programmers who are looking to become professional developers. Many of the concepts in this book are not covered in a university CS program, and developers need to learn the lessons at some point. For current professionals, I found the book to be an easy read (and a reminder for certain practices which you may have let fall by the wayside).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;From the preface:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;There is no overarching narrative: it is for you to respond to, reflect on, and connect together what you read, weighing it against your own context, knowledge, and experience.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-6606061711864093486?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-860610076672417776</id><title type="text">Cloud Computing enables Megacommunity support of Haiti relief efforts</title><published>2010-01-22T08:54:00-08:00</published><updated>2010-01-22T08:54:26-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=860610076672417776" /><link rel="alternate" type="text/html" title="Cloud Computing enables Megacommunity support of Haiti relief efforts" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=860610076672417776" /><category term="Cloud" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;After the &lt;a href="http://en.wikipedia.org/wiki/2010_Haiti_earthquake" target="_blank"&gt;2010 earthquake in Haiti&lt;/a&gt;, people worldwide jumped to donate money, time and expertise to help the victims. Software developers &lt;a href="http://wiki.crisiscommons.org/wiki/Main_Page" target="_blank"&gt;jumped to support&lt;/a&gt; the information sharing required by the &lt;a href="http://www.thecepp.org/download/The_Megacommunity_Manifesto.pdf" target="_blank"&gt;Megacommunity&lt;/a&gt; of government agencies, non-profits, media, and public. The &lt;a href="http://twitter.com/crisiscamp" target="_blank"&gt;Crisis Camp&lt;/a&gt; movement is a framework for people to meet locally, and coordinate globally to support disaster relief efforts. Although the focus is on software development (the crisis camp idea stems from the &lt;a href="http://en.wikipedia.org/wiki/BarCamp" target="_blank"&gt;BarCamp&lt;/a&gt; movement), volunteers with any experience and background are needed and welcome.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4016/4283917625_624d7ed929.jpg" /&gt; &lt;/p&gt;  &lt;p&gt;In one week, a distributed team from Washington DC and Los Angeles released the first application, &lt;a href="http://www.wehaveweneed.org/" target="_blank"&gt;&amp;quot;We Have, We Need&amp;quot;&lt;/a&gt;. This project will create a online marketplace for the exchange of resources and services to suit the needs of the NGOs in Haiti, providing Earthquake relief operations. This application is being hosted in Amazon Web Services to provide scalability and quick developer ramp up. (If you or your company would like to provide long-term sponsorship, see the contact information on the &lt;a href="http://wiki.crisiscommons.org/wiki/We_Have,_We_Need_Exchange" target="_blank"&gt;project wiki&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/35507329-860610076672417776?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4513766533680846196</id><title type="text">How to Train for What's Next</title><published>2010-01-18T02:59:00-08:00</published><updated>2010-01-18T02:59:00-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4513766533680846196" /><link rel="alternate" type="text/html" title="How to Train for What&amp;#39;s Next" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4513766533680846196" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;In talking with my manager, she brought up an HR issue for all firms, (but I'll focus on technology). &amp;quot;How do we identify what skills we are going to need next year and start training for them?&amp;quot; I've mulled over this for some time, as I find myself documenting the training I've taken and provided for 2009, and how to plan for 2010 and beyond. I've realized that it is impossible to predict the future, especially so in technology where a technology product may only have a 2-3 year lifespan. However, that is not an excuse not to train. We are all &lt;a href="http://elegantcode.com/2010/01/14/you-are-responsible-for-your-education/" target="_blank"&gt;responsible for our own education&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you participated in competitive sports growing up, you're going to recognize a lot of what I have to say. You have to practice, practice, practice; and practice hard, so that the game is easy. What does this mean though? If you think back to futball (soccer) practice, every day we would run laps around the field. Why? Were we going to forget how to run? No, we run to build strength and endurance so when there are 30 seconds left in the game, we would still have enough energy to compete. This I think is the first thing to understand in training. We need to drill on the basics constantly. &lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm2.static.flickr.com/1232/1352924469_c4566912e8.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;For developers, this means exploring the .NET CLR or Java JDK or our product documentation forward and backward. For IT infrastructure professionals, this means knowing what every feature of our web server, database, or application is for. It isn't groundbreaking and it won't set your resume apart, but I believe this is the required technology foundation. If you are planning on spending your personal development budget, or your team/company's training budget I think this is where the bulk of the money should go.&lt;/p&gt;  &lt;p&gt;The next step is on-the-job training. We identified earlier that new technologies are constantly coming and going. Depending on a training company to identify the trend, then create a curriculum and offer the training to you guarantees that you are always one step behind. When we are evaluating solutions to problems, this is a chance to take advantage of all of the basic training we have invested in, and identify gaps where new technology may fit in. Perhaps an under-funded IT shop could take advantage of a cloud-hosted environment, or a data-centric analysis shop could invest more in GIS. You won't be able to keep a heads-up view and identify opportunities for new technology unless your foundation is strong. &lt;/p&gt;  &lt;p&gt;At this point, you won't know everything about the new technology, &lt;a href="http://facility9.com/2010/01/14/knowing-and-not-knowing" target="_blank"&gt;but that's ok&lt;/a&gt;. You've identified the gap where new technologies could be used, and you can explore the technology enough to see if it fills the gap. If it does, this provides a springboard to explore other uses of the technology, product, or process. If it doesn't fit well or meet your needs, that's valuable as well. This ensures that you are learning new techniques that are directly related to your business needs.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4513766533680846196?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-959209343559683584</id><title type="text">Working in a team to reduce technical debt</title><published>2010-01-11T07:40:00-08:00</published><updated>2010-01-11T07:42:56-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=959209343559683584" /><link rel="alternate" type="text/html" title="Working in a team to reduce technical debt" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=959209343559683584" /><category term="teamwork" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt; We've all had to cut corners when writing code. Maybe a corner case came up and we implemented a kludge workaround. Looming deadlines can lead us to choose expedient solutions over elegant ones. I hope you are weighing cost, schedule, quality, and risk when you are making these decisions. Over time, these shortcuts accumulate &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html" target="_blank"&gt;technical debt&lt;/a&gt;. This debt manifests itself as poor performance, code smells, and low maintainability. &lt;/p&gt;  &lt;p&gt;I've discussed how testing and analysis can help us identify and address areas where we are accumulating technical debt. Any sufficiently dedicated developer can &lt;a href="http://msdn.microsoft.com/magazine/bc6b16fe-e61b-4593-8b77-916441f84b60" target="_blank"&gt;use these tools&lt;/a&gt; to improve and refactor their project and improve quality. Once you have set the bar sufficiently high for your project, how do you keep the quality from slipping back. This becomes a team effort. &lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3278/2523825358_a89a4a517b.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;I believe code reviews are the number one tool for maintaining high quality. A code review allows senior developers to ensure that junior developers are following project standards. It also allows junior developers to ask questions to better understand both the standards, and the &amp;quot;dark corners&amp;quot; of your code. This approach works well in the middle of a development push (as many developers are working on interconnected functionality), or in maintenance mode to allow your team to review parts of the system to identify improvements. &lt;/p&gt;  &lt;p&gt;In addition to socializing project standards, code reviews allow you to publicize standard library functionality. Every team build utility libraries, or domain specific functionality. Code reviews give everyone a chance to see how they should be used, or identify areas for &amp;quot;coding by subtraction&amp;quot;, by replacing code with standard, tested library calls. This allows your team to take advantage of the testing you have been performing on your libraries as well as reduce duplication.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-959209343559683584?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2850552773137951912</id><title type="text">Share your Passion at Ignite DC</title><published>2010-01-05T08:34:00-08:00</published><updated>2010-01-05T08:34:24-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2850552773137951912" /><link rel="alternate" type="text/html" title="Share your Passion at Ignite DC" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2850552773137951912" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;&lt;img style="margin: 0px 35px 0px 0px" src="http://farm4.static.flickr.com/3034/2543215559_4d51a18ca4_o.gif" align="left" /&gt;I've been doing presentations and training at work and &lt;a href="http://www.mobiusdevelopment.com/dev/speaking.asp" target="_blank"&gt;outside the office&lt;/a&gt; for several years now. I guess I'm trying to fill my childhood dream of being a standup comic. I've acted as a teacher in classroom sessions, resident expert in brainstorming sessions, presenter at industry events and speaker at &lt;a href="http://booz.freetoasthost.org" target="_blank"&gt;Toastmasters&lt;/a&gt;. I've learned valuable skills from all of these venues, and I am looking forward to another, &lt;a href="http://en.wikipedia.org/wiki/Pecha_Kucha" target="_blank"&gt;Pecha Kucha&lt;/a&gt;. This is a media-driven presentation that has a few simple rules.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;20 slides&lt;/li&gt;    &lt;li&gt;for 20 seconds each&lt;/li&gt;    &lt;li&gt;Presenter sits down.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I really like this format because it forces presenters to follow some best practices including&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Focusing each of their slides. You don't have enough time to read a block of text in 20 seconds, so make your slides visual and entertaining. &lt;/li&gt;    &lt;li&gt;The time limit is strictly enforced. This keeps speakers from rambling on. Most of my presentations end early because I've practiced and ensured that time doesn't run over. We have all been in meetings or presentations that we wished would end. I really don't want people to feel that way when I am presenting. I would rather end early for everyone, and be available afterwards for discussion with those people who would like to go deeper into a subject.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Ignite_(event)#External_links" target="_blank"&gt;Ignite&lt;/a&gt; is a similar format (except the time limit for each slide is 15 seconds). Speakers are encouraged to think big and present &amp;quot;game-changing&amp;quot; presentations. This event will be held in &lt;a href="http://ignite-dc.com/" target="_blank"&gt;D.C.&lt;/a&gt; on Feb 18, 2010. Speaker submissions are due Jan 10th for any interested parties. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2850552773137951912?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5663292350029278538</id><title type="text">Integrating Appian BPM with SharePoint</title><published>2009-12-14T00:58:00-08:00</published><updated>2009-12-14T00:58:00-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5663292350029278538" /><link rel="alternate" type="text/html" title="Integrating Appian BPM with SharePoint" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5663292350029278538" /><category term="BPM" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;&lt;a href="http://www.appian.com/bpm-software/features.jsp" target="_blank"&gt;Appian BPM&lt;/a&gt; is a workflow tool that allows you to model Business Processes and execute the in a repeatable fashion. Tools like this have broader tooling and support when compared to the Microsoft-only tools like SharePoint Designer and Workflow Foundation. &lt;/p&gt;  &lt;p&gt;Appian currently offers an &lt;a href="http://www.appian.com/bpm-software/sharepoint.jsp" target="_blank"&gt;integration toolkit with SharePoint&lt;/a&gt;. I've listed the capabilities and design implications below.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;The Appian Integration kit creates their own web services to supplement what is offered by Microsoft out of the box. This requires you to install something on the web servers so the Appian-provided web services can use the SharePoint dlls.&lt;/li&gt;      &lt;li&gt;The integration works with both WSS 3.0 and MOSS 2007.&lt;/li&gt;      &lt;li&gt;The integration toolkit currently supports Appian 5.7. Appian 6.0 support will be released in the first half of 2010.&lt;/li&gt;      &lt;li&gt;To support single-sign on between SharePoint and Appian, this approach requires Appian to be installed on a Windows server rather than a Linux server.&lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;&lt;strong&gt;Workflow&lt;/strong&gt;&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;The integration toolkit offers canned tasks for working in SharePoint like creating tasks, creating and deleting sites, and customizing permissions. These activities lend themselves to automating parts of your SharePoint governance plan. &lt;a href="http://www.appian.com/downloads/podcasts/webinar20080626.wmv" target="_blank"&gt;Appian discusses this use&lt;/a&gt;, and I think it provides an excellent solution for managing &amp;quot;site sprawl&amp;quot;.&lt;/li&gt;      &lt;li&gt;Appian does not provide an out of the box feature to start a workflow from content in SharePoint. (eg. starting an Appian workflow from a new document upload). This capability requires a developer to use the Appian webservices from a SharePoint event handler.&lt;/li&gt;      &lt;li&gt;Appian also provides a web part to see Appian tasks and reports in a SharePoint web part. These webparts link back to the Appian server however, so users will not work only in the SharePoint environment. This approach mirrors what I have seen from other BPM providers as well.&lt;/li&gt;      &lt;li&gt;Appian provides a document picker if you choose to use SharePoint as a document repository and use Appian as the workflow environment.&lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5663292350029278538?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-8797424978671823521</id><title type="text">A Lap around Dynamic Data</title><published>2009-12-08T19:12:00-08:00</published><updated>2009-12-08T19:16:02-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8797424978671823521" /><link rel="alternate" type="text/html" title="A Lap around Dynamic Data" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8797424978671823521" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="DynamicData" scheme="http://www.blogger.com/atom/ns#" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;&lt;em&gt;ASP.NET Dynamic Data provides a framework that enables you to quickly build a functional data-driven application, based on a LINQ to SQL or Entity Framework data model. It also adds great flexibility and functionality to the &lt;b&gt;DetailsView&lt;/b&gt;, &lt;b&gt;FormView&lt;/b&gt;, &lt;b&gt;GridView&lt;/b&gt;, and &lt;b&gt;ListView&lt;/b&gt; controls in the form of smart validation and the ability to easily change the display of these controls using templates.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Here's a &lt;a href="http://docs.google.com/present/edit?id=0AV4Olzgz6hdjZDNwcDg0al8yMjZkZndnNzRjNQ&amp;amp;hl=en" target="_blank"&gt;link to the presentation&lt;/a&gt; I gave for the Rockville .NET User's Group on Dec 9, 2009. We discussed the three enabling technologies and how we can use this tool from RAD to distributed enterprise development. I read all sorts of blogs to get the background information for this presentation and suggest you check out the &lt;a href="http://delicious.com/jwmiller5/dynamicdata" target="_blank"&gt;list of links&lt;/a&gt; on delicious as well.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-8797424978671823521?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-8948516047158727926</id><title type="text">Distributed systems for sustainability and survivability</title><published>2009-12-02T04:45:00-08:00</published><updated>2009-12-02T04:45:44-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8948516047158727926" /><link rel="alternate" type="text/html" title="Distributed systems for sustainability and survivability" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8948516047158727926" /><category term="Security" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I've been thinking about future cities this recent Earth Day. I have children and I'd like to leave them a futuristic Earth that I've always dreamed of. We still don't have flying cars, but today's mobile devices are pretty cool, so I'll call that a wash. I was reading an article about using &lt;a href="http://www.cnn.com/2009/TECH/04/17/gsif.rainwater.solutions/index.html" target="_blank"&gt;cisterns for a distributed water collection&lt;/a&gt; system. It makes sense for several reasons including energy cost and sustainability. In addition, it provides security for the water supply as there is a source of fresh water close to people who need to consume it. In South Florida, I've seen the same thing with inline generators installed at people's homes. This idea isn't as green as collecting rainwater, but from a security standpoint they are both taking the same approach. The next step is &lt;a href="http://earth2tech.com/2009/04/20/smart-grid-miami-fpl-ge-cisco-silver-spring-rolling-out-1m-smart-meters/" target="_blank"&gt;Energy Smart Miami&lt;/a&gt;, which provides consumers with a window into their energy consumption as well as communication between the energy grid and endpoints at homes and business to better manage consumption.&lt;/p&gt;  &lt;p&gt;Any distributed system, technical, personal or otherwise is going to have some similar characteristics. These systems have distributed decision making and authority for local actors to make decisions without having to contact a central point. This allows local nodes to focus on managing local resources as well as using system resources as necessary. Large organizations (hopefully) act in the same way, providing autonomy to smaller more agile teams, while communicating enough to provide support across a large organization. As technology and communication become cheaper and richer, it makes sense to develop products, organizations, governments, communities and systems that can stand alone and focus on local needs, while being participants in a greater system. Think Global, Act Local.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-8948516047158727926?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7713113489877910763</id><title type="text">Great Kerberos Troubleshooting Tool</title><published>2009-11-23T03:29:00-08:00</published><updated>2009-11-23T03:29:00-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7713113489877910763" /><link rel="alternate" type="text/html" title="Great Kerberos Troubleshooting Tool" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7713113489877910763" /><category term="Security" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I have been looking into authentication issues between web servers and application servers, and the system engineer I have been working with introduced me to a great new tool called &lt;a href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/delegconfig-delegation-configuration-reporting-tool.aspx" target="_blank"&gt;DelegConfig&lt;/a&gt;. This is a ASP.NET web application that you can install on the web server that you are troubleshooting, and test Kerberos delegation and authentication with databases, application servers, and domain controllers. This tool supports IIS 5, 6, 7, and 7.5. The report is easy to understand and lets you see at a glance where you problem is.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/images/GreatKerberosTroubleshootingTool_13F45/delegconfig.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="195" alt="delegconfig" src="http://www.mobiusdevelopment.com/dev/images/GreatKerberosTroubleshootingTool_13F45/delegconfig_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once installed, you open a browser and hit the application and it will check the Kerberos settings for the account the application pool is using. Once you have checked and fixed any of those settings, you can test backend systems as well to make sure your &amp;quot;double-hop&amp;quot; settings are working. There are tests for access to file servers, Active Directory, SQL/SSAS/OLAP, as well as web servers. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/images/GreatKerberosTroubleshootingTool_13F45/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="Backend system Kerberos test" src="http://www.mobiusdevelopment.com/dev/images/GreatKerberosTroubleshootingTool_13F45/image_thumb.png" width="122" border="0" /&gt;&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/35507329-7713113489877910763?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7310839112614249737</id><title type="text">Paying for previous sins</title><published>2009-11-17T08:24:00-08:00</published><updated>2009-11-17T08:24:05-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7310839112614249737" /><link rel="alternate" type="text/html" title="Paying for previous sins" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7310839112614249737" /><category term="Blackpearl" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I've been supporting a project for some time now using SharePoint and K2 BlackPearl. I came onto the project after 1 major and 4 minor releases. Since that time I've touched all of the code, and most of the architecture. However, there are still some lingering ghosts to give me problems (as well as new ones all my own). &lt;/p&gt;  &lt;p&gt;I've been using K2 through Visual Studio, but today I was working with a team member and he was showing me the browser-based workflow editor. It was pretty cool, but it didn't have all of the features I needed. I decided to deploy a workflow anyway just so I could have the full experience. The workflow authoring was straightforward and I went to deploy the workflow, and got the following error message.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;SmartObjectServer Exception: Error HRESULT E_FAIL has been returned from a call to a COM component.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Not .. so .. good. I tried a couple more times, the error didn't change. I couldn't blame this on network issues. I looked at the Application log and saw that MSDTC was throwing errors about another network registration with the same ID. I uninstalled and reinstalled MSDTC with the following commands, and everything is working wonderfully now. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Open a command window&lt;/li&gt;    &lt;li&gt;msdtc -uninstall&lt;/li&gt;    &lt;li&gt;reboot server&lt;/li&gt;    &lt;li&gt;msdtc -install&lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7310839112614249737?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7458954516645063967</id><title type="text">Mature Your Process with Continuous Integration</title><published>2009-11-15T10:59:00-08:00</published><updated>2009-11-17T15:28:18-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7458954516645063967" /><link rel="alternate" type="text/html" title="Mature Your Process with Continuous Integration" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7458954516645063967" /><category term="Static Code Analysis" scheme="http://www.blogger.com/atom/ns#" /><category term="CI" scheme="http://www.blogger.com/atom/ns#" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="CapArea" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;&lt;em&gt;Continuous Integration is a software development practice where members of a team integrate their work frequently. Each integration is verified by an automated build to detect integration errors as quickly as possible.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Software teams can benefit from Continuous Integration for both coordination and automation. We'll be discussing the people that can and should participate in CI, the processes that we can implement and then automate, and look at the technology that makes all of this possible. I've attached the presentation I gave at the &lt;a href="http://www.caparea.net" target="_blank"&gt;CapArea .NET User Group&lt;/a&gt; on Nov 16, 2009.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Downloads&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/CI_CapArea_Nov2009.pdf" target="_blank"&gt;Presentation&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/CI_handout.pdf" target="_blank"&gt;Handout&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7458954516645063967?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2332249112366894410</id><title type="text">MSDN Subscription Benefits</title><published>2009-11-04T10:24:00-08:00</published><updated>2009-11-04T10:24:27-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2332249112366894410" /><link rel="alternate" type="text/html" title="MSDN Subscription Benefits" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2332249112366894410" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I must have missed the email that came out regarding upgrades to MSDN subscriptions, but the MSDN team has &lt;a href="http://blogs.msdn.com/paulcornell/archive/2009/11/03/msdn-subscriber-benefit-changes.aspx" target="_blank"&gt;posted a copy&lt;/a&gt; on their blog. I want to highlight two items that I will be taking advantage of in short order.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/subscriptions/ee461390.aspx" target="_blank"&gt;Free E-Learning course collections&lt;/a&gt;. The joy of being a software developer means that there is always more to learn about. Now MSDN subscribers can download free E-Learning collections (each collection is about 10 2-hour courses)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/subscriptions/ee461076.aspx" target="_blank"&gt;Free Cloud Computing&lt;/a&gt;. I've looked into Windows Azure and I really like it as a &lt;a href="http://en.wikipedia.org/wiki/Platform_as_a_service" target="_blank"&gt;PaaS&lt;/a&gt;. The ability to deploy something to the internet without having to go through IT machinations is truly wonderful. Starting Feb 1, Microsoft will start billing for Windows Azure use. But MSDN subscribers can get up to 750 compute hours free. This is a great way to demo or prototype applications and distribute them rapidly.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2332249112366894410?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3323340918229281384</id><title type="text">Grid Computing with Windows Azure</title><published>2009-10-09T19:48:00-07:00</published><updated>2009-10-09T19:52:22-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3323340918229281384" /><link rel="alternate" type="text/html" title="Grid Computing with Windows Azure" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3323340918229281384" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="Azure" scheme="http://www.blogger.com/atom/ns#" /><category term="CapArea" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I was lucky enough to present at the 2009.2 &lt;a href="http://novacodecamp.org/RecentCodeCamps/NoVaCodeCamp200902/Sessions/tabid/187/Default.aspx" target="_blank"&gt;Northern Virginia Code Camp&lt;/a&gt; today. As usual we had a wide range of interests and got to reconnect with peers across the region. A great time was had by all. I was presenting Grid Computing on Windows Azure. I think this is a great application architecture that is easier to setup in a cloud environment rather than trying to install and run in your enterprise. &lt;/p&gt;  &lt;p&gt;In my presentation I talk about the benefits of Grid Computing and how we can leverage Windows Azure to write our own grid apps. You can &lt;a href="http://www.mobiusdevelopment.com/dev/downloads/NovaCodeCamp_AzureGrid.zip" target="_blank"&gt;download&lt;/a&gt; my deck and the demo code.&lt;/p&gt;  &lt;p&gt;I'd like to thank &lt;a href="http://davidpallmann.blogspot.com/" target="_blank"&gt;David Pallman&lt;/a&gt; for doing the hard work to release this to the community. I encourage you to download the &lt;a href="http://azuregrid.codeplex.com" target="_blank"&gt;Azure Grid framework&lt;/a&gt; and get started today. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3323340918229281384?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5688596593276238827</id><title type="text">Jumping straight to Web Part Edit Mode</title><published>2009-10-08T22:00:00-07:00</published><updated>2009-10-08T22:00:57-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5688596593276238827" /><link rel="alternate" type="text/html" title="Jumping straight to Web Part Edit Mode" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5688596593276238827" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="jQuery" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I've been building document and form centric web applications lately with SharePoint and InfoPath Forms Services. As you can imagine it's a nice fit, however, one of my requirements has been to strip out all of the SharePoint options for external users, but leave them for internal users who are used to the SharePoint look and feel.&lt;/p&gt;  &lt;p&gt;I've been using jQuery to identify areas that need to disappear and making use of the toggle() option. It's quick, I'm not relying on it for security, and it's really nice. I'm going to say that any time you reach for SharePoint Designer, you should use jQuery in a master page or Content Editor Web Part instead.&lt;/p&gt;  &lt;p&gt;However, I need to make changes in this daily, and I'm hiding all of the links that would let me edit the page. So I've been relying on the following querystring to jump straight to edit mode. I've trolled through my browser history enough, so now I'm writing it for myself, and for all of you as well.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;?PageView=Shared&amp;amp;DisplayMode=Design&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5688596593276238827?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4068994512250133418</id><title type="text">SharePoint search-as-you-type with jQuery</title><published>2009-09-23T02:36:00-07:00</published><updated>2009-09-23T02:37:46-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4068994512250133418" /><link rel="alternate" type="text/html" title="SharePoint search-as-you-type with jQuery" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4068994512250133418" /><category term="Search" scheme="http://www.blogger.com/atom/ns#" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="jQuery" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I remember the first time I saw Google Suggest, it would run the search in real-time and provide a dropdown with possible queries. One of my teammates always joked about making software with one button that would automatically know what you wanted to do. I showed it to him and suggested that Google was getting closer.&lt;/p&gt;  &lt;p&gt;I've been working on my presentation for &lt;a href="http://www.caparea.net/sharepoint" target="_blank"&gt;CapArea.NET&lt;/a&gt; about jQuery and SharePoint and I knew I would have to demo this search as you type code. The &lt;a href="http://weblogs.asp.net/jan/archive/2009/07/02/sharepoint-search-as-you-type-with-jquery.aspx" target="_blank"&gt;proof of concept&lt;/a&gt; was created by Jan Tielens, and the solution was &lt;a href="http://www.muhimbi.com/blog/2009/07/automatically-add-search-as-you-type-to.html" target="_blank"&gt;fleshed out&lt;/a&gt; by the team at muhimbi. It overrides the default search box and starts returning results as you type. It's super cool and it's all HTML and JavaScript, it's not a web part, and there are no assemblies. Just add this to your master page, and you get a search upgrade.&lt;/p&gt;  &lt;p&gt;While I was testing it I realized one thing. This search is using the keyword search. That's not too helpful since no results get returned until you spell out the entire keyword. I ended up using the LIKE operator against the Name and Description to get a much more helpful search that brings up results while you are still spelling the keywords. It required two changes to the javascript.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Changing the query to use the FullText rather than the keyword query. &lt;/li&gt;    &lt;li&gt;Changing the jQuery selectors as the return values are different for the different query types. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In addition to this I changed the path to jQuery to load from the 12 hive, and I added some protection against SQL injection in the query.&lt;/p&gt;  &lt;p&gt;Once this was all done, I was in business. Feel free to to &lt;a href="http://www.mobiusdevelopment.com/dev/downloads/jQuery_search_ahead.txt" target="_blank"&gt;use this and enjoy&lt;/a&gt;. I tested this using FireFox and Chrome and everything is working splendid. IE is going to require additional code to do the XML parsing of the results XML.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;SHA1: 382eaf1eb7e4270961a7054ca60f0aff6854da39&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.mobiusdevelopment.com/dev/images/search_ahead.jpeg" /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4068994512250133418?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-1341512520092436958</id><title type="text">Two common mistakes with SPList.GetItems</title><published>2009-09-21T19:00:00-07:00</published><updated>2009-09-21T19:07:26-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1341512520092436958" /><link rel="alternate" type="text/html" title="Two common mistakes with SPList.GetItems" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1341512520092436958" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I wrote a short console application to upload documents as attachments to a list and I ran into two problems that probably cost me 30 minutes today. I'm writing this to remind myself and to save you 30 minutes.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Problem: When I run SPList.GetItems(), it returns the entire list, rather than the items I queried for.      &lt;ol&gt;       &lt;li&gt;Answer: Are you using the &lt;a href="http://www.u2u.info/SharePoint/U2U%20Community%20Tools/U2U%20Caml%20Query%20Builder%202007%20v3.1.0.0%20%28windows%20version%29.zip" target="_blank"&gt;U2U&lt;/a&gt; CAML creator to define the CAML syntax for your query (you should be). Be sure that you remove the &amp;lt;Query&amp;gt; tags. If the query returns all of the items, that means your CAML syntax was malformed. The query parameter should start with a &amp;lt;Where&amp;gt; tag. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Problem: When I run SPList.GetItems(), I get the error message that      &lt;h3&gt;&lt;em&gt;One or more field types are not installed properly.&lt;/em&gt;&lt;/h3&gt;      &lt;ol&gt;       &lt;li&gt;Answer: Are you using the Internal field name? The most common cause of this is not having an _x0020 instead of a space in your field name (eg First_x0020Name instead of First Name) &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-1341512520092436958?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5106592802217456112</id><title type="text">jQuery and SharePoint at CapArea.NET</title><published>2009-09-09T08:21:00-07:00</published><updated>2009-09-09T08:27:40-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5106592802217456112" /><link rel="alternate" type="text/html" title="jQuery and SharePoint at CapArea.NET" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5106592802217456112" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="jQuery" scheme="http://www.blogger.com/atom/ns#" /><category term="CapArea" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;Here is the presentation, along with links to the sample code, and webcasts presented at the Sep 9, 2009 &lt;a href="http://caparea.net/sharepoint" target="_blank"&gt;CapArea.NET SharePoint User Group.&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://ping.fm/CVms9" target="_blank"&gt;Download the presentation&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Drag and Drop &lt;a href="http://www.screencast.com/users/einaros/folders/Jing/media/82f4d6f1-19d7-4037-ae00-6332b50d27fc" target="_blank"&gt;webcast&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Image Carousel &lt;a href="http://httpcode.com/blogs/screen/imagecarousel.html" target="_blank"&gt;webcast&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Charts and Graphs &lt;a href="http://www.endusersharepoint.com/2009/07/16/create-charts-and-graphs-for-sharepoint-dashboards/" target="_blank"&gt;webcast&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5106592802217456112?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3823328027692177668</id><title type="text">Migrating an ASP.NET Dynamic Data website to Windows Azure</title><published>2009-09-03T04:44:00-07:00</published><updated>2009-09-03T05:02:11-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3823328027692177668" /><link rel="alternate" type="text/html" title="Migrating an ASP.NET Dynamic Data website to Windows Azure" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3823328027692177668" /><category term="Cloud" scheme="http://www.blogger.com/atom/ns#" /><category term="DynamicData" scheme="http://www.blogger.com/atom/ns#" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="Azure" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;My &lt;a href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3986039114281401240" target="_blank"&gt;previous post&lt;/a&gt; shows how to migrate a SQL database to Azure SQL. Now we will complete the app migration by migrating the web application to Windows Azure as well. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;We'll start by creating a &amp;quot;New Azure Web Cloud Service&amp;quot; in Visual Studio (2008 or 2010). You'll need to install the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=B44C10E8-425C-417F-AF10-3D2839A5A362&amp;amp;displaylang=en" target="_blank"&gt;Windows Azure SDK&lt;/a&gt; to get this new project type. When this project starts up you'll have an Azure project, and a traditional web application. &lt;/li&gt;    &lt;li&gt;Follow the directions in &lt;a href="http://blogs.msdn.com/jnak/archive/2009/02/05/using-an-existing-asp-net-web-application-as-a-windows-azure-web-role.aspx" target="_blank"&gt;this blog post&lt;/a&gt; to add an existing web application to the project. &lt;/li&gt;    &lt;li&gt;Edit the ServiceDefinition file by adding enableNativeCodeExecution=&amp;quot;true&amp;quot; to the webRole element. This places the web worker role in &lt;a href="http://msdn.microsoft.com/en-us/library/dd573353.aspx" target="_blank"&gt;full trust&lt;/a&gt; mode. &lt;/li&gt;    &lt;li&gt;&lt;a href="https://windows.azure.com/Cloud/Provisioning/Default.aspx" target="_blank"&gt;Upload&lt;/a&gt; your project and service definition into a new Windows Azure project. &lt;/li&gt;    &lt;li&gt;Start your project, test it, and promote to Production. &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3823328027692177668?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3986039114281401240</id><title type="text">Getting Started with SQL Azure</title><published>2009-08-30T18:27:00-07:00</published><updated>2009-08-30T19:27:45-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3986039114281401240" /><link rel="alternate" type="text/html" title="Getting Started with SQL Azure" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3986039114281401240" /><category term="Cloud" scheme="http://www.blogger.com/atom/ns#" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="Azure" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I have a demo application that I have been using to test out new technologies including ASP.NET dynamic data websites as well as &lt;a href="http://dev.live.com/tools/" target="_blank"&gt;Windows Live Tools&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So now that I have an invite for Azure SQL I wanted to try these technologies out "in the cloud".&lt;/p&gt;  &lt;p&gt;For this web application, I was going to try two different configurations&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;App Local, DB in the cloud. &lt;/li&gt;    &lt;li&gt;App in the cloud, DB in the cloud. (more on this later) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The first step was to migrate the database from my local DB server to Azure SQL. The documentation to do this is &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=413E88F8-5966-4A83-B309-53B7B77EDF78" target="_blank"&gt;available&lt;/a&gt; now. The only issues I ran into were&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;No locking of any kind is supported (Page, Row-level) so all of those options need to be removed from the database &lt;/li&gt;    &lt;li&gt;Multiple Active Recordsets are not supported. &lt;/li&gt; &lt;/ol&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;There are &lt;a href="http://blog.ehuna.org/2009/08/cleaning_up_scripts_for_sql_az.html" target="_blank"&gt;other limitations&lt;/a&gt; of SQL Azure currently. This is a demo app and is not using every last SQL Server feature, YMMV.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Once my scripts were &lt;a href="http://blog.ehuna.org/2009/08/windows_powershell_commands_to.html" target="_blank"&gt;scrubbed&lt;/a&gt; and ready to go, &lt;a href="http://english.zachskylesowens.net/2009/08/18/connecting-to-sql-azure/" target="_blank"&gt;I opened up query analyzer&lt;/a&gt; and created my databases. A Select * brought back my tables. Wonderful!!! &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;One note about this, Don't use Debug. I repeatedly got the error "Unable to cast object of type 'System.DBNull' to type 'System.String'" trying to run query analyzer in debug mode. Just hit Execute and everything will run smoothly.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Next I changed the connection strings in my web.config to point to my new Azure SQL database. You can get your connection string by logging into your &lt;a href="https://sql.azure.com/ProjectViewer.aspx" target="_blank"&gt;Azure management portal&lt;/a&gt; and choosing your database, there is an option to create connection strings for different data access providers. I ran the web application, and everything was working. I was able to create/edit/delete without any changes to my web application. Very nice.&lt;/p&gt;  &lt;p&gt;To review, migrating a DynamicData website from SQL Server to Azure SQL involves&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Moving the database &lt;/li&gt;    &lt;li&gt;Changing your connection string &lt;/li&gt; &lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3986039114281401240?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4895397298281156511</id><title type="text">Cloud Computing Lock-In and Portability</title><published>2009-08-27T13:03:00-07:00</published><updated>2009-08-27T13:05:13-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4895397298281156511" /><link rel="alternate" type="text/html" title="Cloud Computing Lock-In and Portability" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4895397298281156511" /><category term="Cloud" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;As vendors discuss and fight over private &amp;amp; public clouds, I was thinking about &lt;a title="AppDrop" href="http://jchrisa.net/drl/_design/sofa/_show/post/announcing_appdrop_com__host_go" target="_blank"&gt;AppDrop&lt;/a&gt;. This allows you to run &lt;a href="http://appengine.google.com/" target="_blank"&gt;Google AppEngine&lt;/a&gt; applications in &lt;a href="http://aws.amazon.com/ec2" target="_blank"&gt;Amazon's EC2&lt;/a&gt;. This code is currently a proof of concept, and probably not production-ready, but it's open source, so feel free to poke around. I realized that this is an excellent example of a new service/application to offer in the cloud computing sector. &lt;/p&gt;  &lt;p&gt;For simplicity's sake, I'll define cloud computing as a 3 tier system offering &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Software as a Service (GMail) &lt;/li&gt;    &lt;li&gt;Platform as a Service (Azure, Google App Engine) &lt;/li&gt;    &lt;li&gt;Infrastructure as a Service (EC2, S3) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;AppDrop allows you to move down this stack, (from PaaS to IaaS). Of course as you do this, you have to recreate some of the things that were available out of the box at the higher level. We would expect to see this as you are moving down the value chain. &lt;/p&gt;  &lt;p&gt;This type of migration keeps you from being dependent on any one vendor. I think trying to create your own private cloud is going to miss the mark for all but the largest enterprises, and even then, I don't think it's in their core competencies to do so. I'll be doing some posts next week on Windows Azure and moving from an internally hosted application to Windows Azure (from IaaS to PaaS).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4895397298281156511?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-6290794966412137189</id><title type="text">Lap around ASP.NET Dynamic Data websites</title><published>2009-08-26T09:03:00-07:00</published><updated>2009-08-26T09:04:42-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6290794966412137189" /><link rel="alternate" type="text/html" title="Lap around ASP.NET Dynamic Data websites" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6290794966412137189" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="DynamicData" scheme="http://www.blogger.com/atom/ns#" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;Most of my work is time-constrained as my clients need data management tools yesterday. As I'm sure you can see from my blog, a lot of times, I end up using SharePoint to rapidly deliver applications, but in ASP.NET 3.5 SP1, there is a powerful new tool in my arsenal that is &lt;a href="http://www.asp.net/dynamicdata/" target="_blank"&gt;ASP.NET Dynamic Data&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;The typical workflow for &lt;a href="http://msdn.microsoft.com/en-us/library/cc488469.aspx" target="_blank"&gt;creating an ASP.NET Dynamic Data application&lt;/a&gt; is as follows&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Open up SQL Server Management Studio and create the data model.&lt;/li&gt;    &lt;li&gt;Create a new ASP.NET Dynamic Data Entities Web Application.&lt;/li&gt;    &lt;li&gt;Create an ADO.NET Entity Model.&lt;/li&gt;    &lt;li&gt;Register the model&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;At this point you have the barebones for a &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank"&gt;CRUD&lt;/a&gt; Web application. From here you go about your normal ASP.NET development against the Entity Data Model to create the reports, visualization, services, or whatever application you were planning on. &lt;/p&gt;  &lt;p&gt;This has accelerated numerous projects by freeing up a developer who would normally be creating and updating the data management pages to work on something far more interesting. In addition to accelerating development, it can accelerate the validation phase as well as there is a UI earlier for managing the data to ensure that everyone agrees on the data structures. If not, congratulations, you just &lt;a href="http://www.abstractcode.com/abstractblog/archive/2008/11/02/development-philosophy-fail-fast.aspx" target="_blank"&gt;failed fast&lt;/a&gt;. Make the changes to the data layer, regenerate your model, and your app is up to date.&lt;/p&gt;  &lt;p&gt;Here are the &lt;a href="http://www.mobiusdevelopment.com/dev/downloads/LaparoundDynamicData.ppt" target="_blank"&gt;slides&lt;/a&gt; for the Introduction to ASP.NET Dynamic Data at the &lt;a href="http://novacodecamp.org/UpcomingCodeCamp/tabid/172/Default.aspx" target="_blank"&gt;NoVa Code Camp&lt;/a&gt; this summer. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-6290794966412137189?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-457402560032824420</id><title type="text">Must have tools for jQuery development</title><published>2009-08-24T07:25:00-07:00</published><updated>2009-08-24T07:28:09-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=457402560032824420" /><link rel="alternate" type="text/html" title="Must have tools for jQuery development" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=457402560032824420" /><category term="jQuery" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I've been looking into &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt; development. I was never much of a JavaScript developer, most of my js code was form validation, or rounded corners. My current learning approach is to extend jQuery plugins and scripts to get a better feel for how real JavaScript developers would do things. Here's my necessary tools list&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.mozilla.com/firefox/" target="_blank"&gt;Firefox&lt;/a&gt; 3.x and &lt;a href="http://getfirebug.com/" target="_blank"&gt;FireBug&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/windows/internet-explorer/default.aspx" target="_blank"&gt;IE8&lt;/a&gt; and Web Developer Toolbar &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It's sad, but true, even in 2009 with a great library like jQuery, things that should work across browsers don't, (my current battle is &lt;a href="http://www.perturb.org/display/entry/924/" target="_blank"&gt;XML parsing&lt;/a&gt;). So make sure that you have multiple browsers to test on with a JavaScript debugger in each.&lt;/p&gt;  &lt;p&gt;In addition, there are several websites that have jQuery tools to speed development along. These are&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet" target="_blank"&gt;jQuerify&lt;/a&gt;: a bookmarklet that loads jQuery on any existing page. This is a great way to see how you can integrate jQuery in an existing web application without making any changes to the site. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.selectorgadget.com/" target="_blank"&gt;Selector Gadget&lt;/a&gt;: This is another bookmarklet that you can load on any existing page that lets you point and click to determine the CSS selectors for any element on the page. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.woods.iki.fi/interactive-jquery-tester.html" target="_blank"&gt;Selector Tester&lt;/a&gt;: This simple web page lets you define the HTML/XML to use as a source, and highlights the selection defined by your selectors. You can change them, and the new selections show up on the fly. This is a great way to learn how to chain selectors, as you see the selections as you add them to the chain. This is a complement to Selector Gadget, as it lets you work with HTML snippets or XML from a web service as well. &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-457402560032824420?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-8707423055429126511</id><title type="text">Identifying Duplicated Code with Continuous Integration</title><published>2009-08-16T19:05:00-07:00</published><updated>2009-08-16T19:05:59-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8707423055429126511" /><link rel="alternate" type="text/html" title="Identifying Duplicated Code with Continuous Integration" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8707423055429126511" /><category term="Static Code Analysis" scheme="http://www.blogger.com/atom/ns#" /><category term="CI" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;As part of my continuous improvement campaign, I have been adding additional processes to our continuous integration server so our team can ensure high code quality.&lt;/p&gt;  &lt;p&gt;One issue I have seen is that developers do not take enough time to read each other&amp;#8217;s code. This leads to duplicate code that then needs to be maintained in multiple places. Sometimes this is just a one-off, sometimes this is a trend, &lt;a href="http://stackoverflow.com/questions/296056/how-fanatically-do-you-eliminate-code-duplication" target="_blank"&gt;you need to decide&lt;/a&gt; for your project. Practices like code reviews and pair programming can minimize this. There are many tools that can do the mechanical review as well.&lt;/p&gt;  &lt;p&gt;The most popular commercial tool is &lt;a href="http://www.redhillconsulting.com.au/products/simian/" target="_blank"&gt;Simian&lt;/a&gt;. However, for my project I am using &lt;a href="http://duplicatefinder.codeplex.com/" target="_blank"&gt;Duplicate Finder&lt;/a&gt;, which is open-source software. These tools will scan your source code, not object code, so access to the source code is required. The reports that are generated can help you identify cut &amp;amp; paste programming, or common constructs that can be &lt;a href="http://www.lostechies.com/blogs/sean_chambers/archive/2009/08/15/refactoring-day-15-remove-duplication.aspx" target="_blank"&gt;refactored&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Anthony Steele (the developer of Duplicate Finder) recently integrated changes into the tool to provide an XML output perfect for use with CruiseControl.NET. I've created two Xsl files that integrate the Xml reports in both summary form and detail (with file name and line number).&lt;/p&gt;  &lt;p&gt;To integrate them into your CruiseControl.NET dashboard &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Unzip them both to &amp;lt;cruisecontrol install directory&amp;gt;\webdashboard\xsl&lt;/li&gt;    &lt;li&gt;Modify the dashboard.config file in &amp;lt;cruisecontrol install directory&amp;gt;\webdashboard\ as follows&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;Add the following line &lt;em&gt;&amp;lt;xslFile&amp;gt;xsl\DuplicateReportSummary.xsl&amp;lt;/xslFile&amp;gt;&lt;/em&gt; to dashboard/plugins/buildPlugins/buildReportBuildPlugin/xslFileNames&lt;/li&gt;      &lt;li&gt;Add the following line &lt;em&gt;&amp;lt;xslReportBuildPlugin description=&amp;quot;Duplicate Code Report&amp;quot; actionName=&amp;quot;DuplicateBuildReport&amp;quot; xslFileName=&amp;quot;xsl\DuplicateReport.xsl&amp;quot; /&amp;gt;&lt;/em&gt; to dashboard/plugins/buildPlugins/&lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/DuplicateReportXsl.zip" target="_blank"&gt;DuplicateReportXsl.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;sha1: 29d5ae55db98db86ebf01d3e8bfd88f15c53b3a4&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-8707423055429126511?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2826128261602270055</id><title type="text">Prevent security mishaps with CAT.NET</title><published>2009-08-02T17:53:00-07:00</published><updated>2009-08-03T12:55:31-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2826128261602270055" /><link rel="alternate" type="text/html" title="Prevent security mishaps with CAT.NET" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2826128261602270055" /><category term="Static Code Analysis" scheme="http://www.blogger.com/atom/ns#" /><category term="Security" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;Static code analysis can improve software security by looking for common security errors like (SQL/XML/LDAP) injection, Cross Site Scripting (XSS), and more. Generally this is done by looking for malformed queries where malicious input can be injected. The &lt;a href="http://blogs.msdn.com/cisg/archive/tags/CAT.NET/default.aspx"&gt;CAT.NET&lt;/a&gt; tool from Microsoft goes one better and analyzes the data as it flows from trusted (or untrusted) inputs to output. This is a great QA check as well as a teaching tool for developers to understand where their applications may be vulnerable to attack.&lt;/p&gt;  &lt;p&gt;The tool is available as a Visual Studio plugin or command-line tool. It will scan your object code (assemblies) and provide a report for you to review. Microsoft offers a tool to handle XSS attacks known as the &lt;a href="http://blogs.msdn.com/cisg/archive/tags/Anti-XSS/default.aspx"&gt;Anti-XSS library&lt;/a&gt;. For the remainder of the errors, you are on your own to mitigate them. &lt;/p&gt;  &lt;p&gt;I was writing some code to search Active Directory with an LDAP query. CAT.NET found this and marked it as a vulnerability for LDAP injection. I made sure to sanitize the input (and decorate the method with a System.Diagnotics.CodeAnalysis.&lt;a href="http://mobiusdevelopment.com/dev/Blog.asp?ArticleID=7631930255747378444" target="_blank"&gt;SupressMessage attribute&lt;/a&gt;), and it disappeared from the report. This is a great tool to use in a daily build to ensure common security bugs can be eliminated.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2826128261602270055?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5268401986879274349</id><title type="text">Getting started with web part development</title><published>2009-07-27T04:52:00-07:00</published><updated>2009-07-27T04:52:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5268401986879274349" /><link rel="alternate" type="text/html" title="Getting started with web part development" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5268401986879274349" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;As developers come and go, I find myself with new team members who have ASP.NET experience but no SharePoint experience. My approach to web part development is meant to get them up to speed quickly. The process that I use is&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Build traditional ASP.NET web page in a ASP.NET web application &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/webdevelopertips/archive/2009/07/09/tip-87-did-you-know-how-to-reuse-a-web-page-by-converting-into-an-asp-net-user-control.aspx" target="_blank"&gt;Convert&lt;/a&gt; the web page to a user control. &lt;/li&gt;    &lt;li&gt;Create a &lt;a href="http://weblogs.asp.net/erobillard/archive/2008/03/04/what-to-know-about-smartpart-and-loadcontrol.aspx" target="_blank"&gt;thin web part&lt;/a&gt; that loads the user control. &lt;/li&gt;    &lt;li&gt;Deploy the assembly to the GAC, and the control to the 12 hive. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;You will notice that this does not look like the &lt;a href="http://msdn.microsoft.com/en-us/library/ms452873.aspx" target="_blank"&gt;MSDN&lt;/a&gt; approach. There is no requirement to install &lt;a href="http://blogs.msdn.com/pandrew/archive/2009/03/19/visual-studio-2008-extensions-for-sharepoint-vsewss-1-3-addresses-all-common-sharepoint-developer-requests.aspx" target="_blank"&gt;VSeWSS&lt;/a&gt;, or any other tools. In fact, this approach could be used on a XP development machine because the web part code shouldn't require a reference to the SharePoint dlls. This makes it easier to setup for a new SharePoint developer.&lt;/p&gt;  &lt;p&gt;The real reason I use this approach, is because I like using a visual designer for visual components. Yes, I know &amp;quot;drag &amp;amp; drop&amp;quot; programming isn't glamorous, but the speed for getting your controls to &amp;quot;look right&amp;quot; is impressive. Those of you in the know will recognize this approach as a statically bound &lt;a href="http://www.sharepoint-tips.com/2008/03/thoughts-and-best-practices-around.html" target="_blank"&gt;SmartPart&lt;/a&gt;. I have built web parts by overriding &lt;a href="http://blogs.msdn.com/mcsnoiwb/archive/2008/08/04/sharepoint-performance-optimizing-web-parts.aspx" target="_blank"&gt;CreateChildControls()&lt;/a&gt;, but that should be for learning purposes only.&lt;/p&gt;  &lt;p&gt;This approach also makes deployment easier. The code can be packaged into an assembly containing many web parts and supporting code. We use the wonderful &lt;a href="http://www.codeplex.com/wspbuilder" target="_blank"&gt;WSPBuilder&lt;/a&gt; to build solution packages for deployment. As we are required to debug and upgrade the web part, the code is in an assembly that we can manage normally, and the UI is in the ascx control on the server. This makes it easy to upgrade the web part in place, without requiring changes to the SharePoint sites or pages.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5268401986879274349?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2229119180290337894</id><title type="text">Code Coverage with PartCover</title><published>2009-06-29T04:34:00-07:00</published><updated>2009-07-08T07:55:34-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2229119180290337894" /><link rel="alternate" type="text/html" title="Code Coverage with PartCover" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2229119180290337894" /><category term="CI" scheme="http://www.blogger.com/atom/ns#" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="TDD" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Code_coverage"&gt;Code coverage&lt;/a&gt; is a static analysis technique to match your unit tests to your code and track how much of your code is being exercised by your testing suite. I had been using &lt;a href="http://www.ncover.com/"&gt;NCover &lt;/a&gt;(the paid version) for a while to identify areas of my code that needed more extensive testing. However, I'm on a small team, and every add-in necessary to get started is a barrier. A paid tool just wasn't going to cut it. I looked into &lt;a href="http://ncover.sourceforge.net/"&gt;ncover.sourceforge.net&lt;/a&gt;, but it is hopelessly outdated. After some more searching, I found &lt;a href="http://sourceforge.net/projects/partcover/"&gt;partcover&lt;/a&gt;. This tool is open source and free. The syntax isn't too hard to get used to. &lt;a href="http://stackoverflow.com/questions/363740/getting-partcover-to-work"&gt;Run it once&lt;/a&gt; with just your test framework, and quickly start excluding assemblies and classes you aren't interested in.&lt;/p&gt;  &lt;p&gt;Once I figured out how to get the classes I want to show up in the reports, I ran into another problem. There are two xslt files to transform your xml results into a readable html file. Whenever I ran this, my results always came back 0%. I'll admit, I'm no &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; guru, but my coverage isn't that low. After some more digging, I found a &lt;a href="http://sourceforge.net/tracker/?func=detail&amp;amp;aid=2762607&amp;amp;group_id=175733&amp;amp;atid=874420" target="_blank"&gt;patch&lt;/a&gt; to the two xslt files. Once this was applied, I was in business.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2229119180290337894?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2052144097432164202</id><title type="text">Programming Pearls</title><published>2009-06-11T14:11:00-07:00</published><updated>2009-06-11T14:11:34-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2052144097432164202" /><link rel="alternate" type="text/html" title="Programming Pearls" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2052144097432164202" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;My review of &lt;a href="http://www.amazon.com/gp/product/0201657880?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0201657880"&gt;Programming Pearls&lt;/a&gt;&lt;img style="margin: 0px; border-top-style: none! important; border-right-style: none! important; border-left-style: none! important; border-bottom-style: none! important" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0201657880" width="1" border="0" /&gt; is going to require a little personal background. My undergraduate degree is in Finance, not Computer Science, and my focus has always been on programming, not computer science. However, I have enough experience now that I'm running into those things that CS majors need to know. &lt;/p&gt;  &lt;p&gt;When I first started reading the book, it was dry and academic, and I quickly lost interest. The first few chapters focused on algorithms. It went into my bag, not to be read. Recently I was bored on the train and tried to keep reading it. I was quickly drawn in, nodding my head as I read the problem descriptions he sets about to solve. The book quickly became much more compelling to me and I was excited to keep reading. The book is a collection of articles from &lt;a href="http://cacm.acm.org/" target="_blank"&gt;Communications of the ACM&lt;/a&gt; that actually read pretty quickly. The focus is on &amp;quot;thinking&amp;quot; about difficult programming problems to come to elegant solutions. The &amp;quot;pearls&amp;quot; are born from irritating programming problems. The book is split into&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Preliminaries&lt;/li&gt;    &lt;li&gt;Performance&lt;/li&gt;    &lt;li&gt;Product&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I realized, that for myself, the first part was a bit too academic, and the third part was a bit contrived, while the middle chapters about Performance were just what I needed. At the end of the book (currently second edition) there was a compendium of common algorithms and it's easy to compare/contrast them. After reading this, the first chapters were much more meaningful. If you are finding it difficult to follow this book, jump ahead to another chapter or section that may interest you more.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2052144097432164202?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-8415313519825323111</id><title type="text">Web Part Maintenance Mode</title><published>2009-05-27T13:24:00-07:00</published><updated>2009-05-27T13:24:34-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8415313519825323111" /><link rel="alternate" type="text/html" title="Web Part Maintenance Mode" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8415313519825323111" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I spent way too much time today hunting down this tip. I'm writing it here for my ease of recall.&lt;/p&gt;  &lt;p&gt;Often times, developers in WSS3.0/MOSS2007 probably run across the issue where a web part is dropped on to a page and then Sharepoint errors out for one reason or the other. Sometimes, the user is directed to a Web Part Maintenance page, which helps the developer remove the offending web part from the page. However, there is no way to get to this page from any easily available link. If you are seeing the ASP.Net &amp;quot;Yellow Screen of Death&amp;quot; then you need to disable the offending web part.&lt;/p&gt;  &lt;p&gt;In order to get to the Web Part Maintenance page for ANY sharepoint url, try the following trick.&lt;/p&gt;  &lt;p&gt;Append the querystring ?contents=1 to the url in the browser as shown below   &lt;br /&gt;http://portal/area/default.aspx?contents=1&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-8415313519825323111?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2456068835585245920</id><title type="text">Data.gov and Open Governance</title><published>2009-05-22T06:13:00-07:00</published><updated>2009-05-22T09:06:23-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2456068835585245920" /><link rel="alternate" type="text/html" title="Data.gov and Open Governance" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2456068835585245920" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;blockquote&gt;   &lt;p&gt;The primary goal of &lt;a href="http://www.data.gov/"&gt;Data.Gov&lt;/a&gt; is to improve access to Federal data and expand creative use of those data beyond the walls of government by encouraging innovation. As a priority Open Government Initiative for President Obama's administration, Data.gov increases the ability of the public to easily find, download, and use datasets that are generated and held by the Federal Government. Federal, Executive Branch data are included in the first version of Data.gov.&lt;/p&gt;    &lt;p&gt;In a recent interview on &lt;a href="http://www.nextgov.com/nextgov/ng_20090520_9043.php"&gt;NextGov.com&lt;/a&gt;, Federal CIO&lt;strong&gt; &lt;/strong&gt;Vivek Kundra shed some details on Data.Gov &amp;amp; Open Government Initiative&lt;strong&gt;. &lt;/strong&gt;&amp;quot;We recognize the power of tapping into the ingenuity of the American people and recognize that government doesn't have a monopoly on the best ideas or always have the best idea on finding an innovative path to solving the toughest problems the country faces. By democratizing data and making it available to the public and private sector ... we can tap into that ingenuity.&amp;quot; &lt;/p&gt;    &lt;p&gt;Combining the open data available at this site along with modern presentation technologies (mapping, filtering, drill-down and roll-up) and delivering these over scalable cloud infrastructures provides a new model for policy analysis and public discourse about the state of the modern union. We have seen &lt;a href="http://www.microstrategy.com/recovery-act-data/" target="_blank"&gt;examples&lt;/a&gt; of this with ARRA. As more data is &lt;a href="http://www.usgovxml.com/" target="_blank"&gt;published&lt;/a&gt; in standard formats I expect this trend to continue. For today's developers, a &lt;a href="http://sunlightlabs.com/contests/appsforamerica2/" target="_blank"&gt;competition&lt;/a&gt; to publish the most innovative new applications.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2456068835585245920?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7443521726781067199</id><title type="text">ARRA funding for Healthcare IT</title><published>2009-04-28T05:16:00-07:00</published><updated>2009-04-28T06:09:28-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7443521726781067199" /><link rel="alternate" type="text/html" title="ARRA funding for Healthcare IT" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7443521726781067199" /><category term="Security" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;div&gt;ARRA provides approx. $180 billion USD for healthcare spending (&lt;a href="http://www.hhs.gov/recovery/reports/arraweekly.xml"&gt;current expenditure&lt;/a&gt;), and approx. $23 billion of that is focused on IT upgrades and modernization. This money is &lt;a href="http://www.itchannelplanet.com/channel/article.php/3815576/VARs+Find+Opportunities+in+Healtcare+Thanks+to+Fed.htm"&gt;targeted to the states&lt;/a&gt;, who will then provide the funds to the healthcare providers. &lt;/div&gt;  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div&gt;In addition to IT upgrades, there are &lt;a href="http://journal.ahima.org/2009/04/16/hitech-act-privacy-provisions%E2%80%99-impact-for-health-information-exchanges/"&gt;additional requirements&lt;/a&gt; on top of HIPAA. The same regulations that applied to providers under HIPAA now extend to business associates, as well as employees of the "covered entities". It also subjects business associates to the same potential civil and criminal liability for breaches as covered entities. &lt;/div&gt;  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div&gt;To ensure adoption of an Electronic Health Record (EHR), more patients need to feel confident about how their medical data is being protected. To ensure citizens are informed about their data security, a breach notification clause is included forcing providers to notify HHS, and in some cases the media directly in case of breach. This is similar to the &lt;a href="http://blog.wired.com/27bstroke6/2009/03/ca-looks-to-exp.html"&gt;data protection laws&lt;/a&gt; in effect in California since 2003.  The FTC has the responsibility for announcing these breaches, &lt;a href="http://www.modernhealthcare.com/apps/pbcs.dll/article?AID=/20090417/REG/304179997/1153&amp;amp;nocache=1&amp;amp;nocache=1" target="_blank"&gt;bringing a new agency&lt;/a&gt; into the healthcare privacy arena.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7443521726781067199?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2683952177995973353</id><title type="text">Book Review: Thinking for a Living</title><published>2009-04-23T04:19:00-07:00</published><updated>2009-04-23T04:19:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2683952177995973353" /><link rel="alternate" type="text/html" title="Book Review: Thinking for a Living" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2683952177995973353" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/1591394236?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1591394236"&gt;Thinking for a Living&lt;/a&gt;&lt;img style="border-style: none ! important; margin: 0px;" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1591394236" border="0" height="1" width="1" /&gt; by &lt;a title="Tom Davenport" href="http://www.tomdavenport.com/index.html" target="_blank"&gt;Tom Davenport&lt;/a&gt; is a book that focuses on increasing productivity for "information workers". I've been focused on knowledge management for several years so I found the book to be an interesting collection of best practices. I'm generally more focused on technology workers, but this book casts a wide net for producers, distributors and consumers on information and knowledge on the job.&lt;/p&gt;&lt;p&gt;This book is focused on managers who are responsible for improving the productivity of these workers. In reading this book, it seemed to describe a tension between a "hands-off" approach to allow workers maximum flexibility to a more industrial approach (but never too heavy) to introduce some process and collaboration into the workstream. I found both arguments to have merit and really require managers to consider their specific case.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;An interesting corollary to the techniques in the book is that smaller firms and teams will be able to have looser processes due to lower communication and coordination overhead. I believe this is the inevitable march of industrialized firms. Not to grow larger like GM or AIG (straw man argument ahead) but to grow smaller and stay "adolescent". This allows them to operate in a "startup" mentaility longer and avoid carrying needless costs.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2683952177995973353?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-8028400828852516626</id><title type="text">Distributed Caching in ASP.NET</title><published>2009-04-20T04:19:00-07:00</published><updated>2009-04-20T06:33:36-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8028400828852516626" /><link rel="alternate" type="text/html" title="Distributed Caching in ASP.NET" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8028400828852516626" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="Caching" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;&lt;a href="http://aspnetcache.wordpress.com/2008/10/08/asp-net-cache-features/" target="_blank"&gt;Cache Scavenging&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Although caching allows to to have higher performance and scalability, there is no free lunch. Applications that use extensive caching run the risk of showing the user stale data. ASP.NET allows you to evict items from the cache based on several parameters including time, memory usage, and priority. There are also dependency objects that allow you to evict items from the cache when the underlying database changes.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://odetocode.com/Articles/305.aspx" target="_blank"&gt;AppDomains&lt;/a&gt; and Caching boundaries&lt;/p&gt;  &lt;p&gt;In ASP.NET the AppDomain is your application boundary. This is a security perimeter, but also a housekeeping one. For our discussion, each AppDomain has its own cache object. What does this mean for us? &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If you have a main website, and four subsites that are ASP.NET applications, then you will have 5 Cache objects that are not guaranteed to be synchronized. &lt;/li&gt;    &lt;li&gt;If you have one ASP.NET application and web gardens set up with 2 worker processes, then you will have two Cache objects that are not guaranteed to be synchronized &lt;/li&gt;    &lt;li&gt;If you have a web farm with three servers, then you will have 3 cache objects that are not guaranteed to be synchronized. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Third Party Caching Solutions&lt;/p&gt;  &lt;p&gt;If we combine the two issues above, the situation only gets worse. You can run into a situation where you have multiple caches with different data. An application may update data that invalidates its cache, but has to notify the other caches to evict this item as well. As you can see from the examples above, you may need a distributed caching solution even if you only have one web server. I've investigated three products that can provide a distributed cache across AppDomains, processes and servers. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.codeproject.com/KB/aspnet/memcached_aspnet.aspx" target="_blank"&gt;memcached&lt;/a&gt; - A port of the &lt;a href="http://www.cmswire.com/cms/tips-tricks/sweet-scalability-its-memcached-for-net-001692.php" target="_blank"&gt;popular caching framework&lt;/a&gt; used by LiveJournal and Wikipedia.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.alachisoft.com/ncache/asp-net-cache.html" target="_blank"&gt;NCache&lt;/a&gt; - Feature rich commercial caching framework      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/velocity/" target="_blank"&gt;Velocity&lt;/a&gt;- Microsoft's distributed caching software. Currently at CTP3.      &lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-8028400828852516626?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3773363449107529453</id><title type="text">Conceptual Blockbusting Book Review</title><published>2009-04-16T04:55:00-07:00</published><updated>2009-04-16T05:31:43-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3773363449107529453" /><link rel="alternate" type="text/html" title="Conceptual Blockbusting Book Review" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3773363449107529453" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;After my last attempt at Book reviews,I'm trying to keep these a little shorter. Next on my reading list was &lt;a href="http://www.amazon.com/gp/product/0738205370?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0738205370"&gt;Conceptual Blockbusting: A Guide to Better Ideas&lt;/a&gt;&lt;img style="margin: 0px; border-top-style: none! important; border-right-style: none! important; border-left-style: none! important; border-bottom-style: none! important" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0738205370" width="1" border="0" /&gt; by James L Adams. Readers will learn about ways we can become more creative by "busting" conceptual blocks in our thinking. This book is on it's fourth edition, and has been polished to present some great research and writing.  The book focuses on developing new and creative ideas and grows from the individual thought process to groups and organizations. I'll glance at each group below.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;h5&gt;Individual&lt;/h5&gt; The majority of the book is dedicated to how individuals can overcome their conceptual blocks and form new creative ideas. Some of the "blocks" identified included perception, emotional, cultural, educational, and social. The book contains many exercises that help illuminate exactly what the author is trying to teach us. Addressing some of these, like perception or education can be quite an intellectual exercise. However, some of the others like culture or emotion require some real soul searching, and in my case, identifying new areas where focused development is required.      &lt;br /&gt;    &lt;br /&gt;The author also reviews several techniques for for breaking through including breaking sets, different problem solving languages, brainstorming and more. These techniques have proven valuable to me just weeks after reading the book. &lt;/li&gt;    &lt;li&gt;     &lt;h5&gt;Groups&lt;/h5&gt; This portion of the book looks at how creativity and problem solving changes when we add more people. I think this is a very important section as we work in groups not only at work, but also at home, playing sports, volunteering, at church and more. &lt;/li&gt;    &lt;li&gt;     &lt;h5&gt;Organizations&lt;/h5&gt; This is the shortest portion of the book and not the most relevant for people looking to change their own thinking processes. However, Mr Adams does discuss the factors inside an organization that can help nurture a creative environment or stifle it. These form excellent guidelines for managers looking to create this type of environment or potential employees trying to decide if the firm is right for them. &lt;/li&gt; &lt;/ol&gt; In conclusion, this book has provided me with valuable insights into my own thinking as well as improving my problem solving with others. The chapters are short and digestible, and I suggest you put the book down several times while you are reading it to maximize the value of the exercises contained within.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3773363449107529453?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3920171538484940102</id><title type="text">Web Application Caching in ASP.NET</title><published>2009-04-13T03:47:00-07:00</published><updated>2009-04-13T03:47:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3920171538484940102" /><link rel="alternate" type="text/html" title="Web Application Caching in ASP.NET" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3920171538484940102" /><category term="ASP.NET" scheme="http://www.blogger.com/atom/ns#" /><category term="Caching" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Caching in ASP.NET web applications can happen on multiple levels. As developers, we can greatly increase performance and scalability by caching data or calculations. We can cache at   &lt;ol&gt;   &lt;li&gt;Data Access layer      &lt;blockquote&gt;       &lt;p&gt;If we are using web services and SOA, then we can use IIS caching to cache our data values. Clearly this may not be appropriate for real-time data, but even a 60 second cache can increase performance without seriously impacting decision making. By decorating our web service like so, we can cache the data for 60 seconds. &lt;/p&gt;        &lt;pre style="color: black"&gt;&amp;lt;WebMethod(CacheDuration:=60)&amp;gt;&lt;/pre&gt;&lt;br /&gt;Here's an &lt;a href="http://blogs.msdn.com/bags/archive/2008/08/28/rest-in-wcf-part-x-supporting-caching-and-conditional-get.aspx" target="_blank"&gt;detailed article&lt;/a&gt; about caching in WCF.&lt;br /&gt;   &lt;/blockquote&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;&lt;br /&gt; &lt;li&gt;Business Object Layer&lt;br /&gt;   &lt;blockquote&gt;&lt;br /&gt;     &lt;p&gt;Now we have moved a step up the application stack and are dealing with our domain objects. There are two places we can store cache data depending on their expected lifespan.If your page makes heavy use of certain objects, then discards them, you should consider storing the item in the&lt;strong&gt;&lt;em&gt; HttpContext.Items&lt;/em&gt;&lt;/strong&gt; collection. Items stored here have a lifespan of 1 request/response cycle. After that they are discarded. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;     &lt;p&gt;If our objects are expected to be longer-lived between requests in an application, then a better storage is in the &lt;strong&gt;&lt;em&gt;HttpRuntime.Cache.Items&lt;/em&gt;&lt;/strong&gt; collection. &lt;/p&gt;&lt;br /&gt;   &lt;/blockquote&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;&lt;br /&gt; &lt;li&gt;Presentation Layer&lt;br /&gt;   &lt;ol&gt;&lt;br /&gt;     &lt;li&gt;Single Control - This technique is known as &lt;a title="Partial Page Caching" href="http://www.devx.com/dotnet/Article/27327/0/page/4" target="_blank"&gt;partial page caching&lt;/a&gt;. This allows us to cache a single user control and have the rest of the page be dynamically generated. This is very important for portal and web parts where users may be able to add multiple webparts and make a page relatively "heavy". This technique also allows you to vary the cache by user, querystring, browser and more. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;     &lt;li&gt;Entire Page - The oldest trick in the book. We &lt;a title="Page Level Caching" href="http://msdn.microsoft.com/en-us/kb/kb00323290.aspx" target="_blank"&gt;add an HTTP Header&lt;/a&gt; that tells browsers, and interim cache servers to hold a copy of this page. This keeps the request from ever hitting your server. This approach is best for applications that are updated infrequently, or are updated on a strict schedule. If new content is published on a strict schedule, then you can set the cache to expire just before the new content is published. &lt;/li&gt;&lt;br /&gt;   &lt;/ol&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;There are drawbacks to this approach. When you are debugging, you need to add an additional step to determine if your page is being processed or server from the cache. Like all performance optimizations, this should be done last to keep your system easy and predictable.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3920171538484940102?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7797108329453512579</id><title type="text">Code Complete Book Review (7 of 7)</title><published>2009-04-02T03:19:00-07:00</published><updated>2009-04-02T03:19:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7797108329453512579" /><link rel="alternate" type="text/html" title="Code Complete Book Review (7 of 7)" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7797108329453512579" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;This is the final piece of my review of &lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt;&lt;img style="margin: 0px; border-top-style: none! important; border-right-style: none! important; border-left-style: none! important; border-bottom-style: none! important" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0735619670" width="1" border="0" /&gt; by Steve McConnell. This final section is about craftsmanship, and how we can approach construction as a craft. There are companies and &lt;a href="http://groups.softwarecraftsmanship.org/" target="_blank"&gt;groups&lt;/a&gt; dedicated to this pursuit. As we progress in our professional development it seems natural that we adopt these practices as well. Many of the readers of these posts are finding them via specific search queries, so I know people are thinking about this and looking to adopt these ideas. &lt;/p&gt;  &lt;li&gt;Software Craftsmanship    &lt;ul&gt;     &lt;li&gt;Layout and Style        &lt;ul&gt;         &lt;li&gt;The most important part of code layout is making it easy to read for the next programmer. Use of whitespace, grouping and indentation make it easier for programmers to understand your program control flow. &lt;/li&gt;          &lt;li&gt;When it comes to laying out comments, I'm a proponent of only commenting routine definitions. If you need to comment some tricky code, then that code needs to have it's own routine. In modern IDE's, this documentation will be available to future programmers via the class browser. &lt;/li&gt;          &lt;li&gt;&lt;a href="http://www.cc2e.com/3194"&gt;Layout Checklist&lt;/a&gt; &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Self-Documenting Code        &lt;ul&gt;         &lt;li&gt;All development will require some external documentation in the form of design documents, test plans and more. As our tools permit, more of these documents are becoming executable, which allows for quicker round-trips between requirements, design, development, testing, and defect tracking. &lt;/li&gt;          &lt;li&gt;Rather than documenting your code, we should strive to choose good routine and variable names, so people who read the code can understand what is going on without referring to documentation. &lt;/li&gt;          &lt;li&gt;&lt;a href="http://www.cc2e.com/3252"&gt;Self-Documenting Code Checklist&lt;/a&gt; &lt;/li&gt;          &lt;li&gt;Use the Pseudocode Programming Process to document your code. This has the benefit of forcing you to think through your program flow before you start coding. &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Personal Character        &lt;ul&gt;         &lt;li&gt;Since the main productive asset in development is people, we are required to develop certain personal characteristics to perform our jobs. These include:            &lt;ul&gt;             &lt;li&gt;honesty &lt;/li&gt;              &lt;li&gt;humility &lt;/li&gt;              &lt;li&gt;curiosity &lt;/li&gt;              &lt;li&gt;creativity &lt;/li&gt;              &lt;li&gt;discipline &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Themes in Software Craftsmanship        &lt;ul&gt;         &lt;li&gt;Conquer Complexity: The best way to make system more modular is to break complex sections into easier sub-components. Every time you run into a difficult problem, start decomposing the problem until you have a list of simple problems. &lt;/li&gt;          &lt;li&gt;Write Programs for People First, Computers Second: Every year hardware gets faster and cheaper. However, programmer time gets more expensive. Focus your development on making things easy to understand for the next developer and don't worry about squeezing every last bit of performance out of the current system. &lt;/li&gt;          &lt;li&gt;Focus Your Attention with the Help of Conventions: Standardizing on variable names, indentation, and other conventions allows your brain to build muscle memory to make certain checks automatic. Sports have conventions (how to hold a baseball bat, a three-point stance in football) to train our body how to setup. The real thinking starts after these standards. &lt;/li&gt;          &lt;li&gt;Program in Terms of the Problem Domain: Take advantage of OOP and layer your program so systems components talk to system components, and business logic talks to business logic. This composition is easier to read, easier to maintain, and easy to explain. &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;hr /&gt;    &lt;p&gt;This material is copied and/or adapted from the &lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt; 2 Website at cc2e.com. This material is Copyright &amp;#169; 1993-2007 Steven C. McConnell. Permission is hereby given to copy, adapt, and distribute this material as long as this notice is included on all such materials and the materials are not sold, licensed, or otherwise distributed for commercial gain. &lt;/p&gt; &lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7797108329453512579?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2545827105212129654</id><title type="text">SharePoint and Wikis</title><published>2009-03-30T03:34:00-07:00</published><updated>2009-03-30T03:34:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2545827105212129654" /><link rel="alternate" type="text/html" title="SharePoint and Wikis" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2545827105212129654" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Project Management" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I recently had a chance to hear from &lt;a title="Future Changes" href="http://www.ikiw.org/stewart/" target="_blank"&gt;Stewart Mader&lt;/a&gt; about the best practices for using &lt;a title="Wikipedia on wiki" href="http://en.wikipedia.org/wiki/Wiki" target="_blank"&gt;wikis&lt;/a&gt; inside an organization. As a heavy SharePoint user, I had not jumped in too deep with wikis because the support is &lt;a title="SharePoint wiki analysis" href="http://www.wikisym.org/ws2008/index.php/How_good_is_MS_Sharepoint_as_a_wiki%3F" target="_blank"&gt;pretty poor&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;I like to think that I'm an advanced Office user, but having dived into the Office object model before, I know there's huge portions of the product that I've never used. In fact, &lt;a href="http://googlesystem.blogspot.com/2008/02/most-frequently-used-features-in.html" target="_blank"&gt;most people&lt;/a&gt; never use those options in Office. This is where the disconnect between SharePoint and wikis comes into play. &lt;/p&gt;  &lt;p&gt;SharePoint is first and foremost an Office product. It is the highway for you to drive your tricked-out Office documents. But most users are stuck in first gear. They write short memos or reports in Word, bullet-laden PowerPoint presentations, or csv style Excel spreadsheets. While SharePoint will surely add value, you're driving down the highway in first-gear.&lt;/p&gt;  &lt;p&gt;It can be hard for us to look at tools we use every day and admit that we aren't experts with them at all. I think every entry-level Information Worker job requires "familiarity with Microsoft Office". However, the majority of workers can't do things like resize a column in Excel, or sort and filter. It sounds absurd, but it is true. If you are at all interested in career development, I encourage you to visit the &lt;a href="http://www.microsoft.com/learning/office2007/iworker/default.mspx" target="_blank"&gt;Microsoft Office learning site&lt;/a&gt;, and choose one class, or book to increase your skills. It will pay off. &lt;/p&gt;  &lt;p&gt;What about users who don't need this level of complexity? We can agree that these tools are rich, but what if you only need those top 10 features (save, bold, italic, spell check, ...). I think this is where wikis are most valuable. Think about the work that you create day to day. If you're a Project Manager, you'll need a tool like Project or Primavera to do scheduling and cost analysis. What about meeting agendas, project documentation and contact lists? These are excellent documents to store in a wiki.&lt;/p&gt;  &lt;p&gt;I've discussed both sides of this approach. If you'd like to have your cake and eat it too, there are &lt;a title="SharePoint Connector for Confluence" href="http://confluence.atlassian.com/display/CONFEXT/SharePoint+Connector+for+Confluence" target="_blank"&gt;plugins&lt;/a&gt; to expose your Wiki in SharePoint. This allows you to use a best of breed wiki for collaboration, and rely on SharePoint to handle your complex Office documents. Everything is available and searchable from one place. Ciao.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2545827105212129654?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3473549756344974638</id><title type="text">Code Complete Book Review (6 of 7)</title><published>2009-03-26T04:10:00-07:00</published><updated>2009-03-26T04:10:00-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3473549756344974638" /><link rel="alternate" type="text/html" title="Code Complete Book Review (6 of 7)" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3473549756344974638" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;In reviewing these sections of &lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt;&lt;img style="margin: 0px; border-top-style: none! important; border-right-style: none! important; border-left-style: none! important; border-bottom-style: none! important" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0735619670" width="1" border="0" /&gt; by Steve McConnell there was a lot of discussion about tools. Of course, using the right tool will make programmers more productive. I steered away from these discussions because it seems to me that the tool vendors are doing a great job getting their point across. I'll focus on ideas that we can internalize to improve our software. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;System Considerations      &lt;ul&gt;       &lt;li&gt;Program Size          &lt;ul&gt;           &lt;li&gt;As programs increase in size and add more programmers, testers, business analysts, communications channels rapidly jump up (n * (n-1)) / 2 where n is the number of team members. This is why status reports, and chains of management make for better communication and coordination on larger teams rather than everyone trying to talk to everyone. &lt;/li&gt;            &lt;li&gt;As programs increase in size, defect density goes up, while programmer productivity goes down. This seems to be an endorsement of SOA, where each project focuses on providing a specific service, then composite applications mashup the existing services. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Managing Construction          &lt;ul&gt;           &lt;li&gt;Encourage good coding with practices such as pair programming and formal reviews. &lt;/li&gt;            &lt;li&gt;As programs grow, the need for formal configuration management grows as well. Use a Change Control Board to discuss and rank requested changes to ensure that you are working on the most important requests. XP uses cards for this and every iteration, the custom picks the most important cards, &amp;quot;stories&amp;quot;, for implementation. &lt;/li&gt;            &lt;li&gt;Be sure to use version control software, and have backups to quickly recover from construction missteps. &lt;/li&gt;            &lt;li&gt;&lt;a href="http://www.cc2e.com/2843"&gt;Configuration Management Checklist&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;You can estimate the size of a project and the effort required to complete it in any of several ways. It is important to first identify why you are estimating. Is this a rough order of magnitude estimation for a go-no go decision? Is this for a detailed customer quote? In my experience, the most effective approach is to use at least two estimating techniques. (I prefer a top-down estimation based on similar projects, and a bottom-up estimation from the software design). If these estimations are close, then you can have additional confidence. If not, maybe you need to choose a third approach. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Integration          &lt;ul&gt;           &lt;li&gt;If you construct and integrate software in the wrong order, it's harder to code, harder to test, and harder to debug. If none of it will work until all of it works, it can seem as though it will never be finished. It too can collapse under its own weight during construction&amp;#8212;the bug count might seem insurmountable, progress might be invisible, or the complexity might be overwhelming&amp;#8212;even though the finished product would have worked. &lt;/li&gt;            &lt;li&gt;Incremental integration (developing one part of a system at a time, and then adding it to the rest), makes work much easier than a grand &amp;quot;integration phase&amp;quot;. &lt;/li&gt;            &lt;li&gt;The basic strategies for integration are top-down and bottom-up integration. Top-down integration lets you test the architecture earlier, but leaves testing the system interfaces for last. Bottom-up integration tests tricky system interfaces first, then architecture and design last. Since both of these approaches have benefits and drawbacks, many teams use a hybrid version. &lt;/li&gt;            &lt;li&gt;&lt;a href="http://www.cc2e.com/2992"&gt;Integration Checklist&lt;/a&gt; &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;hr /&gt;  &lt;p&gt;This material is copied and/or adapted from the &lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt; 2 Website at cc2e.com. This material is Copyright &amp;#169; 1993-2007 Steven C. McConnell. Permission is hereby given to copy, adapt, and distribute this material as long as this notice is included on all such materials and the materials are not sold, licensed, or otherwise distributed for commercial gain. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3473549756344974638?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5445912500716126663</id><title type="text">Visualizing Data with GeoRSS and Virtual Earth</title><published>2009-03-23T04:57:00-07:00</published><updated>2010-03-19T17:20:42-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5445912500716126663" /><link rel="alternate" type="text/html" title="Visualizing Data with GeoRSS and Virtual Earth" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5445912500716126663" /><category term="VirtualEarth" scheme="http://www.blogger.com/atom/ns#" /><category term="visualization" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;According to the &lt;a title="a 19 member interagency committee composed of representatives from the Executive Office of the President, and Cabinet level and independent Federal agencies" href="http://www.fgdc.gov/" target="_blank"&gt;Federal Geographic Data Committee&lt;/a&gt;, &lt;a href="http://www.fgdc.gov/library/whitepapers-reports/white-papers/homeland-security-gis" target="_blank"&gt;80%-90% of all government data has a geographic component&lt;/a&gt;. As we offer data to the public, this offers an incredible opportunity to create richer interfaces and allow users to quickly grasp issues that effect them based on location. As RSS becomes more and more prevalent as a way to publish and share information, it becomes increasingly important that location is described in an interoperable manner so that applications can request, aggregate, share and map geographically tagged feeds&lt;/p&gt;  &lt;p&gt;&lt;a href="http://georss.org/" target="_blank"&gt;GeoRSS&lt;/a&gt; is an encoding standard that allows us to add geographical information to any existing RSS or Atom feed. &lt;a href="http://code.google.com/apis/kml/documentation/kmlreference.html" target="_blank"&gt;KML&lt;/a&gt; is an XML based language that allows us describe geographical information as well. KML seems better suited for strictly visual browsers (as it offers additional data for creating a &amp;quot;camera view&amp;quot;). I'll focus on GeoRSS since we can easily expose this to users who are currently consuming our feeds.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;To add GeoRSS data to a feed we need to take two steps&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Add the GeoRSS namespace to our feed namespace declarations. &lt;/li&gt;    &lt;li&gt;Add a GeoRSS element (point) to our posts. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I've created some extension methods to make this easier if you are using the &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.aspx" target="_blank"&gt;SyndicationFeed&lt;/a&gt; class.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre style="color: black"&gt;public static class SyndicationFeedExtension&lt;br /&gt;  &lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private static XmlQualifiedName geoRssXmlQualifiedName = new XmlQualifiedName(&amp;quot;georss&amp;quot;, &amp;quot;http://www.w3.org/2000/xmlns/&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private static string geoRssNamespace = &amp;quot;http://www.georss.org/georss&amp;quot;;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public static void AddGeoRSSPoint(this SyndicationItem feedItem, string Latitude, string Longitude)  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; feedItem.ElementExtensions.Add(new SyndicationElementExtension(&amp;quot;point&amp;quot;, geoRssNamespace,Latitude + &amp;quot; &amp;quot; + Longitude));  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public static void AddGeoRSSNamespace(this SyndicationFeed feed)  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; feed.AttributeExtensions.Add(geoRssXmlQualifiedName, geoRssNamespace);  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;br /&gt;&lt;/p&gt;&lt;p&gt;}&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;At this point we have an RSS/Atom feed with location data. What is the best way to display this data? I would use an online mapping service that users are familiar with like Google Maps or Windows Live Maps. Microsoft offers a Virtual Earth Server control as part of its &lt;a href="http://dev.live.com/tools/" target="_blank"&gt;Windows Live Tools&lt;/a&gt;. Once we have installed this toolkit, we can drop the control onto a page and tell it to consume the RSS feed we created earlier.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="color: black"&gt;using Microsoft.Live.ServerControls.VE;&lt;br /&gt;&lt;p&gt;public partial class FeedMap : System.Web.UI.Page   &lt;br /&gt;{ &lt;/p&gt;&lt;br /&gt;&lt;p&gt;   protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;   {&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ShapeLayer myPoints= new ShapeLayer(); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ShapeSourceSpecification grants = new ShapeSourceSpecification(DataType.GeoRSS, &amp;quot;MyFeed.aspx&amp;quot;, myPoints); &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Map1.ImportShapeLayerData(myPoints, null, true);&amp;#160; &lt;br /&gt;   }&lt;br /&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5445912500716126663?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7056844622753809555</id><title type="text">Cyber defense is OUR problem</title><published>2009-03-19T04:50:00-07:00</published><updated>2009-03-19T04:50:01-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7056844622753809555" /><link rel="alternate" type="text/html" title="Cyber defense is OUR problem" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7056844622753809555" /><category term="Security" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;In &lt;a title="Pentagon Official Warns of Risk of Cyber Attacks" href="Gen. Kevin Chilton" target="_blank"&gt;today's Washington Post&lt;/a&gt;, Air Force Gen. Kevin Chilton outlines the risk the country faces in a cyber attack and makes the case for militarization of cyber-defense in the U.S. But Air Force Gen. Kevin Chilton made clear to a House Armed Services subcommittee that he has not been asked to defend most government Web sites nor the commercial and public infrastructure networks whose destruction could cripple the nation.&lt;/p&gt;  &lt;p&gt;Our military services should take full responsibility for defending military networks as well as oversight for defending critical national assets. However, &lt;em&gt;we the people&lt;/em&gt; need to be responsible for civil networks including banking, power, telecom, and transportation. When a backhoe severs a fiber-optic cable, do we need a military response? Do we need the military investigating &amp;quot;hackers&amp;quot; gaining access to celebrity mobile devices? I would argue not. We need to take responsibility for the networks we build, manage, and use every day the same way we contribute to local communities such as parks, charities, churches and more.&lt;/p&gt;  &lt;p&gt;We need to develop &lt;a href="http://en.wikipedia.org/wiki/Defense_in_Depth_(computing)" target="_blank"&gt;&amp;quot;defense in depth&amp;quot;&lt;/a&gt;. The military does an excellent job of securing and defending their networks and building intelligence. Rather than expanding their scope and diluting their focus, we as a society need to take responsibility&amp;#160; for our network hygiene. We have seen and will continue to see issues with our technology infrastructure that do not require military intervention. By managing our networks in coordination with local leaders, businesses, and law enforcement we will be more flexible in our response and better able to support our military when the need for coordination arises. &lt;a href="http://www.amazon.com/gp/product/0309069998?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0309069998"&gt;Facing the Unexpected&lt;/a&gt;&lt;img style="margin: 0px; border-top-style: none! important; border-right-style: none! important; border-left-style: none! important; border-bottom-style: none! important" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0309069998" width="1" border="0" /&gt; is excellent reading for anyone who wants to compare and contrast these approaches to emergency management. I would look to organizations such as &lt;a href="http://www.infragard.net/" target="_blank"&gt;InfraGard&lt;/a&gt; and &lt;a href="http://www.cert.org/" target="_blank"&gt;CERT&lt;/a&gt; as models for coordinating public, private, and government organizations for cyber defense. &lt;/p&gt;  &lt;p&gt;As you can see there will be a need for individuals, governments from local to federal, private firms, coordination groups, military services, and intelligence agencies working together to address these problems moving forward. Booz Allen Hamilton has identified this coordination effort as a &lt;a href="http://www.boozallen.com/publications/article/38632762" target="_blank"&gt;Megacommunity&lt;/a&gt;. As our society becomes more dependent on information technology, nothing less will be required to maintain our culture and way of life.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7056844622753809555?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2918529413027287424</id><title type="text">Code Complete Book Review (5 of 7)</title><published>2009-03-16T06:16:00-07:00</published><updated>2009-03-16T06:16:41-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2918529413027287424" /><link rel="alternate" type="text/html" title="Code Complete Book Review (5 of 7)" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2918529413027287424" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;As I continue this review of &lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt;&lt;img style="margin: 0px; border-top-style: none! important; border-right-style: none! important; border-left-style: none! important; border-bottom-style: none! important" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0735619670" width="1" border="0" /&gt; by Steve McConnell, we look at techniques to improve our code quality. As I read through, many of these problems are addressed by modern programming techniques including XP and Agile. These techniques have been around much longer and will persist after these movements have passed as well.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Code Improvements      &lt;ul&gt;       &lt;li&gt;The Software Quality Landscape          &lt;ul&gt;           &lt;li&gt;Characteristics of Software Quality: Software has both external and internal quality characteristics. External characteristics are characteristics that a user is aware of including Usability, Efficiency and Reliability. Programmers care about the internal characteristics of the software as well as the external ones. Some internal characteristics include Readability, Maintainability and Flexibility. Sometimes, these features correlate, increasing Integrity increases Reliability. In other cases, they work against each other, increasing efficiency can decrease maintainability. &lt;/li&gt;            &lt;li&gt;Techniques for Improving Software Quality: The most important technique for improving software quality is by setting explicit quality objectives. Research was done on meeting objectives (&amp;quot;Goals and Performance in Computer Programming&amp;quot; (Weinberg and Schulman 1974). In every case the team focused on their objective and was ranked highly on their objective. &lt;/li&gt;            &lt;li&gt;Relative Effectiveness of Quality Techniques: There are many techniques to improve code quality including              &lt;ol&gt;               &lt;li&gt;Design Review &lt;/li&gt;                &lt;li&gt;Code Inspection &lt;/li&gt;                &lt;li&gt;Unit Testing &lt;/li&gt;                &lt;li&gt;Integration Testing &lt;/li&gt;                &lt;li&gt;Beta Testing &lt;/li&gt;             &lt;/ol&gt; Some of these techniques are more effective than others, but no technique has been found to detect more than 75% of all defects. If we want to increase the quality of our software products we need to use several of these techniques in tandem. &lt;/li&gt;            &lt;li&gt;The General Principle of Software Quality: Debugging and rework account for 50% of development time. Studies done at IBM and NASA confirm that increased quality accounts for a lower defect rate, but not higher cost. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Collaborative Construction          &lt;ul&gt;           &lt;li&gt;Collaborative Construction covers a wide range of techniques to improve code quality. These techniques include pair programming, code reviews and formal inspection. In addition to sharing technical expertise, Collaborative construction techniques offer a chance to create and/or transmit corporate culture. &lt;/li&gt;            &lt;li&gt;Pair Programming: &lt;a href="http://www.cc2e.com/2192"&gt;Checklist for effective Pair Programming&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;Inspections were developed by Michael Fagan and used at IBM for several years before Fagan &lt;a href="http://www.research.ibm.com/journal/sj/153/ibmsj1503C.pdf"&gt;published the paper&lt;/a&gt; that made them public. A formal inspection has set roles including the author, moderator, reviewer and scribe. In addition, there is a standard process of Planning, Preparation, Inspection Meeting, Inspection Report, Rework and Follow up. &lt;a href="http://www.cc2e.com/2199"&gt;Checklist for effective Formal Inspections&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;Other approaches include Walkthroughs and code reading. Walkthroughs are informal code inspections. Organizations that choose that approach find the benefits are lower than the formal code review with a similar cost. Code reading provides a reviewer with a print out of the code. The reader reviews the code and submits it back to the author for updates. No meeting is necessary. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Developer Testing          &lt;ul&gt;           &lt;li&gt;Role of Developer Testing in Software Quality: Testing can never improve the quality of a software product. It can only act as an indicator for the quality. Some ways developers can test their code include              &lt;ul&gt;               &lt;li&gt;Unit testing is the execution of a complete class, routine, or small program that has been written by a single programmer or team of programmers, which is tested in isolation from the more complete system. &lt;/li&gt;                &lt;li&gt;Component testing is the execution of a class, package, small program, or other program element that involves the work of multiple programmers or programming teams, which is tested in isolation from the more complete system. &lt;/li&gt;                &lt;li&gt;Integration testing is the combined execution of two or more classes, packages, components, or subsystems that have been created by multiple programmers or programming teams. This kind of testing typically starts as soon as there are two classes to test and continues until the entire system is complete. &lt;/li&gt;                &lt;li&gt;Regression testing is the repetition of previously executed test cases for the purpose of finding defects in software that previously passed the same set of tests. &lt;/li&gt;                &lt;li&gt;System testing is the execution of the software in its final configuration, including integration with other software and hardware systems. It tests for security, performance, resource loss, timing problems, and other issues that can't be tested at lower levels of integration.                  &lt;ul&gt;                   &lt;li&gt;It is recommended that developers write tests before they write code. This doesn't take any extra work, we are simply changing the sequence in which the work is performed. This has the added benefit of catching design and architecture flaws earlier. &lt;/li&gt;                    &lt;li&gt;When writing tests, developers need ton consider logic flow (if, then, while, switch, case and goto statements. Data flow is just as important and developers need to test with initialized and uninitialized data. &lt;/li&gt;                    &lt;li&gt;&lt;a href="http://www.cc2e.com/2210"&gt;Checklist for writing test cases&lt;/a&gt; &lt;/li&gt;                 &lt;/ul&gt;               &lt;/li&gt;                &lt;li&gt;Debugging                  &lt;ul&gt;                   &lt;li&gt;Structured Debugging is a required skill for developers who are going to keep a system in production for any length of time. The debugging process will look a lot like the scientific process.                      &lt;ol&gt;                       &lt;li&gt;Stabilize the error &lt;/li&gt;                        &lt;li&gt;Locate the source of the error (the &amp;quot;fault&amp;quot;).                          &lt;ol&gt;                           &lt;li&gt;Gather the data that produces the defect. &lt;/li&gt;                            &lt;li&gt;Analyze the data that has been gathered, and form a hypothesis about the defect. &lt;/li&gt;                            &lt;li&gt;Determine how to prove or disprove the hypothesis, either by testing the program or by examining the code. &lt;/li&gt;                            &lt;li&gt;Prove or disprove the hypothesis by using the procedure identified above. &lt;/li&gt;                         &lt;/ol&gt;                       &lt;/li&gt;                        &lt;li&gt;Fix the defect. &lt;/li&gt;                        &lt;li&gt;Test the fix. &lt;/li&gt;                        &lt;li&gt;Look for similar errors. &lt;/li&gt;                     &lt;/ol&gt; Another approach is called brute force debugging. this can be time-consuming, but it is guaranteed to find bugs. Some approaches include                       &lt;ul&gt;                       &lt;li&gt;Perform a full design and/or code review on the broken code. &lt;/li&gt;                        &lt;li&gt;Throw away the section of code and redesign/recode it from scratch. &lt;/li&gt;                        &lt;li&gt;Throw away the whole program and redesign/recode it from scratch. &lt;/li&gt;                        &lt;li&gt;Compile code with full debugging information. &lt;/li&gt;                        &lt;li&gt;Compile code at pickiest warning level and fix all the picky compiler warnings. &lt;/li&gt;                        &lt;li&gt;Strap on a unit test harness and test the new code in isolation. &lt;/li&gt;                        &lt;li&gt;Create an automated test suite and run it all night. &lt;/li&gt;                        &lt;li&gt;Step through a big loop in the debugger manually until you get to the error condition. &lt;/li&gt;                        &lt;li&gt;Instrument the code with print, display, or other logging statements. &lt;/li&gt;                        &lt;li&gt;Compile the code with a different compiler. &lt;/li&gt;                        &lt;li&gt;Compile and run the program in a different environment. &lt;/li&gt;                        &lt;li&gt;Link or run the code against special libraries or execution environments that produce warnings when code is used incorrectly. &lt;/li&gt;                        &lt;li&gt;Replicate the end-user's full machine configuration. &lt;/li&gt;                        &lt;li&gt;Integrate new code in small pieces, fully testing each piece as it's integrated. &lt;/li&gt;                     &lt;/ul&gt;                   &lt;/li&gt;                    &lt;li&gt;&lt;a href="http://www.cc2e.com/2368"&gt;Debugging Checklist&lt;/a&gt; &lt;/li&gt;                 &lt;/ul&gt;               &lt;/li&gt;                &lt;li&gt;Refactoring                  &lt;ul&gt;                   &lt;li&gt;Many times we assume that a perfect project has an elegant design before a single line of code gets laid down. However, software is constantly evolving due to changing requirements, technology, and maintenance. We can take advantage of this to continually improve the design of our software. Some &lt;a href="http://www.cc2e.com/2443"&gt;reasons to refactor&lt;/a&gt; are included. &lt;/li&gt;                    &lt;li&gt;Refactoring can happen at the following levels                      &lt;ul&gt;                       &lt;li&gt;Data level &lt;/li&gt;                        &lt;li&gt;Statement level &lt;/li&gt;                        &lt;li&gt;Routine Level &lt;/li&gt;                        &lt;li&gt;Class Interface Level &lt;/li&gt;                        &lt;li&gt;Class Implementation Level &lt;/li&gt;                        &lt;li&gt;System Level &lt;/li&gt;                     &lt;/ul&gt;                   &lt;/li&gt;                    &lt;li&gt;&lt;a href="http://www.cc2e.com/2450"&gt;Checklist of Refactorings&lt;/a&gt; &lt;/li&gt;                    &lt;li&gt;&lt;a href="http://www.cc2e.com/2457"&gt;Checklist for Safe Refactoring&lt;/a&gt; &lt;/li&gt;                 &lt;/ul&gt;               &lt;/li&gt;                &lt;li&gt;Code Tuning Strategies                  &lt;ul&gt;                   &lt;li&gt;Remember the Pareto Principle (80/20 rule) when making optimizations. Improvements in small areas of your code will make the biggest improvements in speed. If you have been keeping your design modular, you can swap out slow operations for faster ones. &lt;/li&gt;                    &lt;li&gt;System calls and I/O can be very expensive. Examine routines that use these and ensure that you need these operations, if you can use a simpler operation, you can save time and overhead. &lt;/li&gt;                    &lt;li&gt;When tuning your code &lt;strong&gt;the first thing to do is measure&lt;/strong&gt;. This allows you to identify bottlenecks and compare different resolutions to choose the best. &lt;/li&gt;                    &lt;li&gt;Your code tuning workflow should look like this:                      &lt;ol&gt;                       &lt;li&gt;Develop the software by using well-designed code that's easy to understand and modify. &lt;/li&gt;                        &lt;li&gt;If performance is poor,                          &lt;ol&gt;                           &lt;li&gt;Save a working version of the code so that you can get back to the &amp;quot;last known good state.&amp;quot; &lt;/li&gt;                            &lt;li&gt;Measure the system to find hot spots. &lt;/li&gt;                            &lt;li&gt;Determine whether the weak performance comes from inadequate design, data types, or algorithms and whether code tuning is appropriate. If code tuning isn't appropriate, go back to step 1. &lt;/li&gt;                            &lt;li&gt;Tune the bottleneck identified above &lt;/li&gt;                            &lt;li&gt;Measure each improvement one at a time. &lt;/li&gt;                            &lt;li&gt;If an improvement doesn't improve the code, revert to the code saved earlier. (Typically, more than half the attempted tunings will produce only a negligible improvement in performance or degrade performance.) &lt;/li&gt;                         &lt;/ol&gt;                       &lt;/li&gt;                        &lt;li&gt;Repeat from step 2. &lt;/li&gt;                     &lt;/ol&gt;                   &lt;/li&gt;                    &lt;li&gt;&lt;a href="http://www.cc2e.com/2506"&gt;Code Tuning Checklist&lt;/a&gt; &lt;/li&gt;                 &lt;/ul&gt;               &lt;/li&gt;             &lt;/ul&gt;           &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;hr /&gt;  &lt;p&gt;This material is copied and/or adapted from the &lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt; 2 Website at cc2e.com. This material is Copyright &amp;#169; 1993-2007 Steven C. McConnell. Permission is hereby given to copy, adapt, and distribute this material as long as this notice is included on all such materials and the materials are not sold, licensed, or otherwise distributed for commercial gain. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2918529413027287424?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7097340516113577803</id><title type="text">MOSS Search in Office Applications</title><published>2009-03-09T04:00:00-07:00</published><updated>2009-03-09T04:00:01-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7097340516113577803" /><link rel="alternate" type="text/html" title="MOSS Search in Office Applications" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7097340516113577803" /><category term="Search" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;Don't let this title fool you, this isn't about searching Office documents in SharePoint. This is about searching your SharePoint server inside your Office application (Word, Outlook...). This functionality has existed since Office 2003, but whenever I show it to people, they love it. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Launch any Office component (Word, Excel, etc...). &lt;/li&gt;    &lt;li&gt;Open the Research Pane      &lt;ol&gt;       &lt;li&gt;Office 2003: On the &lt;b&gt;Tools&lt;/b&gt; menu, click &lt;b&gt;Research&lt;/b&gt;. &lt;/li&gt;        &lt;li&gt;Office 2007: On the &lt;strong&gt;Review&lt;/strong&gt; tab, click &lt;strong&gt;Research&lt;/strong&gt; &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;In the &lt;b&gt;Research&lt;/b&gt; task pane, click &lt;b&gt;Research options&lt;/b&gt;. &lt;/li&gt;    &lt;li&gt;While you are here, I usually disable research services that I don't use. &lt;/li&gt;    &lt;li&gt;Add research services, click &lt;b&gt;Add Services&lt;/b&gt;.       &lt;p&gt;&lt;img src="http://www.microsoft.com/middleeast/arabicdev/dotnetservers/SharePointPortal/images/image53.gif" border="0" /&gt;         &lt;br /&gt;Figure 51 - Share Point Portal Server 2003&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;Add the path to your MOSS search web service, type &lt;b&gt;http://your root directory/_vti_bin/search.asmx.&lt;/b&gt;(Example:&lt;b&gt;http://Share/_vti_bin/search.asmx&lt;/b&gt;.) &lt;/li&gt;    &lt;li&gt;Click &lt;b&gt;Add.&lt;/b&gt; The service is automatically enabled for searching, and it will appear in the&lt;b&gt; Search for &lt;/b&gt;list the next time you open the &lt;b&gt;Research&lt;/b&gt; task pane. &lt;/li&gt;    &lt;li&gt;To use the integrated Search you can      &lt;ol&gt;       &lt;li&gt;Select the portal name in the Research task pane and enter a search term, then press the Search icon &lt;/li&gt;        &lt;li&gt;(In Word and Outlook), select a word or phrase, right-click and choose &lt;strong&gt;Look Up&lt;/strong&gt;. This is my preferred approach because you don't waste the real estate of having the Research pane open when you don't need it, and it is fewer clicks to open when you do need it. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;This can also be configured in your Internet Explorer Research settings.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="97" alt="research_button" src="http://www.mobiusdevelopment.com/dev/images/research_button.jpg" width="515" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This approach provides the default search options. If you want to create your own specialized search, there is &lt;a href="http://www.google.com/search?q=microsoft+office+research+service" target="_blank"&gt;plenty of documentation&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/35507329-7097340516113577803?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4043317217169766587</id><title type="text">Extending Enterprise Search to the Browser</title><published>2009-03-04T20:36:00-08:00</published><updated>2009-03-04T20:38:17-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4043317217169766587" /><link rel="alternate" type="text/html" title="Extending Enterprise Search to the Browser" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4043317217169766587" /><category term="Search" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;After all of the effort we put into creating content sources, making sure our content is properly crawled and indexed, don't you think we should go the extra mile and make our enterprise search available to as many users as possible? Modern browsers (IE 7+, FF 2+, Chrome, Opera) provide an option to search from a &amp;quot;search bar&amp;quot;. The default is usually a major search engine, but we can expose our SharePoint installs to act as a search provider as well. There is a standard for describing your search provider called &lt;a href="http://www.opensearch.org/Home" target="_blank"&gt;OpenSearch&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The easiest way to create an OpenSearch description document is to &lt;a href="http://www.microsoft.com/windows/ie/searchguide/en-en/default.mspx" target="_blank"&gt;do this manually&lt;/a&gt; in your browser. IE7 tells you to copy the URL for the &amp;quot;TEST&amp;quot; query, and it will provide the xml file for download. You can tweak the Title, Description, and query URL as you see fit. This is a great time to add scope and managed properties. You can manually add this to your list of search providers, but what about all of those end users? I see two approaches.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;You can push the OpenSearch provider to all of your users with the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=d3fc8129-63f7-43b5-8d99-de4058ade0ec&amp;amp;displaylang=en" target="_blank"&gt;IE Administration kit&lt;/a&gt;. This approach is most relevant for internal implementations where you control the end-user desktop. &lt;/li&gt;    &lt;li&gt;You can also add it to your master page. This is appropriate when you do not control the end-user desktop. When they visit your site, the search dropdown will glow and the user will have the opportunity to install your Search provider. To do this, you will need to add a link in your head like so &lt;/li&gt; &lt;/ol&gt;  &lt;pre style="color:black;"&gt;&amp;lt;link rel=&amp;quot;search&amp;quot; type=&amp;quot;application/opensearchdescription+xml&amp;quot; href=&amp;quot;/opensearch.xml&amp;quot; title=&amp;quot;Portal Search&amp;quot;&amp;gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4043317217169766587?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-1293786477991093164</id><title type="text">Code Complete Book Review (part 4 of 7)</title><published>2009-02-23T04:00:00-08:00</published><updated>2009-03-16T06:17:04-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1293786477991093164" /><link rel="alternate" type="text/html" title="Code Complete Book Review (part 4 of 7)" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1293786477991093164" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;As I continue this review of &lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt;&lt;img style="margin: 0px; border-top-style: none! important; border-right-style: none! important; border-left-style: none! important; border-bottom-style: none! important" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=earlieeducat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0735619670" width="1" border="0" /&gt; by Steve McConnell, we look at how to organize our statements to keep our code readable and maintainable. As I read through, many of these problems are solved in modern programming languages, while others are still very relevant.&lt;/p&gt;  &lt;li&gt;Statements    &lt;ul&gt;     &lt;li&gt;Organizing Straight Line Code        &lt;ul&gt;         &lt;li&gt;Statements that must be in a specific order- Ideally, the flow of your program will make it obvious that certain calls are required before others (load, calculate, display). If you cannot change your code to make this obvious, be sure to add comments or documentation explaining any hidden dependencies. &lt;/li&gt;          &lt;li&gt;If your statements don't rely on any type of order, focus on readability from top to bottom. &lt;/li&gt;          &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=231"&gt;Checklist for Organizing Straight Line Code&lt;/a&gt; &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Using Conditionals        &lt;ul&gt;         &lt;li&gt;&lt;i&gt;if statement&lt;/i&gt;             &lt;ul&gt;             &lt;li&gt;Write your normal case first. Put any exception code in your else blocks. 50-80% of if blocks require an else block, so if you have a &amp;quot;naked if&amp;quot; double check that there isn't an extra exception case. &lt;/li&gt;              &lt;li&gt;Be sure that you put the proper logic in the &lt;i&gt;if&lt;/i&gt; and &lt;i&gt;else&lt;/i&gt; blocks. It's very common to reverse these. &lt;/li&gt;              &lt;li&gt;Simplify complicated tests with boolean function calls. If you name your functions properly, this should enhance readability. &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;&lt;i&gt;case statement&lt;/i&gt;             &lt;ul&gt;             &lt;li&gt;order cases meaningfully &lt;/li&gt;              &lt;li&gt;make the case actions simple. Call external routines if necessary &lt;/li&gt;              &lt;li&gt;Use the default case to catch exceptions &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=232"&gt;Checklist for using conditionals&lt;/a&gt; &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Controlling Loops        &lt;ul&gt;         &lt;li&gt;Selecting the Loop - Loop structures (&lt;i&gt;for&lt;/i&gt;, &lt;i&gt;foreach&lt;/i&gt;, &lt;i&gt;while&lt;/i&gt;) are chosen based on two parameters: flexibility and and test location. Some loops are flexible in how many times they are run, others run a predetermined number of times. You can also structure loops to test at the beginning or end of each loop. &lt;/li&gt;          &lt;li&gt;Controlling the Loop &lt;/li&gt;          &lt;li&gt;Creating Loops - Inside Out- The easiest way to write complex looping structures is two write an initial case with hardcoded values, then indent your code and put that in a loop. Repeat as many times as necessary to create a complex nested loop. &lt;/li&gt;          &lt;li&gt;Correspondence between Loops and Arrays- If you are using a loop to manipulate the items in an array or list, check to see if your language supports bulk operations (or &lt;a href="http://en.wikipedia.org/wiki/Map_%28higher-order_function%29"&gt;map&lt;/a&gt;). This will allow you to escape from looping entirely. &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Unusual Control Structures        &lt;ul&gt;         &lt;li&gt;Multiple returns from a routine- This happens when you have extensive test cases and you want to jump out of the routine (no data, invalid data, network connection down). In these cases it makes sense to just quit the routine, rather than try to net several test statements. &lt;/li&gt;          &lt;li&gt;Recursion- This is a favorite of cs types because it creates &amp;quot;elegant&amp;quot; solutions. However, in practice this can be dangerous because you can &amp;quot;smash the stack&amp;quot;, or run out of memory quickly by recursing too deep. Be sure to add a &amp;quot;safety counter&amp;quot;to allow you to jump out if things run too long. Also, investigate iteration as opposed to recursion.&amp;#160; &lt;/li&gt;          &lt;li&gt;&lt;a href="http://www.u.arizona.edu/%7Erubinson/copyright_violations/Go_To_Considered_Harmful.html"&gt;Goto statement considered harmful&lt;/a&gt; - This article is over 40 years old, so I'll assume that you're not jumping around in your code. If you are there are several approaches you can use to keep your code easier to follow, including nested if's, status variables, and try .. finally blocks. &lt;/li&gt;          &lt;li&gt;&lt;a href="http://www.cc2e.com/1713"&gt;Safety Checklist for Unusual Control Structures&lt;/a&gt; &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Table Driven Methods- A table-driven method is a scheme that allows you to look up information in a table rather than using logic statements (if and case&lt;a name="you can"&gt;&lt;/a&gt;) to figure it out. Virtually anything you can select with logic statements, you can select with tables instead. In simple cases, logic statements are easier and more direct. As the logic chain becomes more complex, tables become increasingly attractive.         &lt;ul&gt;         &lt;li&gt;Direct Access Tables - these are your basic key/value lookups. Remember that you will need a key for every value. If you want to do a lookup on a range (say ages from 0-17, 18-20, 21-65, 66+), you will probably want to transform the value (the age) to a generic key value. &lt;/li&gt;          &lt;li&gt;Indexed Access Tables- As you build more data fields, you may want to lookup tuples in different ways (age, social security number, name). In this case you would build a table and multiple indices. The strength to this approach is that as the data access evolves, it's much easier to optimize, drop, change indexes as opposed to the underlying data. &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;General Control Issues        &lt;ul&gt;         &lt;li&gt;Boolean expressions            &lt;ul&gt;             &lt;li&gt;To improve readability, use implicit boolean tests (if (UserIsValid)). This is one less variable that the next programmer has to remember. &lt;/li&gt;              &lt;li&gt;If your code has complex logic, rewrite these tests as boolean functions. &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;Compound statements (blocks). This is everything between the curly {} braces.&amp;#160; &lt;ul&gt;             &lt;li&gt;Always write the braces first. &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;Taming Deeply Nested Loops            &lt;ul&gt;             &lt;li&gt;Rewrite extensive logic inside loops as their own routines. &lt;/li&gt;              &lt;li&gt;Use objects and &lt;a href="http://www.objectfaq.com/oofaq2/DynamicDispatch.htm"&gt;polymorphic dispatching&lt;/a&gt; &lt;/li&gt;              &lt;li&gt;Use guard cases to protect the routine and keep the nominal case easy to understand &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Structured_programming"&gt;Structured Programming&lt;/a&gt; - The core thesis of structured programming is that any control flow whatsoever can be created from these three constructs of sequence, selection, and iteration. Programmers sometimes favor language structures that increase convenience, but programming seems to have advanced largely by restricting what we are allowed to do with our programming languages. Prior to structured programming, use of &lt;em&gt;goto&lt;/em&gt; provided the ultimate in control-flow convenience, but code written that way turned out to be incomprehensible and unmaintainable. My belief is that use of any control structure other than the three standard structured programming constructs&amp;#8212;that is, the use of break, continue, return, throw-catch&lt;a name="and so"&gt;&lt;/a&gt;, and so on&amp;#8212;should be viewed with a critical eye. &lt;/li&gt;      &lt;li&gt;Controlling Complexity- The easiest way to determine if your routines are &amp;quot;too complex&amp;quot; is to calculate the &lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;cyclomatic complexity&lt;/a&gt;. Many static code analyzers will perform these calculations for you. Any score over ten should be broken into multiple routines. &lt;/li&gt;   &lt;/ul&gt;    &lt;hr /&gt;    &lt;p&gt;This material is copied and/or adapted from the &lt;a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt; 2 Website at cc2e.com. This material is Copyright &amp;#169; 1993-2007 Steven C. McConnell. Permission is hereby given to copy, adapt, and distribute this material as long as this notice is included on all such materials and the materials are not sold, licensed, or otherwise distributed for commercial gain. &lt;/p&gt; &lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-1293786477991093164?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4463236371468196706</id><title type="text">Cyber Strategy for the Obama Administration</title><published>2009-02-18T17:44:00-08:00</published><updated>2009-02-18T19:01:25-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4463236371468196706" /><link rel="alternate" type="text/html" title="Cyber Strategy for the Obama Administration" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4463236371468196706" /><category term="BlackHat" scheme="http://www.blogger.com/atom/ns#" /><category term="Security" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">In his &lt;a href="http://www.businessweek.com/the_thread/techbeat/archives/2009/02/fearing_cyber_k.html"&gt;keynote speech&lt;/a&gt; at Black Hat DC 2009, &lt;a href="http://www.goodharbor.net/team/kurtz.html"&gt;Paul Kurtz&lt;/a&gt; outlines what the administrations needs to do to strengthen our nation's cyber position. He compares our current situation to that of domestic intelligence pre-9/11. Law Enforcement can't talk to Intelligence, who doesn't talk to the Military, all of whom are at arms-distance from private companies. He identified NSA as the logical agency to handle this coordination. It seems to me that &lt;a href="http://www.cert.org/"&gt;CERT&lt;/a&gt; would be a better choice as they seem to have experience coordinating public/private/government cyber issues.&lt;br /&gt;&lt;br /&gt;On the offensive side, Mr. Kurtz talks about the need to formalize and publicize offensive cyber strategies. Our nation went through this once before with &lt;a href="http://en.wikipedia.org/wiki/Deterrence_theory"&gt;nuclear weapons strategy&lt;/a&gt;. I think that a transparent process that outlines our capabilities and intentions would do a lot to deter aggressive actions in the future. This of course assumes that we can identify the real source of cyber attacks. This seems to be where US intelligence agencies have the most to offer. He offers the example of &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9119221"&gt;recent presidential candidates&lt;/a&gt;. They were advised that they had been compromised, but not much more information had been provided. If we expect to defend against dedicated cyber attacks from foreign governments and sophisticated crime rings, more data sharing will be required.&lt;br /&gt;&lt;br /&gt;On the defensive side, he identified the need for an agency to handle a cyber-Katrina. He lists possible agencies including NSA, DOD, Dept of Commerce, FCC, but not FEMA. FEMA has the requisite Emergency Management skills if not the cyber skills. Perhaps the coordinating party could work with FEMA in the event of a &lt;a href="http://www.computerworld.com/printthis/2003/0,4814,88646,00.html"&gt;digital Pearl Harbor&lt;/a&gt;. FEMA is rapidly developing assets in social networking that could prove valuable if traditional communications networks are impacted. In addition, they have experience coordinating multiple actors outside the agency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4463236371468196706?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7358303492820360711</id><title type="text">Licensed Users in K2 Blackpearl</title><published>2009-02-16T02:04:00-08:00</published><updated>2009-02-16T02:04:00-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7358303492820360711" /><link rel="alternate" type="text/html" title="Licensed Users in K2 Blackpearl" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7358303492820360711" /><category term="Blackpearl" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;My client was using &amp;quot;per user&amp;quot; licensing versus &amp;quot;per server licensing&amp;quot;, it makes sense for them. At a status meeting last week, the question came up of &amp;quot;How does licensing work in K2 Blackpearl?&amp;quot; &lt;/p&gt;  &lt;p&gt;For per-user licenses, a license is consumed anytime a user is a destination in a workflow. Once someone consumes a license, they can participate in unlimited workflows. OK, simple enough, so the next question was, &amp;quot;How many licenses are we currently using?&amp;quot;. I navigate to the Workspace, go to &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Management&lt;/li&gt;    &lt;li&gt;Workflow Server&lt;/li&gt;    &lt;li&gt;Licensing&lt;/li&gt;    &lt;li&gt;Licensed Users &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;..... and see only two service accounts!!!! I guffaw a little bit and reassure the client that they are far under their current licensing limits. &lt;/p&gt;  &lt;p&gt;Back at my desk, I start digging a little deeper. It turns out that the GUI is only useful if users are logging into the workspace or using the K2 designer plug-ins. We have a custom ASP.NET application that hides all of K2 from the users, so they never see that. To get the real number, I need to login to the DB and look at the &lt;em&gt;_Actioners&lt;/em&gt; table. Success. All of my current users are listed and I get a much more believable number for my next meeting.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://forum.k2workflow.com/forums/thread/26719.aspx" target="_blank"&gt;This article&lt;/a&gt; talks about deleting the contents of that table to remove old employees. Until this issue is resolved, that seems like a reasonable workaround quarterly.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7358303492820360711?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7640099796034686370</id><title type="text">SQL Reporting Services and SharePoint List data</title><published>2009-02-09T04:59:00-08:00</published><updated>2009-02-09T04:59:00-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7640099796034686370" /><link rel="alternate" type="text/html" title="SQL Reporting Services and SharePoint List data" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7640099796034686370" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;They seem to be a perfect couple. List data that is accessible to users to add/edit delete, and Reporting Services offering custom reports with subscriptions to deliver them right where you need them. But this is not easy to accomplish OOB. There are several approaches to using Reporting Services with SharePoint data.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.enesyssoftware.com/Products/EnesysRSDataExtension/Overview/tabid/72/language/en-US/Default.aspx" target="_blank"&gt;Enesys RS Data Extension&lt;/a&gt;: This is an extension to reporting services that allows you to use list data as a data source. You can also query document libraries, permission sets, and SharePoint groups as data sources. In addition, you can query multiple lists and and perform a SQL JOIN. Very cool stuff.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.teuntostring.net/blog/2005/09/reporting-over-sharepoint-lists-with.html" target="_blank"&gt;Write your own Data Extension&lt;/a&gt;: This is a great article by &lt;a href="http://www.teuntostring.net/" target="_blank"&gt;Teun Duynstee&lt;/a&gt;. This is the bare metal version of a Reporting Services Data Extension. If you find that your environment won't support the Enesys Data Extension, or you just like to write your own, this shows you how you can integrate SharePoint Lists into reporting services. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeproject.com/KB/reporting-services/ReportFromSharePoint.aspx" target="_blank"&gt;Consume the Lists.asmx web service as an XML Data Source&lt;/a&gt;: This approach doesn't require any custom code on the server and it ready to go once Reporting Services is installed. Here's &lt;a href="http://www.sharepointblogs.com/dwise/archive/2007/11/28/connecting-sql-reporting-services-to-a-sharepoint-list-redux.aspx" target="_blank"&gt;another article&lt;/a&gt; that discusses some of the roadblocks with this approach.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.mssqltips.com/tip.asp?tip=1323" target="_blank"&gt;Build your own Views based on the SharePoint DB&lt;/a&gt;: As you should know by now, &lt;a href="http://support.microsoft.com/kb/841057/en-us" target="_blank"&gt;direct access to the SharePoint DB is unsupported&lt;/a&gt;. If you decide to go this route, I would suggest placing these views in a reporting DB outside of SharePoint. With this approach, there is no custom code on your server, (but you will have DB customization). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Of course, your choice will be limited based on &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Cost&lt;/li&gt;    &lt;li&gt;Expertise (development, DB, reporting ...)&lt;/li&gt;    &lt;li&gt;Technical requirements&lt;/li&gt;    &lt;li&gt;Organization policy&lt;/li&gt;    &lt;li&gt;Schedule&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Choice number 3 is ready to go on Day 1, but it can be unwieldy to work with. Direct DB access seems to fit best with Reporting Services database focus, but adds technical risk. The first two choices require custom code which may not be supported in all environments.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7640099796034686370?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2522228725311349779</id><title type="text">MOSS and FIPS</title><published>2009-02-02T04:47:00-08:00</published><updated>2009-02-02T05:38:00-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2522228725311349779" /><link rel="alternate" type="text/html" title="MOSS and FIPS" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2522228725311349779" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I was enjoying a special lunch my wife had made for me. She had been looking into &lt;a href="http://www.flickr.com/groups/bentoboxes/"&gt;bento boxes&lt;/a&gt;, and decided that I should take one to work. She made a sandwich that looked like a dapper suit and tie, and a hard-boiled egg sunrise.&lt;br /&gt;&lt;br /&gt;Then I got the call that our client was seeing a new error. I left my special lunch behind and walked over to see what was going on. I found a new and exciting error on every page in Sharepoint: default, customized, and admin. &lt;pre style="color:black"&gt;This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.&lt;/pre&gt;This was a new one to me. I realize that domain security settings have changed &lt;span class="Apple-style-span" style="font-style: italic;"&gt;[Security Settings: Local Policies: Security Options: System Cryptography: Use FIPS compliant algorithms for encryption, hashing, and signing] &lt;/span&gt;and clearly a configuration update is in order. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A quick search brings up the following &lt;a href="http://support.microsoft.com/kb/935434"&gt;KB article&lt;/a&gt;. That seems right, Sharepoint requires .NET 3.0 Framework. This hotfix should work. But it didn't. Our dll was already a later version. Hmmm. A few days later a co-worker came to our rescue with the following &lt;a href="http://support.microsoft.com/kb/911722"&gt;fix&lt;/a&gt;. We add the machineKey to the root-level web.Config and define 3DES for validation and decryption. Problem solved, app compliant, delicious lunches enjoyed.&lt;br /&gt;&lt;h5&gt;Additional Reading&lt;/h5&gt;&lt;a href="http://www.dscoduc.com/post/2008/05/03/FIPS-Compliant-Algorithms-and-IIS.aspx"&gt;&lt;/a&gt;&lt;a href="http://www.dscoduc.com/post/2008/05/03/FIPS-Compliant-Algorithms-and-IIS.aspx"&gt;Debug settings with FIPS compliance&lt;/a&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/811833"&gt;Details about FIPS compliance in Windows&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2522228725311349779?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-315276558179068407</id><title type="text">Wildcard Search Web Part</title><published>2009-01-26T04:59:00-08:00</published><updated>2009-01-26T06:14:15-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=315276558179068407" /><link rel="alternate" type="text/html" title="Wildcard Search Web Part" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=315276558179068407" /><category term="Search" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;One early pain that organizations run into with SharePoint Search is the inability to perform wildcard queries (using a * to find keywords). I have identified three approaches to solve this problem.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Use a third party tools like &lt;a href="http://www.ontolica.com/Ontolica%20for%20MOSS%202007.aspx" target="_blank"&gt;Ontolica&lt;/a&gt;, &lt;a href="http://www.ba-insight.net/search-solutions2.html" target="_blank"&gt;BA Insight&lt;/a&gt;, or &lt;a href="http://www.fastsearch.com/l3a.aspx?m=1031" target="_blank"&gt;FAST&lt;/a&gt;. These tools provide wildcard search along with additional capability like improved results pages, faceted search and more. &lt;/li&gt;    &lt;li&gt;I have seen customers write their own search API on top of SharePoint to get this necessary functionality. This is a good approach, but it requires you to also rewrite the results page. &lt;/li&gt;    &lt;li&gt;Use the &lt;a title="Wildcard Search web part" href="http://www.codeplex.com/WildcardSearch" target="_blank"&gt;Wildcard Search&lt;/a&gt; webpart by Corey Roth. This is a drop-in replacement for the &lt;em&gt;CoreResultsWebPart&lt;/em&gt;. I will discuss the third approach in depth. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The webpart is easy to install. The only infrastructure requirement is that you install the .NET Framework v3.5. This is required because the web part uses LINQ to XML to parse the &lt;em&gt;SelectColumns&lt;/em&gt; property. You can drop this on the search results page to compare it to the OOB experience. When you do this you will probably notice some subtle differences between the results. The wildcard results will probably be more numerous, however, we have lost something in the process. Some search &lt;a href="http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/09/18/what-you-give-up-with-full-text-sql-queries-using-wildcard-search.aspx" target="_blank"&gt;functionality is based on keyword search&lt;/a&gt; including&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SearchSummaryWebPart - Provides the &amp;quot;Did you mean...&amp;quot; functionality. &lt;/li&gt;    &lt;li&gt;Best Bets &lt;/li&gt;    &lt;li&gt;Keyword Highlighting &lt;/li&gt;    &lt;li&gt;RSS &lt;/li&gt;    &lt;li&gt;Federated Search - Works but treats your search term as a keyword ignoring the wildcard. &lt;/li&gt;    &lt;li&gt;Faceted Search &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Well, do we drop this functionality to get Wildcard search? I propose a third option, we get both. Now, I'm not going to write my own implementation of the above features. We should try to detect if the wildcard query is being used, and if it isn't then we drop back to our original keyword search. This is quite easy to do.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Find the following code in WildCardSearchResultsWebPart.cs&amp;#160; (line 95 for v3)      &lt;br /&gt;&lt;code style="color: black"&gt;// read what the user searched for        &lt;br /&gt;string keywordQuery = (string)keywordQueryProperty.GetValue(searchResultsHiddenObject, null);&lt;/code&gt;       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Add the following code underneath      &lt;br /&gt;&lt;code style="color: black"&gt;//If we're not doing the fulltext then fall back to keyword&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;if (!(keywordQuery.Contains('*') || AlwaysUseWildcard))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return;&lt;/code&gt;       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Compile and deploy &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;As you can see from the additional code, if the web part is configured to always use Wildcard, this block will never fall back to keyword search. I feel this is a nice way to maintain the OOB function of Search, but provide users additional power when they need it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-315276558179068407?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4082503658487071154</id><title type="text">Code Complete Book Review (part 3 of 7)</title><published>2009-01-19T09:54:00-08:00</published><updated>2009-01-19T10:07:18-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4082503658487071154" /><link rel="alternate" type="text/html" title="Code Complete Book Review (part 3 of 7)" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4082503658487071154" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;li&gt;Variables    &lt;ul&gt;     &lt;li&gt;General Issues in Using Variables        &lt;ul&gt;         &lt;li&gt;Data Literacy - Know what types are available in your framework. Not every collection is a list. &lt;/li&gt;          &lt;li&gt;Implicit Declarations - Dangerous because the compiler won't warn you when you are misusing variables, (or just misspelling them) &lt;/li&gt;          &lt;li&gt;Guidelines for Initializing Variables            &lt;ul&gt;             &lt;li&gt;Initialize the variable as it is declared, or right afterwards &lt;/li&gt;              &lt;li&gt;Turn on &amp;quot;&lt;a href="http://visualstudiotips.wordpress.com/2006/04/16/tip-treat-warnings-as-errors/"&gt;Treat warnings as errors&lt;/a&gt;&amp;quot; in your IDE. This will identify un-initialized, and unused variables &lt;/li&gt;              &lt;li&gt;use final or const when possible. This will protect your variable from change and allow developers later on to quickly understand your code. &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;Scope            &lt;ul&gt;             &lt;li&gt;Minimizing Span- Span is the distance between statements where are variable changes. By minimizing this distance, you can debug or trace a variable quickly because all of the changes will be in close proximity &lt;/li&gt;              &lt;li&gt;Minimizing Live Time - Distance between the first and last statements involving a variable. By minimizing this distance, you reduce the complexity of managing the variable. &lt;/li&gt;              &lt;li&gt;Minimizing Scope- minimizing scope reduces access to the variable throughout the software. This aids in maintenance, as it decouples the variable from the rest of the program and changes can be localized th the routine or class. &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;Persistence - This is the lifetime of a variable.            &lt;ul&gt;             &lt;li&gt;control block like for, if-then, using &lt;/li&gt;              &lt;li&gt;routine/class lifetime &lt;/li&gt;              &lt;li&gt;until garbage collected. This can be very dangerous as the garbage collector is non-deterministic. Always check for items to be sure they remain in memory &lt;/li&gt;              &lt;li&gt;For the life of the program. These are static variables &lt;/li&gt;              &lt;li&gt;forever. These variables are persisted to the filesystem/db/somewhere else. They are reloaded every time the program starts. &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;Binding Time- This is the time at which a variable is set to its value. This can happen at code time, compile time, load time, instantiation time, or just in time. This is a tradeoff            &lt;ul&gt;             &lt;li&gt;Early binding - This is the lowest complexity and makes it easy to predict how a program will act. &lt;/li&gt;              &lt;li&gt;Late binding - This provides more flexibility as the program can be altered without having to change the code by changing settings files. This adds additional complexity to debugging and deployment though. &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;Relationship between Data Types and Control Structures            &lt;ul&gt;             &lt;li&gt;Sequential Data &lt;/li&gt;              &lt;li&gt;Selective Data &lt;/li&gt;              &lt;li&gt;Iterative Data &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;          &lt;li&gt;Using each variable for exactly one purpose            &lt;ul&gt;             &lt;li&gt;Don't reuse a temp variable later in the routine &lt;/li&gt;              &lt;li&gt;don't give variables &amp;quot;hidden meanings&amp;quot; &lt;/li&gt;           &lt;/ul&gt;         &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;The Power of Variable Names        &lt;ul&gt;         &lt;li&gt;           &lt;p&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=225"&gt;Variable Name Checklist&lt;/a&gt;&lt;/p&gt;         &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Fundamental Data Types        &lt;ul&gt;         &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=227"&gt;Specific Data Type Checklist&lt;/a&gt; &lt;/li&gt;          &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=226"&gt;Fundamental Data Checklist&lt;/a&gt; &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;Unusual Data Types - These include structures, pointers, and global variables.        &lt;ul&gt;         &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=229"&gt;Considerations for using Unusual Data Types&lt;/a&gt; &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;hr /&gt;    &lt;p&gt;This material is copied and/or adapted from the &lt;a title="Buy this at Amazon" href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670" target="_blank"&gt;Code Complete&lt;/a&gt; 2 Website at cc2e.com. This material is Copyright &amp;#169; 1993-2007 Steven C. McConnell. Permission is hereby given to copy, adapt, and distribute this material as long as this notice is included on all such materials and the materials are not sold, licensed, or otherwise distributed for commercial gain. &lt;/p&gt; &lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4082503658487071154?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-778658769340139074</id><title type="text">K2 Blackpearl configuration problem</title><published>2009-01-06T08:55:00-08:00</published><updated>2009-01-07T08:16:28-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=778658769340139074" /><link rel="alternate" type="text/html" title="K2 Blackpearl configuration problem" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=778658769340139074" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Blackpearl" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">So we are taking advantage of the new year to ensure all of our servers are patched up. As we patched our SQL Servers (SQL Server 2005 SP3), we started getting the following error from our application servers (both SharePoint WFE and K2 Blackpearl app servers).&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 0);"&gt;Unable to connect to SERVERNAME on port 5252. No connection could be made because the target machine actively refused it.&lt;/pre&gt;&lt;br /&gt;I immediately start looking at the SQL Server, and everything is working as it should be. Since I'm running into a wall, I drop down to the network level. Port 5252 isn't open on my server. OK, I checked to see that the service is running, and it is. Why isn't it listening?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I turn on logging by&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;opening C:\Program Files\K2 blackpearl\Host Server\Bin\HostServerLogging.config&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Going to &lt;pre style="color: rgb(0, 0, 0);"&gt; applicationlevellogsettings ... loglocation name="FileExtension"&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Change the Active to "True" and LogLevel to"All" &lt;/li&gt;&lt;li&gt;Restart the K2 Service &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;A new log file is available in C:\Program Files\K2 blackpearl\Host Server\Bin\. I open it up and find the culprit.&lt;br /&gt;&lt;br /&gt;&lt;pre style="color: rgb(0, 0, 0);"&gt;1046 Expired K2 [blackpearl] - Partner Software License Key: KEYNUM&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Ahhh, and I was thinking it was the patching we were doing. Sometimes you just have to look at the logs.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-778658769340139074?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-9120292028822342884</id><title type="text">Code Complete Book Review (part 2 of 7)</title><published>2008-12-30T10:10:00-08:00</published><updated>2009-01-19T10:07:42-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=9120292028822342884" /><link rel="alternate" type="text/html" title="Code Complete Book Review (part 2 of 7)" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=9120292028822342884" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;I am &lt;a href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=691298488786025897"&gt;continuing my book review&lt;/a&gt; of the great &lt;a title="Buy it now at Amazon." href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670" target="_blank"&gt;Code Complete&lt;/a&gt;. This second part focuses on design in software construction. As I am reviewing Code Complete I have also been reading &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=2&amp;amp;url=http%3A%2F%2Fwww.amazon.com%2FRefactoring-Improving-Existing-Addison-Wesley-Technology%2Fdp%2F0201485672&amp;amp;ei=U2FaSeTBMePetgek1qDnBg&amp;amp;usg=AFQjCNG3b3YYB5LvGIp-_J8lSc44-Aftdg&amp;amp;sig2=WVqepaQJ89j426wZ0VTmRg"&gt;Refactoring&lt;/a&gt; by Martin Fowler. In his book he states that great design comes about through refactoring and polishing your design. Steve McConnell supports design up front. &lt;/p&gt;  &lt;p&gt;In my experience I think that up-front design is necessary and focuses your development. However, my best design has come from refactoring. In addition, Code Complete discusses design at many different levels, from system and subsystem all the way down to routine level. Even if your class hierarchy will change down the line, well designed routines can help make your refactoring much easier.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Creating High-Quality Code &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Design in Construction      &lt;ul&gt;       &lt;li&gt;Design Challenges          &lt;ul&gt;           &lt;li&gt;Designs is about tradeoffs and priorities &lt;/li&gt;            &lt;li&gt;Design involves restrictions &lt;/li&gt;            &lt;li&gt;Design is nondeterministic &lt;/li&gt;            &lt;li&gt;Design is a heuristic process &lt;/li&gt;            &lt;li&gt;Design is emergent &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Key Design Concepts          &lt;ul&gt;           &lt;li&gt;Levels of Software Design &lt;/li&gt;         &lt;/ul&gt;          &lt;ol&gt;           &lt;li&gt;System &lt;/li&gt;            &lt;li&gt;Subsystems/packages &lt;/li&gt;            &lt;li&gt;classes &lt;/li&gt;            &lt;li&gt;data &amp;amp; routines &lt;/li&gt;            &lt;li&gt;internal routine design &lt;/li&gt;         &lt;/ol&gt;       &lt;/li&gt;        &lt;li&gt;Design Building Blocks: Heuristics          &lt;ul&gt;           &lt;li&gt;Mimic real world objects. When doing this, try to form consistent abstractions. &lt;/li&gt;            &lt;li&gt;Hide as much information as possible. Only expose enough information to run the system &lt;/li&gt;            &lt;li&gt;Isolate pieces of the system likely to change. &lt;/li&gt;            &lt;li&gt;Identify common &lt;a href="http://www.javacamp.org/designPattern/"&gt;design patterns&lt;/a&gt; &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Design Practices          &lt;ul&gt;           &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=209"&gt;Design Checklist&lt;/a&gt; &lt;/li&gt;            &lt;li&gt;Iterate. Design a small part of your system, then branch out from there. There are two approaches to be considered, top-down and bottom-up.&amp;#160; &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Working Classes - &lt;a href="http://www.cc2e.com/Page.aspx?hid=213"&gt;Class Quality Checklist&lt;/a&gt;       &lt;ul&gt;       &lt;li&gt;Class Foundations: Abstract Data Type - The easiest way to identify classes in your system is to look at collections of data. Group together related data and their operations to form a class. &lt;/li&gt;        &lt;li&gt;Good Class Interfaces - Make sure you only implement one ADT per class. This has been a helpful rule of thumb to decide if I am &amp;quot;done&amp;quot; refactoring a class. &lt;/li&gt;        &lt;li&gt;Design and Implementation Issues          &lt;ul&gt;           &lt;li&gt;Containment &lt;/li&gt;            &lt;li&gt;Inheritance &lt;/li&gt;            &lt;li&gt;Member Functions and Data &lt;/li&gt;            &lt;li&gt;Constructors &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Reasons to Create a Class          &lt;ul&gt;&lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Model real-world objects &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Model abstract objects &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;ul&gt;&lt;/ul&gt;        &lt;ul&gt;         &lt;li&gt;Reduce complexity &lt;/li&gt;          &lt;li&gt;Isolate complexity &lt;/li&gt;          &lt;li&gt;Hide implementation details &lt;/li&gt;          &lt;li&gt;Limit effects of changes &lt;/li&gt;          &lt;li&gt;Hide global data &lt;/li&gt;       &lt;/ul&gt;        &lt;ul&gt;         &lt;li&gt;Streamline parameter passing &lt;/li&gt;          &lt;li&gt;Make central points of control &lt;/li&gt;          &lt;li&gt;Facilitate reusable code &lt;/li&gt;          &lt;li&gt;Plan for a family of programs &lt;/li&gt;          &lt;li&gt;Package related operations &lt;/li&gt;          &lt;li&gt;Accomplish a specific refactoring &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;High Quality Routines      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=218"&gt;High Quality Routines Checklist&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Here's a summary list of the valid reasons for creating a routine:          &lt;ul&gt;           &lt;li&gt;Reduce complexity &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Introduce an intermediate, understandable abstraction &lt;/li&gt;          &lt;li&gt;Avoid duplicate code &lt;/li&gt;          &lt;li&gt;Support subclassing &lt;/li&gt;          &lt;li&gt;Hide sequences &lt;/li&gt;          &lt;li&gt;Hide pointer operations &lt;/li&gt;          &lt;li&gt;Improve portability &lt;/li&gt;          &lt;li&gt;Simplify complicated boolean tests &lt;/li&gt;          &lt;li&gt;Improve performance &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;ul&gt;       &lt;li&gt;In addition, many of the reasons to create a class are also good reasons to create a routine: &lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a name="to create"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;ul&gt;         &lt;li&gt;Isolate complexity &lt;/li&gt;          &lt;li&gt;Hide implementation details &lt;/li&gt;          &lt;li&gt;Limit effects of changes &lt;/li&gt;          &lt;li&gt;Hide global data &lt;/li&gt;          &lt;li&gt;Make central points of control &lt;/li&gt;          &lt;li&gt;Facilitate reusable code &lt;/li&gt;          &lt;li&gt;Accomplish a specific refactoring &lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;&lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;Design at the Routine Level &lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;ul&gt;       &lt;li&gt;Good Routine Names &lt;/li&gt;        &lt;li&gt;Routine Size &lt;/li&gt;        &lt;li&gt;Parameters in a Routine &lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;Defensive Programming        &lt;ul&gt;         &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=221"&gt;Defensive Programming Checklist&lt;/a&gt; &lt;/li&gt;          &lt;li&gt;Invalid Inputs &lt;/li&gt;          &lt;li&gt;Assertions &lt;/li&gt;          &lt;li&gt;Error Handling &lt;/li&gt;          &lt;li&gt;Exceptions &lt;/li&gt;          &lt;li&gt;Barricade your code &lt;/li&gt;          &lt;li&gt;Debugging Aids &lt;/li&gt;          &lt;li&gt;Defensive code in Production &lt;/li&gt;          &lt;li&gt;Being Defensive about Defensive Programming &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.cc2e.com/Page.aspx?hid=223" target="_blank"&gt;Pseudocode Programming Process&lt;/a&gt; - This is the design tool I was taught in school and it best maps to creative writing. You draft and rewrite your system until writing the code is easier than writing another step. This has the benefits of         &lt;ul&gt;         &lt;li&gt;Identifying any areas of misunderstanding, this ensures that you understand the system and have done a risk analysis early in the system. &lt;/li&gt;          &lt;li&gt;Providing top level documentation for your classes or routines &lt;/li&gt;          &lt;li&gt;&amp;quot;Getting the ball rolling&amp;quot; in decomposing an intricate problem &lt;/li&gt;          &lt;li&gt;Providing a stepping stone towards &amp;quot;&lt;a href="http://www.literateprogramming.com/" target="_blank"&gt;Literate Programming&lt;/a&gt;&amp;quot; &lt;/li&gt;       &lt;/ul&gt;     &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;hr /&gt;This material is copied and/or adapted from the Code Complete 2 Website at cc2e.com. This material is Copyright &amp;#169; 1993-2007 Steven C. McConnell. Permission is hereby given to copy, adapt, and distribute this material as long as this notice is included on all such materials and the materials are not sold, licensed, or otherwise distributed for commercial gain.   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-9120292028822342884?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-691298488786025897</id><title type="text">Code Complete Book Review (part 1 of 7)</title><published>2008-12-17T18:26:00-08:00</published><updated>2009-01-19T10:08:25-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=691298488786025897" /><link rel="alternate" type="text/html" title="Code Complete Book Review (part 1 of 7)" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=691298488786025897" /><category term="Book Review" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I have been preparing training plans for developers. In this process, we were identifying suggested reading. Of course, I suggested &lt;a title="Buy it now at Amazon" href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;amp;tag=earlieeducat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670"&gt;Code Complete&lt;/a&gt; by Steve McConnell. As I was going through the list, I thought it would benefit me, and the rest of us to review this classic. So let's jump in!  &lt;br /&gt;  &lt;br /&gt;Although this book covers so much of the software engineering world, it is focused on coding and debugging. This is the &amp;quot;construction&amp;quot; of software engineering. Some reasons for this focus include  &lt;br /&gt;  &lt;ol&gt;   &lt;li&gt;Construction is a large part of development time and efforts&lt;/li&gt;    &lt;li&gt;Construction's product, source code, can be the only reliable description of the system&lt;/li&gt;    &lt;li&gt;Construction is the only activity that is guaranteed to be done&lt;/li&gt; &lt;/ol&gt; &lt;span style="font-weight: bold; font-style: italic"&gt;Laying the Foundation&lt;/span&gt; The first section in the book is dedicated to understanding requirements, and how they can constrain, focus, and support construction moving forward.  &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;Metaphors in Software Development     &lt;ul&gt;       &lt;li&gt;The key metaphor this chapter moves toward is software &amp;quot;construction&amp;quot;         &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;a id="hkmf" title="Upstream Prerequisites" href="http://cc2e.com/Page.aspx?nid=76"&gt;Upstream Prerequisites&lt;/a&gt;       &lt;ul&gt;       &lt;li&gt;&lt;span style="font-style: italic"&gt;Importance of Prerequisites&lt;/span&gt; - This section looks back to the idea of &amp;quot;Software Construction&amp;quot; and compares requirements and design to the foundation for a building.&lt;/li&gt;        &lt;li&gt;&lt;span style="font-style: italic"&gt;Determine the kind of software you are working on&lt;/span&gt; - Software projects are very unique. They may run from a one-time report, to code that runs in a pacemaker. Different approaches are required.&lt;/li&gt;        &lt;li&gt;&lt;span style="font-style: italic"&gt;Problem Definition Prerequisite&lt;/span&gt; - This is a definition of the problem in the users' language. It should say, &amp;quot;We need to handle more policy documents.&amp;quot;, not &amp;quot;We need a &lt;span class="misspell" suggestions="work flow,work-flow,workfare,workforce,workable"&gt;workflow&lt;/span&gt; system for our Oracle portal to accelerate policy review&amp;quot;. This provides the foundation for collecting requirements and identifying what is in or out of scope.          &lt;br /&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-style: italic"&gt;Requirements Prerequisite&lt;/span&gt;          &lt;br /&gt;          &lt;ul&gt;           &lt;li&gt;See &lt;a id="kc78" title="gilb.com" href="http://www.gilb.com/"&gt;&lt;span class="misspell" suggestions="glib,Gib,Gil,Gibb,Gila"&gt;gilb&lt;/span&gt;.com&lt;/a&gt; for requirements tools and certification&lt;/li&gt;            &lt;li&gt;&lt;a id="lpz." title="SWEBOK" href="http://www.swebok.org/swebokcontents-ch2.html#ch2"&gt;&lt;span class="misspell" suggestions="SEEBECK,SABIK,SWAYBACK,ZWIEBACK,SWANK"&gt;SWEBOK&lt;/span&gt;&lt;/a&gt; has a chapter outlining requirements&lt;/li&gt;            &lt;li&gt;Requirements &lt;a id="hcni" title="Checklist" href="http://cc2e.com/Page.aspx?hid=194"&gt;Checklist&lt;/a&gt;              &lt;br /&gt;&lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li style="font-style: italic"&gt;Architecture Prerequisite         &lt;ul&gt;           &lt;li&gt;Architecture &lt;a id="tp9s" title="Checklist" href="http://cc2e.com/Page.aspx?hid=193"&gt;Checklist&lt;/a&gt;              &lt;br /&gt;&lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;&lt;span style="font-style: italic"&gt;Amount of Time to spend on Upstream Prerequisites &lt;/span&gt;- Generally 10-20% of effort and 20-30% of the schedule          &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Key Construction Decisions     &lt;ul&gt;       &lt;li&gt;&lt;span style="font-style: italic"&gt;Choice of Programming Language&lt;/span&gt; - On many projects, we as developers will not get a choice in the matter of language because of existing standards or client demands          &lt;br /&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-style: italic"&gt;Programming Conventions&lt;/span&gt; - Programming conventions are very malleable between projects and developers. This is a matter we should all focus on, since we cannot quickly change languages, but we can change programming conventions. This allows us to take desirable techniques from other programming languages.          &lt;br /&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-style: italic"&gt;Location on the Technology Wave&lt;/span&gt; - Programming in a language vs &lt;a id="u_gi" title="Programming into a language" href="http://msmvps.com/blogs/jon_skeet/archive/2008/04/23/programming-quot-in-quot-a-language-vs-programming-quot-into-quot-a-language.aspx"&gt;Programming into a language&lt;/a&gt;          &lt;br /&gt;&lt;/li&gt;        &lt;li style="font-style: italic"&gt;Selection of Major Construction Practices         &lt;ul&gt;           &lt;li&gt;&lt;a id="sqor" title="Checklist" href="http://cc2e.com/Page.aspx?hid=212"&gt;Checklist&lt;/a&gt; of Construction Practices&lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;hr /&gt;  &lt;br /&gt;This material is copied and/or adapted from the Code Complete 2 Website at cc2e.com. This material is Copyright &amp;#169; 1993-2007 Steven C. McConnell. Permission is hereby given to copy, adapt, and distribute this material as long as this notice is included on all such materials and the materials are not sold, licensed, or otherwise distributed for commercial gain.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-691298488786025897?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4924155633582410261</id><title type="text">Toastmasters &amp; Social Technology</title><published>2008-12-08T11:57:00-08:00</published><updated>2010-04-23T09:12:49-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4924155633582410261" /><link rel="alternate" type="text/html" title="Toastmasters &amp;amp; Social Technology" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4924155633582410261" /><category term="Toastmasters" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">On Nov 2, 1920, &lt;a href="http://www.kdkaradio.com/pages/15486.php"&gt;KDKA&lt;/a&gt; becomes the first radio station in the US, broadcasting election results. The first "radio election" is held in 1924, also the year Ralph Smedley forms what will become "Toastmasters International". The skills Mr Smedley is looking to develop will serve practitioners well is the age of mass media.  &lt;div&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;On Nov 4, 2008, we saw the dawn of the Web 2.0 election. Once again, the underlying technology was available before, but society needs to accept the medium before it can hear the message. However, the skills developed in Toastmasters serve the same purpose as before, and have not diminished in importance in over eighty years.&lt;/div&gt;  &lt;div&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;What is Web 2.0&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;Many people will describe Web 2.0 in terms of technology, REST and SOAP. RSS and ATOM. I want to discuss a behavior. Authoring. The largest change in these applications is the ability for users to act as providers as well as consumers. The ease of authoring, and ability to mashup new content turns "viewers" into "doers".&lt;/div&gt;  &lt;div&gt;  &lt;br /&gt;Blogging is short for "web log" and just means that people can easily add articles to on ongoing log. These are generally organized chronologically, and may have additional labels for keyword organization   &lt;br /&gt;  &lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Micro-blogging"&gt;Microblogging&lt;/a&gt; is similar, but generally limited to 140 characters. This limitation is the length of a single text message from your cell phone. As text messaging grows in popularity, microblogging sites are a great way to increase ad-hoc writing from your mobile device   &lt;br /&gt;  &lt;br /&gt;Podcasting and videocasting refer to user-generated audio/visual content. Viewers can subscribe to these channels and watch them both on their computer or on their mobile device like cell phone or iPod.   &lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;Impact on Toastmasters&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic"&gt;Blogs and Microblogs&lt;/span&gt; - The writing required by blogging helps us to organize our thoughts and form a coherent article. Microblogging (limited to 140 characters) forces us to use interesting language and get to the point. The first four speeches in the &lt;a href="http://www.district53toastmasters.org/CCmanual.html"&gt;CC manual&lt;/a&gt; focus on these skills.&lt;/div&gt;  &lt;div&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic"&gt;Video and Podcasts&lt;/span&gt;- We can use audio/video sites to watch influential speakers as well as solicit feedback from evaluators all over the world. This reinforces the skills speeches 5 &amp;amp; 6 are designed to develop.&lt;/div&gt;  &lt;div&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic"&gt;Photos&lt;/span&gt; - Collaborative photo sharing sites give access to unencumbered images that we can use in our own presentations. The eighth speech in the manual requires these skills.&lt;/div&gt;  &lt;div&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;Personal Use&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;I have personally benefited from these techniques and I want to offer some personal insights. I have found many Toastmasters on &lt;a href="http://twitter.com/jwmiller5"&gt;Twitter&lt;/a&gt;, and been found by some as well. Their messages give the "pulse" of Toastmasters for those who are interested.&lt;/div&gt;  &lt;div&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;I have used YouTube when preparing for speech contests. There are many example speeches with great content to help the brainstorming process. You can also watch for body language or verbal cues. To give back to all of those who have inspired me on YouTube, &lt;a href="http://www.youtube.com/watch?v=YBOemDxw-gI"&gt;this speech&lt;/a&gt; is available as well.&lt;/div&gt;  &lt;div&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;&lt;a href="http://www.linkedin.com/in/jwmiller5"&gt;LinkedIn&lt;/a&gt; provides a Toastmasters District group in my area. By joining, I met someone in my industry with similar specialties as well as over 20 years experience. This instantly developed my personal network and gave me a sounding board for future projects. &lt;/div&gt;  &lt;div&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;We can see that although the medium has changed drastically over time, the methods for effective communication have not. By focusing on fundamental skills; speaking, listening and thinking, we can achieve our goals, today and tomorrow.  &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4924155633582410261?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-8725371905810427070</id><title type="text">Customizing your Documentation with Sandcastle Help File Builder</title><published>2008-12-02T17:31:00-08:00</published><updated>2008-12-03T11:49:34-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8725371905810427070" /><link rel="alternate" type="text/html" title="Customizing your Documentation with Sandcastle Help File Builder" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8725371905810427070" /><category term="Static Code Analysis" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">In writing this, I'm going to assume that you either read my &lt;a href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=443715232671821766"&gt;previous article&lt;/a&gt; or have ongoing experience with Sandcastle. After using it to autogenerate my documentation I realized a few things.&lt;div&gt;&lt;ol&gt;&lt;li&gt;My spelling and grammar are horrible in an IDE&lt;/li&gt;&lt;li&gt;There are a lot of classes that don't need to be documented (web service proxies, GUI classes) &lt;/li&gt;&lt;li&gt;MSDN style documentation is nice, but support@microsoft.com probably won't be as responsive to my custom code as me or the help desk.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;This is where &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=SHFB"&gt;Sandcastle Help File Builder&lt;/a&gt; comes into play. This tool will build your Sandcastle project for you without requiring a bunch of RegEx magic. When you launch the builder, you will get to choose exactly which assemblies and XML documentation gets included in your Sandcastle project. This is very handy on focusing on what is important and ignoring the autogenerated code that nobody should be touching. In addition, you will be able to customize the output without getting into angle brackets.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;To get started lets fire up SHFB and choose our dlls to document.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;After doing this, click the Namespaces button and deselect all those web service proxy classes that were added&lt;/li&gt;&lt;li&gt;In the &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Build &lt;/span&gt;section we can set the project settings like FrameworkVersion, Dependencies and Components&lt;/li&gt;&lt;li&gt;In the &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Help File&lt;/span&gt; section we can customize our build. This is where we will lean on the MSDN style formatting (see the PresentationStyle option), but we will change the Feedback Email, Copyright Info, Project Name, Headers, Footers and all those other things to make the help files match the "approved format".&lt;/li&gt;&lt;li&gt;The &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Paths &lt;/span&gt;section lets us customize the build if we installed our components to non-default locations.&lt;/li&gt;&lt;li&gt;The &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Visibility &lt;/span&gt;section is another great way to focus the documents on the important code. As you are writing your business logic, you will be depending on lower level .NET classes. By default the inherited properties will be included in the documentation. Do you really want to see all of the string methods on your CustomerName property, or do you want to focus on what's important. This section will allow you to ignore those inherited features.&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.mobiusdevelopment.com/dev/images/visibility.gif" alt="Visibility tab in SFHB" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-8725371905810427070?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-443715232671821766</id><title type="text">Static Code Analysis and API Documentation</title><published>2008-11-11T09:44:00-08:00</published><updated>2008-12-01T07:03:58-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=443715232671821766" /><link rel="alternate" type="text/html" title="Static Code Analysis and API Documentation" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=443715232671821766" /><category term="Static Code Analysis" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Documentation is increasingly important for maintaining a codebase. As your team grows and developers have to interact with existing libraries, comprehensive documentation can help them ramp up. If you aren't currently documenting your code, you should start today. To do this in Visual Studio (2005/2008) [I think this also works for 2003 if you are using C#]. &lt;div&gt;&lt;ol&gt;&lt;li&gt;Right click your project file, go to properties&lt;/li&gt;&lt;li&gt;In the build tab, ensure the XML Documentation file is checked.&lt;/li&gt;&lt;li&gt;As you are developing, use the triple comment (/// or ''') above any class or method. This will automatically expand to the method signature&lt;/li&gt;&lt;li&gt;Add any additional XML fields such as Example, Exception, See, SeeAlso&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Notice that this automatically builds the signature of the method you are commenting. This is very handy for new developers on your project as they will see your comments in the intellisense provided by Visual Studio. I think this is very important as a way to identify &lt;a href="http://c2.com/xp/CodeSmell.html"&gt;code smells&lt;/a&gt;. As you are reviewing or developing, look at where your comments are. If they are describing methods this is decent encapsulation. If your methods have documentation in the middle your code can likely be refactored.&lt;/div&gt;&lt;br /&gt;How can we get even more mileage out of those comments? &lt;a href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt; is an application made of MSBuild scripts along with Xsl and a some other helper scripts that will parse your XML documentation from Visual Studio and create a CHM (Compiled Help), or MSDN-style documentation website. This is handy for explaining your code to stakeholders who do not have Visual Studio. In addition to non-technical stakeholders reassurance, IT staff supporting the system years from now will have an easier time debugging your system with the well-prepared documentation provided.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-443715232671821766?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5249286859183067323</id><title type="text">Powershell and Sharepoint</title><published>2008-11-10T19:44:00-08:00</published><updated>2009-02-07T16:16:36-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=5249286859183067323" /><link rel="alternate" type="text/html" title="Powershell and Sharepoint" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=5249286859183067323" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="SPSaturday" scheme="http://www.blogger.com/atom/ns#" /><category term="PowerShell" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="CapArea" scheme="http://www.blogger.com/atom/ns#" /><content type="html">This is the collection of slides and scripts from the November 2008 presentation I gave for the &lt;a href="http://www.caparea.net/sharepoint"&gt;Capital Area SharePoint SIG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Updated January 2009 for &lt;a href="http://www.sharepointsaturday.org/"&gt;SharePointSaturday&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This includes&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Slides and additional links for more information&lt;/li&gt;&lt;li&gt;get-webservice and invoke-webservice (both from nivot.org)&lt;/li&gt;&lt;li&gt;SecurityMap.ps1&lt;/li&gt;&lt;li&gt;sign-file.ps1&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/Powershell-Sharepoint.zip"&gt;Download slides and scripts&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Visit my del.icio.us profile for my favorite &lt;a href="http://delicious.com/jwmiller5/sharepoint+powershell"&gt;SharePoint and Powershell links&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5249286859183067323?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-6491572021158461932</id><title type="text">MOSS and 508 compliance</title><published>2008-11-06T12:39:00-08:00</published><updated>2008-12-18T08:25:12-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6491572021158461932" /><link rel="alternate" type="text/html" title="MOSS and 508 compliance" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6491572021158461932" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Working with government clients, accessibility compliance gets raised a lot.&amp;#160; Microsoft provides a list of Voluntary Product Accessibility Templates (&lt;a href="http://www.microsoft.com/industry/government/products/section508.mspx"&gt;VPAT&lt;/a&gt;) for their products. These templates describe each part of compliance and where their product may have exceptions.&amp;#160; &lt;div&gt;   &lt;br /&gt;MOSS is pretty well compliant out of the box. MOSS also provides a &lt;span&gt;&lt;span class="Apple-style-span" style="font-style: italic"&gt;More Accessible Mode&lt;/span&gt;&lt;/span&gt; that changes the rendering and behavior of page links to be more compatible with accessibility tools such as screen readers. It's easy to turn on, just press TAB twice after loading a page. &lt;/div&gt;  &lt;div&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic"&gt;&lt;span class="Apple-style-span" style="font-style: normal"&gt;Of course, nobody is ever happy with OOB Sharepoint deployments, and that with where branding, customization, and custom development enter. What does all of this mean to you looking to implement a new MOSS application? If you decide to create a custom look and feel, to maintain maximum accessibility you should build from a &lt;a href="http://www.heathersolomon.com/blog/articles/BaseMasterPages.aspx"&gt;minimal master page&lt;/a&gt;. That way, you can follow all the best practices like avoiding tables, placing alt tags on images, labeling your forms and all of that good stuff. Microsoft and HiSoftware have created an &lt;a href="http://aks.hisoftware.com/index.html"&gt;Accessibility kit for Sharepoint&lt;/a&gt;. You can also use an accessibility &lt;a href="http://wave.webaim.org/"&gt;testing tool&lt;/a&gt; during development.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div&gt;   &lt;br /&gt;If you're looking to go beyond that, &lt;a href="http://www.spworks.co.uk/home/sharepoint-consultancy.aspx"&gt;ARF&lt;/a&gt; is a framework that emits XML from Sharepoint. You can use this and XSLT to ensure that you have valid, accessible websites and retain complete control over the entire UI.&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-6491572021158461932?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7631930255747378444</id><title type="text">Static Code Analysis with FxCop</title><published>2008-10-21T10:02:00-07:00</published><updated>2008-11-20T11:13:21-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7631930255747378444" /><link rel="alternate" type="text/html" title="Static Code Analysis with FxCop" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=7631930255747378444" /><category term="Static Code Analysis" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Static Code Analysis is like spell checking for your code. Instead of looking for spelling mistakes, it looks for coding mistakes (not disposing unmanaged resources, using deprecated assemblies, globalization issues and more). For the .NET framework, the tool is &lt;a href="http://code.msdn.microsoft.com/codeanalysis/Release/ProjectReleases.aspx"&gt;FxCop&lt;/a&gt;. This tool works against 1.0, 2.0, and 3.x object code (assemblies, not source code). This means that the tool works for ALL CLR languages (VB.Net/C#/F#/RPG.Net...) and provides a report on nine areas of code compliance with Design Guidelines&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Design&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Globalization&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Interoperability&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mobility&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Naming&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Performance&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Portability&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Security&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Usage&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;This tool has both a GUI and command line interface (perfect for continuous build processes) and exports an XML/HTML report. To use this tool, you will need to add the CODE_ANALYSIS compilation flag to your project. As you review your reports, you will see three types of errors&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Errors that you have made that you need to fix&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Errors that you have made that you have no intention of fixing (coding style)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Errors that you made a conscious decision to make. (catching a generic Exception, constructor style)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The fixes for these errors are also different&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fix your code (easy enough)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Disable the specific rule for analysis&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Add an attribute to your function/assembly that disables the specific test for that function. &lt;a href="http://social.msdn.microsoft.com/forums/en-US/vstscode/thread/5bf2c10c-e30c-41bd-b305-43a3a2a68841"&gt;CodeAnalysis.SupressMessage&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I have found tools like these to be most useful when you are hitting a wall about how to redesign or extend your application. This provides an impartial look at your code to ensure you are developing with the &lt;a href="http://msdn.microsoft.com/en-us/library/ms229042.aspx"&gt;Design Guidelines&lt;/a&gt; in mind. Of course, a tool like this is also useful when you want to clean up a poorly maintained library as well!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7631930255747378444?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-255453214967806093</id><title type="text">Sharepoint Assurance</title><published>2008-10-14T07:32:00-07:00</published><updated>2008-11-04T10:17:00-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=255453214967806093" /><link rel="alternate" type="text/html" title="Sharepoint Assurance" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=255453214967806093" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I'm currently working on my &lt;a href="http://www.caparea.net/Default.aspx?alias=www.caparea.net/sharepoint"&gt;November presentation&lt;/a&gt; for the CapArea Sharepoint group. My speech will be on PowerShell and how to use it with Sharepoint to help with governance. That's right, I dropped the G word.&lt;br /&gt;&lt;br /&gt;Sharepoint is taking off within organizations because it is easy to use, and offers an entryway to advanced capabilities such as BI, Enterprise Content Management, Records Management and more. However, as these portals gain popularity, the enterprise rushes to come up with a &lt;a href="http://technet.microsoft.com/en-us/office/sharepointserver/bb507202.aspx"&gt;Sharepoint governance plan&lt;/a&gt;. This usually involves stopping any growth or development on the platform, and talking about your feelings around Sharepoint and forcing it into a process similar to all of your bespoke ASP.NET applications. At which point it loses the flexibility and agility that made it an attractive platform in the first place.&lt;br /&gt;&lt;br /&gt;Every governance step for the end user, (contact help desk, security review, management review, change control) that is introduced around your portal is going to dissuade some users, which decreases the reach and the penetration of your platform. What does this mean for IT managers and architects, Do we have to keep our hands off and hope everything goes well on this platform?&lt;br /&gt;&lt;br /&gt;Of course not, effective management is needed across IT and this is no different. This is where the idea of &lt;a href="http://www.cleverworkarounds.com/2008/10/14/its-all-joels-fault/"&gt;Sharepoint Assurance&lt;/a&gt; comes in, moving "governance" closer to the users. We can provide both a flexible platform for collaboration, and a well managed IT infrastructure. I like the &lt;a href="http://erikswenson.blogspot.com/2008/09/governance-topics-and-roles.html"&gt;roles and schedule&lt;/a&gt; listed here, but I want to highlight the role of the business unit. In my experience, this is where the majority of change, collaboration and value is generated. Unfortunately, they all have &lt;a href="http://en.wikipedia.org/wiki/Blind_Men_and_an_Elephant"&gt;different views of the elephant&lt;/a&gt;. Therefore, asking them to have to interact with th "Enterprise Architecture" committee, will generally doom or slow any innovation.&lt;br /&gt;&lt;br /&gt;The central IT management needs to form a few strict guidelines that cannot be broken. (lines between customization/custom app development, branding, security &amp;amp; auditing). Beyond these rules, business units should be free to customize as they see fit. Then administrators at the farm, application, site collection and web level need to have the tools for reporting, auditing and managing that gives insight and assurance to the Sharepoint infrastructure without burdening the environment with a onerous governance methodology.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-255453214967806093?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3128282372543692406</id><title type="text">Adding users to MOSS via code</title><published>2008-07-22T10:27:00-07:00</published><updated>2008-12-18T08:25:54-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3128282372543692406" /><link rel="alternate" type="text/html" title="Adding users to MOSS via code" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3128282372543692406" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Have you been adding users to your MOSS sites via code? Have you received the dreaded &amp;quot;Operation is not valid due to the current state of the object.&amp;quot; error? Rejoice, there is a simple operation that will save you all sorts of typing.  &lt;br /&gt;  &lt;pre style="color: rgb(0,0,0)"&gt;&lt;br /&gt;//This actually creates the SPUser object&lt;br /&gt;SPUser sUser = currentWeb.EnsureUser(UserAccount)&lt;br /&gt;&lt;br /&gt;//This grants contributor rights to the SPUser&lt;br /&gt;SPRoleAssignment ra = new SPRoleAssignment(sUser);&lt;br /&gt;SPRoleDefinition rd = currentWeb.RoleDefinitions.GetByType(SPRoleType.Contributor);&lt;br /&gt;ra.RoleDefinitionBindings.Add(rd);                          &lt;br /&gt;currentWeb.RoleAssignments.Add(ra);         &lt;br /&gt;currentWeb.Update();                    &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When using this approach, there is a slight delay between the Update on the currentWeb and the availability of the new permissions. So if you call that site as the aforementioned user you may get an SPException. Just capture it and try again. Everything will work!  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3128282372543692406?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3234311468494156716</id><title type="text">Communications Skills for Information Workers</title><published>2008-07-07T12:10:00-07:00</published><updated>2008-07-23T11:43:54-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3234311468494156716" /><link rel="alternate" type="text/html" title="Communications Skills for Information Workers" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3234311468494156716" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I've been working on this for about two or three years now. It surprising how quickly written skills can catapult your career. I've worked as a developer and system admin. As a developer, it's assumed that if you write a lot of great code, that everything else can fall by the wayside. But really, writing great code is just the cost of entry. Beyond this, you need to be able to create documentation, project plans, install docs and maintenance docs before people will really be wowed.&lt;br /&gt;&lt;br /&gt;As we work in knowledge-driven companies, we need to distribute knowledge after we create it. Technology makes it cheap to do this, but the onus is still on us to speak, write, and communicate our work to others to make it valuable. If I have a design for a fusion reactor that I keep secret, it isn't a very valuable piece of information. (In fact it has no value until someone else pays for it).  There's always too much information out there, and if we can ingest, refine and communicate the golden bits to others around us, we will all be richer for it.&lt;br /&gt;&lt;br /&gt;What does this mean for you and I, dear reader? Well, &lt;a href="http://iplot.typepad.com/iplot/2008/07/the-writing-org.html"&gt;we all need to write&lt;/a&gt;. I'll probably never write the great American novel, but I hope that you find at last one article out here that makes your life easier. We also need to talk more. Are you an awesome developer? Write some demo code and hit the pavement!! Show it to 2000 people. If you're that great, your code should make 2000 people better. and that is pretty impressive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3234311468494156716?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-3235955046032961096</id><title type="text">Building personalization with MOSS user profiles</title><published>2008-06-01T10:40:00-07:00</published><updated>2009-01-26T06:14:52-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3235955046032961096" /><link rel="alternate" type="text/html" title="Building personalization with MOSS user profiles" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=3235955046032961096" /><category term="Search" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I had plans to extend our custom MOSS application with some deeper personalization. Specifically, certain forms elements would appear/disappear for you based on your department and your position in the org chart. In additional, certain dropdowns would be filtered for your team/peers/shared interests. Notice that this is for data entry and workflow acceleration so this isn't data that needs to be secured. So the two necessary pieces are   &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-weight: bold"&gt;1. Figuring out the current user's profile&lt;/span&gt;   &lt;br /&gt;The dll that needs to be included is Microsoft.Office.Portal (Microsoft.SharePoint.Portal.UserProfiles is &lt;a href="http://msdn.microsoft.com/en-us/library/ms545807.aspx"&gt;deprecated&lt;/a&gt;). The class is &lt;span style="font-style: italic"&gt;UserProfileManager&lt;/span&gt;. This will let you quickly get the current user's profile for display or editing. The &lt;span style="font-style: italic"&gt;UserProfileManager &lt;/span&gt;class is enumerable so you can walk through all of the user profiles. But that doesn't seem to be the most performant method of building groups based on profile information.   &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-weight: bold"&gt;2. Searching across all user profiles&lt;/span&gt;   &lt;br /&gt;If you are looking across all user profiles as opposed to just the current user, you will want to use the search functions. The easiest way to do this is to restrict your search to the &amp;quot;People Scope&amp;quot;. The code snippet below will return all users in the IT Department. You will notice that we defined the scope to be people in the FullTextSQLQuery (make sure your content source is &lt;a href="http://metahat.blogspot.com/2006/12/people-search-not-working-in-moss-2007.html"&gt;setup &lt;/a&gt;for this).   &lt;br /&gt;  &lt;br /&gt;  &lt;pre&gt;&lt;span style="color: rgb(0,0,0)"&gt;FullTextSqlQuery q = new FullTextSqlQuery(ServerContext.Current);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;q.ResultTypes = ResultType.RelevantResults;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;q.QueryText = &amp;quot;SELECT UserName, Email, PreferredName FROM SCOPE() WHERE \&amp;quot;scope\&amp;quot; = 'People' AND Department = 'IT'&amp;quot;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;ResultTableCollection tables = q.Execute();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0,0,0)"&gt;ResultTable results = tables[ResultType.RelevantResults];&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-3235955046032961096?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-1802313708980020849</id><title type="text">Managing Event Handlers</title><published>2008-06-01T10:15:00-07:00</published><updated>2009-02-07T16:16:14-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1802313708980020849" /><link rel="alternate" type="text/html" title="Managing Event Handlers" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1802313708980020849" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="CapArea" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I've been working with Event Handlers. &lt;a href="http://msdn.microsoft.com/en-us/library/ms453149.aspx"&gt;MSDN&lt;/a&gt; has a great intro how-to on event handlers, but I was trying to attach my event handler to a specific list. In looking at the Elements.xml schema it seems that you can link to a list tempate, or a feature guid, but that is it. That didn't really provide the flexibility I needed.&lt;br /&gt;&lt;br /&gt;Brian Wilson, with MCS, has created a &lt;a href="http://blogs.msdn.com/brianwilson/archive/2007/03/18/event-handlers-part-3-register-event-handlers-plus-free-site-settings-manage-event-handlers-add-on.aspx"&gt;site settings application&lt;/a&gt; that allows you to manage event handlers in the Sharepoint admin screens. I was impressed with what he has done, but I hate to install anything more than I need to on production servers.&lt;br /&gt;&lt;br /&gt;So the final option was to write some code that would manage my event handlers. I'll put this up on the downloads page. I'll demo this code at the Capital Area .NET Users group on July 9th. I'll include a feature definition for deployment as well as some event receivers to test with.&lt;br /&gt;&lt;br /&gt;DISCLAIMER: This code is being released as example code only. It is nowhere near production-ready. It currently only works for List Item event, no web or content type events. So if you want that, you have to do it yourself. This is strictly me-ware that scratches an itch. But if you need this approach, feel free to build on what I've provided for you.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/EventHandlers.ppt"&gt;Download the slides&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/EventHandlersDemoCode.zip"&gt;Download Demo Code&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-1802313708980020849?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-7156531513977360024</id><title type="text">MOSS Security Enumerator</title><published>2008-02-19T07:31:00-08:00</published><updated>2008-12-18T08:46:08-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=7156531513977360024" /><link rel="alternate" type="text/html" title="MOSS Security Enumerator" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=7156531513977360024" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="PowerShell" scheme="http://www.blogger.com/atom/ns#" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I talked about &lt;a href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4274720480780282094"&gt;filling in the gaps&lt;/a&gt; in MOSS in an earlier article. This is a script that helped us in troubleshooting security issues. We were iterating through our sites to present custom navigation, and the nav menu would break if the sites permissions had changed. This quickly became not fun, so I created this powershell script that will identify sites with custom security (as opposed to inheriting from the parent).  &lt;br /&gt;  &lt;br /&gt;These types of scripts also become useful two years later. The site has been in production for a while, people of come and gone, new groups have built new ideas on new sites and your security team/auditor/nosy manager wants to know who has access to what sites. That is not fun to compile by hand.  &lt;br /&gt;  &lt;br /&gt;This script takes two parameters -URL (the top level web application you want to audit) and -LogFile (the path to the html file the script will create)  &lt;br /&gt;  &lt;br /&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/SecurityMap.zip"&gt;Download SecurityMap&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-7156531513977360024?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4274720480780282094</id><title type="text">Portal deployment with MOSS 2007</title><published>2008-02-19T07:08:00-08:00</published><updated>2008-06-01T19:17:25-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4274720480780282094" /><link rel="alternate" type="text/html" title="Portal deployment with MOSS 2007" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4274720480780282094" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Microsoft provides a &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=6f3440e8-1ad1-4063-8f14-2d633c12cd21&amp;amp;displaylang=en&amp;amp;tm"&gt;great whitepaper&lt;/a&gt; on how they designed and deployed the intranet sitting on MOSS 2007. As I read through it I smiled, nodded and really believed that this was what they went through because we have been through this as well. The two major themes that jumped out at me were.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use of OOB (out of the box) features. I'm sure Microsoft could find a developer or two to really tweak their setup, but their use of the baked-in features is a lesson for all of us. Maybe we should use the product that we paid for as it was intended. I understand &lt;a href="http://www.andrewconnell.com/blog/"&gt;some people&lt;/a&gt; are touting it as a development platform, and it is incredibly powerful. However, this is a powerful rifle aimed square at your feet, and it you pull the trigger, Microsoft &lt;a href="http://searchwindevelopment.techtarget.com/news/article/0,289142,sid8_gci1299395,00.html"&gt;won't be able to help right away&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;On the other side of this coin, they discuss the custom development they did. Again, I was in agreement as these are the exact problems we encountered as well. Some of the work described was extending advanced search, a broken link catcher, and a &lt;a href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=7156531513977360024"&gt;permissions enumerator&lt;/a&gt;. I found this type of development to be more beneficial as you are "filling the gaps" in the product, and making administration easier, rather than extending and adding and increasing the product footprint.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;In conclusion, if you are starting your internal portal deployment, read the whitepaper and follow their advice. &lt;span style="font-style: italic;"&gt;for your first iteration at least :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4274720480780282094?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4063844421552611950</id><title type="text">MOSS and KB934525</title><published>2007-10-12T07:11:00-07:00</published><updated>2008-06-01T19:17:37-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4063844421552611950" /><link rel="alternate" type="text/html" title="MOSS and KB934525" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4063844421552611950" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Did you go into work and get complaints about your MOSS installations? When I fired up my browser I got a nice little home page that said&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HTTP/1.1 404 Connection: close Date: Fri, 12 Oct 2007 12:58:53 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET MicrosoftSharePointTeamServices: 12.0.0.4518&lt;br /&gt;&lt;br /&gt;Digging a little bit more I saw WSS Event ID 5617 that says&lt;br /&gt;&lt;br /&gt;The schema version (3.0.149.0) of the database WSS_Content_007 on &lt;span style="font-style: italic;"&gt;database&lt;/span&gt; is not consistent with the expected database schema version (3.0.151.0) on &lt;span style="font-style: italic;"&gt;webserver&lt;/span&gt;.  Connections to this database from this server have been blocked to avoid data loss.  Upgrade the web front end or the content database to ensure that these versions match.&lt;br /&gt;&lt;br /&gt;Great ..... so I poke around in the Event Log and I see that &lt;a href="http://support.microsoft.com/kb/934525"&gt;KB934525&lt;/a&gt; was installed via WSUS last night. Great, I'll just uninstall. Nope, that isn't supported. Well, reading a little deeper into this, it appears that after installing this security patch you have to run Sharepoint Products and Technologies Configuration Wizard (aka PSConfig) on EVERY server in your farm. Once, this is all done, then your sites should start up (mine did).&lt;br /&gt;&lt;br /&gt;In talking with people at Microsoft I was told that it's probably best to install these patches by hand rather then with WSUS. Great, I was hoping I could have another piece of Sharepoint that is difficult to manage. :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4063844421552611950?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5765697756647927831</id><title type="text">MindMap to Project Converter</title><published>2007-09-16T18:19:00-07:00</published><updated>2008-12-01T10:05:39-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=5765697756647927831" /><link rel="alternate" type="text/html" title="MindMap to Project Converter" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=5765697756647927831" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="Project Management" scheme="http://www.blogger.com/atom/ns#" /><content type="html">This is a simple command-line utility (disclaimer: requires .NET 2.0 Framework and Project 2007) that will read a &lt;a href="http://freemind.sourceforge.net/"&gt;Freemind MindMap&lt;/a&gt; file and create a project plan from that data. Usage is demonstrated below&lt;br /&gt;&lt;br /&gt;FreemindConverter.exe "C:\Documents and Settings\John\My Documents\Maps\BigProject.mm" "c:\Plans\BigProject.mpp"&lt;br /&gt;&lt;br /&gt;Be sure to use the quotes around your path, and it doesn't matter if your MindMap file comes first or the destination file. During the conversion, any notes attached to the nodes will be attached to the tasks, along with any URL's. If the checked icon was on the node, then the task will be marked at 100% complete.&lt;br /&gt;&lt;br /&gt;If none of this makes sense to you, maybe you should read &lt;a href="http://www.mobiusdevelopment.com/dev/Help.asp?ArticleID=6147671708678475825"&gt;my article on Mind Mapping and Project Management&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/FreemindConverter.exe"&gt;Download Freemind to Project Converter&lt;/a&gt;&lt;br /&gt;&lt;i&gt;SHA1: 183710876acf9cac6d0339b4c659f95db9b05f12&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5765697756647927831?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-5660108529444475808</id><title type="text">Low Intensity Project Management</title><published>2007-09-11T08:38:00-07:00</published><updated>2008-06-01T19:16:52-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5660108529444475808" /><link rel="alternate" type="text/html" title="Low Intensity Project Management" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=5660108529444475808" /><category term="Project Management" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I've been thinking about &lt;a href="http://www.gantthead.com/articles/articlesPrint.cfm?ID=168294"&gt;Low Intensity Project Management&lt;/a&gt; lately. As a System Administrator, the majority of your focus is day to day operations. If everything is running smoothly, then you can address project work. If anybody needs anything, you drop everything and run over. This is great customer service but does not lend itself to traditional Project Management.&lt;br /&gt;&lt;br /&gt;How can you possible schedule for things if you don't know what your workload will look like every day? How can you work on improving your environment if you can't use all the cool PM tricks &amp;amp; tools. The article outlines some prerequisites like&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The organization offers important goods or services to a captive customer base&lt;/li&gt;&lt;li&gt;Customers must have or strongly desire the goods or services&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I'll assume that your management wants you to do more with what they have, and that your in-house employees are your customers (captive customer base). How can you best improve existing processes or introduce new tech while keeping yor ship afloat? I posit there are 3 PM items you WILL NEED.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Project Plan&lt;/li&gt;&lt;ul&gt;&lt;li&gt;If there is a project, no matter how small or ad-hoc, you should go through a project plan. Yours may not be 50 pages long and may omit certain areas if they do not apply to your project, but the exercise is valuable.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Project Charter&lt;/li&gt;&lt;ul&gt;&lt;li&gt;This is a lesson I've learned the hard way; even if you have identified a project opportunity, done a cost-benefit, and talked it up amongst your team. You must get explicit leadership from management in your organization or your project will fail. Or even worse, your project will succeed and greedy VPs will descend and fight over who's idea it really was. Get an explicit charter in the Intiating phase, even for a small project.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Lessons Learned&lt;/li&gt;&lt;ul&gt;&lt;li&gt;If the project is small enough, you might be doing the PM role and the implementer role as well. Even then, you must be disciplined enough to create a lessons learned document. This will legitimize the work you have done as an actual project and help spread the knowledge to the rest of your team.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-5660108529444475808?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-6147671708678475825</id><title type="text">Holistic Project Planning with Mind Mapping</title><published>2007-09-04T08:00:00-07:00</published><updated>2008-12-01T10:09:12-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6147671708678475825" /><link rel="alternate" type="text/html" title="Holistic Project Planning with Mind Mapping" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6147671708678475825" /><category term="Project Management" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;Left-brain and right-brain, yin and yang, these and other cliches point towards a fundamental truth. Useful breakthroughs depend on a mix of logic and analytics as well as aesthetic and creative decisions. I have seen some of this in Project Management as well. Your traditional left-brain project managers love the project plan as it breaks the project into manageable tasks and assigns numbers (duration, precedence, cost) to all of these tasks. However, there are many team members, whether they be hands-off management types, technical experts, or even junior team members that need to be part of project planning that aren't included because they don't have an understanding of the dark arts of project management. How can we better include the requirements, constraints and valuable input from those team members without forcing them into planning meetings they are not suited for; demanding these users create project plans and leave them flailing against Microsoft Project. How can we include differing insights to provide a more realistic, holistic view of a project?&lt;/p&gt;&lt;p&gt;Webbing or Mind Mapping is the decomposition, synthesis and grouping of ideas that is more free-flowing and encompasses more creative activity into a normal organizational activity. My weapon of choice is &lt;a href="http://freemind.sourceforge.org/"&gt;FreeMind&lt;/a&gt;. It's free, so I encourage you to download it and give it a try. Here's an example that I quickly created. If you don't like installing things on your desktop, try &lt;a href="http://www.wikimindmap.org/"&gt;Wiki Mind Map&lt;/a&gt; (a multi-lingual Mind Map for wikipedia) or &lt;a href="http://www.mind42.com/"&gt;Mind42&lt;/a&gt; which is an online version with collaboration built-in.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="cursor: pointer;" src="http://www.mobiusdevelopment.com/dev/images/example.png" alt="Mind Map Example" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You'll notice that you can mark items complete, and color-code parts of the map. The idea is similar to Concept Mapping, but it requires a hub, or central thought that topics flow out from. This is not a limitation, but forces us to focus on the project at hand. Place the project name (or phase name on larger projects) in the center and you are off to the races.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Project Managers might use this when building a risk register or qualitative risk analysis. Maybe this approach can be useful if used in the Initiating phase to manage the scope of the project. But what is a Project Manager to do with this once they are done? Do we have another tool to try to integrate? No. Click on over to the downloads center and check out our &lt;a href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=5765697756647927831"&gt;MindMap to Microsoft Project 2007 conversion tool&lt;/a&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=5765697756647927831%20"&gt;.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Pros&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;   Focus on core deliverable&lt;/li&gt;&lt;li&gt;   Easier to brainstorm risks and opportunities&lt;/li&gt;&lt;li&gt;   Less formal approach allows for more collaboration.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Cons&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;   Difficult to schedule tasks&lt;/li&gt;&lt;li&gt;   Difficult to estimate costs.&lt;/li&gt;&lt;li&gt;   Inability to perform resource scheduling and leveling.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-6147671708678475825?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-1375360325181077569</id><title type="text">Troubleshooting Sharepoint Designer</title><published>2007-09-04T07:50:00-07:00</published><updated>2008-11-20T11:14:22-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1375360325181077569" /><link rel="alternate" type="text/html" title="Troubleshooting Sharepoint Designer" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=1375360325181077569" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Are you sick &amp;amp; tired of getting the following error in Sharepoint Designer 2007 whenever you try to check-in a file?&lt;br /&gt;&lt;br /&gt;&lt;p&gt;"Cannot perform this operation. The file is no longer checked out or has been deleted."&lt;/p&gt;Let's first ensure that the problem is in the Designer and not your MOSS install.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Are you trying to edit a document template, OR are you trying to edit content pages. Sharepoint Designer is ONLY for the template pages. Content is managed in IE via the publishing features of your site. Stop and return to your site to manage content.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Login to your gallery administration page at Site Settings | Galleries |  and try to perform a check-in from here.  If it doesn't work, stop now and return to Google. you have other problems as well. If this works, then your MOSS install is ok, and the problem is definitely with Sharepoint Designer 2007. Continue for further troubleshooting&lt;/li&gt;&lt;/ol&gt;Witches brew of Sharepoint Designer fixes&lt;br /&gt;&lt;ol&gt;&lt;li&gt;   Clear out IE temporary files&lt;/li&gt;&lt;li&gt;   Delete %UserProfile%\AppData\Local\Microsoft\WebsiteCache&lt;/li&gt;&lt;li&gt;   Make sure that Sharepoint Designer is pointing to the FQDN (http://portal.contoso.com) of the site, not just the server name.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-1375360325181077569?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-6267430192790689712</id><title type="text">HEAT Powershell Snapin</title><published>2007-08-25T07:50:00-07:00</published><updated>2008-12-18T08:30:40-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=6267430192790689712" /><link rel="alternate" type="text/html" title="HEAT Powershell Snapin" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=6267430192790689712" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><category term="PowerShell" scheme="http://www.blogger.com/atom/ns#" /><content type="html">&lt;p&gt;This is a &lt;a href="http://msdn2.microsoft.com/en-us/library/ms714437.aspx"&gt;Powershell Snap-in&lt;/a&gt; for the &lt;a href="http://www.frontrange.com/ProductsSolutions/SubCategory.aspx?id=35&amp;amp;ccid=6"&gt;HEAT&lt;/a&gt; Ticketing System. I've used HEAT at several companies, and I was never able to get an easy snapshot that showed how I was doing at closing HEAT tickets. Since numbers like these are key in determining promotion, raise and so on I took a passing interest. I've retrieved they key (to me) properties about a HEAT ticket and exposed them read-only.    &lt;br /&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;You'll need to change the connection string in the code (unless your computer has a DSN named HEAT). The offending line is line 61 in HEATCmdlet.cs.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Compile the dll&lt;/li&gt;    &lt;li&gt;If you only want to use the snap-in once, then forget about it; you will need to manually register the snap-in with the following commands at a powershell prompt.     &lt;br /&gt;      &lt;ol&gt;       &lt;li&gt;Set-Alias installutil $env:windir\Microsoft.NET\Framework\v2.0.50727\installutil&lt;/li&gt;        &lt;li&gt;installutil c:\Cmdlet\bin\Release\Cmdlet.dll (or wherever you compile to)         &lt;br /&gt;&lt;/li&gt;        &lt;li&gt;Add-PSSnapin HEATCmdletSnapin         &lt;br /&gt;&lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;If you want the snap-in available to you all the time then you need to create a console file and start powershell pointing to the console file. The console file is included in the download. You command should look like &lt;span style="font-style: italic"&gt;powershell -PSConsoleFile HEATconsole.mcf.psc1&lt;/span&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Enjoy quick reporting with Cmdlets like Format-Table and Export-Csv.&lt;/li&gt; &lt;/ol&gt; For more information about Cmdlets, snap-ins, registration and custom consoles check out &lt;a href="http://msdn2.microsoft.com/en-us/library/ms714644.aspx"&gt;MSDN&lt;/a&gt;.  &lt;br /&gt;  &lt;br /&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/Cmdlet.zip"&gt;Download HEAT Powershell Snap-in&lt;/a&gt;  &lt;br /&gt;&lt;span style="font-style: italic"&gt;SHA1: 97a88ce0627eb22dd8aec294986944acab5f4c51&lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-6267430192790689712?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2220979029146374196</id><title type="text">Sharepoint Portal Server 2003 Document Picker</title><published>2007-07-05T08:44:00-07:00</published><updated>2007-07-05T17:42:16-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=2220979029146374196" /><link rel="alternate" type="text/html" title="Sharepoint Portal Server 2003 Document Picker" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=2220979029146374196" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><content type="html">This is a script that has worked for me on several occasions. It will connect to a SharePoint 2003 database and restore a file from the db to your local filesystem. Nice when your db is up, and your portal is down. There are &lt;a href="http://mindsharpblogs.com/james/archive/2005/01/20/189.aspx"&gt;Sharepoint Database Explorers&lt;/a&gt; and so on, but sometimes, a short script is just enough.&lt;br /&gt;&lt;br /&gt;You will need to change the connection string in the script to point to your database install, and you will have to get the DocID from the database, and then the script will write the file out to your C drive.&lt;br /&gt;&lt;br /&gt;Using this script as a base you could&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Restore based on filename rather than DocID&lt;/li&gt;&lt;li&gt;Loop through and export all the docs under a certain site&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/SPS2003_docpicker.vbs"&gt;Download Document Picker vbscript&lt;/a&gt;&lt;br /&gt;&lt;i&gt;SHA1: 561278937EE0275CFA4DE8D2628681A6995C56FC&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2220979029146374196?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4007365630051929559</id><title type="text">MOM 2005 Reporting Workbook</title><published>2007-07-05T08:16:00-07:00</published><updated>2008-12-18T08:44:03-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=4007365630051929559" /><link rel="alternate" type="text/html" title="MOM 2005 Reporting Workbook" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=4007365630051929559" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><content type="html">This is another Excel workbook that queries your MOM server and creates a time-bound report including Alert breakdown by type and server so you can quickly grasp the issues in your environment. It even has pretty graphs for people who don't like reading.  &lt;br /&gt;  &lt;br /&gt;The first time you open this workbook, cancel the original popup. On the front page there is a space for server name. This is where the name of the database server that hosts SystemCenterReporting needs to go. You do have rights to SystemCenterReporting, right? This is all the configuration that should be necessary. Press Ctrl+R, input the date range, and you will have a management-ready report in two minutes or less.  &lt;br /&gt;  &lt;br /&gt;The macro is setup to run every time the workbook is opened. This is great for leaving on a manager's desk so when they open it, they can query a new date range. If you want to have a static report, you need to be mindful of this. If you want to remove this function (forcing you to run the macro manually), just open the macro editor (Alt+F11) and delete the Workbook_Open Sub from the ThisWorkbook object.  &lt;br /&gt;  &lt;br /&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/MOM_reporting.xls"&gt;Download MOM Reporting Template&lt;/a&gt;  &lt;br /&gt;&lt;i&gt;SHA1: 3DB361B9407F5E4EBD155295460042F6C560C76B&lt;/i&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4007365630051929559?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-414296240255694703</id><title type="text">Mutual Fund Portfolio Analyzer</title><published>2007-07-04T20:20:00-07:00</published><updated>2008-02-12T12:03:45-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=414296240255694703" /><link rel="alternate" type="text/html" title="Mutual Fund Portfolio Analyzer" href="http://www.mobiusdevelopment.com/dev/Download.asp?ArticleID=414296240255694703" /><category term="Download" scheme="http://www.blogger.com/atom/ns#" /><content type="html">This is an Excel workbook that allows you to list mutual funds (perhaps those offered by your company) and performs a &lt;a href="http://en.wikipedia.org/wiki/Monte_Carlo_analysis"&gt;Monte Carlo analysis&lt;/a&gt; (up to 32,000 iterations) to determine the optimal portfolio for you (highest &lt;a href="http://en.wikipedia.org/wiki/Sharpe_ratio"&gt;Sharpe ratio&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;This workbook will download annualized data from Yahoo Finance. Also be sure that you have installed the Analysis ToolPak.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Updated for Excel 2007. Now you are no longer limited to 32000 iterations. We can now predict more random futures!!!!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/portfolio_template.xls"&gt;Download Portfolio Analyzer Excel 97-2003&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;SHA1: 0D579AE1D321A66AD64F8D0D02DA657790AA6AFA&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mobiusdevelopment.com/dev/downloads/portfolio_template.xlsm"&gt;Download Portfolio Analyzer Excel 2007&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-414296240255694703?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4805008740303134635</id><title type="text">Sharepoint 2007 Event ID 5165</title><published>2007-06-01T06:51:00-07:00</published><updated>2008-06-01T19:18:51-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4805008740303134635" /><link rel="alternate" type="text/html" title="Sharepoint 2007 Event ID 5165" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4805008740303134635" /><category term="MOSS" scheme="http://www.blogger.com/atom/ns#" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Are you getting 404 errors from pages in your site? Is you Application log filling up with the following Publishing error?&lt;br /&gt;&lt;br /&gt;Console Configuration File Error: File Not Found: The system cannot find the file specified. (Exception from HRESULT: 0x80070002)&lt;br /&gt;&lt;br /&gt;Then you, my friend, have Content Database corruption. Apparently this is common and the error message doesn't point us to a list or site to actually fix this problem. The support I was given consisted of restoring from backups. So be sure to&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use stsadm -o backup from time to time to backup the whole shebang.&lt;/li&gt;&lt;li&gt;Use a maintenance plan in SQL Server to backup the content databases.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Updated 7/3/2007&lt;/i&gt; - If you don't have backups, you can always open the webs content database for the application throwing this error and delete the row that references the missing file. Of course, Microsoft won't support you if you start mucking in the database. You were warned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-4805008740303134635?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-2213105207879735010</id><title type="text">Avoiding Spyware</title><published>2007-04-07T18:03:00-07:00</published><updated>2007-07-04T20:20:32-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2213105207879735010" /><link rel="alternate" type="text/html" title="Avoiding Spyware" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=2213105207879735010" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">I know that you don't want to hear about this, but I have helped so many people with spyware that I want to review some basic precautions you can take to protect yourself.&lt;br /&gt;Motivation&lt;br /&gt;&lt;br /&gt;The first question you might ask is where does spyware come from? Some of it is malicious users who want to highlight perceived deficiencies in software, but the majority of this software has a profit motive (doesn't everything?). Spyware can track your keystrokes and send password information. Or, it might just be a sleazy Marketer who wants to track your every movement. Regardless of the motivation, these programs affect your computer's performance in a very negative manner. A great &lt;a href="http://www.cert.org/archive/pdf/spyware2005.pdf"&gt;description and history of spyware&lt;/a&gt; is available from CERT.&lt;br /&gt;Protection&lt;br /&gt;&lt;br /&gt;The first line of defense is your web browser. If you are using Internet Explorer, I strongly suggest you &lt;a href="http://support.microsoft.com/kb/306525%3Eturn%20on%20Automatic%20Updates%3C/a%3E.%20This%20will%20make%20your%20computer%20contact%20Microsoft%20according%20to%20a%20schedule%20you%20define%20to%20get%20important%20patches%20and%20updates.%20I%20also%20think%20you%20should%20switch%20browsers%20to%20%3Ca%20href=" com=""&gt;Firefox&lt;/a&gt; or &lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt;. These browsers are more secure by design (missing ActiveX), and have the additional benefit of being very portable (read my &lt;a href="http://www.mobiusdevelopment.com/dev/help.asp?ArticleID=6069113360445096252"&gt;thoughts on backups&lt;/a&gt; to understand the benefits.) Although some websites will render incorrectly, I've found this a very, very small price to pay for peace of mind.&lt;br /&gt;&lt;br /&gt;Sometimes, these defenses aren't enough. What else can I use to clear up some aggressive issues? First, run your &lt;a href="http://www.google.com/search?q=virus+scanner"&gt;Virus Scanner&lt;/a&gt; to see if that picks up anything. After that, I suggest a one-two punch of &lt;a href="http://www.safer-networking.org/en/index.html"&gt;SpyBot Search &amp; Destroy&lt;/a&gt; and &lt;a href="http://www.lavasoftusa.com/software/adaware/"&gt;Ad-Aware&lt;/a&gt;. These are spyware scanners that find tracking cookies, web bugs, keyloggers and other browser exploits. Each of these programs will find bots &amp;amp; spyware that the other program misses. I understand Microsoft also has an anti-spyware package. I would suggest against using it at this point as Microsoft will label some "spyware" companies as partners and not flag their programs. I think unaffiliated 3rd parties are a bit more trustworthy in these circumstances.&lt;br /&gt;It's hopeless&lt;br /&gt;&lt;br /&gt;If you are still reading this, then you probably ran the scanners, found programs, and had them cleaned. You felt pretty good. But the next time you booted up, BAM, everything came back. These things are not easy to get rid of. To really clean out your system, first &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;315222"&gt;boot into Safe Mode&lt;/a&gt;. This should keep the programs from starting &amp; re-registering themselves. Now you can run S&amp;amp;D and Ad-Aware with the knowledge that these bugs will stay gone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-2213105207879735010?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-6069113360445096252</id><title type="text">Backups on the cheap</title><published>2007-04-07T17:59:00-07:00</published><updated>2008-12-18T08:27:23-08:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6069113360445096252" /><link rel="alternate" type="text/html" title="Backups on the cheap" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=6069113360445096252" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">We know that everyone has heard this before, and we know that you don't do it. But everyone will learn sooner or later that backups are a necessary evil when dealing with high-tech surprises and good,old-fashioned tragedies. I want to talk to you about how painless doing backups can be.  &lt;br /&gt;Storage  &lt;br /&gt;  &lt;br /&gt;The medium you choose for storage should be related to the amount of data you want to backup. You need to be honest, how much data do you truly need to backup? Home users will want to backup addresses, tax or financial information, pictures, and personal items. Business owners will want to backup contracts, contacts, financial information, and operating data. I would argue that both of these groups can get by with a USB Mini Drive. I know it seems a bit small, but I want you to decide what data you absolutely need to have at a moments notice, and I want you to move other data (3 year old email, 2GB worth of baby photos, ....) off onto CD.  &lt;br /&gt;  &lt;br /&gt;For business owners, this is a great opportunity to take a stock of the information generated by your business. What is valuable data that you can mine for trends? Take the time to identify what is really valuable and back it up regularly. Weekly is the minimum. I would shoot for daily. Store copies offsite. Don't let a break-in or hurricane destroy the information that takes months and years to gather. For businesses that still have a lot of data to backup (up to 200 GB), I would suggest the Maxtor One Touch, because the ease of use makes it more likely that users will actually run the backups.  &lt;br /&gt;Backup Philosophy  &lt;br /&gt;  &lt;br /&gt;Now that you have identified what information you need, I want you to look at how the data is stored. Is it a text format that you can open up and look at? Or print a copy for your accountant? When exporting data for backups, I suggest using a comma delimited format or csv. This format is human readable, so you could print it out and make calls by looking it a piece of paper. It is also recognized by just about every program written since the 1970s. I think there is something incredibly reassuring knowing that you can open up your backups anywhere you are and get back to work.  &lt;br /&gt;Testing  &lt;br /&gt;  &lt;br /&gt;Nobody likes to test their backups. It takes so long just to make them, then you want to go back. This is the most important part. Unverified backups could fail you when you need them most. Take the time once a week to check your backups. This is why you want to use simple, text formats if you can. These will be easier to import/export, and can be visually inspected quickly  &lt;br /&gt;  &lt;br /&gt;We hope you can use these ideas to improve your backup strategy; and we hope you never have to use them.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-6069113360445096252?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-8382103593538651316</id><title type="text">System.Web.Mail and Internationalization</title><published>2007-04-07T17:56:00-07:00</published><updated>2007-07-04T20:20:32-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8382103593538651316" /><link rel="alternate" type="text/html" title="System.Web.Mail and Internationalization" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=8382103593538651316" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">After several days of troubleshooting and head-banging, I discovered (unearthed) a shortcoming of System.Web.Mail that I would like to pass along to the readers.&lt;br /&gt;&lt;br /&gt;System.Web.Mail is a wrapper over CDONTS and CDOSYS depending on the version of Windows that the .NET Framework is installed on. This is important to remember, because even though you may be using the same framework, you will see different results depending on the underlying OS.&lt;br /&gt;&lt;br /&gt;If you are running .NET v1.1 on a Windows Server 2003 host, and sending HTML mail, then you will notice that the Transfer-Encoding value is 7-bit. (This is defined in the &lt;a href="http://www.ietf.org/rfc/rfc2045.txt?number=2045"&gt;MIME standard&lt;/a&gt;) On Windows 2000, the transfer-encoding is iso-8859-1 (or quoted-printable). The problem being that 7-bit does not transfer line breaks.&lt;br /&gt;&lt;br /&gt;You may start receiving "&lt;a href="http://support.microsoft.com/kb/896997"&gt;line too long errors&lt;/a&gt;" from certain mail server/spam filter combinations if you have a long HTML email message that does not line-break every 60 characters or so.&lt;br /&gt;&lt;br /&gt;There is no way in .NET v1.1 to change the transfer-encoding value. You are stuck. Your possible workarounds are:&lt;br /&gt;&lt;br /&gt; * Use COM Interop and write your email using CDO. &lt;a href="http://www.velocityreviews.com/forums/t84332-html-mail.html"&gt;example&lt;/a&gt;&lt;br /&gt; * Write your own SMTP component.&lt;br /&gt; * Buy a third party emailing component.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35507329-8382103593538651316?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35507329.post-4839973099865197387</id><title type="text">Application Center and .NET Global Assemblies</title><published>2007-04-07T17:48:00-07:00</published><updated>2007-07-04T20:20:32-07:00</updated><author><name>John</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13890253729634316735" xmlns:gd="http://schemas.google.com/g/2005"></gd:extendedProperty></author><link rel="self" type="application/atom+xml" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4839973099865197387" /><link rel="alternate" type="text/html" title="Application Center and .NET Global Assemblies" href="http://www.mobiusdevelopment.com/dev/Blog.asp?ArticleID=4839973099865197387" /><category term="Articles" scheme="http://www.blogger.com/atom/ns#" /><content type="html">Have you ever had problems with the App Center mmc? I had a package that I could not update via the GUI, so I went to the docs to find out how to do it on the command line.&lt;br /&gt;&lt;br /&gt;Here is a link to the official documents for managing App Center packages from the command line. &lt;a href="http://www.microsoft.com/technet/prodtechnol/acs/proddocs/accfpr_cmdl_appl.mspx?mfr=true"&gt;ac&lt;/a&gt;&lt;br /&gt;When you add support for .NET assemblies, this &lt;a href="http://support.microsoft.com/?kbid=326950"&gt;App Center&lt;/a&gt; KB article outlines the new resource type: &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;GACObj&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/35507329-4839973099865197387?l=mobiusdevelopment.blogspot.com' alt='' /&gt;&lt;/div&gt;</content></entry></feed>