<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Nickelsalad&#039;s Blog</title>
	<atom:link href="http://nickelsalad.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://nickelsalad.wordpress.com</link>
	<description>My 5¢ worth</description>
	<lastBuildDate>Thu, 01 Oct 2009 23:10:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='nickelsalad.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Nickelsalad&#039;s Blog</title>
		<link>http://nickelsalad.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://nickelsalad.wordpress.com/osd.xml" title="Nickelsalad&#039;s Blog" />
	<atom:link rel='hub' href='http://nickelsalad.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Building a solid dev environment for SharePoint 2007</title>
		<link>http://nickelsalad.wordpress.com/2009/10/01/building-a-solid-dev-environment-for-sharepoint-2007/</link>
		<comments>http://nickelsalad.wordpress.com/2009/10/01/building-a-solid-dev-environment-for-sharepoint-2007/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 23:10:48 +0000</pubDate>
		<dc:creator>nickelsalad</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://nickelsalad.wordpress.com/2009/10/01/building-a-solid-dev-environment-for-sharepoint-2007/</guid>
		<description><![CDATA[Let me just start out by saying that when it comes to SharePoint development environments I think there is no single magic bullet. Also I know I’m not the first one to write about this subject and I’m certainly not the best one to talk about this but I’m going to give it a shot [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nickelsalad.wordpress.com&amp;blog=9545835&amp;post=17&amp;subd=nickelsalad&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Let me just start out by saying that when it comes to SharePoint development environments I think there is no single magic bullet. Also I know I’m not the first one to write about this subject and I’m certainly not the best one to talk about this but I’m going to give it a shot anyway.&#160; I’ve tried quite a few install scenarios and tools trying to find the best setup. I’ve had some mixed luck with those environments but I think I’ve finally found what works for me.    </p>
<h3>Development Machines</h3>
<p>There are a couple of different schools of thought here.&#160; Some people prefer running a virtual dev box on there <a href="http://community.bamboosolutions.com/blogs/bambooteamblog/archive/2008/05/21/how-to-install-windows-sharepoint-services-3-0-sp1-on-vista-x64-x86.aspx">local machine</a> whereas others prefer running on physical hardware or using remote desktop into a development farm. Personally I prefer using server hosted virtual machines. There’s a lot to be said about how much easier it is to clean up your dev boxes after a long running project and the individual developer doesn’t have a powerhouse of a machine. Another real bonus here is that you can setup one development machine as a master and create all of your other dev boxes from it so it’s not only quicker to spin up but you can ensure that <em>all</em> of your developers are using the same tools which is really pretty nice.&#160; </p>
<p>On the note of tools there are some really nice ones out there.&#160; I won’t get into a knockdown drag-out&#160; fight over which tools are best for developing (at least not at this very moment). I’ve used some of the community tools like <a href="http://www.codeplex.com/wspbuilder">WSP Builder</a> and I’ve used several versions of VSE.&#160; I will say that <a href="http://www.microsoft.com/downloads/details.aspx?familyid=FB9D4B85-DA2A-432E-91FB-D505199C49F6&amp;displaylang=en">VSeWSS 1.3</a> is <strong>much</strong> better than some previous versions and that if you haven’t tried it you probably should. The real important thing to understand here is that it’s not about which tool you use, it’s about using the same tool every time.</p>
<h3>Source Control, build machines, and a testing plan</h3>
<p>Ok all of the concepts in this section are miles deep and each deserve more than just a mention but those are posts for another day.&#160; Instead I’m just going to go into what my plan is, proceed at your own caution.</p>
<h4>My Plan:</h4>
<h5>Setup Developer VMs and connect them to TFS.</h5>
<p>Matching the production farm doesn’t make all the difference in the world here. Standalone machines will work fine.&#160; Just make sure that some important things match. If your production farm is x64 that your developer machines are x64. If your production farm is Server 2008 r2 your developer machines are Server 2008 r2.</p>
<h5>Create a SharePoint Dev farm to be build machine one.</h5>
<p>This is where you <em>have</em> to match your production farm as near as possible.&#160; That means you need to match the production topology, service accounts used (if you can), and even SQL configuration.&#160; If anything is different on your production farm <em>that</em> will be the thing that brings down your farm and starts the zombie apocalypse.&#160; Also this is where you want your continuous integration build (build on check-in) to happen. That’s going to be what most clearly separates this build server from any others.</p>
<h5>Create a testing farm to be build machine two.</h5>
<p>Just like the last time if you don’t match the production farm here you’re going to be the one responsible for the zombie apocalypse… do you really want to be that person? The builds on this machine should only be kicked off when code has passed review and is ready to really be tested. You know, by real testers.</p>
<p>Ok, so here’s what that looks like:</p>
<p>Developers –&gt; TFS –&gt;&#160; Dev Farm –&gt; Test Farm –&gt; Production</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nickelsalad.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nickelsalad.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nickelsalad.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nickelsalad.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nickelsalad.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nickelsalad.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nickelsalad.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nickelsalad.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nickelsalad.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nickelsalad.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nickelsalad.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nickelsalad.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nickelsalad.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nickelsalad.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nickelsalad.wordpress.com&amp;blog=9545835&amp;post=17&amp;subd=nickelsalad&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nickelsalad.wordpress.com/2009/10/01/building-a-solid-dev-environment-for-sharepoint-2007/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ca99104fc3acd9ba61b6e52ac1b997ec?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nickelsalad</media:title>
		</media:content>
	</item>
		<item>
		<title>A touch of code driven governance (part 1)</title>
		<link>http://nickelsalad.wordpress.com/2009/09/26/a-touch-of-code-driven-governance-part-1/</link>
		<comments>http://nickelsalad.wordpress.com/2009/09/26/a-touch-of-code-driven-governance-part-1/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 05:03:15 +0000</pubDate>
		<dc:creator>nickelsalad</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Governance]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://nickelsalad.wordpress.com/?p=6</guid>
		<description><![CDATA[I may be wrong but it seems like often in the world of SharePoint everything starts out in a nice peaceful land with limitless possibilities. The only problem with our near utopian SharePoint land is when someone has the wonderful idea of handing out Team Sites like kittens. Usually this also seems to be followed [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nickelsalad.wordpress.com&amp;blog=9545835&amp;post=6&amp;subd=nickelsalad&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I may be wrong but it seems like often in the world of SharePoint everything starts out in a nice peaceful land with limitless possibilities. The only problem with our near utopian SharePoint land is when someone has the wonderful idea of handing out Team Sites like kittens. Usually this also seems to be followed by a little governance. The problem, it seems, is that the people who inhabit our magical SharePoint farm want to do things&#8230; things that you, the big bad admin (or in my case developer), don&#8217;t want them to do.  Now I&#8217;m as big of a Microsoft fan as a person can be without having a Windows 3.1 prison tattoo but personally I can&#8217;t handle the fact that someone could change the master page that I took days to painstakingly hand craft and replace it with the default.master simply because they are a site owner and they have an &#8220;eye for design&#8221;. But it really goes deeper than that. Now that they have a team site they want to be able to create 100s of sites under that one team site? not on my watch. &lt;/rant&gt;</p>
<p>So what&#8217;s a dev to do?</p>
<p>I thought I&#8217;d write a little code to help remedy my little situation.  Ofcourse I in no way consider myself to be capable of writing a coherent sentence in the English language, much less good code but I&#8217;ve never let that stop me in either case&#8230; so if the code makes you wince, don&#8217;t say I didn&#8217;t warn you (also feel free to comment).</p>
<p>So to accomplish my evil deed I decided to write an IHttpModule and change the unwitting users mind for them (also please excuse the nasty formatting, i&#8217;m still pretty new to this blogging thing).  Another side note here is that along the way I built a feature to take my master pages and put them in a CustomMasters folder in the 12 hive so they would be available farm wide.</p>
<blockquote><p> <br />
<span style="color:#0000ff;">class </span>SystemMasterModule : IHttpModule</p>
<p>    {<br />
        public void Init(HttpApplication context)<br />
        {<br />
            context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);<br />
        }<br />
        void context_PreRequestHandlerExecute(object sender, EventArgs e)<br />
        {<br />
            Page page = HttpContext.Current.CurrentHandler as Page;<br />
            if (page != null)<br />
            {<br />
                if (page is PublishingLayoutPage || page is TemplateRedirectionPage)<br />
                {<br />
                 SPContext.Current.Web.CustomMasterUrl = <span style="color:#ff0000;">&#8220;/_LAYOUTS/CustomMasters/Standard.master&#8221;</span>;<br />
                 SPContext.Current.Web.MasterUrl = <span style="color:#ff0000;">&#8220;/_LAYOUTS/CustomMasters/Standard.master&#8221;</span>;<br />
                }<br />
                page.PreInit += new EventHandler(page_PreInit);<br />
            }<br />
        }</p></blockquote>
<p> So in this section I&#8217;ve inspected the request to see if the user in question has requested a publishing page&#8230; if they have I set the master page. There&#8217;s really not much else going on here but I&#8217;ve found out that publishing pages can be a very specific pain in the ass so they get their own section.</p>
<blockquote><p>void page_PreInit(object sender, EventArgs e)<br />
{<br />
List&lt;string&gt; safeMasterFiles = new List&lt;string&gt;();<br />
safeMasterFiles.Add(&#8220;simple.master&#8221;);<br />
safeMasterFiles.Add(&#8220;ActivityUIMasterPage.master&#8221;);<br />
safeMasterFiles.Add(&#8220;dialog.master&#8221;);<br />
safeMasterFiles.Add(&#8220;layouts.master&#8221;);<br />
safeMasterFiles.Add(&#8220;pickerdialog.master&#8221;);<br />
safeMasterFiles.Add(&#8220;sspadmin.master&#8221;);</p>
<p>try<br />
{<br />
Page page = sender as Page;<br />
if (page != null)<br />
{<br />
string redirectURL = &#8220;http://mySharePointServer/landing.aspx&#8221;;<br />
string matchString = &#8220;newsbweb.aspx;/teams/&#8221;.ToLower();<br />
if (!string.IsNullOrEmpty(matchString))<br />
{<br />
string request = page.Request.RawUrl.ToLower();<br />
List&lt;bool&gt; isMatch = new List&lt;bool&gt;();<br />
List&lt;string&gt; req = new List&lt;string&gt; (matchString.Split(new char[] { &#8216;;&#8217; }));<br />
foreach (string match in requestMatch)<br />
{<br />
if (request.Contains(match))<br />
{<br />
isMatch.Add(true);<br />
}</p>
<p>else<br />
{<br />
isMatch.Add(false);<br />
}<br />
}<br />
if (!isMatch.Contains(false))<br />
{<br />
page.Response.Redirect(redirectURL);<br />
}<br />
}</p>
<p>if (page.MasterPageFile != null &amp;&amp; !safeMasterFiles.Contains(page.MasterPageFile))<br />
{<br />
if (page.MasterPageFile.Contains(&#8220;application.master&#8221;))<br />
{<br />
page.MasterPageFile = &#8220;/_LAYOUTS/CustomMasters/Standard.master&#8221;;<br />
}<br />
}<br />
}<br />
}<br />
catch<br />
{<br />
}<br />
}<br />
 </p></blockquote>
<p>Alright theres a lot going on here really. First and foremost I&#8217;m creating a List for all of my safe master pages. This is important! Not all master pages are equal, some of them do very specific things and are not always worth modifying! For me, and the requirements of the governance model created by the farm administrator, I didn&#8217;t need to make every last master look exactly the same&#8230; only 90% of what the end user sees. The next major piece is my favorite <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .  We set a redirect path and capture the request event to see if that pesky user is trying to make a new site under one that they own.  In my case the user owned sites all live under a managed path of teams; so basically what is happening here is that I am feeding the code a set of conditions and telling it if the user requests a page that matches /teams/ AND newsbweb.aspx (which is the aspx page for creating new sites) then they need to be redirected to the root of my SharePoint farm.  This is not however the last stop for this particular governance train.  Finally ratchet through all of the master pages, making sure not to step on the toes of one of those safe/utility masters and if the requested page doesn&#8217;t need either one of those or is a publishing site I go ahead and set it to a particular master file.</p>
<p>So that&#8217;s part one in a nutshell.  The next step is to create property bags for the blocked sites so that the farm admin can leverage our redirect to block out any number of request combinations according to our governance plan&#8230; but that&#8217;s part 2 <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Also if anyone sees any obvious errors (or just dumb coding) please let me know. ofcourse all comments are welcome.</p>
<p> </p>
<p>&lt;Nickel /&gt;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nickelsalad.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nickelsalad.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nickelsalad.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nickelsalad.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nickelsalad.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nickelsalad.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nickelsalad.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nickelsalad.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nickelsalad.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nickelsalad.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nickelsalad.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nickelsalad.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nickelsalad.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nickelsalad.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nickelsalad.wordpress.com&amp;blog=9545835&amp;post=6&amp;subd=nickelsalad&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nickelsalad.wordpress.com/2009/09/26/a-touch-of-code-driven-governance-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ca99104fc3acd9ba61b6e52ac1b997ec?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nickelsalad</media:title>
		</media:content>
	</item>
		<item>
		<title>The ball is officially rolling</title>
		<link>http://nickelsalad.wordpress.com/2009/09/18/hello-world/</link>
		<comments>http://nickelsalad.wordpress.com/2009/09/18/hello-world/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 13:23:45 +0000</pubDate>
		<dc:creator>nickelsalad</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Alright I&#8217;m not very good at the whole blogging thing, mostly because I&#8217;ve never really tried, but I&#8217;m thinking it&#8217;s about time for me to start giving back a little to the community. What am I giving back to which community exactly? Well if there is a community of socially deficient, caffeine driven, beer loving crazies then [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nickelsalad.wordpress.com&amp;blog=9545835&amp;post=1&amp;subd=nickelsalad&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Alright I&#8217;m not very good at the whole blogging thing, mostly because I&#8217;ve never really tried, but I&#8217;m thinking it&#8217;s about time for me to start giving back a little to the community. What am I giving back to which community exactly? Well if there is a community of socially deficient, caffeine driven, beer loving crazies then I definitely have a thing or two to contribute&#8230; otherwise I code a bit (poorly in my opinion and generally with the finesse of a brick) and I do a bit of admin work from time to time. </p>
<p>What exactly do I code you ask?</p>
<p>Don&#8217;t be coy I heard you ask all the way over here. For the past 3 years or so I&#8217;ve been mostly working with SharePoint but I&#8217;ve been known to work on Sitecore and a smattering of other languages. I&#8217;d like to think that the grey (or gray if you will) area between admin and developer is mostly my strong point but I really have yet to prove that.</p>
<p>At any rate beer is calling and I&#8217;ve run out of interesting coversation with this text box but hopefully there will be more to come.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nickelsalad.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nickelsalad.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nickelsalad.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nickelsalad.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nickelsalad.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nickelsalad.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nickelsalad.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nickelsalad.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nickelsalad.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nickelsalad.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nickelsalad.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nickelsalad.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nickelsalad.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nickelsalad.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nickelsalad.wordpress.com&amp;blog=9545835&amp;post=1&amp;subd=nickelsalad&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nickelsalad.wordpress.com/2009/09/18/hello-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ca99104fc3acd9ba61b6e52ac1b997ec?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nickelsalad</media:title>
		</media:content>
	</item>
	</channel>
</rss>
