<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title type="text">Brian Farnhill's SharePoint Blog</title>
  <subtitle type="text">The blog of SharePoint Server MVP Brian Farnhill</subtitle>
  <id>http://blog.brianfarnhill.com/feed/</id>
  <updated>2012-05-17T07:43:06+01:00</updated>
  <link rel="alternate" href="http://blog.brianfarnhill.com/blog" />
  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/BrianFarnhill" /><feedburner:info uri="brianfarnhill" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>BrianFarnhill</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
    <id>http://blog.brianfarnhill.com/2012/05/17/dev-presentation-slides</id>
    <title type="text">My SharePoint Developer Session Slides</title>
    <summary type="html">&lt;p&gt;A few weeks back I had the pleasure of presenting at the Australian and New Zealand SharePoint confernces. The session I did was a bit of an 'introduction to ALM for SharePoint developers' and it was pretty well received by the crowds at both conferences.&lt;/p&gt;

&lt;p&gt;As promised (and somewhat late I know), here is all the content from my session. Below is the link to download the source code, as well as the PowerPoint slides. Also I did promise I would publish the results of the survey I discussed during the session as well.&lt;/p&gt;

&lt;p&gt;If you have any questions or comments, make sure you let me know - I would love to hear from you.&lt;/p&gt;

&lt;iframe src="https://r.office.microsoft.com/r/rlidPowerPointEmbed?p1=1&amp;p2=1&amp;p3=SD9CCB265E529D567A!1230&amp;p4=&amp;ak=!AOYxF-du3lieP88&amp;kip=1" width="402" height="327" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="http://c281802.r2.cf1.rackcdn.com/Presentations/AUSPC-2012-SourceCode.zip"&gt;Download source code&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2012/05/17/dev-presentation-slides" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2012%2f05%2f17%2fdev-presentation-slides&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2012-05-17T07:43:00+01:00</published>
    <updated>2012-05-17T07:43:06+01:00</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/_XvzKyPdC9A/dev-presentation-slides" />
    <category term="presentations" />
    <category term="deployment" />
    <content type="html">&lt;p&gt;A few weeks back I had the pleasure of presenting at the Australian and New Zealand SharePoint confernces. The session I did was a bit of an 'introduction to ALM for SharePoint developers' and it was pretty well received by the crowds at both conferences.&lt;/p&gt;

&lt;p&gt;As promised (and somewhat late I know), here is all the content from my session. Below is the link to download the source code, as well as the PowerPoint slides. Also I did promise I would publish the results of the survey I discussed during the session as well.&lt;/p&gt;

&lt;p&gt;If you have any questions or comments, make sure you let me know - I would love to hear from you.&lt;/p&gt;

&lt;iframe src="https://r.office.microsoft.com/r/rlidPowerPointEmbed?p1=1&amp;p2=1&amp;p3=SD9CCB265E529D567A!1230&amp;p4=&amp;ak=!AOYxF-du3lieP88&amp;kip=1" width="402" height="327" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="http://c281802.r2.cf1.rackcdn.com/Presentations/AUSPC-2012-SourceCode.zip"&gt;Download source code&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2012/05/17/dev-presentation-slides" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2012%2f05%2f17%2fdev-presentation-slides&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=_XvzKyPdC9A:dzFzO1MgFEM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=_XvzKyPdC9A:dzFzO1MgFEM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=_XvzKyPdC9A:dzFzO1MgFEM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=_XvzKyPdC9A:dzFzO1MgFEM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=_XvzKyPdC9A:dzFzO1MgFEM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/_XvzKyPdC9A" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2012/05/17/dev-presentation-slides</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2012/2/22/detect-if-wp7-has-a-data-connection</id>
    <title type="text">Detect if WP7 has a data connection</title>
    <summary type="html">&lt;p&gt;I've been doing some work with Windows Phone 7 development of late, and the other day I got around to submitting my first app to the marketplace ... and it got knocked back! The reason was that the application fell over due to some unhandled exceptions when the app was run without an active data connection. &lt;/p&gt;

&lt;p&gt;After a bit of a search I tuned up some code that will let you determine if the phone has an active data connection, which I could implement easily enough and then conditionally run the code that requires an internet connection. You can check for the connection like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (NetworkInterface.GetIsNetworkAvailable())
{
    // do something here
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now there are some problems with this though - and not with the code itself, but some "gotchas" that apply to when you debug this code. Firstly, from what I've seen you can't get the emulator to act as if the data connection is off. If you disable your PC's interenet connection your calls will just time out, but this method will still return true.&lt;/p&gt;

&lt;p&gt;The next test I did was on the device itself, so I plugged in and set VS to debug from the device, and even when I put the phone in to flight mode it was still returning true. It was only when I unplugged the phone from my laptop all together and ran the app again that I saw what I expected. My best guess as to why this is happening is that the phone treats the USB connection as a data connection, and as such that method will return true.&lt;/p&gt;

&lt;p&gt;So the network availability check seems to just test for any kind of network connectivity, not an internet connection specifically. Probably worth knowing and in your code making sure that your HTTP calls and other internet access is still properlly error handled for things like time outs and other errors, and also use this check to try to head off the obvious scenarios where you know for sure there wont be a connection.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2012/2/22/detect-if-wp7-has-a-data-connection" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2012%2f2%2f22%2fdetect-if-wp7-has-a-data-connection&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2012-02-22T11:35:07Z</published>
    <updated>2012-02-22T11:35:07Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/4CiYe_3rCrE/detect-if-wp7-has-a-data-connection" />
    <category term="WindowsPhone" />
    <content type="html">&lt;p&gt;I've been doing some work with Windows Phone 7 development of late, and the other day I got around to submitting my first app to the marketplace ... and it got knocked back! The reason was that the application fell over due to some unhandled exceptions when the app was run without an active data connection. &lt;/p&gt;

&lt;p&gt;After a bit of a search I tuned up some code that will let you determine if the phone has an active data connection, which I could implement easily enough and then conditionally run the code that requires an internet connection. You can check for the connection like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (NetworkInterface.GetIsNetworkAvailable())
{
    // do something here
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now there are some problems with this though - and not with the code itself, but some "gotchas" that apply to when you debug this code. Firstly, from what I've seen you can't get the emulator to act as if the data connection is off. If you disable your PC's interenet connection your calls will just time out, but this method will still return true.&lt;/p&gt;

&lt;p&gt;The next test I did was on the device itself, so I plugged in and set VS to debug from the device, and even when I put the phone in to flight mode it was still returning true. It was only when I unplugged the phone from my laptop all together and ran the app again that I saw what I expected. My best guess as to why this is happening is that the phone treats the USB connection as a data connection, and as such that method will return true.&lt;/p&gt;

&lt;p&gt;So the network availability check seems to just test for any kind of network connectivity, not an internet connection specifically. Probably worth knowing and in your code making sure that your HTTP calls and other internet access is still properlly error handled for things like time outs and other errors, and also use this check to try to head off the obvious scenarios where you know for sure there wont be a connection.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2012/2/22/detect-if-wp7-has-a-data-connection" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2012%2f2%2f22%2fdetect-if-wp7-has-a-data-connection&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=4CiYe_3rCrE:IG-FQx_q-kc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=4CiYe_3rCrE:IG-FQx_q-kc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=4CiYe_3rCrE:IG-FQx_q-kc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=4CiYe_3rCrE:IG-FQx_q-kc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=4CiYe_3rCrE:IG-FQx_q-kc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/4CiYe_3rCrE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2012/2/22/detect-if-wp7-has-a-data-connection</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/sp-dev-survey</id>
    <title type="text">SharePoint developer survey</title>
    <summary type="html">&lt;p&gt;I will be presenting a session at both the &lt;a href="http://www.sharepointconference.com.au/2012/SitePages/Home.aspx"&gt;Australian&lt;/a&gt; and &lt;a href="http://www.sharepointconference.co.nz/2012/SitePages/Home.aspx"&gt;New Zealand&lt;/a&gt; SharePoint conferences in March this year called "Managing Application Development for SharePoint 2010". I've got a bunch of great content that I want to present there, but as part of the session I'm very keen to get some more information from a wider audience about how the rest of world goes about managing SharePoint development. &lt;/p&gt;

&lt;p&gt;So to help with this, I've put together a quick &lt;a href="https://www.surveymonkey.com/s/2012SPDevSurvey"&gt;survey&lt;/a&gt; on SurveyMonkey so you can let me know what you think. The whole thing is multiple choice so you can just click your way through it (unless you like using the "other" box, then you will need to type!). There are 16 questions to it, so it should only take you a couple of minutes to fill out.&lt;/p&gt;

&lt;p&gt;Also, I'm not above trying to buy your information - so that that extent I'm going to put up a small prize for those who fill out the survey. I just took delivery of a few copies of the book I contributed a chapter to called "&lt;a href="http://www.amazon.com/Expert-SharePoint-Practices-Sahil-Malik/dp/1430238704/ref=sr_1_1?ie=UTF8&amp;amp;qid=1327883883&amp;amp;sr=8-1"&gt;Expert SharePoint 2010 Practices&lt;/a&gt;", so I will draw a winner at random from the list of results to give a copy to!&lt;/p&gt;

&lt;p&gt;So what are you waiting for - head over to the survey and let me know your responses. I'll publish the full information after my session at the Australian SharePoint conference (which is March 20) so you can all see as well. Thanks in advance for participating guys! Make sure you spread the word&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Take the survey! &lt;a href="https://www.surveymonkey.com/s/2012SPDevSurvey"&gt;https://www.surveymonkey.com/s/2012SPDevSurvey&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/sp-dev-survey" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2fsp-dev-survey&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2012-01-30T00:40:15Z</published>
    <updated>2012-01-30T00:40:15Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/PKKG-exNtdU/sp-dev-survey" />
    <category term="sharepoint" />
    <category term="presentations" />
    <content type="html">&lt;p&gt;I will be presenting a session at both the &lt;a href="http://www.sharepointconference.com.au/2012/SitePages/Home.aspx"&gt;Australian&lt;/a&gt; and &lt;a href="http://www.sharepointconference.co.nz/2012/SitePages/Home.aspx"&gt;New Zealand&lt;/a&gt; SharePoint conferences in March this year called "Managing Application Development for SharePoint 2010". I've got a bunch of great content that I want to present there, but as part of the session I'm very keen to get some more information from a wider audience about how the rest of world goes about managing SharePoint development. &lt;/p&gt;

&lt;p&gt;So to help with this, I've put together a quick &lt;a href="https://www.surveymonkey.com/s/2012SPDevSurvey"&gt;survey&lt;/a&gt; on SurveyMonkey so you can let me know what you think. The whole thing is multiple choice so you can just click your way through it (unless you like using the "other" box, then you will need to type!). There are 16 questions to it, so it should only take you a couple of minutes to fill out.&lt;/p&gt;

&lt;p&gt;Also, I'm not above trying to buy your information - so that that extent I'm going to put up a small prize for those who fill out the survey. I just took delivery of a few copies of the book I contributed a chapter to called "&lt;a href="http://www.amazon.com/Expert-SharePoint-Practices-Sahil-Malik/dp/1430238704/ref=sr_1_1?ie=UTF8&amp;amp;qid=1327883883&amp;amp;sr=8-1"&gt;Expert SharePoint 2010 Practices&lt;/a&gt;", so I will draw a winner at random from the list of results to give a copy to!&lt;/p&gt;

&lt;p&gt;So what are you waiting for - head over to the survey and let me know your responses. I'll publish the full information after my session at the Australian SharePoint conference (which is March 20) so you can all see as well. Thanks in advance for participating guys! Make sure you spread the word&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Take the survey! &lt;a href="https://www.surveymonkey.com/s/2012SPDevSurvey"&gt;https://www.surveymonkey.com/s/2012SPDevSurvey&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/sp-dev-survey" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2fsp-dev-survey&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=PKKG-exNtdU:dXYZVWVopqo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=PKKG-exNtdU:dXYZVWVopqo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=PKKG-exNtdU:dXYZVWVopqo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=PKKG-exNtdU:dXYZVWVopqo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=PKKG-exNtdU:dXYZVWVopqo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/PKKG-exNtdU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/sp-dev-survey</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/how-i-migrted-to-funnelbeb-from-wordpress</id>
    <title type="text">How I migrted to FunnelWeb from WordPress</title>
    <summary type="html">&lt;p&gt;So as mentioned previously, I migrated my blog from WordPress to &lt;a href="http://www.funnelweblog.com/"&gt;FunnelWeb&lt;/a&gt; - in this post I'm going to explain the steps I went through to get from the idea of moving the blog, to the text you're reading on your screen right now. &lt;/p&gt;

&lt;h2&gt;Getting the code&lt;/h2&gt;

&lt;p&gt;FunnelWeb is an open source project, hosted on &lt;a href="https://bitbucket.org/FunnelWeb/release/overview"&gt;BitBucket&lt;/a&gt; - so the first step was getting myeslf a copy of the code to be able to play around with. Given that I had no experience with mercurial before this, I had to do a little bit of playing around with things to get it all sorted. I began by installing &lt;a href="http://tortoisehg.bitbucket.org/"&gt;TortoiseHg&lt;/a&gt; to give me a GUI, and then creating a clone of the repository locally on my laptop.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hg clone https://bitbucket.org/FunnelWeb/release
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I did this part via the command line tool, but after a while it had downloaded my clone of the repository and I could attempt to run the tool locally&lt;/p&gt;

&lt;h2&gt;Customising my install&lt;/h2&gt;

&lt;p&gt;So before I rolled it out, I wanted to customise a few things about the app - all of which were essentially look and feel realted. To achieve this, I created myself a new theme to apply to the blog (this meant all my customisations would be in new files rather than modifying existing files, which would mean that it would be easier to merge changes in to the app later on). I created myself a new folder under src\FunnelWeb.Web\Themes called BrianFarnhill, and the added myself a style sheet, some images and then added a few views to overwrite the out of the box ones where I needed to make minor HTML changes. &lt;/p&gt;

&lt;h2&gt;Hosting and deploying&lt;/h2&gt;

&lt;p&gt;Once I was ready to try pushing it out I had a look around at hositng options, and I was recommended to look at &lt;a href="http://appharbor.com/"&gt;AppHarbor&lt;/a&gt;. Appharbor is a great way to host .NET applications and it does some very cool stuff around running tests and deploying files to the web servers for you. So to get my code on to thier servers I needed to push it to somewhere that they could deploy from. I decided to push mine to a private repo on BitBucket (so seperate from the main FunnelWeb one that I got the code from) and have it deploy from there. There is a good guide on Appharbor about how to do this, but basically the premise is that you grant read only access to the AppHarbor account and add a POST request to the BitBucket actions for what happens on a commit. This means that when I do a push, BitBucket will let AppHarbor know and they will grab the code, build it and run tests and if the tests pass, deploy the files to the web server.&lt;/p&gt;

&lt;p&gt;I did add the SQL Server add on to my AppHarbor app which gives me 20MB worth of database space to run the application. It's important to keep in mind that with Appharbor everytime they deploy your app they wipe out the files on the server and replace it with the build output. Having the database meant that my blog posts were protected from being wiped out - but I needed an alternative for images and attachments. From another recommendation I looked at &lt;a href="http://www.rackspace.com/cloud/cloud_hosting_products/files/"&gt;RackSpace's CloudFiles&lt;/a&gt;. This was a dirt cheap way of hosting files in the cloud, and using a tool like &lt;a href="http://cyberduck.ch/"&gt;CyberDuck&lt;/a&gt; it's easy to upload them and then the files are published across the Akami CDN as well. So I got that set up and moved all my attachments to that.&lt;/p&gt;

&lt;h2&gt;Configuration&lt;/h2&gt;

&lt;p&gt;To get my app playing nice in both the local install and the remote AppHarbor install I needed to be able to tweak the config files use use &lt;a href="http://support.appharbor.com/kb/getting-started/managing-environments"&gt;configuration transformations&lt;/a&gt;. FunnelWeb puts some of its config in the "my.config" file, things like admin username, password and SQL connection string. So I created my.Debug.config and my.Release.config and used some transformations in there so that AppHarbor would be able to resolve the release settings for it's deployment and locally it would use the default settings in the my.config file. In the release file I had the following code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;funnelweb xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"&amp;gt;
    &amp;lt;setting key="funnelweb.configuration.database.connection" value="[my connection string]" xdt:Locator="Match(key)" xdt:Transform="Replace" /&amp;gt;
    &amp;lt;setting key="funnelweb.configuration.authentication.username" value="[My username]" xdt:Locator="Match(key)" xdt:Transform="Replace" /&amp;gt;
    &amp;lt;setting key="funnelweb.configuration.authentication.password" value="[my password]" xdt:Locator="Match(key)" xdt:Transform="Replace" /&amp;gt;
&amp;lt;/funnelweb&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The xdt tags are used to dictate how the tags should be merged in to the original config. Each tag I specifiy that they should replace a tag in the source, and that tag should be found by matching the 'Key' attribute. &lt;/p&gt;

&lt;h2&gt;Migrating content&lt;/h2&gt;

&lt;p&gt;Once I had the code running I needed to work out how I could move the content I had in my existing blog across to this new one. FunnelWeb has a BlogML import option, so I needed to get the content across. I spoke about the tool I wrote for this (called WXRtoBlogML) in my &lt;a href="http://support.appharbor.com/kb/getting-started/managing-environments"&gt;previous post&lt;/a&gt; so I wont elaborate on it too much.&lt;/p&gt;

&lt;h2&gt;Issues I came across&lt;/h2&gt;

&lt;p&gt;Once I got the content in to the new blog, I did still have some issues to address before going live - and these were all to do with content and stemmed from decisions I made many moons ago when working with the very first version of my blog which ran on Windows Live Spaces. To get my source code to appear formated in that blog I used a tool which generated the HTML styles needed from the source code, and it saved the HTML. This was great at the time, but when it came to using this elsewhere it was painful. I needed to manually clean up a lot of this rubbish as when I tried to run it through a couple of tools it all went a bit pear shaped. So I spent a lot of time working to manually clean up my posts and convert them all from HTML to Markdown. As part of this I cleaned up source code, uploaded images to my CloudFiles account, and corrected any tags and added introductions to each post. This was the most painful and time consuming part of the migration, and looking back I should have automated some of this, but oh well - it's done now.&lt;/p&gt;

&lt;p&gt;The other issue I found (and in honesty was too lazy to solve) was around having AppHarbor run the unit tests for FunnelWeb - it was always failing them, and it's because there was no SQL express install for it to test those methods against, meaning that it would always fail no matter what. To get around this I basically got AppHarbor to ignore the tests all together (told you it was lazy!). If you create a solution file called AppHarbor.sln it will be the solution that gets build in place of any other solution file in the code repository. So I copied the original solution file, renamed it and then took out the test project. Cheating, I know - but it got it going and I can run the tests locally to be sure that I haven't broken anything major (I know the tests should be running in Appharbor to ensure there are no environment specific things affecting them, but whatever!)&lt;/p&gt;

&lt;p&gt;&lt;hr /&gt;&lt;/p&gt;

&lt;p&gt;So that's the gist of the process involved in moving from WordPress to FunnelWeb - hopefully it will help others who are thinking about making the move. I've got a bunch of ideas of things I want to do with the blog now I have control over the source code. It's also proving to be a neat way for me to start understanding ASP.NET MVC3 as well, so it's all a winner in my book!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/how-i-migrted-to-funnelbeb-from-wordpress" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2fhow-i-migrted-to-funnelbeb-from-wordpress&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2012-01-29T05:35:34Z</published>
    <updated>2012-01-29T05:35:34Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/rVJhrX87u_8/how-i-migrted-to-funnelbeb-from-wordpress" />
    <category term="FunnelWeb" />
    <category term="AppHarbor" />
    <category term="BitBucket" />
    <content type="html">&lt;p&gt;So as mentioned previously, I migrated my blog from WordPress to &lt;a href="http://www.funnelweblog.com/"&gt;FunnelWeb&lt;/a&gt; - in this post I'm going to explain the steps I went through to get from the idea of moving the blog, to the text you're reading on your screen right now. &lt;/p&gt;

&lt;h2&gt;Getting the code&lt;/h2&gt;

&lt;p&gt;FunnelWeb is an open source project, hosted on &lt;a href="https://bitbucket.org/FunnelWeb/release/overview"&gt;BitBucket&lt;/a&gt; - so the first step was getting myeslf a copy of the code to be able to play around with. Given that I had no experience with mercurial before this, I had to do a little bit of playing around with things to get it all sorted. I began by installing &lt;a href="http://tortoisehg.bitbucket.org/"&gt;TortoiseHg&lt;/a&gt; to give me a GUI, and then creating a clone of the repository locally on my laptop.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hg clone https://bitbucket.org/FunnelWeb/release
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I did this part via the command line tool, but after a while it had downloaded my clone of the repository and I could attempt to run the tool locally&lt;/p&gt;

&lt;h2&gt;Customising my install&lt;/h2&gt;

&lt;p&gt;So before I rolled it out, I wanted to customise a few things about the app - all of which were essentially look and feel realted. To achieve this, I created myself a new theme to apply to the blog (this meant all my customisations would be in new files rather than modifying existing files, which would mean that it would be easier to merge changes in to the app later on). I created myself a new folder under src\FunnelWeb.Web\Themes called BrianFarnhill, and the added myself a style sheet, some images and then added a few views to overwrite the out of the box ones where I needed to make minor HTML changes. &lt;/p&gt;

&lt;h2&gt;Hosting and deploying&lt;/h2&gt;

&lt;p&gt;Once I was ready to try pushing it out I had a look around at hositng options, and I was recommended to look at &lt;a href="http://appharbor.com/"&gt;AppHarbor&lt;/a&gt;. Appharbor is a great way to host .NET applications and it does some very cool stuff around running tests and deploying files to the web servers for you. So to get my code on to thier servers I needed to push it to somewhere that they could deploy from. I decided to push mine to a private repo on BitBucket (so seperate from the main FunnelWeb one that I got the code from) and have it deploy from there. There is a good guide on Appharbor about how to do this, but basically the premise is that you grant read only access to the AppHarbor account and add a POST request to the BitBucket actions for what happens on a commit. This means that when I do a push, BitBucket will let AppHarbor know and they will grab the code, build it and run tests and if the tests pass, deploy the files to the web server.&lt;/p&gt;

&lt;p&gt;I did add the SQL Server add on to my AppHarbor app which gives me 20MB worth of database space to run the application. It's important to keep in mind that with Appharbor everytime they deploy your app they wipe out the files on the server and replace it with the build output. Having the database meant that my blog posts were protected from being wiped out - but I needed an alternative for images and attachments. From another recommendation I looked at &lt;a href="http://www.rackspace.com/cloud/cloud_hosting_products/files/"&gt;RackSpace's CloudFiles&lt;/a&gt;. This was a dirt cheap way of hosting files in the cloud, and using a tool like &lt;a href="http://cyberduck.ch/"&gt;CyberDuck&lt;/a&gt; it's easy to upload them and then the files are published across the Akami CDN as well. So I got that set up and moved all my attachments to that.&lt;/p&gt;

&lt;h2&gt;Configuration&lt;/h2&gt;

&lt;p&gt;To get my app playing nice in both the local install and the remote AppHarbor install I needed to be able to tweak the config files use use &lt;a href="http://support.appharbor.com/kb/getting-started/managing-environments"&gt;configuration transformations&lt;/a&gt;. FunnelWeb puts some of its config in the "my.config" file, things like admin username, password and SQL connection string. So I created my.Debug.config and my.Release.config and used some transformations in there so that AppHarbor would be able to resolve the release settings for it's deployment and locally it would use the default settings in the my.config file. In the release file I had the following code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;funnelweb xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"&amp;gt;
    &amp;lt;setting key="funnelweb.configuration.database.connection" value="[my connection string]" xdt:Locator="Match(key)" xdt:Transform="Replace" /&amp;gt;
    &amp;lt;setting key="funnelweb.configuration.authentication.username" value="[My username]" xdt:Locator="Match(key)" xdt:Transform="Replace" /&amp;gt;
    &amp;lt;setting key="funnelweb.configuration.authentication.password" value="[my password]" xdt:Locator="Match(key)" xdt:Transform="Replace" /&amp;gt;
&amp;lt;/funnelweb&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The xdt tags are used to dictate how the tags should be merged in to the original config. Each tag I specifiy that they should replace a tag in the source, and that tag should be found by matching the 'Key' attribute. &lt;/p&gt;

&lt;h2&gt;Migrating content&lt;/h2&gt;

&lt;p&gt;Once I had the code running I needed to work out how I could move the content I had in my existing blog across to this new one. FunnelWeb has a BlogML import option, so I needed to get the content across. I spoke about the tool I wrote for this (called WXRtoBlogML) in my &lt;a href="http://support.appharbor.com/kb/getting-started/managing-environments"&gt;previous post&lt;/a&gt; so I wont elaborate on it too much.&lt;/p&gt;

&lt;h2&gt;Issues I came across&lt;/h2&gt;

&lt;p&gt;Once I got the content in to the new blog, I did still have some issues to address before going live - and these were all to do with content and stemmed from decisions I made many moons ago when working with the very first version of my blog which ran on Windows Live Spaces. To get my source code to appear formated in that blog I used a tool which generated the HTML styles needed from the source code, and it saved the HTML. This was great at the time, but when it came to using this elsewhere it was painful. I needed to manually clean up a lot of this rubbish as when I tried to run it through a couple of tools it all went a bit pear shaped. So I spent a lot of time working to manually clean up my posts and convert them all from HTML to Markdown. As part of this I cleaned up source code, uploaded images to my CloudFiles account, and corrected any tags and added introductions to each post. This was the most painful and time consuming part of the migration, and looking back I should have automated some of this, but oh well - it's done now.&lt;/p&gt;

&lt;p&gt;The other issue I found (and in honesty was too lazy to solve) was around having AppHarbor run the unit tests for FunnelWeb - it was always failing them, and it's because there was no SQL express install for it to test those methods against, meaning that it would always fail no matter what. To get around this I basically got AppHarbor to ignore the tests all together (told you it was lazy!). If you create a solution file called AppHarbor.sln it will be the solution that gets build in place of any other solution file in the code repository. So I copied the original solution file, renamed it and then took out the test project. Cheating, I know - but it got it going and I can run the tests locally to be sure that I haven't broken anything major (I know the tests should be running in Appharbor to ensure there are no environment specific things affecting them, but whatever!)&lt;/p&gt;

&lt;p&gt;&lt;hr /&gt;&lt;/p&gt;

&lt;p&gt;So that's the gist of the process involved in moving from WordPress to FunnelWeb - hopefully it will help others who are thinking about making the move. I've got a bunch of ideas of things I want to do with the blog now I have control over the source code. It's also proving to be a neat way for me to start understanding ASP.NET MVC3 as well, so it's all a winner in my book!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/how-i-migrted-to-funnelbeb-from-wordpress" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2fhow-i-migrted-to-funnelbeb-from-wordpress&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=rVJhrX87u_8:4G-R9kaHnhg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=rVJhrX87u_8:4G-R9kaHnhg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=rVJhrX87u_8:4G-R9kaHnhg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=rVJhrX87u_8:4G-R9kaHnhg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=rVJhrX87u_8:4G-R9kaHnhg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/rVJhrX87u_8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/how-i-migrted-to-funnelbeb-from-wordpress</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/converting-wordpress-export-to-blogml</id>
    <title type="text">Converting WordPress export to BlogML</title>
    <summary type="html">&lt;p&gt;For those of you who noticed, I have decided to re-platform my blog (again - yea I know, sorry for anyone who got a full list of posts in thier RSS again too) and this time I decided to move away from WordPress and decided to use &lt;a href="http://www.funnelweblog.com"&gt;FunnelWeb&lt;/a&gt;. There is a bunch of stuff I like about FW in general, but that's not what this post is about - this post is to discuss the tool I wrote to assit with the migration. Enter &lt;a href="http://bitbucket.brianfarnhill.com/wxrtoblogml/overview"&gt;WXRtoBlogML&lt;/a&gt; - which I have published the source code to for anyone who is interested in grabbing it. &lt;/p&gt;

&lt;p&gt;Basically the tool is designed to read from an XML export from WordPress (which is in an extended form of RSS called WXR, which stands for WordPress eXtended RSS) and converts it in to BlogML. The tool makes use of &lt;a href="http://msdn.microsoft.com/en-us/library/bb387098.aspx"&gt;LINQ to XML&lt;/a&gt; to read from the source XML file, and uses the &lt;a href="http://nuget.org/packages/blogml"&gt;BlogML&lt;/a&gt; library on Nuget to prepare the and save the new file - there really isn't all that much code involved in it. I also grabbed &lt;a href="http://nuget.org/packages/NDesk.Options/0.2.1"&gt;NDesk.Options&lt;/a&gt; to help with parsing the command line arguments as I decided a command line tool would be all that was needed for this one. &lt;/p&gt;

&lt;p&gt;Source code is on BitBucket at &lt;a href="http://bitbucket.brianfarnhill.com/wxrtoblogml/overview"&gt;http://bitbucket.brianfarnhill.com/wxrtoblogml/overview&lt;/a&gt;
Feel free to fork it and make changes if you like. There is more that can be done with it, at the moment I ignored pages and attachments so there is room for improvement.&lt;/p&gt;

&lt;p&gt;Some quick highlights of the code in the tool - the command line parsing works like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var showHelp = false;
var source = string.Empty;
var output = string.Empty;

var p = new OptionSet
{
    { "s|source=", "the path of the source XML file",
        v =&amp;gt; source = v },
    { "o|output=", "the path to save the resulting XML file",
        v =&amp;gt; output = v},
    { "h|help",  "show this message and exit", 
        v =&amp;gt; showHelp = v != null },
};

try
{
    p.Parse(args);
}
catch (OptionException e)
{
    Console.Write("WXRtoBlogML: ");
    Console.WriteLine(e.Message);
    Console.WriteLine("Try `WXRtoBlogML --help' for more information.");
}

if (showHelp)
{
    ShowHelp(p);
    return;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;NDesk allows us to use some really simple syntax to specify the parameters, thier descriptions, and then with an expression set the parameter to a local variable. Makes working with command line arguments a piece of cake.&lt;/p&gt;

&lt;p&gt;Next was doing the actual parsing - here's an example of how I start the conversion:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var sourceFile = XDocument.Load(source);
if (sourceFile.Root == null) throw new Exception("Unable to locate root node in XML input file");
var channelNode = sourceFile.Root.Element("channel");

if (channelNode == null) throw new Exception("Unable to locate channel node in XML input file");

XNamespace content = "http://purl.org/rss/1.0/modules/content/";
XNamespace excerpt = "http://wordpress.org/export/1.1/excerpt/";
XNamespace wp = "http://wordpress.org/export/1.1/";

var blog = new BlogMLBlog
{
    Title = channelNode.Elements().First(node =&amp;gt; node.Name == "title").Value,
    SubTitle = channelNode.Elements().First(node =&amp;gt; node.Name == "description").Value
};

foreach (var author in channelNode.Elements().Where(node =&amp;gt; node.Name == wp + "author"))
{
    blog.Authors.Add(new BlogMLAuthor
    {
        Approved = true, 
        DateModified = DateTime.Now,
        Email = GetFirstElementValue(author.Elements(wp + "author_email")),
        ID = GetFirstElementValue(author.Elements(wp + "author_id")),
        Title = GetFirstElementValue(author.Elements(wp + "author_display_name"))
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So it starts with loading the document, creating some namespace references to use later, and then going through setting values on the new blog object through querying the XML document for specific values. Where there are possibilities for more than one value it just drops in to foreach loops like the authors one there to create the necessary child objects.&lt;/p&gt;

&lt;p&gt;I'll write a full post the describes the whole process of how I got the new platform up and running, so stay tuned for that - but feel free to have a look at the code in the mean time if you are interested!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/converting-wordpress-export-to-blogml" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2fconverting-wordpress-export-to-blogml&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2012-01-25T11:40:20Z</published>
    <updated>2012-01-25T11:40:20Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/FR-AWv8Qf1s/converting-wordpress-export-to-blogml" />
    <category term="BlogML" />
    <category term="LinqToXml" />
    <category term="open-source" />
    <content type="html">&lt;p&gt;For those of you who noticed, I have decided to re-platform my blog (again - yea I know, sorry for anyone who got a full list of posts in thier RSS again too) and this time I decided to move away from WordPress and decided to use &lt;a href="http://www.funnelweblog.com"&gt;FunnelWeb&lt;/a&gt;. There is a bunch of stuff I like about FW in general, but that's not what this post is about - this post is to discuss the tool I wrote to assit with the migration. Enter &lt;a href="http://bitbucket.brianfarnhill.com/wxrtoblogml/overview"&gt;WXRtoBlogML&lt;/a&gt; - which I have published the source code to for anyone who is interested in grabbing it. &lt;/p&gt;

&lt;p&gt;Basically the tool is designed to read from an XML export from WordPress (which is in an extended form of RSS called WXR, which stands for WordPress eXtended RSS) and converts it in to BlogML. The tool makes use of &lt;a href="http://msdn.microsoft.com/en-us/library/bb387098.aspx"&gt;LINQ to XML&lt;/a&gt; to read from the source XML file, and uses the &lt;a href="http://nuget.org/packages/blogml"&gt;BlogML&lt;/a&gt; library on Nuget to prepare the and save the new file - there really isn't all that much code involved in it. I also grabbed &lt;a href="http://nuget.org/packages/NDesk.Options/0.2.1"&gt;NDesk.Options&lt;/a&gt; to help with parsing the command line arguments as I decided a command line tool would be all that was needed for this one. &lt;/p&gt;

&lt;p&gt;Source code is on BitBucket at &lt;a href="http://bitbucket.brianfarnhill.com/wxrtoblogml/overview"&gt;http://bitbucket.brianfarnhill.com/wxrtoblogml/overview&lt;/a&gt;
Feel free to fork it and make changes if you like. There is more that can be done with it, at the moment I ignored pages and attachments so there is room for improvement.&lt;/p&gt;

&lt;p&gt;Some quick highlights of the code in the tool - the command line parsing works like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var showHelp = false;
var source = string.Empty;
var output = string.Empty;

var p = new OptionSet
{
    { "s|source=", "the path of the source XML file",
        v =&amp;gt; source = v },
    { "o|output=", "the path to save the resulting XML file",
        v =&amp;gt; output = v},
    { "h|help",  "show this message and exit", 
        v =&amp;gt; showHelp = v != null },
};

try
{
    p.Parse(args);
}
catch (OptionException e)
{
    Console.Write("WXRtoBlogML: ");
    Console.WriteLine(e.Message);
    Console.WriteLine("Try `WXRtoBlogML --help' for more information.");
}

if (showHelp)
{
    ShowHelp(p);
    return;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;NDesk allows us to use some really simple syntax to specify the parameters, thier descriptions, and then with an expression set the parameter to a local variable. Makes working with command line arguments a piece of cake.&lt;/p&gt;

&lt;p&gt;Next was doing the actual parsing - here's an example of how I start the conversion:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var sourceFile = XDocument.Load(source);
if (sourceFile.Root == null) throw new Exception("Unable to locate root node in XML input file");
var channelNode = sourceFile.Root.Element("channel");

if (channelNode == null) throw new Exception("Unable to locate channel node in XML input file");

XNamespace content = "http://purl.org/rss/1.0/modules/content/";
XNamespace excerpt = "http://wordpress.org/export/1.1/excerpt/";
XNamespace wp = "http://wordpress.org/export/1.1/";

var blog = new BlogMLBlog
{
    Title = channelNode.Elements().First(node =&amp;gt; node.Name == "title").Value,
    SubTitle = channelNode.Elements().First(node =&amp;gt; node.Name == "description").Value
};

foreach (var author in channelNode.Elements().Where(node =&amp;gt; node.Name == wp + "author"))
{
    blog.Authors.Add(new BlogMLAuthor
    {
        Approved = true, 
        DateModified = DateTime.Now,
        Email = GetFirstElementValue(author.Elements(wp + "author_email")),
        ID = GetFirstElementValue(author.Elements(wp + "author_id")),
        Title = GetFirstElementValue(author.Elements(wp + "author_display_name"))
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So it starts with loading the document, creating some namespace references to use later, and then going through setting values on the new blog object through querying the XML document for specific values. Where there are possibilities for more than one value it just drops in to foreach loops like the authors one there to create the necessary child objects.&lt;/p&gt;

&lt;p&gt;I'll write a full post the describes the whole process of how I got the new platform up and running, so stay tuned for that - but feel free to have a look at the code in the mean time if you are interested!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/converting-wordpress-export-to-blogml" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2fconverting-wordpress-export-to-blogml&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=FR-AWv8Qf1s:GQzt62_avY8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=FR-AWv8Qf1s:GQzt62_avY8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=FR-AWv8Qf1s:GQzt62_avY8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=FR-AWv8Qf1s:GQzt62_avY8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=FR-AWv8Qf1s:GQzt62_avY8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/FR-AWv8Qf1s" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/converting-wordpress-export-to-blogml</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/06/external-lists-where-is-my-connect-to-outlook-button</id>
    <title type="text">External lists - where is my "Connect to outlook" button?</title>
    <summary type="html">&lt;p&gt;I've said it before and I'll say it again - External Lists in SharePoint 2010 are just awesome. Today I was looking at some work I am doing with an Outlook add in that ties in to an External List in SharePoint and I came across a bit of an odd situation - when I went to browse to my external list the "connect to outlook" button was missing from the ribbon! It wasn't disabled or anything like that, it was just plain and simple not there! Luckily though, this was an easy fix and I wanted to quickly share the solution.&lt;/p&gt;

&lt;p&gt;As with everything to do with the Ribbon in SharePoint, it is all to do with features. Now the external list I was working with was deployed to a site that I had created from a custom site template that I had based on the blank site, so not a lot of features turned on in it at all (I like to keep these things very minimal and turn on only the features that I genuinely need when I'm writing up the onet.xml file). With that in mind I set out to find the feature that would add my button back, and a minute or so later I found it. The feature in question is a site scoped feature (not site collection - so "Web" scoped for the developers out there) and it's called "Offline Synchronization for External Lists".&lt;/p&gt;

&lt;p&gt;So the easy way to fix things here is to just manually turn it on and all is well - but since I'm working with a site template I wanted it included in the site template, so I just looked up the ID of the feature (for anyone who doesn't know, you can do this very easily by switching on your developer tooling of choice and having a look at the HTML around the activate or deactivate button - SharePoint will render a div tag that has an ID attribute of a GUID, this is the ID of that specific feature) and then put it into my onet.xml file, the XML looking like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;WebFeatures&amp;gt;
    &amp;lt;!-- Offline Synchronization for External Lists --&amp;gt;
    &amp;lt;Feature ID="d250636f-0a26-4019-8425-a5232d592c01" /&amp;gt;
&amp;lt;/WebFeatures&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A quick redeployment later and my ribbon button was there and all was right with the world once more!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/06/external-lists-where-is-my-connect-to-outlook-button" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f06%2fexternal-lists-where-is-my-connect-to-outlook-button&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-06-28T04:34:40+01:00</published>
    <updated>2012-01-24T11:29:31Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/dsY6pZWAQMA/external-lists-where-is-my-connect-to-outlook-button" />
    <category term="sharepoint" />
    <category term="BCS" />
    <content type="html">&lt;p&gt;I've said it before and I'll say it again - External Lists in SharePoint 2010 are just awesome. Today I was looking at some work I am doing with an Outlook add in that ties in to an External List in SharePoint and I came across a bit of an odd situation - when I went to browse to my external list the "connect to outlook" button was missing from the ribbon! It wasn't disabled or anything like that, it was just plain and simple not there! Luckily though, this was an easy fix and I wanted to quickly share the solution.&lt;/p&gt;

&lt;p&gt;As with everything to do with the Ribbon in SharePoint, it is all to do with features. Now the external list I was working with was deployed to a site that I had created from a custom site template that I had based on the blank site, so not a lot of features turned on in it at all (I like to keep these things very minimal and turn on only the features that I genuinely need when I'm writing up the onet.xml file). With that in mind I set out to find the feature that would add my button back, and a minute or so later I found it. The feature in question is a site scoped feature (not site collection - so "Web" scoped for the developers out there) and it's called "Offline Synchronization for External Lists".&lt;/p&gt;

&lt;p&gt;So the easy way to fix things here is to just manually turn it on and all is well - but since I'm working with a site template I wanted it included in the site template, so I just looked up the ID of the feature (for anyone who doesn't know, you can do this very easily by switching on your developer tooling of choice and having a look at the HTML around the activate or deactivate button - SharePoint will render a div tag that has an ID attribute of a GUID, this is the ID of that specific feature) and then put it into my onet.xml file, the XML looking like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;WebFeatures&amp;gt;
    &amp;lt;!-- Offline Synchronization for External Lists --&amp;gt;
    &amp;lt;Feature ID="d250636f-0a26-4019-8425-a5232d592c01" /&amp;gt;
&amp;lt;/WebFeatures&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A quick redeployment later and my ribbon button was there and all was right with the world once more!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/06/external-lists-where-is-my-connect-to-outlook-button" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f06%2fexternal-lists-where-is-my-connect-to-outlook-button&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dsY6pZWAQMA:4X2zr_1B_Ec:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dsY6pZWAQMA:4X2zr_1B_Ec:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dsY6pZWAQMA:4X2zr_1B_Ec:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=dsY6pZWAQMA:4X2zr_1B_Ec:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dsY6pZWAQMA:4X2zr_1B_Ec:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/dsY6pZWAQMA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/06/external-lists-where-is-my-connect-to-outlook-button</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/06/checking-permissions-in-sharepoint-from-the-client-object-model</id>
    <title type="text">Checking permissions in SharePoint from the client object model</title>
    <summary type="html">&lt;p&gt;SharePoint 2010 brought us this great little addition called the client object model, which gave us an effective way to talk to SharePoint without having to deal with the at times rather average set of web services. This is been great for me at the moment as I have been working on an addin for Outlook 2010 that talks back to SharePoint, and in this post I wanted to share how I use the client object model to check a users permissions to a specific site.&lt;/p&gt;

&lt;p&gt;The goal for this piece of code was to find out if the user had permissions to view items in a specific site, and I used that information to trim some of the functionality in the Outlook addin. First lets have a look at the code&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bool hasPermissions;
using (var context = new ClientContext("http://MySharePointUrl"))
{
    var web = context.Web;
    context.Load(web);

    var permissions = new BasePermissions();
    permissions.Set(PermissionKind.OpenItems);
    var result = web.DoesUserHavePermissions(permissions);

    context.ExecuteQuery();
    hasPermissions = result.Value;
}
return hasPermissions;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now let's break it down. Getting started we have the ClientContext object, this is the key to retrieving data from SharePoint on the client side. We pass the URL of our site into the constructor and from there we can use this object to execute queries. The first thing we do with this object is to retrieve the Web object (not called an SPWeb at the client side, just a Web, so don't get confused here!). This is done via the next 2 lines of code, the first creates our local variable but at this point it is essentially just a stub. Until we call the context.Load() method, which will essentially return the properties of the object from the server, we can't do much with this object. When we do call that load method only a small set of properties will actually be returned by default - you can throw some overloads into that method to specify which properties you specifically need but I wont go in to that here, I'll keep this simple. The theory is though that by specifying just the properties you need you can reduce the traffic between the client and the server.&lt;/p&gt;

&lt;p&gt;Moving on to the important part of the code, the permission check. Here we create ourselves a BasePermissions object which will contain the permission we are checking for. In this case I'm just looking for the OpenItems permission, so I use the Set method to set the value and then I call the DoesUserHavePermissions method. Again, the result object here will throw an exception if I try to call it immediately after this as it is just a stub. What is happening here is that the appropriate query commands are queued up with the ClientContext object, and until we call the ExecuteQuery method (which we do on the next line) those queries will not be executed. This gives us control over when we go back to the server, which can allow us to do things in batches to optimise the communication between client and server once more. After the ExecuteQuery method returns I can simply check the result object for its Value property and that's it - I now know if the user has permissions to the site in question. Pretty simple stuff in the end, you just need to adjust to the client side way of thinking when dealing with transferring data to your client side app but a lot of the properties and methods on the objects are going to be familiar to you anyway, so feel free to have a crack at the client side object model when you get a chance!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/06/checking-permissions-in-sharepoint-from-the-client-object-model" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f06%2fchecking-permissions-in-sharepoint-from-the-client-object-model&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-06-09T01:46:15+01:00</published>
    <updated>2012-01-24T11:27:56Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/naqqiPBSWlc/checking-permissions-in-sharepoint-from-the-client-object-model" />
    <category term="sharepoint" />
    <category term="permissions" />
    <category term="client-object-model" />
    <content type="html">&lt;p&gt;SharePoint 2010 brought us this great little addition called the client object model, which gave us an effective way to talk to SharePoint without having to deal with the at times rather average set of web services. This is been great for me at the moment as I have been working on an addin for Outlook 2010 that talks back to SharePoint, and in this post I wanted to share how I use the client object model to check a users permissions to a specific site.&lt;/p&gt;

&lt;p&gt;The goal for this piece of code was to find out if the user had permissions to view items in a specific site, and I used that information to trim some of the functionality in the Outlook addin. First lets have a look at the code&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bool hasPermissions;
using (var context = new ClientContext("http://MySharePointUrl"))
{
    var web = context.Web;
    context.Load(web);

    var permissions = new BasePermissions();
    permissions.Set(PermissionKind.OpenItems);
    var result = web.DoesUserHavePermissions(permissions);

    context.ExecuteQuery();
    hasPermissions = result.Value;
}
return hasPermissions;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now let's break it down. Getting started we have the ClientContext object, this is the key to retrieving data from SharePoint on the client side. We pass the URL of our site into the constructor and from there we can use this object to execute queries. The first thing we do with this object is to retrieve the Web object (not called an SPWeb at the client side, just a Web, so don't get confused here!). This is done via the next 2 lines of code, the first creates our local variable but at this point it is essentially just a stub. Until we call the context.Load() method, which will essentially return the properties of the object from the server, we can't do much with this object. When we do call that load method only a small set of properties will actually be returned by default - you can throw some overloads into that method to specify which properties you specifically need but I wont go in to that here, I'll keep this simple. The theory is though that by specifying just the properties you need you can reduce the traffic between the client and the server.&lt;/p&gt;

&lt;p&gt;Moving on to the important part of the code, the permission check. Here we create ourselves a BasePermissions object which will contain the permission we are checking for. In this case I'm just looking for the OpenItems permission, so I use the Set method to set the value and then I call the DoesUserHavePermissions method. Again, the result object here will throw an exception if I try to call it immediately after this as it is just a stub. What is happening here is that the appropriate query commands are queued up with the ClientContext object, and until we call the ExecuteQuery method (which we do on the next line) those queries will not be executed. This gives us control over when we go back to the server, which can allow us to do things in batches to optimise the communication between client and server once more. After the ExecuteQuery method returns I can simply check the result object for its Value property and that's it - I now know if the user has permissions to the site in question. Pretty simple stuff in the end, you just need to adjust to the client side way of thinking when dealing with transferring data to your client side app but a lot of the properties and methods on the objects are going to be familiar to you anyway, so feel free to have a crack at the client side object model when you get a chance!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/06/checking-permissions-in-sharepoint-from-the-client-object-model" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f06%2fchecking-permissions-in-sharepoint-from-the-client-object-model&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=naqqiPBSWlc:FK0YI1qw9_I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=naqqiPBSWlc:FK0YI1qw9_I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=naqqiPBSWlc:FK0YI1qw9_I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=naqqiPBSWlc:FK0YI1qw9_I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=naqqiPBSWlc:FK0YI1qw9_I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/naqqiPBSWlc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/06/checking-permissions-in-sharepoint-from-the-client-object-model</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/05/dialog-boxes-and-long-running-operations</id>
    <title type="text">Dialog boxes and long running operations</title>
    <summary type="html">&lt;p&gt;Just a quick little thing I discovered about the modal dialog boxes in SharePoint 2010 and how you can use a SPLongOperation within it. For those who don’t know, using SPLongOperation is a great way to get SharePoint to throw up a little loading screen while you run some code that will take a while to run (that way they know something is happening still), but if you want to use it in a dialog box you do things a tiny bit differently.&lt;/p&gt;

&lt;p&gt;A basic SPLongOperation will look like this in code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using (var operation = new SPLongOperation(Page))
{
    operation.LeadingHTML = "Updating SMS project";
    operation.TrailingHTML = "Please wait while additional tasks are added to the project plan";
    operation.Begin();

    // do your long running code here

    operation.End("/MyResultPage.aspx", SPRedirectFlags.Default, HttpContext.Current, string.Empty);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And if you are doing it in a modal dialog, there isn’t necessarily anything needs to change if it makes sense for the dialog to stay open, just redirect out and you are fine. If you need to close the dialog though there is only one thing that needs to change. Basically you swap the End() method out for an EndScript() method, which instead of redirecting the user will run some JavaScript for you, which you can use to close the dialog if you like. So the new closing line would look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;operation.EndScript("window.frameElement.commonModalDialogClose(1, 'My long running op completed!');");
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There you have it, hope that helps someone!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/05/dialog-boxes-and-long-running-operations" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f05%2fdialog-boxes-and-long-running-operations&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-05-17T05:51:31+01:00</published>
    <updated>2012-01-24T11:26:31Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/zUhYSo8vBF4/dialog-boxes-and-long-running-operations" />
    <category term="sharepoint" />
    <content type="html">&lt;p&gt;Just a quick little thing I discovered about the modal dialog boxes in SharePoint 2010 and how you can use a SPLongOperation within it. For those who don’t know, using SPLongOperation is a great way to get SharePoint to throw up a little loading screen while you run some code that will take a while to run (that way they know something is happening still), but if you want to use it in a dialog box you do things a tiny bit differently.&lt;/p&gt;

&lt;p&gt;A basic SPLongOperation will look like this in code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using (var operation = new SPLongOperation(Page))
{
    operation.LeadingHTML = "Updating SMS project";
    operation.TrailingHTML = "Please wait while additional tasks are added to the project plan";
    operation.Begin();

    // do your long running code here

    operation.End("/MyResultPage.aspx", SPRedirectFlags.Default, HttpContext.Current, string.Empty);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And if you are doing it in a modal dialog, there isn’t necessarily anything needs to change if it makes sense for the dialog to stay open, just redirect out and you are fine. If you need to close the dialog though there is only one thing that needs to change. Basically you swap the End() method out for an EndScript() method, which instead of redirecting the user will run some JavaScript for you, which you can use to close the dialog if you like. So the new closing line would look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;operation.EndScript("window.frameElement.commonModalDialogClose(1, 'My long running op completed!');");
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There you have it, hope that helps someone!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/05/dialog-boxes-and-long-running-operations" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f05%2fdialog-boxes-and-long-running-operations&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=zUhYSo8vBF4:BV-T2NnS4V0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=zUhYSo8vBF4:BV-T2NnS4V0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=zUhYSo8vBF4:BV-T2NnS4V0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=zUhYSo8vBF4:BV-T2NnS4V0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=zUhYSo8vBF4:BV-T2NnS4V0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/zUhYSo8vBF4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/05/dialog-boxes-and-long-running-operations</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/04/deploying-and-setting-permissions-on-a-bcs-model-via-powershell</id>
    <title type="text">Deploying and setting permissions on a BCS model via PowerShell</title>
    <summary type="html">&lt;p&gt;Recently I have been looking at ways that I can go about deploying a BCS (Business Connectivity Services, or the BDC for anyone still in SP2007 land) model via PowerShell as part of a wider deployment script for a project I have been working on, and finding out a good way to do this was not as simple as I would have thought, so I figured I would document what I did here.&lt;/p&gt;

&lt;p&gt;The first thing I needed to do was to deploy the model, which there is a simple enough process for, but I needed to customise things like the database server name in the model based on the environment I was deploying to, and I didn’t want to maintain 4 copies of the file just for a couple of lines to be different, so the first step was to bring in the BCDM file (which I created by building the model in SharePoint Designer and then exporting it) to my script, do a couple of find and replace for tokens I put into the file and then saving it to a temp location. The code looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$PSScriptRoot = Split-Path -Parent -Path (Get-Item -Path $MyInvocation.MyCommand.Path).FullName;
$modelText = Get-Content "$PSScriptRootMyModelFile.bdcm"
$modelText = ($modelText) -replace ("%DatabaseServer%", "DbServerName")
$filename = [System.IO.Path]::GetTempFileName();
$modelText | Out-File $filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So the settings I was using in the replace had come from an XML file I read for environment specific settings at the start of my deployment script, but they could come from where ever suits your particular example. Once I had my temp file ready to import with the environment specific changes made, and SP2010 makes this one pretty easy with a couple of specific cmdlets. Here is the code for this part:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$metadataStore = Get-SPBusinessDataCatalogMetadataObject -BdcObjectType "Catalog" -ServiceContext "http://MyWebAppUrl"
Import-SPBusinessDataCatalogModel -Path $filename -Identity $metadataStore -Force
Remove-Item $filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see at the end I also remove the temp file as well. Now at this point we have our model imported and ready to use,the last thing we need to do before it is usable is to assign permissions to it so users can query it for data. In my example here I have an admin user and a general users group,here’s the code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$entity = Get-SPBusinessDataCatalogMetadataObject -BdcObjectType "Entity" -ServiceContext "http://MyWebAppUrl" -Name "My Entity Name" -Namespace "My.Entity.Namespace"

$claimAdmin = New-SPClaimsPrincipal -Identity "EXDBrian" -IdentityType WindowsSamAccountName
Grant-SPBusinessDataCatalogMetadataObject -Identity $entity -Principal $claimAdmin -Right "Execute,SetPermissions,Edit,SelectableInClients"

$claimUsers = New-SPClaimsPrincipal -Identity "EXDDomain Users" -IdentityType WindowsSamAccountName
Grant-SPBusinessDataCatalogMetadataObject -Identity $entity -Principal $claimUsers -Right "Execute,Edit,SelectableInClients"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So here you see me create a claims principal for the specific users (in the admin case a single user, the second one is an AD group but the same process applies), and then I assign them permissions to the object I just created (which I have retrieved first). The Right parameter here is actually an enumeration value, but PowerShell lets us shortcut selection of multiple values by just writing is a comma separated list.&lt;/p&gt;

&lt;p&gt;When you put that all together, you now have a deployed model and permissions applied so it is ready to use!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/04/deploying-and-setting-permissions-on-a-bcs-model-via-powershell" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f04%2fdeploying-and-setting-permissions-on-a-bcs-model-via-powershell&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-04-21T02:20:20+01:00</published>
    <updated>2012-01-24T11:24:42Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/FzkSnoBloeg/deploying-and-setting-permissions-on-a-bcs-model-via-powershell" />
    <category term="sharepoint" />
    <category term="PowerShell" />
    <content type="html">&lt;p&gt;Recently I have been looking at ways that I can go about deploying a BCS (Business Connectivity Services, or the BDC for anyone still in SP2007 land) model via PowerShell as part of a wider deployment script for a project I have been working on, and finding out a good way to do this was not as simple as I would have thought, so I figured I would document what I did here.&lt;/p&gt;

&lt;p&gt;The first thing I needed to do was to deploy the model, which there is a simple enough process for, but I needed to customise things like the database server name in the model based on the environment I was deploying to, and I didn’t want to maintain 4 copies of the file just for a couple of lines to be different, so the first step was to bring in the BCDM file (which I created by building the model in SharePoint Designer and then exporting it) to my script, do a couple of find and replace for tokens I put into the file and then saving it to a temp location. The code looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$PSScriptRoot = Split-Path -Parent -Path (Get-Item -Path $MyInvocation.MyCommand.Path).FullName;
$modelText = Get-Content "$PSScriptRootMyModelFile.bdcm"
$modelText = ($modelText) -replace ("%DatabaseServer%", "DbServerName")
$filename = [System.IO.Path]::GetTempFileName();
$modelText | Out-File $filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So the settings I was using in the replace had come from an XML file I read for environment specific settings at the start of my deployment script, but they could come from where ever suits your particular example. Once I had my temp file ready to import with the environment specific changes made, and SP2010 makes this one pretty easy with a couple of specific cmdlets. Here is the code for this part:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$metadataStore = Get-SPBusinessDataCatalogMetadataObject -BdcObjectType "Catalog" -ServiceContext "http://MyWebAppUrl"
Import-SPBusinessDataCatalogModel -Path $filename -Identity $metadataStore -Force
Remove-Item $filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see at the end I also remove the temp file as well. Now at this point we have our model imported and ready to use,the last thing we need to do before it is usable is to assign permissions to it so users can query it for data. In my example here I have an admin user and a general users group,here’s the code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$entity = Get-SPBusinessDataCatalogMetadataObject -BdcObjectType "Entity" -ServiceContext "http://MyWebAppUrl" -Name "My Entity Name" -Namespace "My.Entity.Namespace"

$claimAdmin = New-SPClaimsPrincipal -Identity "EXDBrian" -IdentityType WindowsSamAccountName
Grant-SPBusinessDataCatalogMetadataObject -Identity $entity -Principal $claimAdmin -Right "Execute,SetPermissions,Edit,SelectableInClients"

$claimUsers = New-SPClaimsPrincipal -Identity "EXDDomain Users" -IdentityType WindowsSamAccountName
Grant-SPBusinessDataCatalogMetadataObject -Identity $entity -Principal $claimUsers -Right "Execute,Edit,SelectableInClients"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So here you see me create a claims principal for the specific users (in the admin case a single user, the second one is an AD group but the same process applies), and then I assign them permissions to the object I just created (which I have retrieved first). The Right parameter here is actually an enumeration value, but PowerShell lets us shortcut selection of multiple values by just writing is a comma separated list.&lt;/p&gt;

&lt;p&gt;When you put that all together, you now have a deployed model and permissions applied so it is ready to use!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/04/deploying-and-setting-permissions-on-a-bcs-model-via-powershell" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f04%2fdeploying-and-setting-permissions-on-a-bcs-model-via-powershell&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=FzkSnoBloeg:T2E202ZiRPA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=FzkSnoBloeg:T2E202ZiRPA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=FzkSnoBloeg:T2E202ZiRPA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=FzkSnoBloeg:T2E202ZiRPA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=FzkSnoBloeg:T2E202ZiRPA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/FzkSnoBloeg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/04/deploying-and-setting-permissions-on-a-bcs-model-via-powershell</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/03/css-not-rendering-for-sharepoint-date-picker-control</id>
    <title type="text">CSS not rendering for SharePoint date picker control</title>
    <summary type="html">&lt;p&gt;Been a little while since I posted something to do with SharePoint development as such, so I figured I would add this quick post in explaining something I cam across the other day. I’m currently working on some Project Server 2010 customisations (which of course are all built on top of SharePoint 2010) and came across this when I noticed a date picker I was putting on one of my pages was rendering out like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog-cdn.brianfarnhill.com/images/20110324-1.png" alt="An example of the broken control" /&gt;&lt;/p&gt;

&lt;p&gt;So in this post I’ll take you through how I figured out what was happening here.&lt;/p&gt;

&lt;p&gt;The first place I started was with the CSS – lets make sure I wasn’t doing anything silly to overwrite the out of the box styles. A quick look at where the styles on the date picker come from had me sure it wasn’t one of mine that did this. The reason being is that the calendar portion of the date picker is actually handled by an iFrame, and is an entirely separate page. If you look at the properties of the iFrame you can see that it is rendering the URL of “_layouts/iframe.aspx” with a massive query string that passes all the properties of the calendar, such as which calendar to use, work days, first day of the week, etc.&lt;/p&gt;

&lt;p&gt;Next step was to have a look at what this iFrame looked like when it was called as part of a list field or some other out of the box scenario, as they were working and mine wasn’t. Since there isn’t a great deal of HTML on these little iFrames it was pretty easy to pick the differences – and there was one that got my attention – an extra CSS reference. The out of the box iFrame was rendering this CSS reference and mine wasn’t for some reason:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;link rel="stylesheet" type="text/css" href="http://blog.brianfarnhill.com/_layouts/1033/styles/Themable/datepickerv4.css?rev=Hu9OlQmu1YOXv7TK%2BQrc5Q%3D%3D"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As the name of the style sheet suggested, this is the file that has all of the styles for the date picker in it. From here I needed to figure out why my page wasn’t calling the date picker right. Seeing as I knew it was just an iFrame my next stop was to compare the URL’s of each iFrame to play spot the difference there, and surely enough there was one. Here is a sample of each URL:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default: http://server/pwa/_layouts/iframe.aspx?...&lt;/li&gt;
&lt;li&gt;Mine: http://server/_layouts/iframe.aspx?...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference here – the “/pwa” part, being the URL of my project server collection and the current SPWeb I was working with (also worth acknowledging, in this case there is no site at the root of the URL). When I changed the URL to add the /pwa the iFrame worked great and got the CSS reference.&lt;/p&gt;

&lt;p&gt;So now that I knew what the problem was,how do I fix it? I’m working with and out of the box SharePoint control so recompiling it with a code fix isn’t an option,and I wasn’t keen on writing my own just for this. As luck would have it though, there is a property on the date picker that lets you specify the URL of the iFrame that should be used for the date picker, so a quick line of code in my code behind had it rendering out great, here is it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;MyDatePicker.DatePickerFrameUrl = SPContext.Current.Web.ServerRelativeUrl + "/_layouts/iframe.aspx";
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Redeployed the solution with this and it all worked perfectly. Now I can only assume that the property I’m using is there in the case of someone wanting to use a different date picking mechanism, but in the case it allowed me to fix up the problem with the CSS not rendering.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/03/css-not-rendering-for-sharepoint-date-picker-control" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f03%2fcss-not-rendering-for-sharepoint-date-picker-control&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-03-24T21:54:02Z</published>
    <updated>2012-01-25T10:06:37Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/7rnEHcVDYcY/css-not-rendering-for-sharepoint-date-picker-control" />
    <category term="sharepoint" />
    <category term="controls" />
    <content type="html">&lt;p&gt;Been a little while since I posted something to do with SharePoint development as such, so I figured I would add this quick post in explaining something I cam across the other day. I’m currently working on some Project Server 2010 customisations (which of course are all built on top of SharePoint 2010) and came across this when I noticed a date picker I was putting on one of my pages was rendering out like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog-cdn.brianfarnhill.com/images/20110324-1.png" alt="An example of the broken control" /&gt;&lt;/p&gt;

&lt;p&gt;So in this post I’ll take you through how I figured out what was happening here.&lt;/p&gt;

&lt;p&gt;The first place I started was with the CSS – lets make sure I wasn’t doing anything silly to overwrite the out of the box styles. A quick look at where the styles on the date picker come from had me sure it wasn’t one of mine that did this. The reason being is that the calendar portion of the date picker is actually handled by an iFrame, and is an entirely separate page. If you look at the properties of the iFrame you can see that it is rendering the URL of “_layouts/iframe.aspx” with a massive query string that passes all the properties of the calendar, such as which calendar to use, work days, first day of the week, etc.&lt;/p&gt;

&lt;p&gt;Next step was to have a look at what this iFrame looked like when it was called as part of a list field or some other out of the box scenario, as they were working and mine wasn’t. Since there isn’t a great deal of HTML on these little iFrames it was pretty easy to pick the differences – and there was one that got my attention – an extra CSS reference. The out of the box iFrame was rendering this CSS reference and mine wasn’t for some reason:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;link rel="stylesheet" type="text/css" href="http://blog.brianfarnhill.com/_layouts/1033/styles/Themable/datepickerv4.css?rev=Hu9OlQmu1YOXv7TK%2BQrc5Q%3D%3D"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As the name of the style sheet suggested, this is the file that has all of the styles for the date picker in it. From here I needed to figure out why my page wasn’t calling the date picker right. Seeing as I knew it was just an iFrame my next stop was to compare the URL’s of each iFrame to play spot the difference there, and surely enough there was one. Here is a sample of each URL:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default: http://server/pwa/_layouts/iframe.aspx?...&lt;/li&gt;
&lt;li&gt;Mine: http://server/_layouts/iframe.aspx?...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference here – the “/pwa” part, being the URL of my project server collection and the current SPWeb I was working with (also worth acknowledging, in this case there is no site at the root of the URL). When I changed the URL to add the /pwa the iFrame worked great and got the CSS reference.&lt;/p&gt;

&lt;p&gt;So now that I knew what the problem was,how do I fix it? I’m working with and out of the box SharePoint control so recompiling it with a code fix isn’t an option,and I wasn’t keen on writing my own just for this. As luck would have it though, there is a property on the date picker that lets you specify the URL of the iFrame that should be used for the date picker, so a quick line of code in my code behind had it rendering out great, here is it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;MyDatePicker.DatePickerFrameUrl = SPContext.Current.Web.ServerRelativeUrl + "/_layouts/iframe.aspx";
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Redeployed the solution with this and it all worked perfectly. Now I can only assume that the property I’m using is there in the case of someone wanting to use a different date picking mechanism, but in the case it allowed me to fix up the problem with the CSS not rendering.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/03/css-not-rendering-for-sharepoint-date-picker-control" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f03%2fcss-not-rendering-for-sharepoint-date-picker-control&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=7rnEHcVDYcY:SJdChAP996Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=7rnEHcVDYcY:SJdChAP996Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=7rnEHcVDYcY:SJdChAP996Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=7rnEHcVDYcY:SJdChAP996Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=7rnEHcVDYcY:SJdChAP996Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/7rnEHcVDYcY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/03/css-not-rendering-for-sharepoint-date-picker-control</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/03/australian-sharepoint-saturday-dates-for-2011</id>
    <title type="text">Australian SharePoint Saturday Dates for 2011</title>
    <summary type="html">&lt;p&gt;SharePoint Saturday’s have been happening in Australia now for a year and a half now, and the popularity of these events is continuing to grow! Looking back at the first event that we put on in Sydney to where we are now, we have come a long way, and this year we are really aiming to raise the bar with out events again! As part of our planning for these events we are setting ourselves up for a whole year of events right now!&lt;/p&gt;

&lt;p&gt;We announced these dates at the Australian SharePoint conference last week, but if you couldn’t make it here they are again!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perth – April 9&lt;/li&gt;
&lt;li&gt;Brisbane - May 21&lt;/li&gt;
&lt;li&gt;Adelaide - June 18&lt;/li&gt;
&lt;li&gt;Sydney - August 6&lt;/li&gt;
&lt;li&gt;Canberra - September 24&lt;/li&gt;
&lt;li&gt;Melbourne - October 22&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information you can check out the &lt;a href="http://www.sharepointsaturday.org"&gt;website&lt;/a&gt; or follow &lt;a href="http://twitter.com/sps_au"&gt;@sps_au&lt;/a&gt; on twitter!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/03/australian-sharepoint-saturday-dates-for-2011" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f03%2faustralian-sharepoint-saturday-dates-for-2011&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-03-12T06:51:42Z</published>
    <updated>2012-01-24T11:16:56Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/dyOG7Gk7RQo/australian-sharepoint-saturday-dates-for-2011" />
    <category term="communities" />
    <category term="sharepoint" />
    <content type="html">&lt;p&gt;SharePoint Saturday’s have been happening in Australia now for a year and a half now, and the popularity of these events is continuing to grow! Looking back at the first event that we put on in Sydney to where we are now, we have come a long way, and this year we are really aiming to raise the bar with out events again! As part of our planning for these events we are setting ourselves up for a whole year of events right now!&lt;/p&gt;

&lt;p&gt;We announced these dates at the Australian SharePoint conference last week, but if you couldn’t make it here they are again!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perth – April 9&lt;/li&gt;
&lt;li&gt;Brisbane - May 21&lt;/li&gt;
&lt;li&gt;Adelaide - June 18&lt;/li&gt;
&lt;li&gt;Sydney - August 6&lt;/li&gt;
&lt;li&gt;Canberra - September 24&lt;/li&gt;
&lt;li&gt;Melbourne - October 22&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information you can check out the &lt;a href="http://www.sharepointsaturday.org"&gt;website&lt;/a&gt; or follow &lt;a href="http://twitter.com/sps_au"&gt;@sps_au&lt;/a&gt; on twitter!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/03/australian-sharepoint-saturday-dates-for-2011" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f03%2faustralian-sharepoint-saturday-dates-for-2011&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dyOG7Gk7RQo:w8R6nhK4Uq8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dyOG7Gk7RQo:w8R6nhK4Uq8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dyOG7Gk7RQo:w8R6nhK4Uq8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=dyOG7Gk7RQo:w8R6nhK4Uq8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dyOG7Gk7RQo:w8R6nhK4Uq8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/dyOG7Gk7RQo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/03/australian-sharepoint-saturday-dates-for-2011</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/03/my-developing-advanced-user-experience-for-sharepoint-2010-session</id>
    <title type="text">My “Developing advanced user experience for SharePoint 2010” session</title>
    <summary type="html">&lt;p&gt;Assuming I got the publishing settings right for this, this post should be going live as I’m presenting my session at the the Australian SharePoint Conference. Basically this post is a summary of links and references to content that I’m discussing in the session. The [details of the session][1] are online at the SharePoint Conference site as well. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff407578.aspx"&gt;Walkthrough: Creating a Custom Web Part with a Contextual Tab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/sharepointdev/archive/2011/01/13/using-the-dialog-platform.aspx"&gt;Using the dialog framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/sharepointdev/archive/2011/01/27/loading-script-in-sharepoint-2010.aspx"&gt;Loading script in SharePoint 2010&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee558338.aspx"&gt;Enterprise Search Query Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms544523.aspx"&gt;Document Converter Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms469765.aspx"&gt;Creating Connectable Web Parts in SharePoint Foundation&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope you guys enjoy the session!&lt;/p&gt;

&lt;p&gt;[1]: http://www.sharepointconference.com.au/AU2011/SolutionPages/SessionLookup.aspx?SessionTitle=Developing Advanced User Experience in SharePoint 2010&amp;amp;IsDlg=1&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/03/my-developing-advanced-user-experience-for-sharepoint-2010-session" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f03%2fmy-developing-advanced-user-experience-for-sharepoint-2010-session&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-03-08T00:40:00Z</published>
    <updated>2012-01-24T11:21:37Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/NbEs1NWfFXo/my-developing-advanced-user-experience-for-sharepoint-2010-session" />
    <category term="communities" />
    <category term="presentations" />
    <content type="html">&lt;p&gt;Assuming I got the publishing settings right for this, this post should be going live as I’m presenting my session at the the Australian SharePoint Conference. Basically this post is a summary of links and references to content that I’m discussing in the session. The [details of the session][1] are online at the SharePoint Conference site as well. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff407578.aspx"&gt;Walkthrough: Creating a Custom Web Part with a Contextual Tab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/sharepointdev/archive/2011/01/13/using-the-dialog-platform.aspx"&gt;Using the dialog framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/sharepointdev/archive/2011/01/27/loading-script-in-sharepoint-2010.aspx"&gt;Loading script in SharePoint 2010&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee558338.aspx"&gt;Enterprise Search Query Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms544523.aspx"&gt;Document Converter Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms469765.aspx"&gt;Creating Connectable Web Parts in SharePoint Foundation&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope you guys enjoy the session!&lt;/p&gt;

&lt;p&gt;[1]: http://www.sharepointconference.com.au/AU2011/SolutionPages/SessionLookup.aspx?SessionTitle=Developing Advanced User Experience in SharePoint 2010&amp;amp;IsDlg=1&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/03/my-developing-advanced-user-experience-for-sharepoint-2010-session" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f03%2fmy-developing-advanced-user-experience-for-sharepoint-2010-session&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=NbEs1NWfFXo:JLlNE5RGv0E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=NbEs1NWfFXo:JLlNE5RGv0E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=NbEs1NWfFXo:JLlNE5RGv0E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=NbEs1NWfFXo:JLlNE5RGv0E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=NbEs1NWfFXo:JLlNE5RGv0E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/NbEs1NWfFXo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/03/my-developing-advanced-user-experience-for-sharepoint-2010-session</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/02/configuring-windows-nlb-with-powershell-aka-my-autospinstaller-bit</id>
    <title type="text">Configuring Windows NLB with PowerShell (aka. my AutoSPInstaller bit)</title>
    <summary type="html">&lt;p&gt;For the benefit of anyone who doesn’t know what NLB is, I’m talking about Windows Network Load Balancing. Basically it is a software based load balancing tool that has been built in to Windows Server for many, many moons. It is a reasonably common thing to see in a SharePoint environment as a way of balancing load across multiple web front end servers. What I'm covering here is how you can use PowerShell to do the setup and config for you, and how I've tied it in to AutoSPInstaller.&lt;/p&gt;

&lt;p&gt;So my brief intro to NLB aside, one of the things I have been doing a bit of work with lately is around automating my SharePoint installations with PowerShell. I wasn’t particularly fond of the idea of starting from scratch, so I went and grabbed myself a copy of the AutoSPInstaller script from CodePlex which worked a treat. Next on my to-do list though was to do a few things to extend it, top of the list was to add my NLB configuration to the mix. So I wrote it, did some basic testing and then uploaded them as a patch to the CodePlex project (which will hopefully get included in an upcoming release) and though I would write a quick post to explain the  script and how it can be configured. So first up, the function itself:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# ===================================================================================
# FUNC: Configure network Load Balancing
# DESC: Configures Windows NLB based on the XML configuration file
# ===================================================================================
function ConfigureNLB([xml]$xmlinput)
{
    if ($xmlinput.Configuration.LoadBalancing -ne $null)
    {
        Write-Host "Begining NLB Configuration" -ForegroundColor White

    $fqdn = $xmlinput.Configuration.LoadBalancing.FQDN
        $interfaceName = $xmlinput.Configuration.LoadBalancing.InterfaceName
        $virtualIp = $xmlinput.Configuration.LoadBalancing.VirtualIP
        $subnet = $xmlinput.Configuration.LoadBalancing.SubnetMask
        $mode = $xmlinput.Configuration.LoadBalancing.Mode

        ## install the NLB feature
        Write-Host "Ensuring NLB feature is installed ..." -ForegroundColor White
        dism /online /enable-feature /featurename:NetworkLoadBalancingFullServer
        Write-Host "NLB installation complete" -ForegroundColor White

    Write-Host "Attempting to locate existing cluster ..."
    Import-Module NetworkLoadBalancingClusters

        $alreadyConfigured = $true
        try
        {
            $localCluster = Get-NlbCluster .
        }
        catch
        {
            $alreadyConfigured = $false
        }

        if ($alreadyConfigured -eq $false)
        {
            $cluster = Get-NlbCluster -HostName $fqdn -ErrorAction SilentlyContinue

            if ($cluster -eq $null)
            {
                ## The cluster does not exist, create a new cluster
                Write-Host "No cluster found - creating new NLB cluster..." -ForegroundColor White
                New-NlbCluster -ClusterName $fqdn -InterfaceName $interfaceName -ClusterPrimaryIP $virtualIp -SubnetMask $subnet -OperationMode $mode
                Write-Host "New NLB cluster created" -ForegroundColor White
            }
            else
            {
                ## The cluster already exists, add a new node
                Write-Host "Cluster found - adding node to existing NLB Cluster..."  -ForegroundColor White
                Get-NlbCluster -HostName $fqdn | Add-NlbClusterNode -NewNodeName $env:COMPUTERNAME -NewNodeInterface $interfaceName
                Write-Host "Successfully added new node to NLB cluster" -ForegroundColor White
            }
            Write-Host -ForegroundColor White "Finished configuring load balancing"
        WriteLine
        }
        else
        {
            Write-Host -ForegroundColor White "Load balancing has already been configured. No action taken"
        }
    }
    else
    {
        Write-Host -ForegroundColor White "Load balancing configuration not found, skipping NLB setup"
    WriteLine
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now to explain it. The first thing we do is look for some NLB configuration info. This is passed through the main config XML file for AutoSPInstaller,but could be any XML file really. If we find the config,we go and continue, otherwise we bail. Next we use the dism command line tool to install the NLB components to the server – the great thing about this is that if it is already installed it will just simply run and not throw any errors, awesome. After that we get to the NLB specific bits.&lt;/p&gt;

&lt;p&gt;We start by importing the NLB specific powershell commands, using the Import-Module cmdlet, calling the “NetworkLoadBalancingClusters” commands. Now at this point if you want a full list of all the NLB specific commands just drop a “get-help &lt;em&gt;nlb&lt;/em&gt;” to see the full list.&lt;/p&gt;

&lt;p&gt;Now without doing a line by line run through of the script, here is a summary of what we are doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check to see if the cluster already exists anywhere on the network&lt;/li&gt;
&lt;li&gt;If it doesn’t exist, create it now with the appropriate parameters, then finish up&lt;/li&gt;
&lt;li&gt;If it does exist, the next check is to see if the local server is part of a cluster already (this is the “Get-NlbCluster .” command, with the theory being that if it is part of a cluster already, the config has already been done and we can finish up, and if it hasn’t we can just add the current server to the existing cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last thing I’ll include here is the line of XML I added to the config file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;LoadBalancing InterfaceName="Load Balanced NIC"
       FQDN="fsintranet"
       VirtualIP="192.168.137.130"
       SubnetMask="255.255.255.0"
       Mode="Multicast" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now if you want to take this script away from the AutoSPInstaller context - just look at the main part of the function and swap your own values into the lines where I set the values such as $fqdn, $subnet and those. The only real link into AutoSPInstaller is that reading of that XML from the config file, the rest stands on its own.&lt;/p&gt;

&lt;p&gt;And that’s it! I hope it helps people, and I hope it gets rolled in to an upcoming AutoSPInstaller release.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/02/configuring-windows-nlb-with-powershell-aka-my-autospinstaller-bit" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f02%2fconfiguring-windows-nlb-with-powershell-aka-my-autospinstaller-bit&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-02-26T13:04:50Z</published>
    <updated>2012-01-24T11:14:07Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/-X2L8_yMLpg/configuring-windows-nlb-with-powershell-aka-my-autospinstaller-bit" />
    <category term="sharepoint" />
    <category term="windows-server" />
    <category term="PowerShell" />
    <category term="NLB" />
    <content type="html">&lt;p&gt;For the benefit of anyone who doesn’t know what NLB is, I’m talking about Windows Network Load Balancing. Basically it is a software based load balancing tool that has been built in to Windows Server for many, many moons. It is a reasonably common thing to see in a SharePoint environment as a way of balancing load across multiple web front end servers. What I'm covering here is how you can use PowerShell to do the setup and config for you, and how I've tied it in to AutoSPInstaller.&lt;/p&gt;

&lt;p&gt;So my brief intro to NLB aside, one of the things I have been doing a bit of work with lately is around automating my SharePoint installations with PowerShell. I wasn’t particularly fond of the idea of starting from scratch, so I went and grabbed myself a copy of the AutoSPInstaller script from CodePlex which worked a treat. Next on my to-do list though was to do a few things to extend it, top of the list was to add my NLB configuration to the mix. So I wrote it, did some basic testing and then uploaded them as a patch to the CodePlex project (which will hopefully get included in an upcoming release) and though I would write a quick post to explain the  script and how it can be configured. So first up, the function itself:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# ===================================================================================
# FUNC: Configure network Load Balancing
# DESC: Configures Windows NLB based on the XML configuration file
# ===================================================================================
function ConfigureNLB([xml]$xmlinput)
{
    if ($xmlinput.Configuration.LoadBalancing -ne $null)
    {
        Write-Host "Begining NLB Configuration" -ForegroundColor White

    $fqdn = $xmlinput.Configuration.LoadBalancing.FQDN
        $interfaceName = $xmlinput.Configuration.LoadBalancing.InterfaceName
        $virtualIp = $xmlinput.Configuration.LoadBalancing.VirtualIP
        $subnet = $xmlinput.Configuration.LoadBalancing.SubnetMask
        $mode = $xmlinput.Configuration.LoadBalancing.Mode

        ## install the NLB feature
        Write-Host "Ensuring NLB feature is installed ..." -ForegroundColor White
        dism /online /enable-feature /featurename:NetworkLoadBalancingFullServer
        Write-Host "NLB installation complete" -ForegroundColor White

    Write-Host "Attempting to locate existing cluster ..."
    Import-Module NetworkLoadBalancingClusters

        $alreadyConfigured = $true
        try
        {
            $localCluster = Get-NlbCluster .
        }
        catch
        {
            $alreadyConfigured = $false
        }

        if ($alreadyConfigured -eq $false)
        {
            $cluster = Get-NlbCluster -HostName $fqdn -ErrorAction SilentlyContinue

            if ($cluster -eq $null)
            {
                ## The cluster does not exist, create a new cluster
                Write-Host "No cluster found - creating new NLB cluster..." -ForegroundColor White
                New-NlbCluster -ClusterName $fqdn -InterfaceName $interfaceName -ClusterPrimaryIP $virtualIp -SubnetMask $subnet -OperationMode $mode
                Write-Host "New NLB cluster created" -ForegroundColor White
            }
            else
            {
                ## The cluster already exists, add a new node
                Write-Host "Cluster found - adding node to existing NLB Cluster..."  -ForegroundColor White
                Get-NlbCluster -HostName $fqdn | Add-NlbClusterNode -NewNodeName $env:COMPUTERNAME -NewNodeInterface $interfaceName
                Write-Host "Successfully added new node to NLB cluster" -ForegroundColor White
            }
            Write-Host -ForegroundColor White "Finished configuring load balancing"
        WriteLine
        }
        else
        {
            Write-Host -ForegroundColor White "Load balancing has already been configured. No action taken"
        }
    }
    else
    {
        Write-Host -ForegroundColor White "Load balancing configuration not found, skipping NLB setup"
    WriteLine
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now to explain it. The first thing we do is look for some NLB configuration info. This is passed through the main config XML file for AutoSPInstaller,but could be any XML file really. If we find the config,we go and continue, otherwise we bail. Next we use the dism command line tool to install the NLB components to the server – the great thing about this is that if it is already installed it will just simply run and not throw any errors, awesome. After that we get to the NLB specific bits.&lt;/p&gt;

&lt;p&gt;We start by importing the NLB specific powershell commands, using the Import-Module cmdlet, calling the “NetworkLoadBalancingClusters” commands. Now at this point if you want a full list of all the NLB specific commands just drop a “get-help &lt;em&gt;nlb&lt;/em&gt;” to see the full list.&lt;/p&gt;

&lt;p&gt;Now without doing a line by line run through of the script, here is a summary of what we are doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check to see if the cluster already exists anywhere on the network&lt;/li&gt;
&lt;li&gt;If it doesn’t exist, create it now with the appropriate parameters, then finish up&lt;/li&gt;
&lt;li&gt;If it does exist, the next check is to see if the local server is part of a cluster already (this is the “Get-NlbCluster .” command, with the theory being that if it is part of a cluster already, the config has already been done and we can finish up, and if it hasn’t we can just add the current server to the existing cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last thing I’ll include here is the line of XML I added to the config file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;LoadBalancing InterfaceName="Load Balanced NIC"
       FQDN="fsintranet"
       VirtualIP="192.168.137.130"
       SubnetMask="255.255.255.0"
       Mode="Multicast" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now if you want to take this script away from the AutoSPInstaller context - just look at the main part of the function and swap your own values into the lines where I set the values such as $fqdn, $subnet and those. The only real link into AutoSPInstaller is that reading of that XML from the config file, the rest stands on its own.&lt;/p&gt;

&lt;p&gt;And that’s it! I hope it helps people, and I hope it gets rolled in to an upcoming AutoSPInstaller release.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/02/configuring-windows-nlb-with-powershell-aka-my-autospinstaller-bit" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f02%2fconfiguring-windows-nlb-with-powershell-aka-my-autospinstaller-bit&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=-X2L8_yMLpg:1LwTtB02V6Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=-X2L8_yMLpg:1LwTtB02V6Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=-X2L8_yMLpg:1LwTtB02V6Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=-X2L8_yMLpg:1LwTtB02V6Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=-X2L8_yMLpg:1LwTtB02V6Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/-X2L8_yMLpg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/02/configuring-windows-nlb-with-powershell-aka-my-autospinstaller-bit</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2011/01/configuring-powerpoint-broadcast-in-office-2010</id>
    <title type="text">Configuring PowerPoint broadcast in Office 2010</title>
    <summary type="html">&lt;p&gt;PowerPoint broadcasting is a pretty awesome new feature in Office 2010, it will allow you to publish your slide show to world through the Windows Live PowerPoint broadcast service, which is driven by the Office 2010 Web Applications. Given that we can install the Office Web Apps on to a SharePoint 2010 server, this also means we can use that for a private broadcast rather than pushing our slides out to the internet. In this post I wanted to talk a little about how we set that up. I’m assuming that you already have a SharePoint 2010 environment with Office Web Applications installed on it to begin with.&lt;/p&gt;

&lt;p&gt;The first thing you need to do when you want to broadcast from SharePoint is to create a broadcast site. This is a special kind of site that PowerPoint will recognise as a broadcast target and let the web application run the broadcast from. If you look at it there isn’t actually anything in the site, but there is one thing to be aware of here, and that is the permissions.&lt;/p&gt;

&lt;p&gt;Basically there are two groups to this site – “Broadcast Presenters” and “Broadcast Attendees”, and these groups do exactly what they sound like – they allow you to control who is able to create broadcasts, and who can view them. In a large organisation this might allow some scenarios around things like having a team who are working on a private project to be able to control who can view presentations that are broadcast at that site, meaning even if people share the broadcast URL around internally, you still know exactly who can view it. You could set up multiple broadcast sites to suit the security needs of your users.&lt;/p&gt;

&lt;p&gt;Once you have the broadcast site set up, you need to tell PowerPoint about it, and there are a couple of ways of doing this. One – you can let your users manually add a broadcast site,which they can do by selecting to broadcast a presentation,and instead of choosing a target from the list (which by default just has the windows live option) they can add a new source, providing just the URL of the broadcast site that we talked about earlier. Personally I don’t like this option, and that’s because I don’t like having to get users to do things – they have a habit of breaking things! The better option is to use group policy.&lt;/p&gt;

&lt;p&gt;If you grab the PowerPoint 2010 Administrative template you can get some options that will help you configure PowerPoint for your users (this is documented on TechNet at &lt;a href="http://technet.microsoft.com/en-us/library/ff431688.aspx" title="http://technet.microsoft.com/en-us/library/ff431688.aspx"&gt;http://technet.microsoft.com/en-us/library/ff431688.aspx&lt;/a&gt;). Basically we can add the sources for the users here and let group policy roll it out for us. We can also do things like prevent the user from using other broadcast sites than the ones provided for them by you (again, think back to the security options on the broadcast site – if you prevent the user from adding sources than the ones they are supposed to use that have appropriate security configured, then you’re really just preventing them from hurting themselves really aren’t you!).&lt;/p&gt;

&lt;p&gt;So there you have it, some food for thought for the SharePoint admins – if you have rolled out the Office Web Applications make sure you go through and configure these settings to help out your users, happy broadcasting!&lt;/p&gt;

&lt;p&gt;For further info on configuring PowerPoint broadcasting, see the articles on TechNet at &lt;a href="http://technet.microsoft.com/en-us/library/ff431686.aspx" title="http://technet.microsoft.com/en-us/library/ff431686.aspx"&gt;http://technet.microsoft.com/en-us/library/ff431686.aspx&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/01/configuring-powerpoint-broadcast-in-office-2010" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f01%2fconfiguring-powerpoint-broadcast-in-office-2010&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2011-01-07T03:36:27Z</published>
    <updated>2012-01-24T11:10:39Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/Xu_VX0WCA7Q/configuring-powerpoint-broadcast-in-office-2010" />
    <category term="sharepoint" />
    <category term="powerpoint-broadcast" />
    <content type="html">&lt;p&gt;PowerPoint broadcasting is a pretty awesome new feature in Office 2010, it will allow you to publish your slide show to world through the Windows Live PowerPoint broadcast service, which is driven by the Office 2010 Web Applications. Given that we can install the Office Web Apps on to a SharePoint 2010 server, this also means we can use that for a private broadcast rather than pushing our slides out to the internet. In this post I wanted to talk a little about how we set that up. I’m assuming that you already have a SharePoint 2010 environment with Office Web Applications installed on it to begin with.&lt;/p&gt;

&lt;p&gt;The first thing you need to do when you want to broadcast from SharePoint is to create a broadcast site. This is a special kind of site that PowerPoint will recognise as a broadcast target and let the web application run the broadcast from. If you look at it there isn’t actually anything in the site, but there is one thing to be aware of here, and that is the permissions.&lt;/p&gt;

&lt;p&gt;Basically there are two groups to this site – “Broadcast Presenters” and “Broadcast Attendees”, and these groups do exactly what they sound like – they allow you to control who is able to create broadcasts, and who can view them. In a large organisation this might allow some scenarios around things like having a team who are working on a private project to be able to control who can view presentations that are broadcast at that site, meaning even if people share the broadcast URL around internally, you still know exactly who can view it. You could set up multiple broadcast sites to suit the security needs of your users.&lt;/p&gt;

&lt;p&gt;Once you have the broadcast site set up, you need to tell PowerPoint about it, and there are a couple of ways of doing this. One – you can let your users manually add a broadcast site,which they can do by selecting to broadcast a presentation,and instead of choosing a target from the list (which by default just has the windows live option) they can add a new source, providing just the URL of the broadcast site that we talked about earlier. Personally I don’t like this option, and that’s because I don’t like having to get users to do things – they have a habit of breaking things! The better option is to use group policy.&lt;/p&gt;

&lt;p&gt;If you grab the PowerPoint 2010 Administrative template you can get some options that will help you configure PowerPoint for your users (this is documented on TechNet at &lt;a href="http://technet.microsoft.com/en-us/library/ff431688.aspx" title="http://technet.microsoft.com/en-us/library/ff431688.aspx"&gt;http://technet.microsoft.com/en-us/library/ff431688.aspx&lt;/a&gt;). Basically we can add the sources for the users here and let group policy roll it out for us. We can also do things like prevent the user from using other broadcast sites than the ones provided for them by you (again, think back to the security options on the broadcast site – if you prevent the user from adding sources than the ones they are supposed to use that have appropriate security configured, then you’re really just preventing them from hurting themselves really aren’t you!).&lt;/p&gt;

&lt;p&gt;So there you have it, some food for thought for the SharePoint admins – if you have rolled out the Office Web Applications make sure you go through and configure these settings to help out your users, happy broadcasting!&lt;/p&gt;

&lt;p&gt;For further info on configuring PowerPoint broadcasting, see the articles on TechNet at &lt;a href="http://technet.microsoft.com/en-us/library/ff431686.aspx" title="http://technet.microsoft.com/en-us/library/ff431686.aspx"&gt;http://technet.microsoft.com/en-us/library/ff431686.aspx&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2011/01/configuring-powerpoint-broadcast-in-office-2010" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2011%2f01%2fconfiguring-powerpoint-broadcast-in-office-2010&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=Xu_VX0WCA7Q:SeiQi0g1MNo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=Xu_VX0WCA7Q:SeiQi0g1MNo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=Xu_VX0WCA7Q:SeiQi0g1MNo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=Xu_VX0WCA7Q:SeiQi0g1MNo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=Xu_VX0WCA7Q:SeiQi0g1MNo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/Xu_VX0WCA7Q" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2011/01/configuring-powerpoint-broadcast-in-office-2010</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2010/11/problem-setting-values-of-an-infopath-form-from-sharepoint-designer-based-workflows</id>
    <title type="text">Problem setting values of an InfoPath form from SharePoint Designer based workflows</title>
    <summary type="html">&lt;p&gt;This is something that threw me for a bit a week or two ago, and I didn’t blog about it then, and today I came across the same thing and got just as lost, so I’m gonna write it down this time! Here is the scenario – you have created an InfoPath form and published it to a forms library. The form has a few properties in it that you want to be able to work with in SharePoint designer workflows (your workflow might need to update a value in the form for example).&lt;/p&gt;

&lt;p&gt;Now the first step that I knew needed to be taken was to “promote” the properties within InfoPath. This puts them into the SharePoint list so that I can manipulate views based on the values in the form, and it looked like what I was after. You get to the property promotion window from the form options dialog (go to the backstage view, and select form options, then choose “Property promotion” from the left). When you create a promoted property here this is what you get:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog-cdn.brianfarnhill.com/images/20101129-1.png" alt="Example screenshot from InfoPath 2010" /&gt;&lt;/p&gt;

&lt;p&gt;Go and publish the form, you will notice that when you go into SharePoint designer and try to do something like set a field in the current item, you don’t see your promoted field – what the? It’s promoted, I should be able to work with it right? Well true – but there is a trick to this, and I think that Microsoft screwed up the UI here totally.&lt;/p&gt;

&lt;p&gt;When you publish a form and choose to publish it to SharePoint (not using the quick publish, run through it all like the first time you published the form) you will see that one of the things it asks you about is your promoted properties,giving you the option to set them here instead of in the form options dialog like we did earlier. Here is the thing though – click modify on one of the properties and look at the window it gives you,it will look like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog-cdn.brianfarnhill.com/images/20101129-2.png" alt="Example screenshot from InfoPath 2010" /&gt;&lt;/p&gt;

&lt;p&gt;Notice the bottom of the form – we have an options here that we didn’t have before! First of all we can choose the group for the site column to go in, which is good from the point of view of managing them, but the more important option is one at the bottom – “Allow users to edit data in this field by using a datasheet or properties page”. This is the magic box to tick! Once you enable this for your promoted property and publish the form again, it will show up in SharePoint Designer in all the places you would expect it to!&lt;/p&gt;

&lt;p&gt;So there you have it, easy when you know where to look – but not consistent from a UI perspective – if I am modifying a promoted property, it shouldn’t matter where I change it, I should get the same options in both places. Hopefully this gets addressed at some point!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/11/problem-setting-values-of-an-infopath-form-from-sharepoint-designer-based-workflows" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f11%2fproblem-setting-values-of-an-infopath-form-from-sharepoint-designer-based-workflows&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2010-11-29T03:36:03Z</published>
    <updated>2012-01-25T09:54:46Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/dmrV59bdBZY/problem-setting-values-of-an-infopath-form-from-sharepoint-designer-based-workflows" />
    <category term="sharepoint" />
    <category term="InfoPath" />
    <category term="workflows" />
    <content type="html">&lt;p&gt;This is something that threw me for a bit a week or two ago, and I didn’t blog about it then, and today I came across the same thing and got just as lost, so I’m gonna write it down this time! Here is the scenario – you have created an InfoPath form and published it to a forms library. The form has a few properties in it that you want to be able to work with in SharePoint designer workflows (your workflow might need to update a value in the form for example).&lt;/p&gt;

&lt;p&gt;Now the first step that I knew needed to be taken was to “promote” the properties within InfoPath. This puts them into the SharePoint list so that I can manipulate views based on the values in the form, and it looked like what I was after. You get to the property promotion window from the form options dialog (go to the backstage view, and select form options, then choose “Property promotion” from the left). When you create a promoted property here this is what you get:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog-cdn.brianfarnhill.com/images/20101129-1.png" alt="Example screenshot from InfoPath 2010" /&gt;&lt;/p&gt;

&lt;p&gt;Go and publish the form, you will notice that when you go into SharePoint designer and try to do something like set a field in the current item, you don’t see your promoted field – what the? It’s promoted, I should be able to work with it right? Well true – but there is a trick to this, and I think that Microsoft screwed up the UI here totally.&lt;/p&gt;

&lt;p&gt;When you publish a form and choose to publish it to SharePoint (not using the quick publish, run through it all like the first time you published the form) you will see that one of the things it asks you about is your promoted properties,giving you the option to set them here instead of in the form options dialog like we did earlier. Here is the thing though – click modify on one of the properties and look at the window it gives you,it will look like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog-cdn.brianfarnhill.com/images/20101129-2.png" alt="Example screenshot from InfoPath 2010" /&gt;&lt;/p&gt;

&lt;p&gt;Notice the bottom of the form – we have an options here that we didn’t have before! First of all we can choose the group for the site column to go in, which is good from the point of view of managing them, but the more important option is one at the bottom – “Allow users to edit data in this field by using a datasheet or properties page”. This is the magic box to tick! Once you enable this for your promoted property and publish the form again, it will show up in SharePoint Designer in all the places you would expect it to!&lt;/p&gt;

&lt;p&gt;So there you have it, easy when you know where to look – but not consistent from a UI perspective – if I am modifying a promoted property, it shouldn’t matter where I change it, I should get the same options in both places. Hopefully this gets addressed at some point!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/11/problem-setting-values-of-an-infopath-form-from-sharepoint-designer-based-workflows" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f11%2fproblem-setting-values-of-an-infopath-form-from-sharepoint-designer-based-workflows&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dmrV59bdBZY:9XzifE4ZoNw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dmrV59bdBZY:9XzifE4ZoNw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dmrV59bdBZY:9XzifE4ZoNw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=dmrV59bdBZY:9XzifE4ZoNw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=dmrV59bdBZY:9XzifE4ZoNw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/dmrV59bdBZY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2010/11/problem-setting-values-of-an-infopath-form-from-sharepoint-designer-based-workflows</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2010/11/error-cannot-insert-duplicate-key-row-in-object-dbo-solutions</id>
    <title type="text">Error: Cannot insert duplicate key row in object 'dbo.Solutions'</title>
    <summary type="html">&lt;p&gt;A quick post to talk about an error I just found while working with a sandbox solution in SharePoint 2010 (and when I Bing’ed and Googled it I got nothing, literally nothing!). Here is the scenario …&lt;/p&gt;

&lt;p&gt;You have a sandbox solution in Visual Studio 2010 and you are quite happily deploying it in to your site. Now lets say you delete that site collection and create a new one with the exact same URL and same name, and then try to redeploy your sandbox solution right from Visual Studio. You will get the following error:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Cannot insert duplicate key row in
  object 'dbo.Solutions' with unique
  index
  'Solutions_BySiteAndSolutionId'.  The
  statement has been terminated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How do I fix this you ask? Simple – in Visual Studio in the solution browser, select the project item for your sandbox solution and look in the properties window. You will see the URL property that tells Visual Studio where to deploy your project. Simply change this to something else and then change it back to its original value. Hit deploy again and all will be well.&lt;/p&gt;

&lt;p&gt;Now for the explanation … I don’t really have one. I do know that Visual Studio does some crazy voodoo stuff when it is talking to the locally installed instance of SharePoint sometimes, and it appears that the way it goes about deploying and activating a sandbox solution is no exception to this. The error leads me to believe that something is happening to keep the solution in the database even after the site collection is deleted (if you look through the ULS logs you will see it is a SQLException that is being thrown here), I just can’t think of a good reason for why that would happen though. At least it’s easy to fix though!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/11/error-cannot-insert-duplicate-key-row-in-object-dbo-solutions" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f11%2ferror-cannot-insert-duplicate-key-row-in-object-dbo-solutions&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2010-11-16T10:07:53Z</published>
    <updated>2012-01-24T11:07:17Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/TZbxUzNDHb8/error-cannot-insert-duplicate-key-row-in-object-dbo-solutions" />
    <category term="sharepoint" />
    <category term="visual-studio" />
    <category term="errors" />
    <content type="html">&lt;p&gt;A quick post to talk about an error I just found while working with a sandbox solution in SharePoint 2010 (and when I Bing’ed and Googled it I got nothing, literally nothing!). Here is the scenario …&lt;/p&gt;

&lt;p&gt;You have a sandbox solution in Visual Studio 2010 and you are quite happily deploying it in to your site. Now lets say you delete that site collection and create a new one with the exact same URL and same name, and then try to redeploy your sandbox solution right from Visual Studio. You will get the following error:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Cannot insert duplicate key row in
  object 'dbo.Solutions' with unique
  index
  'Solutions_BySiteAndSolutionId'.  The
  statement has been terminated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How do I fix this you ask? Simple – in Visual Studio in the solution browser, select the project item for your sandbox solution and look in the properties window. You will see the URL property that tells Visual Studio where to deploy your project. Simply change this to something else and then change it back to its original value. Hit deploy again and all will be well.&lt;/p&gt;

&lt;p&gt;Now for the explanation … I don’t really have one. I do know that Visual Studio does some crazy voodoo stuff when it is talking to the locally installed instance of SharePoint sometimes, and it appears that the way it goes about deploying and activating a sandbox solution is no exception to this. The error leads me to believe that something is happening to keep the solution in the database even after the site collection is deleted (if you look through the ULS logs you will see it is a SQLException that is being thrown here), I just can’t think of a good reason for why that would happen though. At least it’s easy to fix though!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/11/error-cannot-insert-duplicate-key-row-in-object-dbo-solutions" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f11%2ferror-cannot-insert-duplicate-key-row-in-object-dbo-solutions&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=TZbxUzNDHb8:T8oex74lNwA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=TZbxUzNDHb8:T8oex74lNwA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=TZbxUzNDHb8:T8oex74lNwA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=TZbxUzNDHb8:T8oex74lNwA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=TZbxUzNDHb8:T8oex74lNwA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/TZbxUzNDHb8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2010/11/error-cannot-insert-duplicate-key-row-in-object-dbo-solutions</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2010/10/retrieving-the-id-of-an-external-data-item-field</id>
    <title type="text">Retrieving the ID of an External Data Item field</title>
    <summary type="html">&lt;p&gt;This is one I cam across the other day while working on a custom web service for a project I am working on. The scenario is this – I have a custom SharePoint list in my site, and one of the fields in that list is an External Data type, linked to a predefined BCS entity. When I retrieve the items from the list I want to get the ID field for the BCS item (without it being selected as an additional field to include in the list itself, because my users don’t care what the number is but my web service needs to dish it out).&lt;/p&gt;

&lt;p&gt;You’ll notice that when you query for a field that is an external data type, it returns you just a string, which is just the text title for that field that will appear on list forms and such. This on it’s own is useless to us. What you might not immediately notice is that when we get the SPListItem through code there are actually a number of other fields in there that contain data that could be useful to us.&lt;/p&gt;

&lt;p&gt;The one you will want to look out for will be named like this – “&lt;em&gt;{BCS Entity Name}&lt;/em&gt;&lt;em&gt;ID”. So if I have a BCS entity called “External Customer” then the field I would be looking for will be called “External Customer&lt;/em&gt;ID”. This doesn’t give us the ID in our external system though, this field will give you a value that looks like this – “__bg800083001300” or some combination of numbers and letters like that.&lt;/p&gt;

&lt;p&gt;This is where we look to a little object called the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.businessdata.infrastructure.entityinstanceidencoder.aspx"&gt;EntityInstanceIdEncoder&lt;/a&gt; (It’s worth noting that the namespace for this class has moved from the SharePoint 2007 days, you can still use it from the old namespace, but you will get a warning about it being obsolete). This class is responsible for encoding and decoding an ID value from your external system into a value that SharePoint will store (the reason for this is that the ID in your external system might consist of more than one field, so a composite key – in that case both values will be used to generate this ID, and when you decode it you will get both values back as separate objects).&lt;/p&gt;

&lt;p&gt;There are 3 static methods on this object, one to encode,one to decode and one to tell you if a string you are looking at is actually an ID value (handy to call this before you attempt to decode a value to save yourself throwing an exception). The decode method will return an array of objects,which will contain our value (or values in the case of a composite key), so if we wanted to get our ID back we could do it something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//assume you have the SPListItem object called myItem
var encodedValue = myItem["External Customer_ID"].ToString();
var ids = EntityInstanceIdEncoder.DecodeEntityInstanceId(encodedValue);
var actualId = ids[0];
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it, now we have the ID from the original data source and we can go and do whatever we need with it!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/10/retrieving-the-id-of-an-external-data-item-field" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f10%2fretrieving-the-id-of-an-external-data-item-field&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2010-10-26T05:20:10+01:00</published>
    <updated>2012-01-24T11:02:12Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/bkZdPeb_jx0/retrieving-the-id-of-an-external-data-item-field" />
    <category term="sharepoint" />
    <category term="BCS" />
    <content type="html">&lt;p&gt;This is one I cam across the other day while working on a custom web service for a project I am working on. The scenario is this – I have a custom SharePoint list in my site, and one of the fields in that list is an External Data type, linked to a predefined BCS entity. When I retrieve the items from the list I want to get the ID field for the BCS item (without it being selected as an additional field to include in the list itself, because my users don’t care what the number is but my web service needs to dish it out).&lt;/p&gt;

&lt;p&gt;You’ll notice that when you query for a field that is an external data type, it returns you just a string, which is just the text title for that field that will appear on list forms and such. This on it’s own is useless to us. What you might not immediately notice is that when we get the SPListItem through code there are actually a number of other fields in there that contain data that could be useful to us.&lt;/p&gt;

&lt;p&gt;The one you will want to look out for will be named like this – “&lt;em&gt;{BCS Entity Name}&lt;/em&gt;&lt;em&gt;ID”. So if I have a BCS entity called “External Customer” then the field I would be looking for will be called “External Customer&lt;/em&gt;ID”. This doesn’t give us the ID in our external system though, this field will give you a value that looks like this – “__bg800083001300” or some combination of numbers and letters like that.&lt;/p&gt;

&lt;p&gt;This is where we look to a little object called the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.businessdata.infrastructure.entityinstanceidencoder.aspx"&gt;EntityInstanceIdEncoder&lt;/a&gt; (It’s worth noting that the namespace for this class has moved from the SharePoint 2007 days, you can still use it from the old namespace, but you will get a warning about it being obsolete). This class is responsible for encoding and decoding an ID value from your external system into a value that SharePoint will store (the reason for this is that the ID in your external system might consist of more than one field, so a composite key – in that case both values will be used to generate this ID, and when you decode it you will get both values back as separate objects).&lt;/p&gt;

&lt;p&gt;There are 3 static methods on this object, one to encode,one to decode and one to tell you if a string you are looking at is actually an ID value (handy to call this before you attempt to decode a value to save yourself throwing an exception). The decode method will return an array of objects,which will contain our value (or values in the case of a composite key), so if we wanted to get our ID back we could do it something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//assume you have the SPListItem object called myItem
var encodedValue = myItem["External Customer_ID"].ToString();
var ids = EntityInstanceIdEncoder.DecodeEntityInstanceId(encodedValue);
var actualId = ids[0];
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it, now we have the ID from the original data source and we can go and do whatever we need with it!&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/10/retrieving-the-id-of-an-external-data-item-field" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f10%2fretrieving-the-id-of-an-external-data-item-field&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=bkZdPeb_jx0:iU7k3p_jFpM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=bkZdPeb_jx0:iU7k3p_jFpM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=bkZdPeb_jx0:iU7k3p_jFpM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=bkZdPeb_jx0:iU7k3p_jFpM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=bkZdPeb_jx0:iU7k3p_jFpM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/bkZdPeb_jx0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2010/10/retrieving-the-id-of-an-external-data-item-field</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2010/10/im-on-the-talking-shop-down-under-podcast-with-jeremy-thake</id>
    <title type="text">I’m on the talking shop down under podcast with Jeremy Thake</title>
    <summary type="html">&lt;p&gt;While we were up at Tech.Ed Australia this year, &lt;a href="http://wss.made4the.net/"&gt;Jeremy Thake&lt;/a&gt; and I sat down with &lt;a href="http://richardsbraindump.blogspot.com/"&gt;Richard Banks&lt;/a&gt; and took part in &lt;strike&gt;a massacre&lt;/strike&gt; an episode of the talking shop down under podcast!&lt;/p&gt;

&lt;p&gt;Jeremy and I talk with Richard about SharePoint from a development perspective, including some history of development for SharePoint, some of the benefits of developing against SharePoint 2010, and some of the highs and lows of SharePoint development. &lt;/p&gt;

&lt;p&gt;Here are the details, love to hear what you guys think!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.talkingshopdownunder.com/2010/10/episode-30-sharepoint-episode.html"&gt;Episode 30 – The Sharepoint Episode&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  
  &lt;p&gt;This episode, recorded live at Tech.Ed Australia 2010, sees Richard Banks talking with Brian Farnhill and Jeremy Thake about Sharepoint. Richard rips into it, and Brian and Jeremy fight back - it makes for a great episode and I hope you enjoy it.&lt;br /&gt;
  Oh, in case it's not obvious, the opinions and viewpoints expressed in this episode are without a doubt in no way reflective of our employers nor of Microsoft corporation. It's all purely personal.&lt;br /&gt;
  Links:&lt;br /&gt;
  &lt;a href="http://wss.made4the.net/"&gt;Jeremy Thake&lt;/a&gt; - &lt;a href="http://twitter.com/jthake"&gt;@jthake&lt;/a&gt;&lt;br /&gt;
  &lt;a href="http://blog.brianfarnhill.com/"&gt;Brian Farnhill&lt;/a&gt; - &lt;a href="http://twitter.com/brianfarnhill"&gt;@brianfarnhill&lt;/a&gt;&lt;br /&gt;
  &lt;a href="http://www.sharepointdevwiki.com/"&gt;Sharepoint Dev Wiki&lt;/a&gt;   &lt;/p&gt;
  
  &lt;p&gt;Duration 32:11 mins | &lt;a href="http://www.archive.org/download/TalkingShopDownUnderPodcastEpisode30/TalkingShopDownUnderEp30-TheSharepointEpisode.mp3"&gt;Download mp3&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/10/im-on-the-talking-shop-down-under-podcast-with-jeremy-thake" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f10%2fim-on-the-talking-shop-down-under-podcast-with-jeremy-thake&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2010-10-11T21:14:06+01:00</published>
    <updated>2012-01-24T10:57:00Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/st50I5CvQjI/im-on-the-talking-shop-down-under-podcast-with-jeremy-thake" />
    <category term="communities" />
    <category term="podcasts" />
    <content type="html">&lt;p&gt;While we were up at Tech.Ed Australia this year, &lt;a href="http://wss.made4the.net/"&gt;Jeremy Thake&lt;/a&gt; and I sat down with &lt;a href="http://richardsbraindump.blogspot.com/"&gt;Richard Banks&lt;/a&gt; and took part in &lt;strike&gt;a massacre&lt;/strike&gt; an episode of the talking shop down under podcast!&lt;/p&gt;

&lt;p&gt;Jeremy and I talk with Richard about SharePoint from a development perspective, including some history of development for SharePoint, some of the benefits of developing against SharePoint 2010, and some of the highs and lows of SharePoint development. &lt;/p&gt;

&lt;p&gt;Here are the details, love to hear what you guys think!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.talkingshopdownunder.com/2010/10/episode-30-sharepoint-episode.html"&gt;Episode 30 – The Sharepoint Episode&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  
  &lt;p&gt;This episode, recorded live at Tech.Ed Australia 2010, sees Richard Banks talking with Brian Farnhill and Jeremy Thake about Sharepoint. Richard rips into it, and Brian and Jeremy fight back - it makes for a great episode and I hope you enjoy it.&lt;br /&gt;
  Oh, in case it's not obvious, the opinions and viewpoints expressed in this episode are without a doubt in no way reflective of our employers nor of Microsoft corporation. It's all purely personal.&lt;br /&gt;
  Links:&lt;br /&gt;
  &lt;a href="http://wss.made4the.net/"&gt;Jeremy Thake&lt;/a&gt; - &lt;a href="http://twitter.com/jthake"&gt;@jthake&lt;/a&gt;&lt;br /&gt;
  &lt;a href="http://blog.brianfarnhill.com/"&gt;Brian Farnhill&lt;/a&gt; - &lt;a href="http://twitter.com/brianfarnhill"&gt;@brianfarnhill&lt;/a&gt;&lt;br /&gt;
  &lt;a href="http://www.sharepointdevwiki.com/"&gt;Sharepoint Dev Wiki&lt;/a&gt;   &lt;/p&gt;
  
  &lt;p&gt;Duration 32:11 mins | &lt;a href="http://www.archive.org/download/TalkingShopDownUnderPodcastEpisode30/TalkingShopDownUnderEp30-TheSharepointEpisode.mp3"&gt;Download mp3&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/10/im-on-the-talking-shop-down-under-podcast-with-jeremy-thake" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f10%2fim-on-the-talking-shop-down-under-podcast-with-jeremy-thake&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=st50I5CvQjI:1baaZ1Lvu1A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=st50I5CvQjI:1baaZ1Lvu1A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=st50I5CvQjI:1baaZ1Lvu1A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=st50I5CvQjI:1baaZ1Lvu1A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=st50I5CvQjI:1baaZ1Lvu1A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/st50I5CvQjI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2010/10/im-on-the-talking-shop-down-under-podcast-with-jeremy-thake</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2010/10/new-codeplex-project-spjumplist-quick-launch-links-for-pinned-sites</id>
    <title type="text">New CodePlex Project: SPJumpList – quick launch links for pinned sites</title>
    <summary type="html">&lt;p&gt;&lt;img src="http://c281802.r2.cf1.rackcdn.com/images/20101008-1.png" alt="Screenshot of a JumpList from a SharePoint 2010 site" /&gt;&lt;/p&gt;

&lt;p&gt;This is a quick little project that I slapped together after seeing the new ability in Internet Explorer 9 beta to pin sites to the task bar/start menu in Windows 7, specifically the ability for a web page to tell the OS what links should be included in the “jump list”. Basically I had a few ideas of what I wanted to achieve with this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All the links in a SharePoint sites quick launch menu should be listed as jump links&lt;/li&gt;
&lt;li&gt;The solution should be a sandbox solution that can be updated to the solution gallery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The solution itself is actually quite simple, its driven entirely by JavaScript and the JavaScript object model provided by SharePoint 2010. This meant that I could sandbox the solution like I wanted and have the desired outcome. I’m calling the solution a beta, mostly to reflect the fact that at this point in time I have only tested it on team sites (not publishing sites yet), and given that Internet Explorer 9 is still in beta the JavaScript may need to change and therefore this release might not work when IE makes its final release.&lt;/p&gt;

&lt;p&gt;That being said, it’s a sandbox solution, its easy to put in and turn on and off, so why not grab it and have a go, I’ve added a link to the CodePlex project and a video run through of the solution below. Also feel free to leave me comments to let me know what you think!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="http://spjumplist.codeplex.com/"&gt;SP Jump List on CodePlex&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="http://www.screencast.com/t/MLsexoCqFu6"&gt;Video demo of SP Jump List&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/10/new-codeplex-project-spjumplist-quick-launch-links-for-pinned-sites" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f10%2fnew-codeplex-project-spjumplist-quick-launch-links-for-pinned-sites&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2010-10-08T10:16:57+01:00</published>
    <updated>2012-01-25T09:44:08Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/uU8CbcAvMXA/new-codeplex-project-spjumplist-quick-launch-links-for-pinned-sites" />
    <category term="sharepoint" />
    <category term="open-source" />
    <content type="html">&lt;p&gt;&lt;img src="http://c281802.r2.cf1.rackcdn.com/images/20101008-1.png" alt="Screenshot of a JumpList from a SharePoint 2010 site" /&gt;&lt;/p&gt;

&lt;p&gt;This is a quick little project that I slapped together after seeing the new ability in Internet Explorer 9 beta to pin sites to the task bar/start menu in Windows 7, specifically the ability for a web page to tell the OS what links should be included in the “jump list”. Basically I had a few ideas of what I wanted to achieve with this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All the links in a SharePoint sites quick launch menu should be listed as jump links&lt;/li&gt;
&lt;li&gt;The solution should be a sandbox solution that can be updated to the solution gallery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The solution itself is actually quite simple, its driven entirely by JavaScript and the JavaScript object model provided by SharePoint 2010. This meant that I could sandbox the solution like I wanted and have the desired outcome. I’m calling the solution a beta, mostly to reflect the fact that at this point in time I have only tested it on team sites (not publishing sites yet), and given that Internet Explorer 9 is still in beta the JavaScript may need to change and therefore this release might not work when IE makes its final release.&lt;/p&gt;

&lt;p&gt;That being said, it’s a sandbox solution, its easy to put in and turn on and off, so why not grab it and have a go, I’ve added a link to the CodePlex project and a video run through of the solution below. Also feel free to leave me comments to let me know what you think!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="http://spjumplist.codeplex.com/"&gt;SP Jump List on CodePlex&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="http://www.screencast.com/t/MLsexoCqFu6"&gt;Video demo of SP Jump List&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/10/new-codeplex-project-spjumplist-quick-launch-links-for-pinned-sites" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f10%2fnew-codeplex-project-spjumplist-quick-launch-links-for-pinned-sites&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=uU8CbcAvMXA:-u6rmZMSf50:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=uU8CbcAvMXA:-u6rmZMSf50:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=uU8CbcAvMXA:-u6rmZMSf50:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=uU8CbcAvMXA:-u6rmZMSf50:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=uU8CbcAvMXA:-u6rmZMSf50:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/uU8CbcAvMXA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2010/10/new-codeplex-project-spjumplist-quick-launch-links-for-pinned-sites</feedburner:origLink></entry>
  <entry>
    <id>http://blog.brianfarnhill.com/2010/09/project-server-psi-error-system-data-sqltypes-sqlnullvalueexception-data-is-null</id>
    <title type="text">Project Server PSI Error - System.Data.SqlTypes.SqlNullValueException: Data is Null.</title>
    <summary type="html">&lt;p&gt;As anyone who has been following my tweets leading up to Tech.Ed last week will know, I have been doing some work with Project Server 2010, so far as developing some customisations that will work with Project Servers API (called the Project Server Interface, or PSI for short). Now I have some opinions on the PSI in general (&lt;strong&gt;&lt;em&gt;*cough*&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;rubbish&lt;/em&gt; &lt;strong&gt;&lt;em&gt;*cough*&lt;/em&gt;&lt;/strong&gt;) but I have been getting the hang of it, and I did come across this error the other day that I thought was worth sharing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was happening when I was trying to add some tasks to an existing project, and was failing at the QueueAddToProject() method. Looking through the stack trace on the error (and seriously don’t get me started on how you get errors out of Project server – I might start coughing again! lol)I found that it was failing while trying to validate the session (with the session being from where I programmatically check out the project before I add to it).&lt;/p&gt;

&lt;p&gt;Here was the problem in the end – when you check a project out you need to specify three things – the GUID of the project, a GUID to represent the session ID, and a string the describes the checkout. Initially I was leaving the string empty, because in all honesty I didn’t care that much – but that was the problem for me. As soon as I put a value in that string it was able to happily continue adding my tasks for me.&lt;/p&gt;

&lt;p&gt;I would have liked to be given an error when I checked out the project here (rather than letting the code for the checkout execute fine and then whinge when I try to do something with it) but in the end the stack trace made it pretty easy to figure out.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/09/project-server-psi-error-system-data-sqltypes-sqlnullvalueexception-data-is-null" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f09%2fproject-server-psi-error-system-data-sqltypes-sqlnullvalueexception-data-is-null&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;</summary>
    <published>2010-09-01T03:59:38+01:00</published>
    <updated>2012-01-24T10:51:45Z</updated>
    <author>
      <name>Brian Farnhill</name>
    </author>
    <link href="http://feedproxy.google.com/~r/BrianFarnhill/~3/S2LCGvcj5gw/project-server-psi-error-system-data-sqltypes-sqlnullvalueexception-data-is-null" />
    <category term="project-server" />
    <content type="html">&lt;p&gt;As anyone who has been following my tweets leading up to Tech.Ed last week will know, I have been doing some work with Project Server 2010, so far as developing some customisations that will work with Project Servers API (called the Project Server Interface, or PSI for short). Now I have some opinions on the PSI in general (&lt;strong&gt;&lt;em&gt;*cough*&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;rubbish&lt;/em&gt; &lt;strong&gt;&lt;em&gt;*cough*&lt;/em&gt;&lt;/strong&gt;) but I have been getting the hang of it, and I did come across this error the other day that I thought was worth sharing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was happening when I was trying to add some tasks to an existing project, and was failing at the QueueAddToProject() method. Looking through the stack trace on the error (and seriously don’t get me started on how you get errors out of Project server – I might start coughing again! lol)I found that it was failing while trying to validate the session (with the session being from where I programmatically check out the project before I add to it).&lt;/p&gt;

&lt;p&gt;Here was the problem in the end – when you check a project out you need to specify three things – the GUID of the project, a GUID to represent the session ID, and a string the describes the checkout. Initially I was leaving the string empty, because in all honesty I didn’t care that much – but that was the problem for me. As soon as I put a value in that string it was able to happily continue adding my tasks for me.&lt;/p&gt;

&lt;p&gt;I would have liked to be given an error when I checked out the project here (rather than letting the code for the checkout execute fine and then whinge when I try to do something with it) but in the end the stack trace made it pretty easy to figure out.&lt;/p&gt;
&lt;img src="http://blog.brianfarnhill.com/via-feed/2010/09/project-server-psi-error-system-data-sqltypes-sqlnullvalueexception-data-is-null" /&gt;  &lt;div class='facebook'&gt;
                      &lt;iframe src='http://www.facebook.com/plugins/like.php?href=http%3a%2f%2fblog.brianfarnhill.com%2f2010%2f09%2fproject-server-psi-error-system-data-sqltypes-sqlnullvalueexception-data-is-null&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'&gt;&lt;/iframe&gt;
                    &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=S2LCGvcj5gw:hnLCUQ-859c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=S2LCGvcj5gw:hnLCUQ-859c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=S2LCGvcj5gw:hnLCUQ-859c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?i=S2LCGvcj5gw:hnLCUQ-859c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BrianFarnhill?a=S2LCGvcj5gw:hnLCUQ-859c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BrianFarnhill?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BrianFarnhill/~4/S2LCGvcj5gw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.brianfarnhill.com/2010/09/project-server-psi-error-system-data-sqltypes-sqlnullvalueexception-data-is-null</feedburner:origLink></entry>
</feed>

