<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>An Irishman Down Under - Technical</title>
    <link>http://blog.keithpatton.com/</link>
    <description>Keith Patton's Blog</description>
    <language>en-us</language>
    <copyright>Keith Patton</copyright>
    <lastBuildDate>Fri, 05 Feb 2010 02:05:58 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>kpatton@gmail.com</managingEditor>
    <webMaster>kpatton@gmail.com</webMaster>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=a01973b9-0041-4921-835c-a94148dbb4d6</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,a01973b9-0041-4921-835c-a94148dbb4d6.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,a01973b9-0041-4921-835c-a94148dbb4d6.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a01973b9-0041-4921-835c-a94148dbb4d6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://www.markerstudio.com/technical/2010/02/introducing-the-marker-kentico-business-library-mkb/">Marker
Kentico Business library</a> now available.<img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=a01973b9-0041-4921-835c-a94148dbb4d6" /></body>
      <title>Marker Kentico Business library released</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,a01973b9-0041-4921-835c-a94148dbb4d6.aspx</guid>
      <link>http://blog.keithpatton.com/2010/02/05/Marker+Kentico+Business+Library+Released.aspx</link>
      <pubDate>Fri, 05 Feb 2010 02:05:58 GMT</pubDate>
      <description>&lt;a href="http://www.markerstudio.com/technical/2010/02/introducing-the-marker-kentico-business-library-mkb/"&gt;Marker
Kentico Business library&lt;/a&gt; now available.&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=a01973b9-0041-4921-835c-a94148dbb4d6" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,a01973b9-0041-4921-835c-a94148dbb4d6.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=1e0471ad-6485-453f-b5c4-14249e199cae</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,1e0471ad-6485-453f-b5c4-14249e199cae.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,1e0471ad-6485-453f-b5c4-14249e199cae.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1e0471ad-6485-453f-b5c4-14249e199cae</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Contrary to popular believe you can actually run multiple ssl sites on an IIS 7 box
which only has one ip address (It's easier if you have multiple ip addresses but not
impossible if you don't). 
</p>
        <p>
          <i>This is very useful for development and test boxes running a test ssl cert but
can also be used in production environments if all secure sites run under a super
cert (e.g. *.mydomain.com)</i>
        </p>
        <p>
          <b>Follow the guide here</b>
        </p>
        <p>
          <a href="http://www.sslshopper.com/article-ssl-host-headers-in-iis-7.html">http://www.sslshopper.com/article-ssl-host-headers-in-iis-7.html</a>
        </p>
        <p>
          <b>However, for the certificate you can easily use a test one in non live environments </b>
        </p>
        <p>
          <a href="http://weblogs.asp.net/scottgu/archive/2007/04/06/tip-trick-enabling-ssl-on-iis7-using-self-signed-certificates.aspx">http://weblogs.asp.net/scottgu/archive/2007/04/06/tip-trick-enabling-ssl-on-iis7-using-self-signed-certificates.aspx</a>
        </p>
        <p>
I recommend you install a single TestSSL certificate on a development machine and
apply this process for any new SSL enabled sites in development. 
</p>
        <p>
          <i>The key I discovered is to assign the certificate to the first site in IIS before
running the command line to enable the host headers for other sites.</i>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=1e0471ad-6485-453f-b5c4-14249e199cae" />
      </body>
      <title>SSL Host Headers in IIS 7 with Test SSL Certificate</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,1e0471ad-6485-453f-b5c4-14249e199cae.aspx</guid>
      <link>http://blog.keithpatton.com/2009/11/04/SSL+Host+Headers+In+IIS+7+With+Test+SSL+Certificate.aspx</link>
      <pubDate>Wed, 04 Nov 2009 08:51:35 GMT</pubDate>
      <description>&lt;p&gt;
Contrary to popular believe you can actually run multiple ssl sites on an IIS 7 box
which only has one ip address (It's easier if you have multiple ip addresses but not
impossible if you don't). 
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;This is very useful for development and test boxes running a test ssl cert but
can also be used in production environments if all secure sites run under a super
cert (e.g. *.mydomain.com)&lt;/i&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Follow the guide here&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.sslshopper.com/article-ssl-host-headers-in-iis-7.html"&gt;http://www.sslshopper.com/article-ssl-host-headers-in-iis-7.html&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;However, for the certificate you can easily use a test one in non live environments &lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/04/06/tip-trick-enabling-ssl-on-iis7-using-self-signed-certificates.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2007/04/06/tip-trick-enabling-ssl-on-iis7-using-self-signed-certificates.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I recommend you install a single TestSSL certificate on a development machine and
apply this process for any new SSL enabled sites in development. 
&lt;/p&gt;
&lt;p&gt;
&lt;i&gt;The key I discovered is to assign the certificate to the first site in IIS before
running the command line to enable the host headers for other sites.&lt;/i&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=1e0471ad-6485-453f-b5c4-14249e199cae" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,1e0471ad-6485-453f-b5c4-14249e199cae.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=184f8532-b671-454b-9b00-1d26b4ed7467</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,184f8532-b671-454b-9b00-1d26b4ed7467.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,184f8532-b671-454b-9b00-1d26b4ed7467.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=184f8532-b671-454b-9b00-1d26b4ed7467</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <br />
        </p>
        <p>
EDIT: Please see <a href="http://blogs.msdn.com/ablock/archive/2009/08/24/exposing-tfs-2010-beta-2-to-the-internet.aspx">Aaron
Block's excellent guide to understanding TFS communiciation architecture </a>along
with tips to set this up. I have just added my thoughts in here on top now that i
have found this doc:
</p>
        <p>
Organisations may wish to expose their Team Foundation Server resources (including
SharePoint Team Sites) using fully qualified domain names (FQDNs) both internally
and externally. This document provides (almost) complete guidelines on how to do this,
with particular focus on the TFS and SharePoint configuration to support FQDNs.
</p>
        <p>
          <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=2d531219-2c39-4c69-88ef-f5ae6ac18c9f" target="_blank">Install
TFS 2010 Beta 2</a>. This guide assumes a single server installation, but could easily
be interpreted to work with multiple application tiers. 
<br /><br />
Set up your FQDN. For internal access, it's recommended that you update your DNS Server
internally (e.g. Forward Lookup Zone for tfs.yourcompany.com) to ensure that the FQDN
points to an internal IP Address when users are connected to the network (to avoid
having to route out to the internet and back). 
</p>
        <p>
For external access, add an A record for the FQDN to the DNS zone file for your domain
(via your ISP’s control panel normally). You will need to configure your perimeter
network appropriately to route public 80 and 8080 (or 443 if you are going secure,
not covered here) traffic through to your TFS server which is not covered here. (Although
I intend to post separately on doing this with ISA 2006 soon). 
<br /><br /><strong>Ensure your FQDN is working internally and externally as expected before continuing
to configure TFS and SharePoint. 
<br /></strong><br />
Disable the Loop Back Check on your TFS Server. <a href="http://support.microsoft.com/kb/926642">http://support.microsoft.com/kb/926642</a>.
This is required otherwise the TFS Admin Console will throw errors as it won't be
able to access your FQDN
</p>
        <p>
Restart your server
</p>
        <p>
Add your FQDN to the alternate access mapping of SharePoint for the TFS Web Application 
using SharePoint 3.0 Central Administration &gt; Operations &gt;Alternate access mappings
(use 'Add Internal Urls').
</p>
        <p>
          <strike>Change the RS &amp; WSS locations by directly editing tbl_LocationMapping
table in the TFS Configuration database, adding your FQDN in.</strike> (Aaron has
advised this is definitely not necessary, as these urls can be altered in the TFS
Admin Console, see below)<br /></p>
        <p>
Restart IIS 7.0
</p>
        <p>
Open TFS Admin Console, select Application Tier, then click on Change URLS. 
</p>
        <p>
Put your FQDN in the Public Url field and change the Server Url to continue to use
the netbios machine name and then click OK. and click OK
</p>
        <p>
Select Application Tier &gt; SharePoint Web Applications, then select the top row
in the list within the SharePoint Web Applications list box. Click 'Change SharePoint
Web Application' and put your FQDN in the Friendly Name and Web Application Url fields
and click OK.<br /></p>
        <p>
Select Application Tier &gt; Reporting and click Edit. Ensure that your FQDN is used
for the Warehouse Database, Analysis Services Database, Report Server Url and Report
Manager url.
</p>
        <p>
Start all services again once this is completed.
</p>
        <p>
Within the TFS Admin Console, select Extensions for SharePoint Products, then select
the top row in the list within the list box. 
</p>
        <p>
Click Modify Access, and ensure the FQDN is added to the URL for Team Foundation Server
and click OK.
</p>
        <p>
          <strong>
            <em>Note! </em>
          </strong>
          <strong>
            <em>Excel Reports on the SharePoint sites
don't work unless you open ports for Analysis Services (link to follow...)<br /></em>
          </strong>
        </p>
        <p>
You should now be ready to go!
</p>
        <p>
          <strong>Credits</strong>
          <br />
This post builds on the work done in the post below, but is updated for Beta 2 and
also includes additional configuration. 
<br /><a href="http://www.euri.com/Blog/tabid/85/EntryId/38/Changing-the-URL-of-Team-Foundation-Server-TFS-2010-Beta-1-to-a-FQDN.aspx">http://www.euri.com/Blog/tabid/85/EntryId/38/Changing-the-URL-of-Team-Foundation-Server-TFS-2010-Beta-1-to-a-FQDN.aspx</a></p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=184f8532-b671-454b-9b00-1d26b4ed7467" />
      </body>
      <title>Enabling a Fully Qualified Domain Name (FQDN) in Team Foundation Server 2010 (TFS 2010)</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,184f8532-b671-454b-9b00-1d26b4ed7467.aspx</guid>
      <link>http://blog.keithpatton.com/2009/10/22/Enabling+A+Fully+Qualified+Domain+Name+FQDN+In+Team+Foundation+Server+2010+TFS+2010.aspx</link>
      <pubDate>Thu, 22 Oct 2009 08:47:11 GMT</pubDate>
      <description>&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
EDIT: Please see &lt;a href="http://blogs.msdn.com/ablock/archive/2009/08/24/exposing-tfs-2010-beta-2-to-the-internet.aspx"&gt;Aaron
Block's excellent guide to understanding TFS communiciation architecture &lt;/a&gt;along
with tips to set this up. I have just added my thoughts in here on top now that i
have found this doc:
&lt;/p&gt;
&lt;p&gt;
Organisations may wish to expose their Team Foundation Server resources (including
SharePoint Team Sites) using fully qualified domain names (FQDNs) both internally
and externally. This document provides (almost) complete guidelines on how to do this,
with particular focus on the TFS and SharePoint configuration to support FQDNs.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=2d531219-2c39-4c69-88ef-f5ae6ac18c9f" target="_blank"&gt;Install
TFS 2010 Beta 2&lt;/a&gt;. This guide assumes a single server installation, but could easily
be interpreted to work with multiple application tiers. 
&lt;br&gt;
&lt;br&gt;
Set up your FQDN. For internal access, it's recommended that you update your DNS Server
internally (e.g. Forward Lookup Zone for tfs.yourcompany.com) to ensure that the FQDN
points to an internal IP Address when users are connected to the network (to avoid
having to route out to the internet and back). 
&lt;/p&gt;
&lt;p&gt;
For external access, add an A record for the FQDN to the DNS zone file for your domain
(via your ISP’s control panel normally). You will need to configure your perimeter
network appropriately to route public 80 and 8080 (or 443 if you are going secure,
not covered here) traffic through to your TFS server which is not covered here. (Although
I intend to post separately on doing this with ISA 2006 soon). 
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;Ensure your FQDN is working internally and externally as expected before continuing
to configure TFS and SharePoint. 
&lt;br&gt;
&lt;/strong&gt; 
&lt;br&gt;
Disable the Loop Back Check on your TFS Server. &lt;a href="http://support.microsoft.com/kb/926642"&gt;http://support.microsoft.com/kb/926642&lt;/a&gt;.
This is required otherwise the TFS Admin Console will throw errors as it won't be
able to access your FQDN
&lt;/p&gt;
&lt;p&gt;
Restart your server
&lt;/p&gt;
&lt;p&gt;
Add your FQDN to the alternate access mapping of SharePoint for the TFS Web Application&amp;nbsp;
using SharePoint 3.0 Central Administration &amp;gt; Operations &amp;gt;Alternate access mappings
(use 'Add Internal Urls').
&lt;/p&gt;
&lt;p&gt;
&lt;strike&gt;Change the RS &amp;amp; WSS locations by directly editing tbl_LocationMapping
table in the TFS Configuration database, adding your FQDN in.&lt;/strike&gt; (Aaron has
advised this is definitely not necessary, as these urls can be altered in the TFS
Admin Console, see below)&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Restart IIS 7.0
&lt;/p&gt;
&lt;p&gt;
Open TFS Admin Console, select Application Tier, then click on Change URLS. 
&lt;/p&gt;
&lt;p&gt;
Put your FQDN in the Public Url field and change the Server Url to continue to use
the netbios machine name and then click OK. and click OK
&lt;/p&gt;
&lt;p&gt;
Select Application Tier &amp;gt; SharePoint Web Applications, then select the top row
in the list within the SharePoint Web Applications list box. Click 'Change SharePoint
Web Application' and put your FQDN in the Friendly Name and Web Application Url fields
and click OK.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Select Application Tier &amp;gt; Reporting and click Edit. Ensure that your FQDN is used
for the Warehouse Database, Analysis Services Database, Report Server Url and Report
Manager url.
&lt;/p&gt;
&lt;p&gt;
Start all services again once this is completed.
&lt;/p&gt;
&lt;p&gt;
Within the TFS Admin Console, select Extensions for SharePoint Products, then select
the top row in the list within the list box. 
&lt;/p&gt;
&lt;p&gt;
Click Modify Access, and ensure the FQDN is added to the URL for Team Foundation Server
and click OK.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;em&gt;Note! &lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;Excel Reports on the SharePoint sites
don't work unless you open ports for Analysis Services (link to follow...)&lt;br&gt;
&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
You should now be ready to go!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Credits&lt;/strong&gt; 
&lt;br&gt;
This post builds on the work done in the post below, but is updated for Beta 2 and
also includes additional configuration. 
&lt;br&gt;
&lt;a href="http://www.euri.com/Blog/tabid/85/EntryId/38/Changing-the-URL-of-Team-Foundation-Server-TFS-2010-Beta-1-to-a-FQDN.aspx"&gt;http://www.euri.com/Blog/tabid/85/EntryId/38/Changing-the-URL-of-Team-Foundation-Server-TFS-2010-Beta-1-to-a-FQDN.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=184f8532-b671-454b-9b00-1d26b4ed7467" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,184f8532-b671-454b-9b00-1d26b4ed7467.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=001a4360-6265-443e-b03b-a718273f9557</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,001a4360-6265-443e-b03b-a718273f9557.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,001a4360-6265-443e-b03b-a718273f9557.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=001a4360-6265-443e-b03b-a718273f9557</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Just posted over on my work blog:<br /><br />
http://www.markerstudio.com/technical/2009/09/net-oauth-sample-working-with-justintv/<p></p><img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=001a4360-6265-443e-b03b-a718273f9557" /></body>
      <title>Net OAuth Sample — Working with Justin.TV</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,001a4360-6265-443e-b03b-a718273f9557.aspx</guid>
      <link>http://blog.keithpatton.com/2009/09/21/Net+OAuth+Sample+Working+With+JustinTV.aspx</link>
      <pubDate>Mon, 21 Sep 2009 05:02:13 GMT</pubDate>
      <description>Just posted over on my work blog:&lt;br&gt;
&lt;br&gt;
http://www.markerstudio.com/technical/2009/09/net-oauth-sample-working-with-justintv/&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=001a4360-6265-443e-b03b-a718273f9557" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,001a4360-6265-443e-b03b-a718273f9557.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=b56203b4-1a44-4464-bfab-843224c41da0</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,b56203b4-1a44-4464-bfab-843224c41da0.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,b56203b4-1a44-4464-bfab-843224c41da0.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b56203b4-1a44-4464-bfab-843224c41da0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Despite asking, i wasn't able to get this from the tech ed organisers and was fed
up with the <a href="http://www.msteched.com/newzealand/Public/SessionList.aspx">god
awful ajax scrolling nonsense</a></p>
        <p>
Hopefully this will make your session planning a little easier. 
</p>
        <p>
          <a href="http://cid-9e76e8332b4363e1.skydrive.live.com/self.aspx/Public/TechEdNZ2009Sessions.docx">Word
Session List</a>
        </p>
        <p>
          <a href="http://cid-9e76e8332b4363e1.skydrive.live.com/self.aspx/Public/TechEdSessionPlanner.xlsx">Excel
Agenda</a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=b56203b4-1a44-4464-bfab-843224c41da0" />
      </body>
      <title>Tech Ed NZ Session List (in one nice big list)</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,b56203b4-1a44-4464-bfab-843224c41da0.aspx</guid>
      <link>http://blog.keithpatton.com/2009/09/07/Tech+Ed+NZ+Session+List+In+One+Nice+Big+List.aspx</link>
      <pubDate>Mon, 07 Sep 2009 22:55:11 GMT</pubDate>
      <description>&lt;p&gt;
Despite asking, i wasn't able to get this from the tech ed organisers and was fed
up with the &lt;a href="http://www.msteched.com/newzealand/Public/SessionList.aspx"&gt;god
awful ajax scrolling nonsense&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Hopefully this will make your session planning a little easier. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://cid-9e76e8332b4363e1.skydrive.live.com/self.aspx/Public/TechEdNZ2009Sessions.docx"&gt;Word
Session List&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://cid-9e76e8332b4363e1.skydrive.live.com/self.aspx/Public/TechEdSessionPlanner.xlsx"&gt;Excel
Agenda&lt;/a&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=b56203b4-1a44-4464-bfab-843224c41da0" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,b56203b4-1a44-4464-bfab-843224c41da0.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=d129c61e-b8a2-479b-bb1e-cfe5810d5743</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,d129c61e-b8a2-479b-bb1e-cfe5810d5743.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,d129c61e-b8a2-479b-bb1e-cfe5810d5743.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=d129c61e-b8a2-479b-bb1e-cfe5810d5743</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blog.keithpatton.com/2009/06/25/db4o+POCO+Repository+Using+Visual+Studio+2010+Net+40+Beta+1+And+ASPNet+MVC+10.aspx">KandaAlpha</a> has
been open sourced on codeplex at <a href="http://kandaaplha.codeplex.com">http://kandaalpha.codeplex.com</a>.
My good friend <a href="http://talesfromthebleedingedge.blogspot.com">Will Beattie</a> is
helping me with the project and has <a href="http://talesfromthebleedingedge.blogspot.com/2009/06/kandaalpha-ddd-architecture-mvc.html">blogged
about kandaalpha<a />. <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=d129c61e-b8a2-479b-bb1e-cfe5810d5743" /></a></p>
      </body>
      <title>KandaAlpha now on codeplex</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,d129c61e-b8a2-479b-bb1e-cfe5810d5743.aspx</guid>
      <link>http://blog.keithpatton.com/2009/06/28/KandaAlpha+Now+On+Codeplex.aspx</link>
      <pubDate>Sun, 28 Jun 2009 23:34:59 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/2009/06/25/db4o+POCO+Repository+Using+Visual+Studio+2010+Net+40+Beta+1+And+ASPNet+MVC+10.aspx"&gt;KandaAlpha&lt;/a&gt; has
been open sourced on codeplex at &lt;a href="http://kandaaplha.codeplex.com"&gt;http://kandaalpha.codeplex.com&lt;/a&gt;.
My good friend &lt;a href="http://talesfromthebleedingedge.blogspot.com"&gt;Will Beattie&lt;/a&gt; is
helping me with the project and has &lt;a href="http://talesfromthebleedingedge.blogspot.com/2009/06/kandaalpha-ddd-architecture-mvc.html"&gt;blogged
about kandaalpha&lt;a /&gt;. &lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=d129c61e-b8a2-479b-bb1e-cfe5810d5743" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,d129c61e-b8a2-479b-bb1e-cfe5810d5743.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=279d4df0-2c60-4090-a5cc-03d8ee70d9bd</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,279d4df0-2c60-4090-a5cc-03d8ee70d9bd.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,279d4df0-2c60-4090-a5cc-03d8ee70d9bd.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=279d4df0-2c60-4090-a5cc-03d8ee70d9bd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This article has code specifically for Kentico CMS 4.0 and can be used in a scenario
where you have an image’s dimensions and want to ensure that the image fits into a
known bounded box. 
</p>
        <p>
With Kentico CMS you retrieve images using a call to a handler at /CMSPages/GetFile.aspx.
That page accepts parameters Height, Width and MaxSideSize. Height and Width can be
fixed and specifying one and not the other will retain aspect ratio. MaxSideSize allows
a <em>single value</em> to bound the height and width. 
</p>
        <p>
However, if you have a given bounded box on the page (e.g. say a 400 * 300 space)
and you want to make sure an image fits inside that space whilst retaining aspect
ratio there is no way to do this. 
</p>
        <p>
I’ve emailed this code to the Kentico support team to allow MaxHeight and MaxWidth
properties so that we can do this. In the meantime this hack/fix within GetFile.aspx.cs
code behind file will allow you to supply <em>negative </em>values for height and
width which then act as a bounding box! 
<br /><br /><font size="1" face="Courier">// HACK - Interpret MaxHeight and MaxWidth via negative
Height and Width values (line 599) 
<br />
if (this.Height &lt; 0 || this.Width &lt; 0) 
<br />
    ApplyBoundingBox(atInfo.AttachmentImageHeight, atInfo.AttachmentImageWidth);</font></p>
        <p>
          <font size="1" face="Courier">/// &lt;summary&gt; 
<br />
   /// Custom Hack to interpret negative height and width values as setting
bounding box 
<br />
   /// &lt;/summary&gt; 
<br />
   private void ApplyBoundingBox(int imageHeight, int imageWidth) 
<br />
   { </font>
        </p>
        <p>
          <font size="1" face="Courier">       if (this.Height
&gt;= 0 &amp;&amp; this.Width &gt;= 0) 
<br />
           return; </font>
        </p>
        <p>
          <font size="1" face="Courier">       int maxHeight =
0; 
<br />
       int maxWidth = 0; 
<br />
       float ratio = 0; </font>
        </p>
        <p>
          <font size="1" face="Courier">       if (this.Height
&lt; 0) 
<br />
       { 
<br />
           maxHeight = this.Height
* -1; 
<br />
           this.Height = imageHeight; 
<br />
       } </font>
        </p>
        <p>
          <font size="1" face="Courier">       if (this.Width
&lt; 0) 
<br />
       {     
<br />
           maxWidth = this.Width
* -1; 
<br />
           this.Width = imageWidth; 
<br />
       } </font>
        </p>
        <p>
          <font size="1" face="Courier">       if (maxHeight &gt;
0 &amp;&amp; this.Height &gt; maxHeight) 
<br />
       { 
<br />
           ratio = (float)this.Height
/ (float)maxHeight; 
<br />
           this.Height = maxHeight;           
<br />
           this.Width = (int)((float)this.Width
/ (float)ratio); 
<br />
       } </font>
        </p>
        <p>
          <font size="1" face="Courier">       if (maxWidth &gt;
0 &amp;&amp; this.Width &gt; maxWidth) 
<br />
       {  
<br />
           ratio = (float)this.Width
/ (float)maxWidth; 
<br />
           this.Width = maxWidth; 
<br />
           this.Height = (int)((float)this.Height
/ (float)ratio); 
<br />
       } </font>
        </p>
        <p>
          <font size="1" face="Courier">   }</font>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=279d4df0-2c60-4090-a5cc-03d8ee70d9bd" />
      </body>
      <title>Kentico CMS 4.0 and Bounded Box Image Resizing</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,279d4df0-2c60-4090-a5cc-03d8ee70d9bd.aspx</guid>
      <link>http://blog.keithpatton.com/2009/05/31/Kentico+CMS+40+And+Bounded+Box+Image+Resizing.aspx</link>
      <pubDate>Sun, 31 May 2009 23:43:47 GMT</pubDate>
      <description>&lt;p&gt;
This article has code specifically for Kentico CMS 4.0 and can be used in a scenario
where you have an image’s dimensions and want to ensure that the image fits into a
known bounded box. 
&lt;/p&gt;
&lt;p&gt;
With Kentico CMS you retrieve images using a call to a handler at /CMSPages/GetFile.aspx.
That page accepts parameters Height, Width and MaxSideSize. Height and Width can be
fixed and specifying one and not the other will retain aspect ratio. MaxSideSize allows
a &lt;em&gt;single value&lt;/em&gt; to bound the height and width. 
&lt;/p&gt;
&lt;p&gt;
However, if you have a given bounded box on the page (e.g. say a 400 * 300 space)
and you want to make sure an image fits inside that space whilst retaining aspect
ratio there is no way to do this. 
&lt;/p&gt;
&lt;p&gt;
I’ve emailed this code to the Kentico support team to allow MaxHeight and MaxWidth
properties so that we can do this. In the meantime this hack/fix within GetFile.aspx.cs
code behind file will allow you to supply &lt;em&gt;negative &lt;/em&gt;values for height and
width which then act as a bounding box! 
&lt;br /&gt;
&lt;br /&gt;
&lt;font size="1" face="Courier"&gt;// HACK - Interpret MaxHeight and MaxWidth via negative
Height and Width values (line 599) 
&lt;br /&gt;
if (this.Height &amp;lt; 0 || this.Width &amp;lt; 0) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ApplyBoundingBox(atInfo.AttachmentImageHeight, atInfo.AttachmentImageWidth);&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="1" face="Courier"&gt;/// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160; /// Custom Hack to interpret negative height and width values as setting
bounding box 
&lt;br /&gt;
&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160; private void ApplyBoundingBox(int imageHeight, int imageWidth) 
&lt;br /&gt;
&amp;#160;&amp;#160; { &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="1" face="Courier"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this.Height
&amp;gt;= 0 &amp;amp;&amp;amp; this.Width &amp;gt;= 0) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="1" face="Courier"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int maxHeight =
0; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int maxWidth = 0; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; float ratio = 0; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="1" face="Courier"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this.Height
&amp;lt; 0) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; maxHeight = this.Height
* -1; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Height = imageHeight; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="1" face="Courier"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this.Width
&amp;lt; 0) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; maxWidth = this.Width
* -1; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Width = imageWidth; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="1" face="Courier"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (maxHeight &amp;gt;
0 &amp;amp;&amp;amp; this.Height &amp;gt; maxHeight) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ratio = (float)this.Height
/ (float)maxHeight; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Height = maxHeight;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Width = (int)((float)this.Width
/ (float)ratio); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="1" face="Courier"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (maxWidth &amp;gt;
0 &amp;amp;&amp;amp; this.Width &amp;gt; maxWidth) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ratio = (float)this.Width
/ (float)maxWidth; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Width = maxWidth; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Height = (int)((float)this.Height
/ (float)ratio); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="1" face="Courier"&gt;&amp;#160;&amp;#160; }&lt;/font&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=279d4df0-2c60-4090-a5cc-03d8ee70d9bd" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,279d4df0-2c60-4090-a5cc-03d8ee70d9bd.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=b0b88091-6707-4327-a074-133071815555</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,b0b88091-6707-4327-a074-133071815555.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,b0b88091-6707-4327-a074-133071815555.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b0b88091-6707-4327-a074-133071815555</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Well, sort off…
</p>
        <p>
The idea is that you have designer types who hate windows and will get ill with prolonged
usage. So as to make sure you have an adequate supply and flow of decent mark up coming
your way as a developer it’s in your best interests to ensure designer type is safely
ensconced within the comfort zone of single button mice and strange looking speakers. 
</p>
        <p>
We use team foundation server, otherwise known as TFS, which helps us to manage the
source control of all our development efforts. In addition, it helps us manage work
items (tasks and bugs) during software projects. 
</p>
        <p>
If you are on a Mac and are working with TFS, you need this: 
<br /><a title="http://www.teamprise.com/products/explorer/" href="http://www.teamprise.com/products/explorer/">http://www.teamprise.com/products/explorer/</a></p>
        <p>
OK, so you can work with source control and work items, big deal, how do you actually
run an asp.net website?. Well, thanks to the wonders of virtualisation you simply
run a windows vm with an iis website as required and give it an appropriate host header
such as macdebug.projectname.mycompany.net. Ensure FTP server is running on your windows
vm with an appropriate login so that you can copy files to this website via ftp from
your Mac. 
</p>
        <p>
Now, back on your good old macintosh, you create a TFS workspace and get latest on
your lovely TFS solution to have the files locally on your mac. You use your favourite
text or html editor and work on the files, checking them out and in as required, and
doing all your work items, great. Obviously visual studio is the tool of choice for
.net development but if all your tasks are around working with content assets, mark
up and styling related files then you don’t really need all that overhead.
</p>
        <p>
All you need to do is ensure that for each change you make that you have an action
to FTP the file that has been changed across to the IIS website via FTP automatically.
This ensures that you have the IIS website running off your latest changes. 
</p>
        <p>
Last thing you need to do is create a hosts file entry on your mac to point macdebug.projectname.mycompany.net
to the IP address of your windows vm. Then you can fire up safari and browse to http:macdebug.projectname.mycompany.net
to see your asp.net website!
</p>
        <p>
I’ll post up some visuals and details on the tools we’re using on the mac when I have
them.
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=b0b88091-6707-4327-a074-133071815555" />
      </body>
      <title>asp.net development on a mac</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,b0b88091-6707-4327-a074-133071815555.aspx</guid>
      <link>http://blog.keithpatton.com/2009/05/23/aspnet+Development+On+A+Mac.aspx</link>
      <pubDate>Sat, 23 May 2009 06:41:29 GMT</pubDate>
      <description>&lt;p&gt;
Well, sort off…
&lt;/p&gt;
&lt;p&gt;
The idea is that you have designer types who hate windows and will get ill with prolonged
usage. So as to make sure you have an adequate supply and flow of decent mark up coming
your way as a developer it’s in your best interests to ensure designer type is safely
ensconced within the comfort zone of single button mice and strange looking speakers. 
&lt;/p&gt;
&lt;p&gt;
We use team foundation server, otherwise known as TFS, which helps us to manage the
source control of all our development efforts. In addition, it helps us manage work
items (tasks and bugs) during software projects. 
&lt;/p&gt;
&lt;p&gt;
If you are on a Mac and are working with TFS, you need this: 
&lt;br /&gt;
&lt;a title="http://www.teamprise.com/products/explorer/" href="http://www.teamprise.com/products/explorer/"&gt;http://www.teamprise.com/products/explorer/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
OK, so you can work with source control and work items, big deal, how do you actually
run an asp.net website?. Well, thanks to the wonders of virtualisation you simply
run a windows vm with an iis website as required and give it an appropriate host header
such as macdebug.projectname.mycompany.net. Ensure FTP server is running on your windows
vm with an appropriate login so that you can copy files to this website via ftp from
your Mac. 
&lt;/p&gt;
&lt;p&gt;
Now, back on your good old macintosh, you create a TFS workspace and get latest on
your lovely TFS solution to have the files locally on your mac. You use your favourite
text or html editor and work on the files, checking them out and in as required, and
doing all your work items, great. Obviously visual studio is the tool of choice for
.net development but if all your tasks are around working with content assets, mark
up and styling related files then you don’t really need all that overhead.
&lt;/p&gt;
&lt;p&gt;
All you need to do is ensure that for each change you make that you have an action
to FTP the file that has been changed across to the IIS website via FTP automatically.
This ensures that you have the IIS website running off your latest changes. 
&lt;/p&gt;
&lt;p&gt;
Last thing you need to do is create a hosts file entry on your mac to point macdebug.projectname.mycompany.net
to the IP address of your windows vm. Then you can fire up safari and browse to http:macdebug.projectname.mycompany.net
to see your asp.net website!
&lt;/p&gt;
&lt;p&gt;
I’ll post up some visuals and details on the tools we’re using on the mac when I have
them.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=b0b88091-6707-4327-a074-133071815555" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,b0b88091-6707-4327-a074-133071815555.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=17152401-1d87-4c5c-84a2-43003570a103</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,17152401-1d87-4c5c-84a2-43003570a103.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,17152401-1d87-4c5c-84a2-43003570a103.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=17152401-1d87-4c5c-84a2-43003570a103</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <object width="400" height="225">
          <param name="allowfullscreen" value="true" />
          <param name="allowscriptaccess" value="always" />
          <param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4732485&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" />
          <embed src="http://vimeo.com/moogaloop.swf?clip_id=4732485&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225">
          </embed>
        </object>
        <p>
          <a href="http://vimeo.com/4732485">Expression For Art's Sake</a> from <a href="http://vimeo.com/kiwivimeo">Nigel
Parker</a> on <a href="http://vimeo.com">Vimeo</a>.
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=17152401-1d87-4c5c-84a2-43003570a103" />
      </body>
      <title>Expression for Arts Sake</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,17152401-1d87-4c5c-84a2-43003570a103.aspx</guid>
      <link>http://blog.keithpatton.com/2009/05/22/Expression+For+Arts+Sake.aspx</link>
      <pubDate>Fri, 22 May 2009 10:14:59 GMT</pubDate>
      <description>&lt;object width="400" height="225"&gt;
&lt;param name="allowfullscreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;
&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4732485&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4732485&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;p&gt;
&lt;a href="http://vimeo.com/4732485"&gt;Expression For Art's Sake&lt;/a&gt; from &lt;a href="http://vimeo.com/kiwivimeo"&gt;Nigel
Parker&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=17152401-1d87-4c5c-84a2-43003570a103" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,17152401-1d87-4c5c-84a2-43003570a103.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=eceaa9be-24ea-4a6b-bf2e-d4d66e5f7f52</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,eceaa9be-24ea-4a6b-bf2e-d4d66e5f7f52.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,eceaa9be-24ea-4a6b-bf2e-d4d66e5f7f52.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=eceaa9be-24ea-4a6b-bf2e-d4d66e5f7f52</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/WhereismymindWolfram_CFBA/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/WhereismymindWolfram_CFBA/image_thumb.png" width="764" height="590" />
          </a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=eceaa9be-24ea-4a6b-bf2e-d4d66e5f7f52" />
      </body>
      <title>Where is my mind Wolfram?</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,eceaa9be-24ea-4a6b-bf2e-d4d66e5f7f52.aspx</guid>
      <link>http://blog.keithpatton.com/2009/05/16/Where+Is+My+Mind+Wolfram.aspx</link>
      <pubDate>Sat, 16 May 2009 02:46:27 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/WhereismymindWolfram_CFBA/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/WhereismymindWolfram_CFBA/image_thumb.png" width="764" height="590" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=eceaa9be-24ea-4a6b-bf2e-d4d66e5f7f52" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,eceaa9be-24ea-4a6b-bf2e-d4d66e5f7f52.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=3f7cfc0d-edd9-444f-a379-587a80a66ece</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,3f7cfc0d-edd9-444f-a379-587a80a66ece.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,3f7cfc0d-edd9-444f-a379-587a80a66ece.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=3f7cfc0d-edd9-444f-a379-587a80a66ece</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just started playing with Windows 7 RC1 and thought, i know i’ll try IE8 again,
see if they’ve fixed up the main usability thing that was always annoying me which
was the way the Stop and Refresh icons were on the other side of the browser from
the back and forward icons. 
</p>
        <p>
After struggling with the Tools menu i came across this blog post.
</p>
        <p>
          <a title="http://blogs.msdn.com/ie/archive/2009/04/20/customization-in-ie8.aspx" href="http://blogs.msdn.com/ie/archive/2009/04/20/customization-in-ie8.aspx">http://blogs.msdn.com/ie/archive/2009/04/20/customization-in-ie8.aspx</a>
        </p>
        <p>
Right-click IE8 command bar then select Customise &gt; 'Show Stop and Refresh Icons
before Address Bar’
</p>
        <p>
If you remove all the toolbars you get a really clean interface with all the navigation
buttons next to one another. 
</p>
        <p>
 
</p>
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/IE8CustomisationMovingStopandRefreshIcon_CBA2/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/IE8CustomisationMovingStopandRefreshIcon_CBA2/image_thumb.png" width="807" height="456" />
          </a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=3f7cfc0d-edd9-444f-a379-587a80a66ece" />
      </body>
      <title>IE8 Customisation &amp;ndash; Moving Stop and Refresh Icons next to Back and Forward</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,3f7cfc0d-edd9-444f-a379-587a80a66ece.aspx</guid>
      <link>http://blog.keithpatton.com/2009/05/02/IE8+Customisation+Ndash+Moving+Stop+And+Refresh+Icons+Next+To+Back+And+Forward.aspx</link>
      <pubDate>Sat, 02 May 2009 02:29:09 GMT</pubDate>
      <description>&lt;p&gt;
I just started playing with Windows 7 RC1 and thought, i know i’ll try IE8 again,
see if they’ve fixed up the main usability thing that was always annoying me which
was the way the Stop and Refresh icons were on the other side of the browser from
the back and forward icons. 
&lt;/p&gt;
&lt;p&gt;
After struggling with the Tools menu i came across this blog post.
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://blogs.msdn.com/ie/archive/2009/04/20/customization-in-ie8.aspx" href="http://blogs.msdn.com/ie/archive/2009/04/20/customization-in-ie8.aspx"&gt;http://blogs.msdn.com/ie/archive/2009/04/20/customization-in-ie8.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Right-click IE8 command bar then select Customise &amp;gt; 'Show Stop and Refresh Icons
before Address Bar’
&lt;/p&gt;
&lt;p&gt;
If you remove all the toolbars you get a really clean interface with all the navigation
buttons next to one another. 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/IE8CustomisationMovingStopandRefreshIcon_CBA2/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/IE8CustomisationMovingStopandRefreshIcon_CBA2/image_thumb.png" width="807" height="456" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=3f7cfc0d-edd9-444f-a379-587a80a66ece" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,3f7cfc0d-edd9-444f-a379-587a80a66ece.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=e51d0cef-4252-4b9b-9fe8-85d9e94f5fd2</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,e51d0cef-4252-4b9b-9fe8-85d9e94f5fd2.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,e51d0cef-4252-4b9b-9fe8-85d9e94f5fd2.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e51d0cef-4252-4b9b-9fe8-85d9e94f5fd2</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Disclaimer: This post contains unsupported guideline for configuring your Kentico
CMS 4.x to utilise extensionless urls with IIS 7.0. Use with care!
</p>
        <p>
Base System Requirements: IIS 7.0 with .net 3.5 SP1 on a Windows Vista dev machine
or Windows 2008 server to utilise extensionless urls.
</p>
        <p>
Firstly, install the marvellous IIS 7.0 URL Rewrite Module 
<br />
Get it here: <a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;g=6&amp;i=1692">http://www.iis.net/downloads/default.aspx?tabid=34&amp;g=6&amp;i=1692</a><br />
Learn about it here: <a href="http://learn.iis.net/page.aspx/460/using-url-rewrite-module/">http://learn.iis.net/page.aspx/460/using-url-rewrite-module/</a></p>
        <p>
Now, make sure Kentico is configured not to interefere with things…
</p>
        <p>
Kentico automatically applies a filter to the form tags. You need to disable this
here:
</p>
        <ul>
          <li>
Site Manager &gt; Settings &gt; Output Filters &gt; 
</li>
          <li>
Ensure the ‘Excluded output form filter URLs’ value is set to a single forward slash..
/ 
</li>
          <li>
Site Manager &gt; Settings &gt; Urls&gt; 
</li>
          <li>
Ensure the Friendly Url Extensions value is blank 
</li>
        </ul>
        <p>
There is currently no way of ensuring that automatically generated urls from Kentico
contain a trailing slash. The user must set the Document UrlPath for each page in
Page &gt; Properties &gt; Urls to include the trailing slash. However the trailing
slash is enforced via in IIS 7 rewriting rule. It is hoped that a future version of
Kentico will allow for this to avoid the extra 301 redirect.
</p>
        <p>
Now apply the following website configuration….
</p>
        <p>
Place the following code in the Page_Load of your master page. 
<br />
            // ensure we fix
up the form action if required 
<br />
            if (!String.IsNullOrEmpty(Request.ServerVariables["HTTP_X_ORIGINAL_URL"])) 
<br />
            { 
<br />
               
form1.Action = Request.ServerVariables["HTTP_X_ORIGINAL_URL"]; 
<br />
            }
</p>
        <p>
This ensures that Asp.Net postback and ajax work correctly with the IIS7 URL Rewrite
Module
</p>
        <p>
Now all you need to do now is apply whatever special rewriting rule syou like within
the web.config, utilising the IIS Rewrite Module’s capabilities as you need them.
(Note that you don’t need to do anything within IIS, you can manage everything within
the web.config and simply deploy it out to target servers without worrying about any
additional configuration).
</p>
        <p>
For example, the <strong>EnforceTrailingSlash</strong> rule below will ensure that
a trailing slash is added to all urls without extensions, performing a 301 redirect
in the process. This is so to avoid multiple urls (ones with and without slashes)
returning the same content which isn’t ideal from an SEO perspective.
</p>
        <p>
The <strong>TrailingSlashToAspx</strong> rule below will ensure that a trailing slash
is rewritten internally to .aspx, so that the kentico rewriting engine can take over.
Note that the Kentico CMS folders are ignored (ones starting with CMS..)
</p>
        <p>
&lt;system.webServer&gt; 
<br />
        &lt;rewrite&gt; 
<br />
            &lt;rules&gt; 
<br />
               
&lt;rule name=”EnforceTrailingSlash”&gt; 
<br />
                   
&lt;match url=”^(.*)$” ignoreCase=”false” /&gt; 
<br />
                   
&lt;conditions&gt; 
<br />
                       
&lt;add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” /&gt; 
<br />
                       
&lt;add input=”{REQUEST_URI}” negate=”true” pattern=”(.*)\.([a-zA-Z]+)(\?.*)?$” /&gt; 
<br />
                       
&lt;add input=”{REQUEST_URI}” negate=”true” pattern=”(.*)/$” /&gt;                        
<br />
                   
&lt;/conditions&gt; 
<br />
                   
&lt;action type=”Redirect” url=”{R:1}/” redirectType=”Permanent” /&gt; 
<br />
               
&lt;/rule&gt;
</p>
        <p>
               
&lt;rule name=”TrailingSlashToAspx”&gt; 
<br />
                   
&lt;match url=”^(.*)/$” /&gt; 
<br />
                   
&lt;conditions&gt; 
<br />
                       
&lt;add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” /&gt; 
<br />
                       
&lt;add input=”{REQUEST_URI}” negate=”true” pattern=”/cms(.*)$” /&gt; 
<br />
                       
&lt;add input=”{REQUEST_URI}” negate=”true” pattern=”^(.*)/\.aspx[#\w=\|\&amp;amp;%-]*$”
/&gt; 
<br />
                   
&lt;/conditions&gt; 
<br />
                   
&lt;action type=”Rewrite” url=”{R:1}.aspx” /&gt; 
<br />
               
&lt;/rule&gt; 
<br />
            &lt;/rules&gt; 
<br />
        &lt;/rewrite&gt; 
<br />
    &lt;/system.webServer&gt;
</p>
        <p>
And so there you have it, a relatively painless way to get yourself all SEOd with
IIS 7.0 and Kentico CMS 4.0.
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=e51d0cef-4252-4b9b-9fe8-85d9e94f5fd2" />
      </body>
      <title>IIS7 Extensionless Urls and Kentico CMS 4.0</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,e51d0cef-4252-4b9b-9fe8-85d9e94f5fd2.aspx</guid>
      <link>http://blog.keithpatton.com/2009/04/18/IIS7+Extensionless+Urls+And+Kentico+CMS+40.aspx</link>
      <pubDate>Sat, 18 Apr 2009 10:06:50 GMT</pubDate>
      <description>&lt;p&gt;
Disclaimer: This post contains unsupported guideline for configuring your Kentico
CMS 4.x to utilise extensionless urls with IIS 7.0. Use with care!
&lt;/p&gt;
&lt;p&gt;
Base System Requirements: IIS 7.0 with .net 3.5 SP1 on a Windows Vista dev machine
or Windows 2008 server to utilise extensionless urls.
&lt;/p&gt;
&lt;p&gt;
Firstly, install the marvellous IIS 7.0 URL Rewrite Module 
&lt;br /&gt;
Get it here: &lt;a href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1692"&gt;http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1692&lt;/a&gt; 
&lt;br /&gt;
Learn about it here: &lt;a href="http://learn.iis.net/page.aspx/460/using-url-rewrite-module/"&gt;http://learn.iis.net/page.aspx/460/using-url-rewrite-module/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Now, make sure Kentico is configured not to interefere with things…
&lt;/p&gt;
&lt;p&gt;
Kentico automatically applies a filter to the form tags. You need to disable this
here:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Site Manager &amp;gt; Settings &amp;gt; Output Filters &amp;gt; 
&lt;/li&gt;
&lt;li&gt;
Ensure the ‘Excluded output form filter URLs’ value is set to a single forward slash..
/ 
&lt;/li&gt;
&lt;li&gt;
Site Manager &amp;gt; Settings &amp;gt; Urls&amp;gt; 
&lt;/li&gt;
&lt;li&gt;
Ensure the Friendly Url Extensions value is blank 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
There is currently no way of ensuring that automatically generated urls from Kentico
contain a trailing slash. The user must set the Document UrlPath for each page in
Page &amp;gt; Properties &amp;gt; Urls to include the trailing slash. However the trailing
slash is enforced via in IIS 7 rewriting rule. It is hoped that a future version of
Kentico will allow for this to avoid the extra 301 redirect.
&lt;/p&gt;
&lt;p&gt;
Now apply the following website configuration….
&lt;/p&gt;
&lt;p&gt;
Place the following code in the Page_Load of your master page. 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // ensure we fix
up the form action if required 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!String.IsNullOrEmpty(Request.ServerVariables[&amp;quot;HTTP_X_ORIGINAL_URL&amp;quot;])) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
form1.Action = Request.ServerVariables[&amp;quot;HTTP_X_ORIGINAL_URL&amp;quot;]; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }
&lt;/p&gt;
&lt;p&gt;
This ensures that Asp.Net postback and ajax work correctly with the IIS7 URL Rewrite
Module
&lt;/p&gt;
&lt;p&gt;
Now all you need to do now is apply whatever special rewriting rule syou like within
the web.config, utilising the IIS Rewrite Module’s capabilities as you need them.
(Note that you don’t need to do anything within IIS, you can manage everything within
the web.config and simply deploy it out to target servers without worrying about any
additional configuration).
&lt;/p&gt;
&lt;p&gt;
For example, the &lt;strong&gt;EnforceTrailingSlash&lt;/strong&gt; rule below will ensure that
a trailing slash is added to all urls without extensions, performing a 301 redirect
in the process. This is so to avoid multiple urls (ones with and without slashes)
returning the same content which isn’t ideal from an SEO perspective.
&lt;/p&gt;
&lt;p&gt;
The &lt;strong&gt;TrailingSlashToAspx&lt;/strong&gt; rule below will ensure that a trailing slash
is rewritten internally to .aspx, so that the kentico rewriting engine can take over.
Note that the Kentico CMS folders are ignored (ones starting with CMS..)
&lt;/p&gt;
&lt;p&gt;
&amp;lt;system.webServer&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;rewrite&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;rules&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;rule name=”EnforceTrailingSlash”&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;match url=”^(.*)$” ignoreCase=”false” /&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;conditions&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” /&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;add input=”{REQUEST_URI}” negate=”true” pattern=”(.*)\.([a-zA-Z]+)(\?.*)?$” /&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;add input=”{REQUEST_URI}” negate=”true” pattern=”(.*)/$” /&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;/conditions&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;action type=”Redirect” url=”{R:1}/” redirectType=”Permanent” /&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;/rule&amp;gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;rule name=”TrailingSlashToAspx”&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;match url=”^(.*)/$” /&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;conditions&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” /&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;add input=”{REQUEST_URI}” negate=”true” pattern=”/cms(.*)$” /&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;add input=”{REQUEST_URI}” negate=”true” pattern=”^(.*)/\.aspx[#\w=\|\&amp;amp;amp;%-]*$”
/&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;/conditions&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;action type=”Rewrite” url=”{R:1}.aspx” /&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
&amp;lt;/rule&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/rules&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/rewrite&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.webServer&amp;gt;
&lt;/p&gt;
&lt;p&gt;
And so there you have it, a relatively painless way to get yourself all SEOd with
IIS 7.0 and Kentico CMS 4.0.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=e51d0cef-4252-4b9b-9fe8-85d9e94f5fd2" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,e51d0cef-4252-4b9b-9fe8-85d9e94f5fd2.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=9dde48ca-44d6-43ea-be9b-d46647043bee</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,9dde48ca-44d6-43ea-be9b-d46647043bee.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,9dde48ca-44d6-43ea-be9b-d46647043bee.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9dde48ca-44d6-43ea-be9b-d46647043bee</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://makerstudio.com/blog/" target="_blank">We’ve</a> just launched another
brand spanking new website for Yellow in <a href="http://maps.yellow.co.nz" target="_blank">Yellow
Maps</a>. It gives you the ability to do general map and direction searches a la Google
but also do specific yellow business listing searches. You can layer on points of
interest and see these pop up on your directions from one place to another. 
</p>
        <p>
The site was built using Kentico CMS 4, .Net 3.5 SP1, JQuery and the Yellow and Google
APIs. Thanks to Calvin, Darren, Campbell and late night pizza from Hell we made it!
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=9dde48ca-44d6-43ea-be9b-d46647043bee" />
      </body>
      <title>Yellow Maps now live</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,9dde48ca-44d6-43ea-be9b-d46647043bee.aspx</guid>
      <link>http://blog.keithpatton.com/2009/04/10/Yellow+Maps+Now+Live.aspx</link>
      <pubDate>Fri, 10 Apr 2009 01:25:21 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://makerstudio.com/blog/" target="_blank"&gt;We’ve&lt;/a&gt; just launched another
brand spanking new website for Yellow in &lt;a href="http://maps.yellow.co.nz" target="_blank"&gt;Yellow
Maps&lt;/a&gt;. It gives you the ability to do general map and direction searches a la Google
but also do specific yellow business listing searches. You can layer on points of
interest and see these pop up on your directions from one place to another. 
&lt;/p&gt;
&lt;p&gt;
The site was built using Kentico CMS 4, .Net 3.5 SP1, JQuery and the Yellow and Google
APIs. Thanks to Calvin, Darren, Campbell and late night pizza from Hell we made it!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=9dde48ca-44d6-43ea-be9b-d46647043bee" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,9dde48ca-44d6-43ea-be9b-d46647043bee.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=70524aab-4394-4def-8fe8-d3948986cde4</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,70524aab-4394-4def-8fe8-d3948986cde4.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,70524aab-4394-4def-8fe8-d3948986cde4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=70524aab-4394-4def-8fe8-d3948986cde4</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My good friend Nigel Parker over at Microsoft beat me to the post with this excellent
blog post on <a href="http://www.markerstudio.com" target="_blank">Marker Studio</a>'s <a href="http://search.yellow.co.nz/" target="_blank">new
search site for Yellow</a> and customised IE8 browser experience:
</p>
        <p>
          <a href="http://blogs.msdn.com/nigel/archive/2009/03/17/yellow-blackcaps-first-to-build-and-deploy-on-ie8-in-new-zealand.aspx">http://blogs.msdn.com/nigel/archive/2009/03/17/yellow-blackcaps-first-to-build-and-deploy-on-ie8-in-new-zealand.aspx</a>
        </p>
        <p>
The launch has been very successful with <strong>over 10,000 downloads of the Yellow
IE8 browser in the first 2 days</strong>!
</p>
        <p>
To add a bit of technical detail to Nigel's post we made heavy usage of the Google
Search Ajax APIs. I kind of wish they still had the SOAP apis as it would have been
easier in many respects using .net to bind the results using server side asp.net rather
than be forced to work primarily with the ajax apis. Also, the ajax apis come with
handy code snippets <a href="http://code.google.com/apis/ajaxsearch/">http://code.google.com/apis/ajaxsearch/</a> but
they assumed things like ajax calls for paging requests which means the user can't
book mark the urls. Aside from that a few workarounds here and there got us enabling
Google integrated search quite easily. I would like people to note that the Live Search
apis were superior in terms of the range of ways one could consume and make use search
services and relevance in my book is very comparable between the two.
</p>
        <p>
We made use of <a href="http://msdn.microsoft.com/en-us/library/bb387098.aspx" target="_blank">Linq
to XML</a> when consuming the core Yellow listings api which is REST based. This made
the consumption and binding of the search results to the page using a standard asp.net
repeater much easier. In fact, i cringed to think of the additional effort that was
involved before Linq for XML in navigating XML Documents with the .net 2.0 xml apis
which I never found particularly intuitive. 
</p>
        <p>
There is also some Salesforce integration for helping to manage competition entries
where we created custom lead objects in Salesforce. It's kind of nice to have the
ability to regenerate the wsdl for the web service after you make changes in the gui
to core field information. It would be even nicer to have this discoverable at runtime
so i could just regenerate proxies using a url rather than having to download the
wsdl and re-run svcutil across the wsdl locally. 
</p>
        <p>
And let's not forget our good friend <a href="http://www.jquery.com" target="_blank">JQuery</a>,
and loving that Intellisense support in Vs.Net 2008;) Also a shout to <a href="http://famspam.com/facebox/" target="_blank">facebox</a> for
those obligatory modals with rounded corners.
</p>
        <p>
Oh, and the whole thing is powered by <a href="http://www.kentico.com" target="_blank">Kentico
CMS</a>. Kentico CMS is a powerful, flexible and affordable content and document management
system that i have been personally recommending to all and sundry since i first came
across it in 2005. At Marker  &lt;shamelessPlug&gt;we have a great team of experienced
Kentico developers should be looking in this direction. Please <a href="mailto:keith.p@markerstudio.com" target="_blank">give
me a yell</a> if you would like to discuss further&lt;/shamelessPlug&gt;.
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=70524aab-4394-4def-8fe8-d3948986cde4" />
      </body>
      <title>Marker and Yellow partner to bring IE 8 first in New Zealand</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,70524aab-4394-4def-8fe8-d3948986cde4.aspx</guid>
      <link>http://blog.keithpatton.com/2009/03/18/Marker+And+Yellow+Partner+To+Bring+IE+8+First+In+New+Zealand.aspx</link>
      <pubDate>Wed, 18 Mar 2009 07:44:56 GMT</pubDate>
      <description>&lt;p&gt;
My good friend Nigel Parker over at Microsoft beat me to the post with this excellent
blog post on &lt;a href="http://www.markerstudio.com" target="_blank"&gt;Marker Studio&lt;/a&gt;'s &lt;a href="http://search.yellow.co.nz/" target="_blank"&gt;new
search site for Yellow&lt;/a&gt; and customised IE8 browser experience:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.msdn.com/nigel/archive/2009/03/17/yellow-blackcaps-first-to-build-and-deploy-on-ie8-in-new-zealand.aspx"&gt;http://blogs.msdn.com/nigel/archive/2009/03/17/yellow-blackcaps-first-to-build-and-deploy-on-ie8-in-new-zealand.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The launch has been very successful with &lt;strong&gt;over 10,000 downloads of the Yellow
IE8 browser in the first 2 days&lt;/strong&gt;!
&lt;/p&gt;
&lt;p&gt;
To add a bit of technical detail to Nigel's post we made heavy usage of the Google
Search Ajax APIs. I kind of wish they still had the SOAP apis as it would have been
easier in many respects using .net to bind the results using server side asp.net rather
than be forced to work primarily with the ajax apis. Also, the ajax apis come with
handy code snippets &lt;a href="http://code.google.com/apis/ajaxsearch/"&gt;http://code.google.com/apis/ajaxsearch/&lt;/a&gt; but
they assumed things like ajax calls for paging requests which means the user can't
book mark the urls. Aside from that a few workarounds here and there got us enabling
Google integrated search quite easily. I would like people to note that the Live Search
apis were superior in terms of the range of ways one could consume and make use search
services and relevance in my book is very comparable between the two.
&lt;/p&gt;
&lt;p&gt;
We made use of &lt;a href="http://msdn.microsoft.com/en-us/library/bb387098.aspx" target="_blank"&gt;Linq
to XML&lt;/a&gt; when consuming the core Yellow listings api which is REST based. This made
the consumption and binding of the search results to the page using a standard asp.net
repeater much easier. In fact, i cringed to think of the additional effort that was
involved before Linq for XML in navigating XML Documents with the .net 2.0 xml apis
which I never found particularly intuitive. 
&lt;/p&gt;
&lt;p&gt;
There is also some Salesforce integration for helping to manage competition entries
where we created custom lead objects in Salesforce. It's kind of nice to have the
ability to regenerate the wsdl for the web service after you make changes in the gui
to core field information. It would be even nicer to have this discoverable at runtime
so i could just regenerate proxies using a url rather than having to download the
wsdl and re-run svcutil across the wsdl locally. 
&lt;/p&gt;
&lt;p&gt;
And let's not forget our good friend &lt;a href="http://www.jquery.com" target="_blank"&gt;JQuery&lt;/a&gt;,
and loving that Intellisense support in Vs.Net 2008;) Also a shout to &lt;a href="http://famspam.com/facebox/" target="_blank"&gt;facebox&lt;/a&gt; for
those obligatory modals with rounded corners.
&lt;/p&gt;
&lt;p&gt;
Oh, and the whole thing is powered by &lt;a href="http://www.kentico.com" target="_blank"&gt;Kentico
CMS&lt;/a&gt;. Kentico CMS is a powerful, flexible and affordable content and document management
system that i have been personally recommending to all and sundry since i first came
across it in 2005. At Marker&amp;#160; &amp;lt;shamelessPlug&amp;gt;we have a great team of experienced
Kentico developers should be looking in this direction. Please &lt;a href="mailto:keith.p@markerstudio.com" target="_blank"&gt;give
me a yell&lt;/a&gt; if you would like to discuss further&amp;lt;/shamelessPlug&amp;gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=70524aab-4394-4def-8fe8-d3948986cde4" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,70524aab-4394-4def-8fe8-d3948986cde4.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=be0c6ae4-5d55-48e1-9698-0aa0f9a901a3</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,be0c6ae4-5d55-48e1-9698-0aa0f9a901a3.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,be0c6ae4-5d55-48e1-9698-0aa0f9a901a3.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=be0c6ae4-5d55-48e1-9698-0aa0f9a901a3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">We just launched a brand spanking new website
at <a href="http://www.markerstudio.com/" target="_blank">http://www.markerstudio.com/</a> go
take a look.<img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=be0c6ae4-5d55-48e1-9698-0aa0f9a901a3" /></body>
      <title>New Marker Website</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,be0c6ae4-5d55-48e1-9698-0aa0f9a901a3.aspx</guid>
      <link>http://blog.keithpatton.com/2009/03/09/New+Marker+Website.aspx</link>
      <pubDate>Mon, 09 Mar 2009 05:39:46 GMT</pubDate>
      <description>We just launched a brand spanking new website at &lt;a href="http://www.markerstudio.com/" target="_blank"&gt;http://www.markerstudio.com/&lt;/a&gt; go
take a look.&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=be0c6ae4-5d55-48e1-9698-0aa0f9a901a3" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,be0c6ae4-5d55-48e1-9698-0aa0f9a901a3.aspx</comments>
      <category>Life in New Zealand;Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=43625196-2edf-4562-986a-6ca7daf25fc2</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,43625196-2edf-4562-986a-6ca7daf25fc2.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,43625196-2edf-4562-986a-6ca7daf25fc2.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=43625196-2edf-4562-986a-6ca7daf25fc2</wfw:commentRss>
      <slash:comments>669</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just realised there exists today more helpful free software than i could ever possibly
imagine. A few years back I remember it being hard to find good little utilities to
do even the most basic things like FTP in a reliable usable way.
</p>
        <p>
          <strong>TwitterFeed.com</strong>
        </p>
        <p>
Anyways...I've resuscitated my usage of Twitter by using <a href="http://www.twitterfeed.com">www.twitterfeed.com</a>.
Essentially, this allows me to automatically prefix and post up tweets from RSS Feeds. 
</p>
        <p>
In my case, i'm automatically tweeting from Google Reader shared items (i simply click
a share item in Google Reader, and a tweet is imminent..) and from this blog.
</p>
        <p>
          <strong>FriendFeed.com</strong>
        </p>
        <p>
In addition, i thought i would blabber a bit about <a href="http://www.friendfeed.com">www.friendfeed.com</a> which
is essentially an aggregation portal for your online activity. 
</p>
        <p>
I've integrated friendfeed activity directly into my blog (on the right hand side
panel) which should make some of the things i'm doing without the need for formal
blog posts.
</p>
        <p>
You *could* if you wanted have twitter feed pull from all your online activity via
freidn feed, but you would have to exclude twitter from friendfeed to avoid a nasty
infinite loop of friendfeed/twitter posts;)
</p>
        <p>
To avoid this, you can filter the friendfeed rss by service, but you can only select
one service;( i wanted to create a feed for everything apart from twitter but couldn't
do this.
</p>
        <p>
This is why i'm manually adding feeds to twitterfeed. 
</p>
        <p>
Have fun!
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=43625196-2edf-4562-986a-6ca7daf25fc2" />
      </body>
      <title>Twitter Feed and Friend Feed</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,43625196-2edf-4562-986a-6ca7daf25fc2.aspx</guid>
      <link>http://blog.keithpatton.com/2009/01/29/Twitter+Feed+And+Friend+Feed.aspx</link>
      <pubDate>Thu, 29 Jan 2009 07:24:29 GMT</pubDate>
      <description>&lt;p&gt;
I just realised there exists today more helpful free software than i could ever possibly
imagine. A few years back I remember it being hard to find good little utilities to
do even the most basic things like FTP in a reliable usable way.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;TwitterFeed.com&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Anyways...I've resuscitated my usage of Twitter by using &lt;a href="http://www.twitterfeed.com"&gt;www.twitterfeed.com&lt;/a&gt;.
Essentially, this allows me to automatically prefix and post up tweets from RSS Feeds. 
&lt;/p&gt;
&lt;p&gt;
In my case, i'm automatically tweeting from Google Reader shared items (i simply click
a share item in Google Reader, and a tweet is imminent..) and from this blog.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;FriendFeed.com&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
In addition, i thought i would blabber a bit about &lt;a href="http://www.friendfeed.com"&gt;www.friendfeed.com&lt;/a&gt; which
is essentially an aggregation portal for your online activity. 
&lt;/p&gt;
&lt;p&gt;
I've integrated friendfeed activity directly into my blog (on the right hand side
panel) which should make some of the things i'm doing without the need for formal
blog posts.
&lt;/p&gt;
&lt;p&gt;
You *could* if you wanted have twitter feed pull from all your online activity via
freidn feed, but you would have to exclude twitter from friendfeed to avoid a nasty
infinite loop of friendfeed/twitter posts;)
&lt;/p&gt;
&lt;p&gt;
To avoid this, you can filter the friendfeed rss by service, but you can only select
one service;( i wanted to create a feed for everything apart from twitter but couldn't
do this.
&lt;/p&gt;
&lt;p&gt;
This is why i'm manually adding feeds to twitterfeed. 
&lt;/p&gt;
&lt;p&gt;
Have fun!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=43625196-2edf-4562-986a-6ca7daf25fc2" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,43625196-2edf-4562-986a-6ca7daf25fc2.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=16a40a26-bf31-42c2-8760-81c69545ad1a</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,16a40a26-bf31-42c2-8760-81c69545ad1a.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,16a40a26-bf31-42c2-8760-81c69545ad1a.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=16a40a26-bf31-42c2-8760-81c69545ad1a</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
And one more exam to get the web developer certification. This adds 3 points to our
Microsoft partnership, only a few points left for gold! Some less boring posts soon
i promise...
</p>
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCPDatlast_13195/MCPD(rgb)_504_2.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="84" alt="MCPD(rgb)_504" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCPDatlast_13195/MCPD(rgb)_504_thumb.png" width="233" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=16a40a26-bf31-42c2-8760-81c69545ad1a" />
      </body>
      <title>MCPD at last</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,16a40a26-bf31-42c2-8760-81c69545ad1a.aspx</guid>
      <link>http://blog.keithpatton.com/2008/12/04/MCPD+At+Last.aspx</link>
      <pubDate>Thu, 04 Dec 2008 08:44:43 GMT</pubDate>
      <description>&lt;p&gt;
And one more exam to get the web developer certification. This adds 3 points to our
Microsoft partnership, only a few points left for gold! Some less boring posts soon
i promise...
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCPDatlast_13195/MCPD(rgb)_504_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="84" alt="MCPD(rgb)_504" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCPDatlast_13195/MCPD(rgb)_504_thumb.png" width="233" border="0" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=16a40a26-bf31-42c2-8760-81c69545ad1a" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,16a40a26-bf31-42c2-8760-81c69545ad1a.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=5dacdf4f-fa03-44b7-8618-f50e9e52344b</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,5dacdf4f-fa03-44b7-8618-f50e9e52344b.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,5dacdf4f-fa03-44b7-8618-f50e9e52344b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5dacdf4f-fa03-44b7-8618-f50e9e52344b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Another exam another certification, one more for MCPD and then i can retire safe in
the knowledge I have contributed handsomely to the development and continuance of
one of the world's largest corporations.
</p>
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCTScertificationachieved_B7/MCTS(rgb)_513_530_2.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="59" alt="MCTS(rgb)_513_530" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCTScertificationachieved_B7/MCTS(rgb)_513_530_thumb.png" width="244" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=5dacdf4f-fa03-44b7-8618-f50e9e52344b" />
      </body>
      <title>MCTS certification achieved</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,5dacdf4f-fa03-44b7-8618-f50e9e52344b.aspx</guid>
      <link>http://blog.keithpatton.com/2008/12/01/MCTS+Certification+Achieved.aspx</link>
      <pubDate>Mon, 01 Dec 2008 11:02:56 GMT</pubDate>
      <description>&lt;p&gt;
Another exam another certification, one more for MCPD and then i can retire safe in
the knowledge I have contributed handsomely to the development and continuance of
one of the world's largest corporations.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCTScertificationachieved_B7/MCTS(rgb)_513_530_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="59" alt="MCTS(rgb)_513_530" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCTScertificationachieved_B7/MCTS(rgb)_513_530_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=5dacdf4f-fa03-44b7-8618-f50e9e52344b" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,5dacdf4f-fa03-44b7-8618-f50e9e52344b.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=dff13448-4c86-41e2-9493-f2da6848a35c</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,dff13448-4c86-41e2-9493-f2da6848a35c.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,dff13448-4c86-41e2-9493-f2da6848a35c.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=dff13448-4c86-41e2-9493-f2da6848a35c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just found a really really useful whitepaper on Entity Framework mapping possibilities.
If you're doing any work with EF this will certainly come in useful.
</p>
        <p>
          <a title="http://download.microsoft.com/download/b/3/3/b333d63e-0df2-4d43-978a-1ce9d2f39801/EntityFrameworkMappingWhitepaper.pdf" href="http://download.microsoft.com/download/b/3/3/b333d63e-0df2-4d43-978a-1ce9d2f39801/EntityFrameworkMappingWhitepaper.pdf">http://download.microsoft.com/download/b/3/3/b333d63e-0df2-4d43-978a-1ce9d2f39801/EntityFrameworkMappingWhitepaper.pdf</a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=dff13448-4c86-41e2-9493-f2da6848a35c" />
      </body>
      <title>Entity Framework supported mappings</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,dff13448-4c86-41e2-9493-f2da6848a35c.aspx</guid>
      <link>http://blog.keithpatton.com/2008/11/27/Entity+Framework+Supported+Mappings.aspx</link>
      <pubDate>Thu, 27 Nov 2008 04:45:13 GMT</pubDate>
      <description>&lt;p&gt;
Just found a really really useful whitepaper on Entity Framework mapping possibilities.
If you're doing any work with EF this will certainly come in useful.
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://download.microsoft.com/download/b/3/3/b333d63e-0df2-4d43-978a-1ce9d2f39801/EntityFrameworkMappingWhitepaper.pdf" href="http://download.microsoft.com/download/b/3/3/b333d63e-0df2-4d43-978a-1ce9d2f39801/EntityFrameworkMappingWhitepaper.pdf"&gt;http://download.microsoft.com/download/b/3/3/b333d63e-0df2-4d43-978a-1ce9d2f39801/EntityFrameworkMappingWhitepaper.pdf&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=dff13448-4c86-41e2-9493-f2da6848a35c" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,dff13448-4c86-41e2-9493-f2da6848a35c.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=dc128332-a185-4361-8faf-3151e883386a</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,dc128332-a185-4361-8faf-3151e883386a.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,dc128332-a185-4361-8faf-3151e883386a.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=dc128332-a185-4361-8faf-3151e883386a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <br />
        <br />
a nice little extension method to shuffle a string's contents.<br /><br />
  public static string Shuffle(this string stringToShuffle)<br />
        {<br />
            if (String.IsNullOrEmpty(stringToShuffle))<br />
               
return null;<br />
            return new String((<br />
               
from testChar in stringToShuffle.ToCharArray()<br />
               
orderby Guid.NewGuid()<br />
               
select testChar<br />
               
).ToArray());<br />
        }<br /><br />
thanks to jonathan and luke for reducing to a single line return!<br /><img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=dc128332-a185-4361-8faf-3151e883386a" /></body>
      <title>string shuffle in one line</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,dc128332-a185-4361-8faf-3151e883386a.aspx</guid>
      <link>http://blog.keithpatton.com/2008/11/21/string+Shuffle+In+One+Line.aspx</link>
      <pubDate>Fri, 21 Nov 2008 03:49:09 GMT</pubDate>
      <description>&lt;br&gt;
&lt;br&gt;
a nice little extension method to shuffle a string's contents.&lt;br&gt;
&lt;br&gt;
&amp;nbsp; public static string Shuffle(this string stringToShuffle)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (String.IsNullOrEmpty(stringToShuffle))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
return null;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new String((&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
from testChar in stringToShuffle.ToCharArray()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
orderby Guid.NewGuid()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
select testChar&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
).ToArray());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
thanks to jonathan and luke for reducing to a single line return!&lt;br&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=dc128332-a185-4361-8faf-3151e883386a" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,dc128332-a185-4361-8faf-3151e883386a.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=67550297-b8d5-48f5-b005-3b767d6e4fb0</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,67550297-b8d5-48f5-b005-3b767d6e4fb0.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,67550297-b8d5-48f5-b005-3b767d6e4fb0.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=67550297-b8d5-48f5-b005-3b767d6e4fb0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCTSOfficiallyaGenius_1397D/MCTS_4.gif">
            <img height="80" alt="MCTS" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCTSOfficiallyaGenius_1397D/MCTS_thumb_1.gif" width="379" border="0" />
          </a>
        </p>
        <p>
I am now officially a genius after scoring 929/1000 in my <a href="http://www.microsoft.com/learning/mcp/mcts/spserver/config/default.mspx" target="_blank">Moss
(SharePoint) configuration exam</a>. Thank you.
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=67550297-b8d5-48f5-b005-3b767d6e4fb0" />
      </body>
      <title>MCTS - Officially a Genius</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,67550297-b8d5-48f5-b005-3b767d6e4fb0.aspx</guid>
      <link>http://blog.keithpatton.com/2008/11/07/MCTS+Officially+A+Genius.aspx</link>
      <pubDate>Fri, 07 Nov 2008 09:18:54 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCTSOfficiallyaGenius_1397D/MCTS_4.gif"&gt;&lt;img height="80" alt="MCTS" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/MCTSOfficiallyaGenius_1397D/MCTS_thumb_1.gif" width="379" border="0" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I am now officially a genius after scoring 929/1000 in my &lt;a href="http://www.microsoft.com/learning/mcp/mcts/spserver/config/default.mspx" target="_blank"&gt;Moss
(SharePoint) configuration exam&lt;/a&gt;. Thank you.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=67550297-b8d5-48f5-b005-3b767d6e4fb0" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,67550297-b8d5-48f5-b005-3b767d6e4fb0.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=57951fac-3b68-4330-a3f6-aa545cd85da4</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,57951fac-3b68-4330-a3f6-aa545cd85da4.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,57951fac-3b68-4330-a3f6-aa545cd85da4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=57951fac-3b68-4330-a3f6-aa545cd85da4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We created the following extension methods for entity framework to avoid code bloat
in consuming applications when working with these key types. I hope you find them
useful if you are working with the Entity Framework.
</p>
        <p>
 
</p>
        <p>
          <strong>EntityObject</strong>
        </p>
        <p>
/// &lt;summary&gt; 
<br />
/// Extension methods for EntityObject 
<br />
/// &lt;/summary&gt; 
<br />
public static class EntityObjectExtensions 
<br />
{ 
</p>
        <p>
    /// &lt;summary&gt; 
<br />
    /// Gets the original value for a modified entity object's property 
<br />
    /// &lt;/summary&gt; 
<br />
    /// &lt;returns&gt;the value before the property was modified&lt;/returns&gt; 
<br />
    public static T GetOriginalValue&lt;T&gt;(this EntityObject entityObject,
string propertyName) 
<br />
    { 
<br />
        if (entityObject == null) 
<br />
            return default(T); 
<br />
        if (entityObject.EntityState == EntityState.Modified) 
<br />
        { 
<br />
            ObjectContext context
= <font color="#ff0000">[YOUR OBJECT CONTEXT]</font><br />
            ObjectStateEntry
stateEntry = null; 
<br />
            context.ObjectStateManager.TryGetObjectStateEntry(entityObject,
out stateEntry); 
</p>
        <p>
            if (stateEntry
!= null) 
<br />
               
return (T)stateEntry.OriginalValues.GetValue(stateEntry.OriginalValues.GetOrdinal(propertyName)); 
</p>
        <p>
        } 
</p>
        <p>
        // return the value of the property 
<br />
        return (T)entityObject.GetType().GetProperty(propertyName).GetValue(entityObject,
null); 
<br />
    }
</p>
        <p>
          <strong>EntityCollection&lt;T&gt;</strong>
        </p>
        <p>
/// &lt;summary&gt; 
<br />
   /// Extension methods for EntityCollection 
<br />
   /// &lt;/summary&gt; 
<br />
   public static class EntityCollectionExtensions 
<br />
   { 
<br />
       /// &lt;summary&gt; 
<br />
       /// Loads the entity collection if it hasn't
already been loaded 
<br />
       /// &lt;/summary&gt; 
<br />
       /// &lt;typeparam name="T"&gt;Type
of entity collection&lt;/typeparam&gt; 
<br />
       /// &lt;param name="entityCollection"&gt;Entity
collection to potentially load entities into&lt;/param&gt; 
<br />
       /// &lt;param name="entitySource"&gt;The
source entity which has the entity collection relationship (modified or unchanged
only)&lt;/param&gt; 
<br />
       public static void EnsureLoaded&lt;T&gt;(this
EntityCollection&lt;T&gt; entityCollection, EntityObject entitySource) where T : class,
IEntityWithRelationships 
<br />
       { 
<br />
           if (entitySource != null
&amp;&amp; entityCollection != null &amp;&amp; !entityCollection.IsLoaded ) 
<br />
           { 
<br />
              
if (entitySource.EntityState == System.Data.EntityState.Modified || entitySource.EntityState
== System.Data.EntityState.Unchanged) 
<br />
              
{ 
<br />
                  
entityCollection.Load(); 
<br />
              
} 
<br />
           } 
<br />
       } 
</p>
        <p>
       /// &lt;summary&gt; 
<br />
       /// Returns the collection as a queryable type 
<br />
       /// &lt;/summary&gt; 
<br />
       /// &lt;typeparam name="T"&gt;Type
of entity collection&lt;/typeparam&gt; 
<br />
       /// &lt;param name="entityCollection"&gt;Entity
collection to return as a queryable object&lt;/param&gt; 
<br />
       /// &lt;param name="ensureLoaded"&gt;Flag
to determine if to load the collection if it has not been done so already&lt;/param&gt; 
<br />
       /// &lt;returns&gt;Queryable object for the in
memory collection&lt;/returns&gt; 
<br />
       public static IQueryable&lt;T&gt; AsQueryable&lt;T&gt;(this
EntityCollection&lt;T&gt; entityCollection, bool ensureLoaded, EntityObject entitySource)
where T : class, IEntityWithRelationships 
<br />
       { 
<br />
           if (ensureLoaded) 
<br />
              
EnsureLoaded(entityCollection, entitySource); 
<br />
           return entityCollection.AsQueryable(); 
<br />
       }
</p>
        <p>
 
</p>
        <p>
          <strong>EntityReference&lt;T&gt;</strong>
        </p>
        <p>
 
</p>
        <p>
/// &lt;summary&gt; 
<br />
   /// Extension methods for EntityReference 
<br />
   /// &lt;/summary&gt; 
<br />
   public static class EntityReferenceExtensions 
<br />
   { 
</p>
        <p>
       /// &lt;summary&gt; 
<br />
       /// Loads the entity reference or its value if
it hasn't already been loaded. 
<br />
       /// &lt;/summary&gt; 
<br />
       /// &lt;typeparam name="T"&gt;Type
of entity reference&lt;/typeparam&gt; 
<br />
       /// &lt;param name="entitySource"&gt;The
source entity which has the entity reference relationship (added, modified or unchanged
only)&lt;/param&gt; 
<br />
       public static void EnsureLoaded&lt;T&gt;(this
EntityReference&lt;T&gt; entityReference, EntityObject entitySource) where T : class,
IEntityWithRelationships 
<br />
       { 
<br />
           if (entitySource != null
&amp;&amp; entityReference != null &amp;&amp; !entityReference.IsLoaded &amp;&amp;
entityReference.EntityKey != null) 
<br />
           { 
<br />
              
if (entitySource.EntityState == System.Data.EntityState.Added) // add the value directly
as load will throw 
<br />
              
{ 
<br />
                  
if (entityReference.Value == null) 
<br />
                      
entityReference.Value = LoadByKey&lt;T&gt;(entityReference.EntityKey); 
<br />
              
} 
<br />
              
else if (entitySource.EntityState == System.Data.EntityState.Modified || entitySource.EntityState
== System.Data.EntityState.Unchanged) 
<br />
              
{ 
<br />
                  
entityReference.Load(); 
<br />
              
} 
<br />
           } 
<br />
       } 
</p>
        <blockquote>
          <p>
privateT LoadByKey&lt;T&gt;(object entityKey) 
<br />
{ 
<br />
    if (entityKey == null) 
<br />
        throw new ArgumentNullException("Supplied
entity key is null, unable to load entity", "entityKey"); 
<br />
    // make sure the object is loaded in the object context 
<br />
    ObjectContext objectContext = <font color="#ff0000">[YOUR OBJECT
CONTEXT]</font>; 
<br />
    EntityKey key = (EntityKey)entityKey; 
<br />
    ObjectStateEntry entry; 
<br />
    if (!objectContext.ObjectStateManager.TryGetObjectStateEntry(entityKey,
out entry) || entry.Entity == null) 
<br />
    { 
<br />
        return (T)objectContext.GetObjectByKey(key); 
<br />
    } 
<br />
    return (T)entry.Entity; 
<br />
}
</p>
        </blockquote>
        <p>
       /// &lt;summary&gt; 
<br />
       /// Whether or not the entity reference has an
entity key with a value present 
<br />
       /// &lt;/summary&gt; 
<br />
       public static bool HasEntityKeyFirstValue&lt;T&gt;(this
EntityReference&lt;T&gt; entityReference) where T : class, IEntityWithRelationships 
<br />
       { 
<br />
           return entityReference
!= null &amp;&amp; entityReference.EntityKey.HasFirstValue&lt;int&gt;(); 
<br />
       } 
</p>
        <p>
       /// &lt;summary&gt; 
<br />
       /// Get entity key with a value present 
<br />
       /// &lt;/summary&gt; 
<br />
       public static int GetEntityKeyFirstValue&lt;T&gt;(this
EntityReference&lt;T&gt; entityReference) where T : class, IEntityWithRelationships 
<br />
       { 
<br />
           if (entityReference !=
null) 
<br />
              
return entityReference.EntityKey.GetFirstValue&lt;int&gt;(); 
<br />
           return 0; 
<br />
       }
</p>
        <p>
 
</p>
        <p>
          <strong>EntityKey</strong>
        </p>
        <p>
 
</p>
        <p>
/// &lt;summary&gt; 
<br />
   /// Extension methods for EntityKey 
<br />
   /// &lt;/summary&gt; 
<br />
   public static class EntityKeyExtensions 
<br />
   { 
</p>
        <p>
       /// &lt;summary&gt; 
<br />
       /// Gets the first entity key value 
<br />
       /// &lt;/summary&gt; 
<br />
       /// &lt;returns&gt;the first entity key value&lt;/returns&gt; 
<br />
       public static T GetFirstValue&lt;T&gt;(this EntityKey
entityKey) 
<br />
       { 
<br />
           if (entityKey != null
&amp;&amp; entityKey.EntityKeyValues != null &amp;&amp; entityKey.EntityKeyValues.Length
&gt; 0) 
<br />
              
return (T)entityKey.EntityKeyValues.First().Value; 
<br />
           return default(T); 
<br />
       } 
</p>
        <p>
       /// &lt;summary&gt; 
<br />
       /// Sets the first entity key value 
<br />
       /// &lt;/summary&gt; 
<br />
       public static void SetFirstValue&lt;T&gt;(this
EntityKey entityKey, T value) 
<br />
       { 
<br />
           if (entityKey != null
&amp;&amp; entityKey.EntityKeyValues != null &amp;&amp; entityKey.EntityKeyValues.Length
&gt; 0) 
<br />
              
entityKey.EntityKeyValues.First().Value = value; 
<br />
           return; 
<br />
       } 
</p>
        <p>
       /// &lt;summary&gt; 
<br />
       /// Whether or not the entity key has a first
value 
<br />
       /// &lt;/summary&gt; 
<br />
       public static bool HasFirstValue&lt;T&gt;(this
EntityKey entityKey) 
<br />
       { 
<br />
           var firstValue = GetFirstValue&lt;T&gt;(entityKey); 
<br />
           var defaultValue = default(T); 
<br />
           return (!firstValue.Equals(defaultValue)); 
<br />
       }
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=57951fac-3b68-4330-a3f6-aa545cd85da4" />
      </body>
      <title>Entity Framework - Key Extension Methods</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,57951fac-3b68-4330-a3f6-aa545cd85da4.aspx</guid>
      <link>http://blog.keithpatton.com/2008/08/16/Entity+Framework+Key+Extension+Methods.aspx</link>
      <pubDate>Sat, 16 Aug 2008 03:26:05 GMT</pubDate>
      <description>&lt;p&gt;
We created the following extension methods for entity framework to avoid code bloat
in consuming applications when working with these key types. I hope you find them
useful if you are working with the Entity Framework.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;EntityObject&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
/// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
/// Extension methods for EntityObject 
&lt;br /&gt;
/// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
public static class EntityObjectExtensions 
&lt;br /&gt;
{ 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; /// Gets the original value for a modified entity object's property 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;the value before the property was modified&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; public static T GetOriginalValue&amp;lt;T&amp;gt;(this EntityObject entityObject,
string propertyName) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entityObject == null) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return default(T); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entityObject.EntityState == EntityState.Modified) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ObjectContext context
= &lt;font color="#ff0000"&gt;[YOUR OBJECT CONTEXT]&lt;/font&gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ObjectStateEntry
stateEntry = null; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.ObjectStateManager.TryGetObjectStateEntry(entityObject,
out stateEntry); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (stateEntry
!= null) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
return (T)stateEntry.OriginalValues.GetValue(stateEntry.OriginalValues.GetOrdinal(propertyName)); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // return the value of the property 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (T)entityObject.GetType().GetProperty(propertyName).GetValue(entityObject,
null); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; }
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;EntityCollection&amp;lt;T&amp;gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
/// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160; /// Extension methods for EntityCollection 
&lt;br /&gt;
&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160; public static class EntityCollectionExtensions 
&lt;br /&gt;
&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Loads the entity collection if it hasn't
already been loaded 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;Type
of entity collection&amp;lt;/typeparam&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;entityCollection&amp;quot;&amp;gt;Entity
collection to potentially load entities into&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;entitySource&amp;quot;&amp;gt;The
source entity which has the entity collection relationship (modified or unchanged
only)&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static void EnsureLoaded&amp;lt;T&amp;gt;(this
EntityCollection&amp;lt;T&amp;gt; entityCollection, EntityObject entitySource) where T : class,
IEntityWithRelationships 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entitySource != null
&amp;amp;&amp;amp; entityCollection != null &amp;amp;&amp;amp; !entityCollection.IsLoaded ) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
if (entitySource.EntityState == System.Data.EntityState.Modified || entitySource.EntityState
== System.Data.EntityState.Unchanged) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
entityCollection.Load(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Returns the collection as a queryable type 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;Type
of entity collection&amp;lt;/typeparam&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;entityCollection&amp;quot;&amp;gt;Entity
collection to return as a queryable object&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;ensureLoaded&amp;quot;&amp;gt;Flag
to determine if to load the collection if it has not been done so already&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;Queryable object for the in
memory collection&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static IQueryable&amp;lt;T&amp;gt; AsQueryable&amp;lt;T&amp;gt;(this
EntityCollection&amp;lt;T&amp;gt; entityCollection, bool ensureLoaded, EntityObject entitySource)
where T : class, IEntityWithRelationships 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ensureLoaded) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
EnsureLoaded(entityCollection, entitySource); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return entityCollection.AsQueryable(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;EntityReference&amp;lt;T&amp;gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
/// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160; /// Extension methods for EntityReference 
&lt;br /&gt;
&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160; public static class EntityReferenceExtensions 
&lt;br /&gt;
&amp;#160;&amp;#160; { 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Loads the entity reference or its value if
it hasn't already been loaded. 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;Type
of entity reference&amp;lt;/typeparam&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;entitySource&amp;quot;&amp;gt;The
source entity which has the entity reference relationship (added, modified or unchanged
only)&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static void EnsureLoaded&amp;lt;T&amp;gt;(this
EntityReference&amp;lt;T&amp;gt; entityReference, EntityObject entitySource) where T : class,
IEntityWithRelationships 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entitySource != null
&amp;amp;&amp;amp; entityReference != null &amp;amp;&amp;amp; !entityReference.IsLoaded &amp;amp;&amp;amp;
entityReference.EntityKey != null) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
if (entitySource.EntityState == System.Data.EntityState.Added) // add the value directly
as load will throw 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
if (entityReference.Value == null) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
entityReference.Value = LoadByKey&amp;lt;T&amp;gt;(entityReference.EntityKey); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
else if (entitySource.EntityState == System.Data.EntityState.Modified || entitySource.EntityState
== System.Data.EntityState.Unchanged) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
entityReference.Load(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
privateT LoadByKey&amp;lt;T&amp;gt;(object entityKey) 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; if (entityKey == null) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentNullException(&amp;quot;Supplied
entity key is null, unable to load entity&amp;quot;, &amp;quot;entityKey&amp;quot;); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; // make sure the object is loaded in the object context 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ObjectContext objectContext = &lt;font color="#ff0000"&gt;[YOUR OBJECT
CONTEXT]&lt;/font&gt;; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; EntityKey key = (EntityKey)entityKey; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; ObjectStateEntry entry; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; if (!objectContext.ObjectStateManager.TryGetObjectStateEntry(entityKey,
out entry) || entry.Entity == null) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (T)objectContext.GetObjectByKey(key); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; return (T)entry.Entity; 
&lt;br /&gt;
}
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Whether or not the entity reference has an
entity key with a value present 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static bool HasEntityKeyFirstValue&amp;lt;T&amp;gt;(this
EntityReference&amp;lt;T&amp;gt; entityReference) where T : class, IEntityWithRelationships 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return entityReference
!= null &amp;amp;&amp;amp; entityReference.EntityKey.HasFirstValue&amp;lt;int&amp;gt;(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Get entity key with a value present 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static int GetEntityKeyFirstValue&amp;lt;T&amp;gt;(this
EntityReference&amp;lt;T&amp;gt; entityReference) where T : class, IEntityWithRelationships 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entityReference !=
null) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
return entityReference.EntityKey.GetFirstValue&amp;lt;int&amp;gt;(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;EntityKey&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
/// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160; /// Extension methods for EntityKey 
&lt;br /&gt;
&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160; public static class EntityKeyExtensions 
&lt;br /&gt;
&amp;#160;&amp;#160; { 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Gets the first entity key value 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;the first entity key value&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static T GetFirstValue&amp;lt;T&amp;gt;(this EntityKey
entityKey) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entityKey != null
&amp;amp;&amp;amp; entityKey.EntityKeyValues != null &amp;amp;&amp;amp; entityKey.EntityKeyValues.Length
&amp;gt; 0) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
return (T)entityKey.EntityKeyValues.First().Value; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return default(T); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Sets the first entity key value 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static void SetFirstValue&amp;lt;T&amp;gt;(this
EntityKey entityKey, T value) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (entityKey != null
&amp;amp;&amp;amp; entityKey.EntityKeyValues != null &amp;amp;&amp;amp; entityKey.EntityKeyValues.Length
&amp;gt; 0) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
entityKey.EntityKeyValues.First().Value = value; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Whether or not the entity key has a first
value 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static bool HasFirstValue&amp;lt;T&amp;gt;(this
EntityKey entityKey) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var firstValue = GetFirstValue&amp;lt;T&amp;gt;(entityKey); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var defaultValue = default(T); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (!firstValue.Equals(defaultValue)); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=57951fac-3b68-4330-a3f6-aa545cd85da4" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,57951fac-3b68-4330-a3f6-aa545cd85da4.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=07a2d677-ef9d-40e8-b2b2-f05c45511631</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,07a2d677-ef9d-40e8-b2b2-f05c45511631.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,07a2d677-ef9d-40e8-b2b2-f05c45511631.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=07a2d677-ef9d-40e8-b2b2-f05c45511631</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I saw the following code on a customer object which made me think about affording
a better way to query domain relationships without the extra methods, extension methods
come to the rescue! 
</p>
        <p>
I realise transparent lazy loading a la Nhibernate is another option, but i think
that this way keeps the spirit of explicitly loading from the database, but reduces
the amount of code clutter on the client side so you are not forever checking whether
a relationship is loaded or not, you simply request an IQueryable from the EntityCollection&lt;T&gt;.
</p>
        <p>
        /// &lt;summary&gt; 
<br />
        /// Finds a customer account with the specified
ID 
<br />
        /// &lt;/summary&gt; 
<br />
        /// &lt;param name="customerAccountID"&gt;ID
of the customer account to find&lt;/param&gt; 
<br />
        /// &lt;returns&gt;Customer account with
the specified ID&lt;/returns&gt; 
<br />
        public CustomerAccount FindAccount(int
customerAccountID) 
<br />
        { 
<br />
            if(!this.CustomerAccounts.IsLoaded) 
<br />
            { 
<br />
               
this.CustomerAccounts.Load(); 
<br />
            } 
</p>
        <p>
            var query = 
<br />
               
from ca in this.CustomerAccounts 
<br />
               
where ca.CustomerAccountID == customerAccountID 
<br />
               
select ca; 
</p>
        <p>
            return query.FirstOrDefault(); 
<br />
        } 
</p>
        <p>
I added a static class with the extension methods for the EntityCollection type as
follows: 
</p>
        <p>
public static class EntityCollectionExtensions 
<br />
    { 
<br />
      <strong>  public static EntityCollection&lt;T&gt;
EnsureLoaded&lt;T&gt;(this EntityCollection&lt;T&gt; entityCollection) where T : class,
IEntityWithRelationships 
<br /></strong>        { 
<br />
            if (!entityCollection.IsLoaded) 
<br />
               
entityCollection.Load(); 
<br />
            return entityCollection; 
<br />
        } 
</p>
        <p>
     <strong>   public static IQueryable&lt;T&gt; AsQueryable&lt;T&gt;(this
EntityCollection&lt;T&gt; entityCollection, bool ensureLoaded) where T : class, IEntityWithRelationships 
<br /></strong>        { 
<br />
            if (ensureLoaded) 
<br />
               
entityCollection = EnsureLoaded&lt;T&gt;(entityCollection); 
<br />
            return entityCollection.AsQueryable();       
} 
<br />
    } 
</p>
        <p>
This allows you to do the following, which will only go to the database if the relationship
is not loaded.
</p>
        <p>
            var query = 
<br />
               
from ca in <strong>this.CustomerAccounts.AsQueryable(true) // ensure the relationship
is loaded and return a queryable on it</strong><br />
               
where ca.CustomerAccountID == customerAccountID 
<br />
               
select ca; 
<br />
    return query.FirstOrDefault();
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=07a2d677-ef9d-40e8-b2b2-f05c45511631" />
      </body>
      <title>Entity Framework Lazy Loading - A quick alternative with extension methods</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,07a2d677-ef9d-40e8-b2b2-f05c45511631.aspx</guid>
      <link>http://blog.keithpatton.com/2008/07/03/Entity+Framework+Lazy+Loading+A+Quick+Alternative+With+Extension+Methods.aspx</link>
      <pubDate>Thu, 03 Jul 2008 20:44:57 GMT</pubDate>
      <description>&lt;p&gt;
I saw the following code on a customer object which made me think about affording
a better way to query domain relationships without the extra methods, extension methods
come to the rescue! 
&lt;/p&gt;
&lt;p&gt;
I realise transparent lazy loading a la Nhibernate is another option, but i think
that this way keeps the spirit of explicitly loading from the database, but reduces
the amount of code clutter on the client side so you are not forever checking whether
a relationship is loaded or not, you simply request an IQueryable from the EntityCollection&amp;lt;T&amp;gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Finds a customer account with the specified
ID 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;customerAccountID&amp;quot;&amp;gt;ID
of the customer account to find&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;Customer account with
the specified ID&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public CustomerAccount FindAccount(int
customerAccountID) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(!this.CustomerAccounts.IsLoaded) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
this.CustomerAccounts.Load(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var query = 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
from ca in this.CustomerAccounts 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
where ca.CustomerAccountID == customerAccountID 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
select ca; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return query.FirstOrDefault(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
I added a static class with the extension methods for the EntityCollection type as
follows: 
&lt;/p&gt;
&lt;p&gt;
public static class EntityCollectionExtensions 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&amp;#160; public static EntityCollection&amp;lt;T&amp;gt;
EnsureLoaded&amp;lt;T&amp;gt;(this EntityCollection&amp;lt;T&amp;gt; entityCollection) where T : class,
IEntityWithRelationships 
&lt;br /&gt;
&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!entityCollection.IsLoaded) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
entityCollection.Load(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return entityCollection; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&amp;#160;&amp;#160; public static IQueryable&amp;lt;T&amp;gt; AsQueryable&amp;lt;T&amp;gt;(this
EntityCollection&amp;lt;T&amp;gt; entityCollection, bool ensureLoaded) where T : class, IEntityWithRelationships 
&lt;br /&gt;
&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ensureLoaded) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
entityCollection = EnsureLoaded&amp;lt;T&amp;gt;(entityCollection); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return entityCollection.AsQueryable();&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
} 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
This allows you to do the following, which will only go to the database if the relationship
is not loaded.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var query = 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
from ca in &lt;strong&gt;this.CustomerAccounts.AsQueryable(true) // ensure the relationship
is loaded and return a queryable on it&lt;/strong&gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
where ca.CustomerAccountID == customerAccountID 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
select ca; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; return query.FirstOrDefault();
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=07a2d677-ef9d-40e8-b2b2-f05c45511631" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,07a2d677-ef9d-40e8-b2b2-f05c45511631.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=6ea97c4b-568f-48fc-9033-c4526fb27265</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,6ea97c4b-568f-48fc-9033-c4526fb27265.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,6ea97c4b-568f-48fc-9033-c4526fb27265.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6ea97c4b-568f-48fc-9033-c4526fb27265</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I saw a post from the alt.net community here saying the EF was crap basically....<a temp_href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/ " href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/%20">http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/ </a><br /></p>
        <p>
The core complaints raise some important issues, but i really don't think we need
to go ballistic, and in some cases the concerns are just plain wrong. Time would be
better spent finishing the Linq for NHibernate provider don't you think??
</p>
        <p>
I've been working solidly with EF since the SP1 beta came out and can honestly say
it's holding up very well across a large, enterprise data model structure, and alongside
usage of a repository pattern and dependency injection to factor out most of the direct
dependencies on the EF ObjectContext, we have a system that can move towards POCO
over time with relatively little refactoring. 
</p>
        <p>
Here's some of my responses:
</p>
        <p>
          <strong>The design of the framework entities is that they are data only, causing issues
in maintainability and making it difficult or impossible to implement business objects
or more “real-world” objects.</strong>  
<br /><em>Wrong, you use partial classes to extend the generated aspects of the entities.
This is explicitly encouraged and we use it a lot for core business rules and validation.
There is nothing to stop you adding new non persistent properties or methods, or indeed
new classes that are used alongside the entities. </em></p>
        <p>
          <strong>The design of the framework entities is that they cannot be persistence ignorant,
so things like unit testing become next to impossible because you cannot test the
model without the database (for instance).</strong>
          <br />
There are (admittedly difficult) ways to get close to POCO. Rather than tear your
hair out, we used the repository pattern around the EF and avoid using the object
context directly. You are then only dependent on EntityObject, EntityReference and
EntityCollection on your entities. If you are sensible about it and don't work on
object context, your refactoring when vnext comes along will be significantly reduced.
This is a happy compromise for us and works well.
</p>
        <p>
          <strong>Lazy loading is not supported at all and requires a lot of extra code to make
work.  This confuses me.  I thought I saw "lazy-loading" demoed internally
but I might be mistaken.</strong>
          <br />
KP &gt; 'By design';) but honestly pretty easy to wire it up, not really a "lot
of extra code". I have worked for years with NH too, and the time saved using the
designer with EF more than makes up for it:)
</p>
        <p>
          <strong>Shared, canonical models contradict software best practices.  This appears
to be related to using a single shared model for multiple contexts in the EF, rather
than multiple models, one for each individual context.</strong>  
<br />
KP &gt; Well, it may be a criticism of the vision of EF (the more than just an ORM
story), but not of its core ORM functionality. Our clients are interested in the reporting
aspects on their entity models without writing excessive code. It remained to be seen
how this will pan out, but surely this is not a reason to pledge a vote of no confidence
in a piece of technology?
</p>
        <p>
          <strong>Excessive merge conflicts with source control.  Apparently, since the
diagram contains the model and the visualization, it causes tons of merge conflicts
when a team is using it.</strong>
          <br />
A somewhat moot point for most teams. We've settled on having a 'domain master', not
a biggy for most teams? shared design on the database, entities and relationships
would get messy in the best of worlds, i don't think this is a biggy.
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=6ea97c4b-568f-48fc-9033-c4526fb27265" />
      </body>
      <title>A vote of confidence for the Entity Framework</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,6ea97c4b-568f-48fc-9033-c4526fb27265.aspx</guid>
      <link>http://blog.keithpatton.com/2008/06/24/A+Vote+Of+Confidence+For+The+Entity+Framework.aspx</link>
      <pubDate>Tue, 24 Jun 2008 05:22:28 GMT</pubDate>
      <description>&lt;p&gt;
I saw a post from the alt.net community here saying the EF was crap basically....&lt;a temp_href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/ " href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/%20"&gt;http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/ &lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
The core complaints raise some important issues, but i really don't think we need
to go ballistic, and in some cases the concerns are just plain wrong. Time would be
better spent finishing the Linq for NHibernate provider don't you think??
&lt;/p&gt;
&lt;p&gt;
I've been working solidly with EF since the SP1 beta came out and can honestly say
it's holding up very well across a large, enterprise data model structure, and alongside
usage of a repository pattern and dependency injection to factor out most of the direct
dependencies on the EF ObjectContext, we have a system that can move towards POCO
over time with relatively little refactoring. 
&lt;/p&gt;
&lt;p&gt;
Here's some of my responses:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The design of the framework entities is that they are data only, causing issues
in maintainability and making it difficult or impossible to implement business objects
or more “real-world” objects.&lt;/strong&gt;&amp;nbsp; 
&lt;br&gt;
&lt;em&gt;Wrong, you use partial classes to extend the generated aspects of the entities.
This is explicitly encouraged and we use it a lot for core business rules and validation.
There is nothing to stop you adding new non persistent properties or methods, or indeed
new classes that are used alongside the entities. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The design of the framework entities is that they cannot be persistence ignorant,
so things like unit testing become next to impossible because you cannot test the
model without the database (for instance).&lt;/strong&gt; 
&lt;br&gt;
There are (admittedly difficult) ways to get close to POCO. Rather than tear your
hair out, we used the repository pattern around the EF and avoid using the object
context directly. You are then only dependent on EntityObject, EntityReference and
EntityCollection on your entities. If you are sensible about it and don't work on
object context, your refactoring when vnext comes along will be significantly reduced.
This is a happy compromise for us and works well.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Lazy loading is not supported at all and requires a lot of extra code to make
work.&amp;nbsp; This confuses me.&amp;nbsp; I thought I saw "lazy-loading" demoed internally
but I might be mistaken.&lt;/strong&gt; 
&lt;br&gt;
KP &amp;gt; 'By design';) but honestly&amp;nbsp;pretty easy to wire it up, not really a "lot
of extra code". I have worked for years with NH too, and the time saved using the
designer with EF more than makes up for it:)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Shared, canonical models contradict software best practices.&amp;nbsp; This appears
to be related to using a single shared model for multiple contexts in the EF, rather
than multiple models, one for each individual context.&lt;/strong&gt;&amp;nbsp; 
&lt;br&gt;
KP &amp;gt; Well, it may be a criticism of the vision of EF (the more than just an ORM
story), but not of its core ORM functionality. Our clients are interested in the reporting
aspects on their entity models without writing excessive code. It remained to be seen
how this will pan out, but surely this is not a reason to pledge a vote of no confidence
in a piece of technology?
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Excessive merge conflicts with source control.&amp;nbsp; Apparently, since the
diagram contains the model and the visualization, it causes tons of merge conflicts
when a team is using it.&lt;/strong&gt;
&lt;br&gt;
A somewhat moot point for most teams. We've settled on having a 'domain master', not
a biggy for most teams? shared design on the database, entities and relationships
would get messy in the best of worlds, i don't think this is a biggy.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=6ea97c4b-568f-48fc-9033-c4526fb27265" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,6ea97c4b-568f-48fc-9033-c4526fb27265.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=2f487046-bb39-47cf-8fa4-b2292f8ec8cb</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,2f487046-bb39-47cf-8fa4-b2292f8ec8cb.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,2f487046-bb39-47cf-8fa4-b2292f8ec8cb.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2f487046-bb39-47cf-8fa4-b2292f8ec8cb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wow, what a sexy title!
</p>
        <p>
This post shows how you can have a repository pattern with the entity framework .
</p>
        <p>
So, here we have a generic repository interface through which you can do all the nice
things. You would normally use Castle Windsor (or similar Dependency Injection tool)
to configure the Repository implementation (such as EFRepository) so you then just
have a dependency on the interface, which is nice. Here's a snippet of how to configure
the EFRepository to be used for all requests for IRepository from Castle Windsor.
Note the ability to change object contexts and even the repository implementation,
as long as IRepository is supported, the application won't care.
</p>
        <p>
&lt;castle&gt; 
<br />
    &lt;components&gt; 
</p>
        <p>
         &lt;component id="objectContext"
type="<em>YourObjectContext</em>"  &gt;&lt;/component&gt; 
<br />
      &lt;component id="iEFRepository" service="<em>YourIRepository</em>"
type="<em>YourEFRepository</em>" 
<br />
        &lt;parameters&gt; 
<br />
          &lt;objectContext&gt;${objectContext}&lt;/objectContext&gt; 
<br />
        &lt;/parameters&gt; 
<br />
      &lt;/component&gt; 
<br />
    &lt;/components&gt; 
<br />
  &lt;/castle&gt;
</p>
        <p>
Note the reflection in the EFRepository implementation which allows you to query and
work with all types in a hierarchy. By default you can't work directly with sub types
in EF, you have to do extra work to get to them. The reflection gets the base type
before communication with the ObjectContext to ensure minimal fussing about for the
developer. Note i don't understand why this isn't built in to be honest, perhaps they
ran out of time!
</p>
        <p>
The whole point of this is that you avoid using your application's ObjectContext explicitly
and only work with the core business entities that are then managed by the Entity
Framework. This allows us to have a good separation of concerns between the various
layers (although our entities are not pure POCO sadly). Note that i have only exposed
the most widely used features of ObjectContext, you can extend your Repository interface
and implementation to expose more advanced parts of the ObjectContext implementation
if needs be. 
</p>
        <p>
In the future, EF may move towards greater persistence ignorance, but in the mean
time structuring your application working off a Repository interface will mean minimal
changes as EF changes moving forwards.
</p>
        <p>
          <strong>IRepository interface</strong>
        </p>
        <p>
public interface IRepository 
<br />
  { 
</p>
        <p>
      /// &lt;summary&gt; 
<br />
      /// Return reference to an underlying repository context 
<br />
      /// &lt;/summary&gt; 
<br />
      /// &lt;returns&gt;the repository context&lt;/returns&gt; 
<br />
      object GetRepositoryContext(); 
</p>
        <p>
      /// &lt;summary&gt; 
<br />
      /// Return strongly typed IQueryable 
<br />
      /// &lt;/summary&gt; 
<br />
      IQueryable&lt;T&gt; GetQuery&lt;T&gt;(); 
</p>
        <p>
      /// &lt;summary&gt; 
<br />
      /// Load entity from the repository or store if necessary 
<br />
      /// &lt;/summary&gt; 
<br />
      /// &lt;typeparam name="T"&gt;the entity
type to load&lt;/typeparam&gt; 
<br />
      /// &lt;param name="where"&gt;where condition&lt;/param&gt; 
<br />
      /// &lt;returns&gt;the loaded entity&lt;/returns&gt; 
<br />
      T Load&lt;T&gt;(Expression&lt;Func&lt;T, bool&gt;&gt;
whereCondition); 
</p>
        <p>
      /// &lt;summary&gt; 
<br />
      /// Mark entity to be deleted within the repository 
<br />
      /// &lt;/summary&gt; 
<br />
      /// &lt;param name="entity"&gt;The entity
to delete&lt;/param&gt; 
<br />
      void Delete&lt;T&gt;(T entity); 
</p>
        <p>
      /// &lt;summary&gt; 
<br />
      /// Add entity to the repository 
<br />
      /// &lt;/summary&gt; 
<br />
      /// &lt;param name="entity"&gt;the entity
to add&lt;/param&gt; 
<br />
      /// &lt;returns&gt;The added entity&lt;/returns&gt; 
<br />
      void Add&lt;T&gt;(T entity); 
</p>
        <p>
      /// &lt;summary&gt; 
<br />
      /// Updates entity within the the repository 
<br />
      /// &lt;/summary&gt; 
<br />
      /// &lt;param name="entity"&gt;the entity
to update&lt;/param&gt; 
<br />
      /// &lt;returns&gt;The updates entity&lt;/returns&gt; 
<br />
      void Update&lt;T&gt;(T entity); 
</p>
        <p>
      /// &lt;summary&gt; 
<br />
      /// Save all changes from repository to store 
<br />
      /// &lt;/summary&gt; 
<br />
      /// &lt;returns&gt;Total number of objects affected&lt;/returns&gt; 
<br />
      int SaveChanges(); 
</p>
        <p>
  }
</p>
        <p>
Now we have our proper EFRepository.......
</p>
        <p>
          <strong>EFRepository implementation</strong>
        </p>
        <p>
using System; 
<br />
using System.Linq; 
<br />
using System.Linq.Expressions; 
<br />
using System.Reflection;
</p>
        <p>
public class EFRepository : IRepository, IDisposable 
<br />
  { 
<br />
      private ObjectContext _objectContext; 
</p>
        <p>
      private Type GetBaseType(Type type) 
<br />
      { 
<br />
          Type baseType = type.BaseType; 
<br />
          if (baseType != null &amp;&amp;
baseType != typeof(EntityObject)) 
<br />
          { 
<br />
              return
GetBaseType(type.BaseType); 
<br />
          } 
<br />
          return type; 
<br />
      } 
</p>
        <p>
      private bool HasBaseType(Type type, out Type baseType) 
<br />
      { 
<br />
          Type originalType = type.GetType(); 
<br />
          baseType = GetBaseType(type); 
<br />
          return baseType != originalType; 
<br />
      } 
</p>
        <p>
      public EFRepository(ObjectContext objectContext) 
<br />
      { 
<br />
          _objectContext = objectContext; 
<br />
      } 
</p>
        <p>
      public ObjectContext ObjectContext 
<br />
      { 
<br />
          get 
<br />
          { 
<br />
              return
_objectContext; 
<br />
          } 
<br />
      } 
</p>
        <p>
      public object GetRepositoryContext() 
<br />
      { 
<br />
          return this.ObjectContext; 
<br />
      } 
</p>
        <p>
      public IQueryable&lt;T&gt; GetQuery&lt;T&gt;() 
<br />
      { 
<br />
          Type baseType; 
<br />
          if (HasBaseType(typeof(T),
out baseType)) 
<br />
          { 
<br />
              return
this.ObjectContext.CreateQuery&lt;T&gt;("[" + baseType.Name.ToString() +
"]").OfType&lt;T&gt;(); 
<br />
          } 
<br />
          else 
<br />
          { 
<br />
              return
this.ObjectContext.CreateQuery&lt;T&gt;("[" + typeof(T).Name.ToString()
+ "]"); 
<br />
          } 
<br />
      } 
</p>
        <p>
      public T Load&lt;T&gt;(Expression&lt;Func&lt;T, bool&gt;&gt;
whereCondition) 
<br />
      { 
<br />
          return this.GetQuery&lt;T&gt;().Where(whereCondition).First(); 
<br />
      } 
</p>
        <p>
      public void Add&lt;T&gt;(T entity) 
<br />
      { 
<br />
          this.ObjectContext.AddObject(GetBaseType(typeof(T)).Name.ToString(),
entity);       
<br />
      } 
</p>
        <p>
      public void Update&lt;T&gt;(T entity) 
<br />
      { 
<br />
          EntityObject entityObject =
entity as EntityObject; 
<br />
          ObjectContext objectContext
= this.ObjectContext; 
<br />
          objectContext.ApplyPropertyChanges( 
<br />
              GetBaseType(typeof(T)).Name.ToString(), 
<br />
              objectContext.GetObjectByKey(entityObject.EntityKey) 
<br />
          ); 
<br />
      } 
</p>
        <p>
      public void Delete&lt;T&gt;(T entity) 
<br />
      { 
<br />
          this.ObjectContext.DeleteObject(entity); 
<br />
      } 
</p>
        <p>
      public int SaveChanges() 
<br />
      { 
<br />
          return this.ObjectContext.SaveChanges(); 
<br />
      } 
</p>
        <p>
      public void Dispose() 
<br />
      { 
<br />
          if (_objectContext != null) 
<br />
          { 
<br />
              _objectContext.Dispose(); 
<br />
          } 
<br />
      } 
</p>
        <p>
  }
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=2f487046-bb39-47cf-8fa4-b2292f8ec8cb" />
      </body>
      <title>Polymorphic Repository for ADO.Net Entity Framework</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,2f487046-bb39-47cf-8fa4-b2292f8ec8cb.aspx</guid>
      <link>http://blog.keithpatton.com/2008/05/29/Polymorphic+Repository+For+ADONet+Entity+Framework.aspx</link>
      <pubDate>Thu, 29 May 2008 04:13:14 GMT</pubDate>
      <description>&lt;p&gt;
Wow, what a sexy title!
&lt;/p&gt;
&lt;p&gt;
This post shows how you can have a repository pattern with the entity framework .
&lt;/p&gt;
&lt;p&gt;
So, here we have a generic repository interface through which you can do all the nice
things. You would normally use Castle Windsor (or similar Dependency Injection tool)
to configure the Repository implementation (such as EFRepository) so you then just
have a dependency on the interface, which is nice. Here's a snippet of how to configure
the EFRepository to be used for all requests for IRepository from Castle Windsor.
Note the ability to change object contexts and even the repository implementation,
as long as IRepository is supported, the application won't care.
&lt;/p&gt;
&lt;p&gt;
&amp;lt;castle&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;components&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;component id=&amp;quot;objectContext&amp;quot;
type=&amp;quot;&lt;em&gt;YourObjectContext&lt;/em&gt;&amp;quot;&amp;#160; &amp;gt;&amp;lt;/component&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;component id=&amp;quot;iEFRepository&amp;quot; service=&amp;quot;&lt;em&gt;YourIRepository&lt;/em&gt;&amp;quot;
type=&amp;quot;&lt;em&gt;YourEFRepository&lt;/em&gt;&amp;quot; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;parameters&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;objectContext&amp;gt;${objectContext}&amp;lt;/objectContext&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/parameters&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/component&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160; &amp;lt;/components&amp;gt; 
&lt;br /&gt;
&amp;#160; &amp;lt;/castle&amp;gt;
&lt;/p&gt;
&lt;p&gt;
Note the reflection in the EFRepository implementation which allows you to query and
work with all types in a hierarchy. By default you can't work directly with sub types
in EF, you have to do extra work to get to them. The reflection gets the base type
before communication with the ObjectContext to ensure minimal fussing about for the
developer. Note i don't understand why this isn't built in to be honest, perhaps they
ran out of time!
&lt;/p&gt;
&lt;p&gt;
The whole point of this is that you avoid using your application's ObjectContext explicitly
and only work with the core business entities that are then managed by the Entity
Framework. This allows us to have a good separation of concerns between the various
layers (although our entities are not pure POCO sadly). Note that i have only exposed
the most widely used features of ObjectContext, you can extend your Repository interface
and implementation to expose more advanced parts of the ObjectContext implementation
if needs be. 
&lt;/p&gt;
&lt;p&gt;
In the future, EF may move towards greater persistence ignorance, but in the mean
time structuring your application working off a Repository interface will mean minimal
changes as EF changes moving forwards.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;IRepository interface&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
public interface IRepository 
&lt;br /&gt;
&amp;#160; { 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Return reference to an underlying repository context 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;the repository context&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object GetRepositoryContext(); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Return strongly typed IQueryable 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IQueryable&amp;lt;T&amp;gt; GetQuery&amp;lt;T&amp;gt;(); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Load entity from the repository or store if necessary 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;the entity
type to load&amp;lt;/typeparam&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;where&amp;quot;&amp;gt;where condition&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;the loaded entity&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T Load&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt;
whereCondition); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Mark entity to be deleted within the repository 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;entity&amp;quot;&amp;gt;The entity
to delete&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void Delete&amp;lt;T&amp;gt;(T entity); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Add entity to the repository 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;entity&amp;quot;&amp;gt;the entity
to add&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;The added entity&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void Add&amp;lt;T&amp;gt;(T entity); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Updates entity within the the repository 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;param name=&amp;quot;entity&amp;quot;&amp;gt;the entity
to update&amp;lt;/param&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;The updates entity&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void Update&amp;lt;T&amp;gt;(T entity); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Save all changes from repository to store 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;returns&amp;gt;Total number of objects affected&amp;lt;/returns&amp;gt; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int SaveChanges(); 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; }
&lt;/p&gt;
&lt;p&gt;
Now we have our proper EFRepository.......
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;EFRepository implementation&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
using System; 
&lt;br /&gt;
using System.Linq; 
&lt;br /&gt;
using System.Linq.Expressions; 
&lt;br /&gt;
using System.Reflection;
&lt;/p&gt;
&lt;p&gt;
public class EFRepository : IRepository, IDisposable 
&lt;br /&gt;
&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ObjectContext _objectContext; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private Type GetBaseType(Type type) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Type baseType = type.BaseType; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (baseType != null &amp;amp;&amp;amp;
baseType != typeof(EntityObject)) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return
GetBaseType(type.BaseType); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return type; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private bool HasBaseType(Type type, out Type baseType) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Type originalType = type.GetType(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; baseType = GetBaseType(type); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return baseType != originalType; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public EFRepository(ObjectContext objectContext) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _objectContext = objectContext; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ObjectContext ObjectContext 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return
_objectContext; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public object GetRepositoryContext() 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this.ObjectContext; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IQueryable&amp;lt;T&amp;gt; GetQuery&amp;lt;T&amp;gt;() 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Type baseType; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (HasBaseType(typeof(T),
out baseType)) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return
this.ObjectContext.CreateQuery&amp;lt;T&amp;gt;(&amp;quot;[&amp;quot; + baseType.Name.ToString() +
&amp;quot;]&amp;quot;).OfType&amp;lt;T&amp;gt;(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return
this.ObjectContext.CreateQuery&amp;lt;T&amp;gt;(&amp;quot;[&amp;quot; + typeof(T).Name.ToString()
+ &amp;quot;]&amp;quot;); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public T Load&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt;
whereCondition) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this.GetQuery&amp;lt;T&amp;gt;().Where(whereCondition).First(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Add&amp;lt;T&amp;gt;(T entity) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ObjectContext.AddObject(GetBaseType(typeof(T)).Name.ToString(),
entity);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Update&amp;lt;T&amp;gt;(T entity) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EntityObject entityObject =
entity as EntityObject; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ObjectContext objectContext
= this.ObjectContext; 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objectContext.ApplyPropertyChanges( 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetBaseType(typeof(T)).Name.ToString(), 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objectContext.GetObjectByKey(entityObject.EntityKey) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Delete&amp;lt;T&amp;gt;(T entity) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ObjectContext.DeleteObject(entity); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public int SaveChanges() 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this.ObjectContext.SaveChanges(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Dispose() 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (_objectContext != null) 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _objectContext.Dispose(); 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 
&lt;/p&gt;
&lt;p&gt;
&amp;#160; }
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=2f487046-bb39-47cf-8fa4-b2292f8ec8cb" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,2f487046-bb39-47cf-8fa4-b2292f8ec8cb.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=090fa09b-620b-400d-a885-1d5aa0a73a59</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,090fa09b-620b-400d-a885-1d5aa0a73a59.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,090fa09b-620b-400d-a885-1d5aa0a73a59.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=090fa09b-620b-400d-a885-1d5aa0a73a59</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a title="http://friendfeed.com/kpatton" href="http://friendfeed.com/kpatton">http://friendfeed.com/kpatton</a> contains
a list of all my online activity, essentially blog posts, youtube, flickr and twitter
stuff. Nice idea, although there seems to be a new social networking site every 5
minutes and i'm struggling to keep up!
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=090fa09b-620b-400d-a885-1d5aa0a73a59" />
      </body>
      <title>FriendFeed is cool</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,090fa09b-620b-400d-a885-1d5aa0a73a59.aspx</guid>
      <link>http://blog.keithpatton.com/2008/05/19/FriendFeed+Is+Cool.aspx</link>
      <pubDate>Mon, 19 May 2008 19:07:04 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a title="http://friendfeed.com/kpatton" href="http://friendfeed.com/kpatton"&gt;http://friendfeed.com/kpatton&lt;/a&gt; contains
a list of all my online activity, essentially blog posts, youtube, flickr and twitter
stuff. Nice idea, although there seems to be a new social networking site every 5
minutes and i'm struggling to keep up!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=090fa09b-620b-400d-a885-1d5aa0a73a59" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,090fa09b-620b-400d-a885-1d5aa0a73a59.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=a62bffdd-5742-4556-a88a-db03e4c0ecab</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,a62bffdd-5742-4556-a88a-db03e4c0ecab.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,a62bffdd-5742-4556-a88a-db03e4c0ecab.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a62bffdd-5742-4556-a88a-db03e4c0ecab</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We've just built a complete 64 bit moss 2007 development environment and thought
i'd share the process via a pdf this time rather than 10 huge blog entries so you
can download it from one place. 
</p>
        <p>
64 bit is the recommended set up for Moss and it's strongly rumoured that future versions
of Moss will be 64 bit only. It makes sense to have your development environment running
in 64 bit if your Build, UAT and Authoring/Production farms are going to be runnign
64 bit too. 
</p>
        <p>
          <a href="http://cid-9e76e8332b4363e1.skydrive.live.com/self.aspx/Public/Moss2007DevEnvX64%20.pdf" target="_blank">Download
the Moss 2007 64 bit Development Environment Setup Guide Now</a>
        </p>
        <p>
All comments welcomed!
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=a62bffdd-5742-4556-a88a-db03e4c0ecab" />
      </body>
      <title>MOSS 2007 64 bit virtual development environment</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,a62bffdd-5742-4556-a88a-db03e4c0ecab.aspx</guid>
      <link>http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx</link>
      <pubDate>Wed, 05 Mar 2008 02:56:41 GMT</pubDate>
      <description>&lt;p&gt;
We've&amp;nbsp;just built a complete 64 bit moss 2007 development environment and thought
i'd share the process via a pdf this time rather than 10 huge blog entries so you
can download it from one place. 
&lt;/p&gt;
&lt;p&gt;
64 bit is the recommended set up for Moss and it's strongly rumoured that future versions
of Moss will be 64 bit only. It makes sense to have your development environment running
in 64 bit if your Build, UAT and Authoring/Production farms are going to be runnign
64 bit too. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://cid-9e76e8332b4363e1.skydrive.live.com/self.aspx/Public/Moss2007DevEnvX64%20.pdf" target=_blank&gt;Download
the Moss 2007 64 bit Development Environment Setup Guide Now&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
All comments welcomed!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=a62bffdd-5742-4556-a88a-db03e4c0ecab" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,a62bffdd-5742-4556-a88a-db03e4c0ecab.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=4684cb04-05a9-4a2d-b354-4423bf2b7080</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,4684cb04-05a9-4a2d-b354-4423bf2b7080.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,4684cb04-05a9-4a2d-b354-4423bf2b7080.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4684cb04-05a9-4a2d-b354-4423bf2b7080</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Lots of people are obviously intending to install the office service pack 1 onto their
Moss installations. However, what's the advice if you are (like me) creating a new
multi-server moss farm and you want to ensure you rollout moss 2007 with SP1 applied?
</p>
        <p>
Well, looking at the official documentation just didn't look like it was easily possible,
and there was conflicting advice on the web around when to install SP1. 
</p>
        <p>
e.g. Configure your whole farm or just the SSP? Run the updates after the initial
installation but don't run the config wizard? etc. etc. 
</p>
        <p>
This is until that is you realise that you can use the /Updates folder on the root
of the Moss installation files, which is what the folder is for, to provision updates/patches.
</p>
        <p>
So follow these five steps to Moss 2007 with SP1 install heaven:
</p>
        <p>
1. Copy the contents of the MOSS 2007 CD to your hard drive (e.g. C:\MossWithSP1)
</p>
        <p>
2. Download <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=4191a531-a2e9-45e4-b71e-5b0b17108bd2&amp;DisplayLang=en" target="_blank">WSS
3.0 SP1</a> and <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ad59175c-ad6a-4027-8c2f-db25322f791b&amp;DisplayLang=en" target="_blank">Office
2007 SP1</a> (e.g C:\MossSp1)
</p>
        <p>
3. Extract the contents to the Updates folder within your locally copied Moss installation
by running the following at the command prompt:  
<br /><br />
C:\MossSp1\Wssv3sp1-kb936988-x86-fullfile-en-us.exe /extract:c:\MossWithSP1 
<br />
C:\MossSp1\Officeserver2007sp1-kb936984-x86-fullfile-en-us.exe /extract:c:\MossWithSP1
</p>
        <p>
4. Use <a href="http://www.imgburn.com" target="_blank">ImgBurn</a> to burn the C:\MossWithSp1
back to an iso or to cd.
</p>
        <p>
5. Use this disc on all future new Moss farms you build to avoid the need to upgrade
to SP1
</p>
        <p>
          <strong>Now why on earth didn't Microsoft do this for new installations and make it
available on MSDN!!??</strong>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=4684cb04-05a9-4a2d-b354-4423bf2b7080" />
      </body>
      <title>Moss 2007 with SP1 together</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,4684cb04-05a9-4a2d-b354-4423bf2b7080.aspx</guid>
      <link>http://blog.keithpatton.com/2008/02/28/Moss+2007+With+SP1+Together.aspx</link>
      <pubDate>Thu, 28 Feb 2008 08:32:00 GMT</pubDate>
      <description>&lt;p&gt;
Lots of people are obviously intending to install the office service pack 1 onto their
Moss installations. However, what's the advice if you are (like me) creating a new
multi-server moss farm and you want to ensure you rollout moss 2007 with SP1 applied?
&lt;/p&gt;
&lt;p&gt;
Well, looking at the official documentation just didn't look like it was easily possible,
and there was conflicting advice on the web around when to install SP1. 
&lt;/p&gt;
&lt;p&gt;
e.g. Configure your whole farm or just the SSP? Run the updates after the initial
installation but don't run the config wizard? etc. etc. 
&lt;/p&gt;
&lt;p&gt;
This is until that is you realise that you can use the /Updates folder on the root
of the Moss installation files, which is what the folder is for, to provision updates/patches.
&lt;/p&gt;
&lt;p&gt;
So follow these five steps to Moss 2007 with SP1 install heaven:
&lt;/p&gt;
&lt;p&gt;
1. Copy the contents of the MOSS 2007 CD to your hard drive (e.g. C:\MossWithSP1)
&lt;/p&gt;
&lt;p&gt;
2. Download &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=4191a531-a2e9-45e4-b71e-5b0b17108bd2&amp;amp;DisplayLang=en" target="_blank"&gt;WSS
3.0 SP1&lt;/a&gt; and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ad59175c-ad6a-4027-8c2f-db25322f791b&amp;amp;DisplayLang=en" target="_blank"&gt;Office
2007 SP1&lt;/a&gt; (e.g C:\MossSp1)
&lt;/p&gt;
&lt;p&gt;
3. Extract the contents to the Updates folder within your locally copied Moss installation
by running the following at the command prompt:&amp;#160; 
&lt;br /&gt;
&lt;br /&gt;
C:\MossSp1\Wssv3sp1-kb936988-x86-fullfile-en-us.exe /extract:c:\MossWithSP1 
&lt;br /&gt;
C:\MossSp1\Officeserver2007sp1-kb936984-x86-fullfile-en-us.exe /extract:c:\MossWithSP1
&lt;/p&gt;
&lt;p&gt;
4. Use &lt;a href="http://www.imgburn.com" target="_blank"&gt;ImgBurn&lt;/a&gt; to burn the C:\MossWithSp1
back to an iso or to cd.
&lt;/p&gt;
&lt;p&gt;
5. Use this disc on all future new Moss farms you build to avoid the need to upgrade
to SP1
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Now why on earth didn't Microsoft do this for new installations and make it
available on MSDN!!??&lt;/strong&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=4684cb04-05a9-4a2d-b354-4423bf2b7080" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,4684cb04-05a9-4a2d-b354-4423bf2b7080.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=9c454d4f-7895-4c41-8ee2-aca729b57dc1</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,9c454d4f-7895-4c41-8ee2-aca729b57dc1.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,9c454d4f-7895-4c41-8ee2-aca729b57dc1.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9c454d4f-7895-4c41-8ee2-aca729b57dc1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Well, back in July last year i posted 10 steps to heaven with the installation of
MOSS 2007 for usage by a developer.
</p>
        <p>
Trouble was, some of the assumptions led to the need to have some manual steps at
the end most notably the requirement to be attached to a corporate domain and this
brought in the need to sysprep any such image so it would be unique on the ad network.
</p>
        <p>
When we thought about this we realised that in a lot of ways having hte image as a
domain controller made sense, we could install everything on one box and then just
clone the VM. However, we didn't want to have a domain popup for every developer that
was developing in Moss.
</p>
        <p>
Along then came the NAT mode in VMWare Server. This allows us to run a completely
private Moss domain for each developer whilst retaining corporate and internet connectivity
from that VM. 
</p>
        <p>
After much trial and error we think we have come acrss the ideal way to carry out
team development in SharePoint and i hope this helps people in developing their SharePoint
solutions too.
</p>
        <p>
See the updated post on how to build a complete moss 2007 64 bit virtual development
environment here:
</p>
        <p>
          <a href="http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx">http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx</a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=9c454d4f-7895-4c41-8ee2-aca729b57dc1" />
      </body>
      <title>Moss 2007 Development Environment Setup - Update</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,9c454d4f-7895-4c41-8ee2-aca729b57dc1.aspx</guid>
      <link>http://blog.keithpatton.com/2008/01/30/Moss+2007+Development+Environment+Setup+Update.aspx</link>
      <pubDate>Wed, 30 Jan 2008 11:28:47 GMT</pubDate>
      <description>&lt;p&gt;
Well, back in July last year i posted 10 steps to heaven with the installation of
MOSS 2007 for usage by a developer.
&lt;/p&gt;
&lt;p&gt;
Trouble was, some of the assumptions led to the need to have some manual steps at
the end most notably the requirement to be attached to a corporate domain and this
brought in the need to sysprep any such image so it would be unique on the ad network.
&lt;/p&gt;
&lt;p&gt;
When we thought about this we realised that in a lot of ways having hte image as a
domain controller made sense, we could install everything on one box and then just
clone the VM. However, we didn't want to have a domain popup for every developer that
was developing in Moss.
&lt;/p&gt;
&lt;p&gt;
Along then came the NAT mode in VMWare Server. This allows us to run a completely
private Moss domain for each developer whilst retaining corporate and internet connectivity
from that VM. 
&lt;/p&gt;
&lt;p&gt;
After much trial and error we think we have come acrss the ideal way to carry out
team development in SharePoint and i hope this helps people in developing their SharePoint
solutions too.
&lt;/p&gt;
&lt;p&gt;
See the updated post on how to build a complete moss 2007 64 bit virtual development
environment here:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx"&gt;http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=9c454d4f-7895-4c41-8ee2-aca729b57dc1" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,9c454d4f-7895-4c41-8ee2-aca729b57dc1.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=c4c37772-f063-43e3-ab6a-d48c66398ffe</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,c4c37772-f063-43e3-ab6a-d48c66398ffe.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,c4c37772-f063-43e3-ab6a-d48c66398ffe.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c4c37772-f063-43e3-ab6a-d48c66398ffe</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It's not often i gush about windows software, particularly considering how utterly
vista has failed to capture the imagination of the ordinary user. Included with vista
was the nice Windows Photo Gallery which was really an IPhoto equivalent built into
the OS. 
</p>
        <p>
Now, Windows Live Photo Gallery (wikipedia: <a title="http://en.wikipedia.org/wiki/Windows_Live_Photo_Gallery" href="http://en.wikipedia.org/wiki/Windows_Live_Photo_Gallery">http://en.wikipedia.org/wiki/Windows_Live_Photo_Gallery</a>,
download: <a title="http://get.live.com/photogallery/overview" href="http://get.live.com/photogallery/overview">http://get.live.com/photogallery/overview</a>)
is available for XP and Vista users which is essentially an upgrade to this vista
application with some lovely new features that i think should make it an essential
download for any blogger or user who publishes images and videos to the web on a regular
basis. 
</p>
        <p>
          <strong>First off, the name, Windows Live Media Gallery anyone?</strong>
        </p>
        <p>
I think MS made a mistake in calling the application Windows Live Photo Gallery, instead
it should be Windows Live Media Gallery because it handles the tagging, previewing,
burning, playing and publishing of video content just as gracefully as photo media.
I suspect this was to avoid confusion with the Windows Media Player application. Perhaps
the whole interface should be merged who knows...
</p>
        <p>
          <strong>Importing Media</strong>
        </p>
        <p>
When you import photos and videos into Windows Live Photo Gallery you get very granular
control over where the files go and crucially the auto-tagging of the files. In the
base version of Windows Photo Gallery on vista, you could only tag in an all or nothing
way for all imported files. So, getting stuff in and organising your import is a breeze.
</p>
        <p>
          <strong>Tagging and Publishing Media</strong>
        </p>
        <p>
Creating, organising and assigning media to tags is easy, with drag and drop support
throughout. Best of all, tags are retained when publishing media. A new Publish menu
item appears at the top of the main interface, allowing you to publish images to MSN
Spaces AND Flickr. I highly recommend Flickr and it's great to see MS support a 3rd
party service out of the box like this. Tagging is preserved when publishing to Flickr
and Flickr has officially announced support for Windows Live Photo Gallery.
</p>
        <p>
Unfortunately, the only thing that lets down the Publish option is that for video
only MSN Video is supported, although i hope YouTube support will be forthcoming perhaps
in a future release. MSN Video is fine and dandy and free, but i have all my videos
at YouTube and really want to publish there with full tagging integration a la Flickr
support. In the meantime, i simply utilise the YouTube multi file upload interface
and manually re-assign tags not a biggy as i don't have as many videos as photos.
</p>
        <p>
          <strong>Windows Live Writer</strong>
        </p>
        <p>
Whatever blog you use, you should really use <a href="http://get.live.com/writer/overview">Windows
Live Writer</a> as an excellent editor for publishing to your blog. It will work with
almos any blog out there and is easy to set up as long as you have your blog's home
page url, username and password. I find it much nicer to write up blog posts rather
than having to login to my blog website each time. 
</p>
        <p>
It is also a highly extensible little applicaiton and already has plugins such as
a <a href="http://wlwplugins.com/flickr4writer.php">Flickr Plugin</a> to support selecting
one or more images from your Flickr stream. 
</p>
        <p>
You can also easily insert videos you have posted to YouTube, Google Video or MSN
Video. 
</p>
        <p>
There is a site, <a href="http://wlwplugins.com/">Windows Live Writer plugins</a>,
where you can view even more useful plugins for this essential blogging tool.
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=c4c37772-f063-43e3-ab6a-d48c66398ffe" />
      </body>
      <title>Managing and publishing media with Windows Live Photo Gallery</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,c4c37772-f063-43e3-ab6a-d48c66398ffe.aspx</guid>
      <link>http://blog.keithpatton.com/2007/12/27/Managing+And+Publishing+Media+With+Windows+Live+Photo+Gallery.aspx</link>
      <pubDate>Thu, 27 Dec 2007 09:26:54 GMT</pubDate>
      <description>&lt;p&gt;
It's not often i gush about windows software, particularly considering how utterly
vista has failed to capture the imagination of the ordinary user. Included with vista
was the nice Windows Photo Gallery which was really an IPhoto equivalent built into
the OS. 
&lt;/p&gt;
&lt;p&gt;
Now, Windows Live Photo Gallery (wikipedia: &lt;a title="http://en.wikipedia.org/wiki/Windows_Live_Photo_Gallery" href="http://en.wikipedia.org/wiki/Windows_Live_Photo_Gallery"&gt;http://en.wikipedia.org/wiki/Windows_Live_Photo_Gallery&lt;/a&gt;,
download: &lt;a title="http://get.live.com/photogallery/overview" href="http://get.live.com/photogallery/overview"&gt;http://get.live.com/photogallery/overview&lt;/a&gt;)
is available for XP and Vista users which is essentially an upgrade to this vista
application with some lovely new features that i think should make it an essential
download for any blogger or user who publishes images and videos to the web on a regular
basis. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;First off, the name, Windows Live Media Gallery anyone?&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I think MS made a mistake in calling the application Windows Live Photo Gallery, instead
it should be Windows Live Media Gallery because it handles the tagging, previewing,
burning, playing and publishing of video content just as gracefully as photo media.
I suspect this was to avoid confusion with the Windows Media Player application. Perhaps
the whole interface should be merged who knows...
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Importing Media&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
When you import photos and videos into Windows Live Photo Gallery you get very granular
control over where the files go and crucially the auto-tagging of the files. In the
base version of Windows Photo Gallery on vista, you could only tag in an all or nothing
way for all imported files. So, getting stuff in and organising your import is a breeze.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Tagging and Publishing Media&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Creating, organising and assigning media to tags is easy, with drag and drop support
throughout. Best of all, tags are retained when publishing media. A new Publish menu
item appears at the top of the main interface, allowing you to publish images to MSN
Spaces AND Flickr. I highly recommend Flickr and it's great to see MS support a 3rd
party service out of the box like this. Tagging is preserved when publishing to Flickr
and Flickr has officially announced support for Windows Live Photo Gallery.
&lt;/p&gt;
&lt;p&gt;
Unfortunately, the only thing that lets down the Publish option is that for video
only MSN Video is supported, although i hope YouTube support will be forthcoming perhaps
in a future release. MSN Video is fine and dandy and free, but i have all my videos
at YouTube and really want to publish there with full tagging integration a la Flickr
support. In the meantime, i simply utilise the YouTube multi file upload interface
and manually re-assign tags not a biggy as i don't have as many videos as photos.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Windows Live Writer&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Whatever blog you use, you should really use &lt;a href="http://get.live.com/writer/overview"&gt;Windows
Live Writer&lt;/a&gt; as an excellent editor for publishing to your blog. It will work with
almos any blog out there and is easy to set up as long as you have your blog's home
page url, username and password. I find it much nicer to write up blog posts rather
than having to login to my blog website each time. 
&lt;/p&gt;
&lt;p&gt;
It is also a highly extensible little applicaiton and already has plugins such as
a &lt;a href="http://wlwplugins.com/flickr4writer.php"&gt;Flickr Plugin&lt;/a&gt; to support selecting
one or more images from your Flickr stream. 
&lt;/p&gt;
&lt;p&gt;
You can also easily insert videos you have posted to YouTube, Google Video or MSN
Video. 
&lt;/p&gt;
&lt;p&gt;
There is a site, &lt;a href="http://wlwplugins.com/"&gt;Windows Live Writer plugins&lt;/a&gt;,
where you can view even more useful plugins for this essential blogging tool.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=c4c37772-f063-43e3-ab6a-d48c66398ffe" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,c4c37772-f063-43e3-ab6a-d48c66398ffe.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=1e37a9dd-41e8-4273-ae96-2ce188d862b8</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,1e37a9dd-41e8-4273-ae96-2ce188d862b8.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,1e37a9dd-41e8-4273-ae96-2ce188d862b8.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=1e37a9dd-41e8-4273-ae96-2ce188d862b8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Congrats to Andy, Teresa, Chris et al at Hyro NZ for getting this up and running.
Despite many obstacles this is now a New Zealand first which i've been helping Andy
get up and running for months. I think this'll take off once the other channels eye
ball it and i wish the team all the very best of luck with this over the coming months.
</p>
        <p>
Check it out on Sky Channel 65, txts only $0.99 each!
</p>
        <p>
          <a title="23122007057" href="http://www.flickr.com/photos/27592284@N00/2130025313/">
            <img height="268" alt="23122007057" src="http://static.flickr.com/2347/2130025313_2c960a159a.jpg" width="357" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=1e37a9dd-41e8-4273-ae96-2ce188d862b8" />
      </body>
      <title>Alt TV Interactive Txt</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,1e37a9dd-41e8-4273-ae96-2ce188d862b8.aspx</guid>
      <link>http://blog.keithpatton.com/2007/12/23/Alt+TV+Interactive+Txt.aspx</link>
      <pubDate>Sun, 23 Dec 2007 11:00:47 GMT</pubDate>
      <description>&lt;p&gt;
Congrats to Andy, Teresa, Chris et al at Hyro NZ for getting this up and running.
Despite many obstacles this is now a New Zealand first which i've been helping Andy
get up and running for months. I think this'll take off once the other channels eye
ball it and i wish the team all the very best of luck with this over the coming months.
&lt;/p&gt;
&lt;p&gt;
Check it out on Sky Channel 65, txts only $0.99 each!
&lt;/p&gt;
&lt;p&gt;
&lt;a title="23122007057" href="http://www.flickr.com/photos/27592284@N00/2130025313/"&gt;&lt;img height="268" alt="23122007057" src="http://static.flickr.com/2347/2130025313_2c960a159a.jpg" width="357" border="0" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=1e37a9dd-41e8-4273-ae96-2ce188d862b8" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,1e37a9dd-41e8-4273-ae96-2ce188d862b8.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=2a28ef08-c63a-44aa-8ff7-57188ac5f734</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,2a28ef08-c63a-44aa-8ff7-57188ac5f734.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,2a28ef08-c63a-44aa-8ff7-57188ac5f734.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2a28ef08-c63a-44aa-8ff7-57188ac5f734</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://twitter.com/kpatton">http://twitter.com/kpatton</a> is
my twitter stream. Yet more ways to sully the semantic web with nuggets of meaningless
twaddle, and i'm up for that! Will aim to integrate the stream onto the side bar once
i find some time. Was thinking about changing the grey of my site as well, what do
others think? Are the comments working i wonder, not received any for a while, and
i thought i'd got more interesting recently as well..<br /><br />
if you're on twitter and know me, follow kpatton, that's me. 
<br /><p></p><img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=2a28ef08-c63a-44aa-8ff7-57188ac5f734" /></body>
      <title>Twitter stream now in operation</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,2a28ef08-c63a-44aa-8ff7-57188ac5f734.aspx</guid>
      <link>http://blog.keithpatton.com/2007/12/22/Twitter+Stream+Now+In+Operation.aspx</link>
      <pubDate>Sat, 22 Dec 2007 07:44:47 GMT</pubDate>
      <description>&lt;a href="http://twitter.com/kpatton"&gt;http://twitter.com/kpatton&lt;/a&gt; is my twitter
stream. Yet more ways to sully the semantic web with nuggets of meaningless twaddle,
and i'm up for that! Will aim to integrate the stream onto the side bar once i find
some time. Was thinking about changing the grey of my site as well, what do others
think? Are the comments working i wonder, not received any for a while, and i thought
i'd got more interesting recently as well..&lt;br&gt;
&lt;br&gt;
if you're on twitter and know me, follow kpatton, that's me. 
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=2a28ef08-c63a-44aa-8ff7-57188ac5f734" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,2a28ef08-c63a-44aa-8ff7-57188ac5f734.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=31e89c0d-ab78-49bb-aeff-8ebfe37eeb23</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,31e89c0d-ab78-49bb-aeff-8ebfe37eeb23.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,31e89c0d-ab78-49bb-aeff-8ebfe37eeb23.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=31e89c0d-ab78-49bb-aeff-8ebfe37eeb23</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Well, perhaps not, but it is a very cool piece of software for your mobile. <a href="http://www.fring.com/">http://www.fring.com/</a></p>
        <p>
Essentially, it integrates with Skype, MSN and GTalk to provide unified VOIP capabilities.
It also has Twitter capabilities for the very geeky amongst you. 
</p>
        <p>
Now, 3G chargs in NZ being what they are (and i imagine elsewhere), this is only really
of interest in Wifi zones e.g. at home, work or at cafes. However, it does mean you
can use your mobile to send/receive Skype calls from home without having to sit in
front of your computer and/or buy a special Skype enabled handset. 
</p>
        <p>
Fring also has the advantage of being able to incorporate new VOIP services over time
and provides a single presence notification for all your contacts, choosing VOIP if
available or GSM if not.
</p>
        <p>
As services like <a href="http://en.wikipedia.org/wiki/WiMAX">WIMAX</a> become available,
i'm hoping that we will have a genuine, low-cost alternative (akin to fixed line
broadband plans) to mobile operators and their fees within the next 5 years.
I'm actually expecting commercial availability of WiMax capable mobiles in or around
2010, we'll wait and see on that one!
</p>
        <p>
In the meantime, if you have a compatible handset and access to wifi or affordable
3g (is there such as thing), get fring immediately. 
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=31e89c0d-ab78-49bb-aeff-8ebfe37eeb23" />
      </body>
      <title>Fring is the Future</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,31e89c0d-ab78-49bb-aeff-8ebfe37eeb23.aspx</guid>
      <link>http://blog.keithpatton.com/2007/12/16/Fring+Is+The+Future.aspx</link>
      <pubDate>Sun, 16 Dec 2007 23:22:37 GMT</pubDate>
      <description>&lt;p&gt;
Well, perhaps not, but it is a very cool piece of software for your mobile. &lt;a href="http://www.fring.com/"&gt;http://www.fring.com/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Essentially, it integrates with Skype, MSN and GTalk to provide unified VOIP capabilities.
It also has Twitter capabilities for the very geeky amongst you. 
&lt;/p&gt;
&lt;p&gt;
Now, 3G chargs in NZ being what they are (and i imagine elsewhere), this is only really
of interest in Wifi zones e.g. at home, work or at cafes. However, it does mean you
can use your mobile to send/receive Skype calls from home without having to sit in
front of your computer and/or buy a special Skype enabled handset. 
&lt;/p&gt;
&lt;p&gt;
Fring also has the advantage of being able to incorporate new VOIP services over time
and provides a single presence notification for all your contacts, choosing VOIP if
available or GSM if not.
&lt;/p&gt;
&lt;p&gt;
As services like &lt;a href="http://en.wikipedia.org/wiki/WiMAX"&gt;WIMAX&lt;/a&gt; become available,
i'm hoping that we will have a genuine, low-cost alternative (akin to&amp;nbsp;fixed line
broadband plans)&amp;nbsp;to mobile operators and their fees within the next 5 years.
I'm actually expecting commercial availability of WiMax capable mobiles in or around
2010, we'll wait and see on that one!
&lt;/p&gt;
&lt;p&gt;
In the meantime, if you have a compatible handset and access to wifi or affordable
3g (is there such as thing), get fring immediately. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=31e89c0d-ab78-49bb-aeff-8ebfe37eeb23" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,31e89c0d-ab78-49bb-aeff-8ebfe37eeb23.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=4ab1d52f-70eb-4919-8100-49c1c15f918b</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,4ab1d52f-70eb-4919-8100-49c1c15f918b.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,4ab1d52f-70eb-4919-8100-49c1c15f918b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4ab1d52f-70eb-4919-8100-49c1c15f918b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yet another gadget, this time a chrissy present to myself in the <a href="http://www.nseries.com/index.html#l=products,n95">Nokia
N95</a>. i've resited buying a new mobile for some time now, but the pitcure and video
quality on this phone means i'll probalby not bother taking a camera or camcorder
with me on holidays. it posts up pictures automagically to <a href="http://www.flickr.com">flickr</a> and
i'm going to have a stab at coding things so that it will upload videos and pictures
to the blog. The rich media side of things has been sorely lacking of late dear readers
so rest assured there will be more videos of tommy, annabel shouting at me and general
tomfoolery to come shortly. 
</p>
        <img src="http://blog.keithpatton.com/content/binary/n95.jpg" border="0" />
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=4ab1d52f-70eb-4919-8100-49c1c15f918b" />
      </body>
      <title>Nokia N95</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,4ab1d52f-70eb-4919-8100-49c1c15f918b.aspx</guid>
      <link>http://blog.keithpatton.com/2007/12/11/Nokia+N95.aspx</link>
      <pubDate>Tue, 11 Dec 2007 02:12:34 GMT</pubDate>
      <description>&lt;p&gt;
Yet another gadget, this time a chrissy present to myself in the &lt;a href="http://www.nseries.com/index.html#l=products,n95"&gt;Nokia
N95&lt;/a&gt;. i've resited buying a new mobile for some time now, but the pitcure and video
quality on this phone means i'll probalby not bother taking a camera or camcorder
with me on holidays. it posts up pictures automagically to &lt;a href="http://www.flickr.com"&gt;flickr&lt;/a&gt; and
i'm going to have a stab at coding things so that it will upload videos and pictures
to the blog. The rich media side of things has been sorely lacking of late dear readers
so rest assured there will be more videos of tommy, annabel shouting at me and general
tomfoolery to come shortly. 
&lt;/p&gt;
&lt;img src="http://blog.keithpatton.com/content/binary/n95.jpg" border=0&gt;&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=4ab1d52f-70eb-4919-8100-49c1c15f918b" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,4ab1d52f-70eb-4919-8100-49c1c15f918b.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=f3de3b19-9f1c-4c9a-ad6c-5061bc2a20d4</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,f3de3b19-9f1c-4c9a-ad6c-5061bc2a20d4.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,f3de3b19-9f1c-4c9a-ad6c-5061bc2a20d4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f3de3b19-9f1c-4c9a-ad6c-5061bc2a20d4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We've been working on this one for a while, finally goes live, <a href="http://www.avjennings.com.au">http://www.avjennings.com.au</a>.
Built using <a href="http://www.kentico.com">www.kentico.com</a> our favourite CMS.
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=f3de3b19-9f1c-4c9a-ad6c-5061bc2a20d4" />
      </body>
      <title>AVJennings Website Goes Live</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,f3de3b19-9f1c-4c9a-ad6c-5061bc2a20d4.aspx</guid>
      <link>http://blog.keithpatton.com/2007/10/31/AVJennings+Website+Goes+Live.aspx</link>
      <pubDate>Wed, 31 Oct 2007 08:02:03 GMT</pubDate>
      <description>&lt;p&gt;
We've been working on this one for a while, finally goes live, &lt;a href="http://www.avjennings.com.au"&gt;http://www.avjennings.com.au&lt;/a&gt;.
Built using &lt;a href="http://www.kentico.com"&gt;www.kentico.com&lt;/a&gt; our favourite CMS.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=f3de3b19-9f1c-4c9a-ad6c-5061bc2a20d4" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,f3de3b19-9f1c-4c9a-ad6c-5061bc2a20d4.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=e23012c8-c21f-4919-9019-d133fe59df61</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,e23012c8-c21f-4919-9019-d133fe59df61.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,e23012c8-c21f-4919-9019-d133fe59df61.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e23012c8-c21f-4919-9019-d133fe59df61</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Woohoo! My GPS wristwatch thingy has arrived. It measures distance, speed, elevation,
heart rate, calorie count as you run. Even allows you to race against your previous
runs and export the runs to google maps!
</p>
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/GarminForerunner305_148C7/cf-lg.jpg" atomicselection="true">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="240" alt="cf-lg" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/GarminForerunner305_148C7/cf-lg_thumb.jpg" width="240" border="0" />
          </a>
        </p>
        <p>
          <a title="https://buy.garmin.com/shop/shop.do?pID=349" href="https://buy.garmin.com/shop/shop.do?pID=349">https://buy.garmin.com/shop/shop.do?pID=349</a>  
</p>
        <p>
          <img height="330" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/GarminForerunner305_148C7/clip_image002_1.jpg" width="500" />
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=e23012c8-c21f-4919-9019-d133fe59df61" />
      </body>
      <title>Garmin Forerunner 305</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,e23012c8-c21f-4919-9019-d133fe59df61.aspx</guid>
      <link>http://blog.keithpatton.com/2007/09/13/Garmin+Forerunner+305.aspx</link>
      <pubDate>Thu, 13 Sep 2007 11:23:21 GMT</pubDate>
      <description>&lt;p&gt;
Woohoo! My GPS wristwatch thingy has arrived. It measures distance, speed, elevation,
heart rate, calorie count as you run. Even allows you to race against your previous
runs and export the runs to google maps!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/GarminForerunner305_148C7/cf-lg.jpg" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="240" alt="cf-lg" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/GarminForerunner305_148C7/cf-lg_thumb.jpg" width="240" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;
&lt;a title="https://buy.garmin.com/shop/shop.do?pID=349" href="https://buy.garmin.com/shop/shop.do?pID=349"&gt;https://buy.garmin.com/shop/shop.do?pID=349&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;img height="330" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/GarminForerunner305_148C7/clip_image002_1.jpg" width="500"&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=e23012c8-c21f-4919-9019-d133fe59df61" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,e23012c8-c21f-4919-9019-d133fe59df61.aspx</comments>
      <category>Life in New Zealand;Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=dce4e1c3-5c13-4133-98c6-198c4bf77f91</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,dce4e1c3-5c13-4133-98c6-198c4bf77f91.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,dce4e1c3-5c13-4133-98c6-198c4bf77f91.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=dce4e1c3-5c13-4133-98c6-198c4bf77f91</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Our work is moving offices tomorrow and we did a nice little flash thing for the move.
Shout out to Big Tau for the design;)
</p>
        <iframe src="http://www.hyro.com/nzofficemove/index.html" frameborder="0" width="600" height="600">
        </iframe>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=dce4e1c3-5c13-4133-98c6-198c4bf77f91" />
      </body>
      <title>Moving Offices</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,dce4e1c3-5c13-4133-98c6-198c4bf77f91.aspx</guid>
      <link>http://blog.keithpatton.com/2007/08/20/Moving+Offices.aspx</link>
      <pubDate>Mon, 20 Aug 2007 08:29:18 GMT</pubDate>
      <description>&lt;p&gt;
Our work is moving offices tomorrow and we did a nice little flash thing for the move.
Shout out to Big Tau for the design;)
&lt;/p&gt;
&lt;iframe src="http://www.hyro.com/nzofficemove/index.html" frameborder=0 width=600 height=600&gt;
&lt;/iframe&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=dce4e1c3-5c13-4133-98c6-198c4bf77f91" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,dce4e1c3-5c13-4133-98c6-198c4bf77f91.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=4e7d9b35-d394-4a81-a1ef-708c4a0ea6ea</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,4e7d9b35-d394-4a81-a1ef-708c4a0ea6ea.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,4e7d9b35-d394-4a81-a1ef-708c4a0ea6ea.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=4e7d9b35-d394-4a81-a1ef-708c4a0ea6ea</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Attached is a guide to seting up a demonstration
machine for MOSS 2007. There is now little difference between this and my <a href="http://blog.keithpatton.com/2007/07/13/MOSS+2007+Development+Environment+Virtual+Server+Set+Up.aspx">previous
post on setting up a MOSS 2007 Development Environment</a> is that both VMs are
self contained. 
<br /><br />
The main difference is that no developer tools are installed on the demonstration
machine.<br /><p></p><a href="http://blog.keithpatton.com/content/binary/Moss.VirtualServer.Demonstration.Setup1.zip">Moss.VirtualServer.Demonstration.Setup1.zip
(3.76 MB)</a><img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=4e7d9b35-d394-4a81-a1ef-708c4a0ea6ea" /></body>
      <title>MOSS 2007 Demonstration Machine Setup</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,4e7d9b35-d394-4a81-a1ef-708c4a0ea6ea.aspx</guid>
      <link>http://blog.keithpatton.com/2007/08/11/MOSS+2007+Demonstration+Machine+Setup.aspx</link>
      <pubDate>Sat, 11 Aug 2007 11:32:10 GMT</pubDate>
      <description>Attached is a guide to seting up a demonstration machine for MOSS 2007. There is now little difference between this and&amp;nbsp;my &lt;a href="http://blog.keithpatton.com/2007/07/13/MOSS+2007+Development+Environment+Virtual+Server+Set+Up.aspx"&gt;previous
post on setting up a MOSS 2007 Development Environment&lt;/a&gt; is that both VMs&amp;nbsp;are
self contained. 
&lt;br&gt;
&lt;br&gt;
The main difference is that no developer tools are installed on the demonstration
machine.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/Moss.VirtualServer.Demonstration.Setup1.zip"&gt;Moss.VirtualServer.Demonstration.Setup1.zip
(3.76 MB)&lt;/a&gt;&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=4e7d9b35-d394-4a81-a1ef-708c4a0ea6ea" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,4e7d9b35-d394-4a81-a1ef-708c4a0ea6ea.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=c4a367bc-a850-4f14-aaa9-adc35603601b</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,c4a367bc-a850-4f14-aaa9-adc35603601b.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,c4a367bc-a850-4f14-aaa9-adc35603601b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c4a367bc-a850-4f14-aaa9-adc35603601b</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://movielibrary.lynda.com/html/modPage.asp?ID=384">http://movielibrary.lynda.com/html/modPage.asp?ID=384</a>
        </p>
        <p>
          <a href="http://movielibrary.lynda.com/html/modListing.asp?vid=70">http://movielibrary.lynda.com/html/modListing.asp?vid=70</a>
        </p>
        <p>
          <a href="http://silverlight.net/quickstarts/blend_quickstart/default.aspx">http://silverlight.net/quickstarts/blend_quickstart/default.aspx</a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=c4a367bc-a850-4f14-aaa9-adc35603601b" />
      </body>
      <title>Free Expression Blend Training Videos</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,c4a367bc-a850-4f14-aaa9-adc35603601b.aspx</guid>
      <link>http://blog.keithpatton.com/2007/07/23/Free+Expression+Blend+Training+Videos.aspx</link>
      <pubDate>Mon, 23 Jul 2007 07:07:16 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://movielibrary.lynda.com/html/modPage.asp?ID=384"&gt;http://movielibrary.lynda.com/html/modPage.asp?ID=384&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://movielibrary.lynda.com/html/modListing.asp?vid=70"&gt;http://movielibrary.lynda.com/html/modListing.asp?vid=70&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://silverlight.net/quickstarts/blend_quickstart/default.aspx"&gt;http://silverlight.net/quickstarts/blend_quickstart/default.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=c4a367bc-a850-4f14-aaa9-adc35603601b" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,c4a367bc-a850-4f14-aaa9-adc35603601b.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=be252e78-1ba3-4beb-8cd3-4396f661f9cf</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,be252e78-1ba3-4beb-8cd3-4396f661f9cf.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,be252e78-1ba3-4beb-8cd3-4396f661f9cf.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=be252e78-1ba3-4beb-8cd3-4396f661f9cf</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Hi, Pointless little post to ensure my technorati profile gets set up ok. 
</p>
        <p>
 
</p>
        <p>
 
</p>
        <a href="http://technorati.com/claim/8kei4ppzhb" rel="me">Technorati Profile</a>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=be252e78-1ba3-4beb-8cd3-4396f661f9cf" />
      </body>
      <title>Technorati Profile</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,be252e78-1ba3-4beb-8cd3-4396f661f9cf.aspx</guid>
      <link>http://blog.keithpatton.com/2007/07/16/Technorati+Profile.aspx</link>
      <pubDate>Mon, 16 Jul 2007 07:52:52 GMT</pubDate>
      <description>&lt;p&gt;
Hi, Pointless little post to ensure my technorati profile gets set up ok. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;a href="http://technorati.com/claim/8kei4ppzhb" rel="me"&gt;Technorati Profile&lt;/a&gt;&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=be252e78-1ba3-4beb-8cd3-4396f661f9cf" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,be252e78-1ba3-4beb-8cd3-4396f661f9cf.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=95e89095-9a38-44b2-aaf9-9a81d5adb05e</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,95e89095-9a38-44b2-aaf9-9a81d5adb05e.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,95e89095-9a38-44b2-aaf9-9a81d5adb05e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=95e89095-9a38-44b2-aaf9-9a81d5adb05e</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
OK, here we go, the complete guide to setting up a <font style="BACKGROUND-COLOR: rgb(253,255,105)" color="black">MOSS</font><font style="BACKGROUND-COLOR: rgb(105,255,105)" color="black">2007</font><font style="BACKGROUND-COLOR: rgb(105,255,253)" color="black">Development
Environment</font> <font style="BACKGROUND-COLOR: rgb(255,125,125)" color="black">Virtual</font> Server<br /></p>
        <p>
[Updated 05/03/2007: See the following post with downloadable pdf for the entire process]
</p>
        <p>
          <a href="http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx">http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx</a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=95e89095-9a38-44b2-aaf9-9a81d5adb05e" />
      </body>
      <title>MOSS 2007 Development Environment - Virtual Server Set Up</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,95e89095-9a38-44b2-aaf9-9a81d5adb05e.aspx</guid>
      <link>http://blog.keithpatton.com/2007/07/13/MOSS+2007+Development+Environment+Virtual+Server+Set+Up.aspx</link>
      <pubDate>Fri, 13 Jul 2007 09:18:59 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
OK, here we go, the complete guide to setting up a &lt;font style="BACKGROUND-COLOR: rgb(253,255,105)" color=black&gt;MOSS&lt;/font&gt; &lt;font style="BACKGROUND-COLOR: rgb(105,255,105)" color=black&gt;2007&lt;/font&gt; &lt;font style="BACKGROUND-COLOR: rgb(105,255,253)" color=black&gt;Development
Environment&lt;/font&gt;&amp;nbsp;&lt;font style="BACKGROUND-COLOR: rgb(255,125,125)" color=black&gt;Virtual&lt;/font&gt; Server&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
[Updated 05/03/2007: See the following post with downloadable pdf for the entire process]
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx"&gt;http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=95e89095-9a38-44b2-aaf9-9a81d5adb05e" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,95e89095-9a38-44b2-aaf9-9a81d5adb05e.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=fbbd5c96-13a9-4b0e-8d39-c06717ecf2e4</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,fbbd5c96-13a9-4b0e-8d39-c06717ecf2e4.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,fbbd5c96-13a9-4b0e-8d39-c06717ecf2e4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=fbbd5c96-13a9-4b0e-8d39-c06717ecf2e4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
OK, here we go, the complete guide to setting up a <font style="BACKGROUND-COLOR: rgb(253,255,105)" color="black">MOSS</font><font style="BACKGROUND-COLOR: rgb(105,255,105)" color="black">2007</font><font style="BACKGROUND-COLOR: rgb(105,255,253)" color="black">Development
Environment</font> <font style="BACKGROUND-COLOR: rgb(255,125,125)" color="black">Virtual</font> Machine
</p>
        <p>
[Note: 05/03/2008 Updated to become a downloadable pdf, see below]
</p>
        <p>
          <a href="http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx">http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx</a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=fbbd5c96-13a9-4b0e-8d39-c06717ecf2e4" />
      </body>
      <title>MOSS 2007 Development - Virtual Server Set Up </title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,fbbd5c96-13a9-4b0e-8d39-c06717ecf2e4.aspx</guid>
      <link>http://blog.keithpatton.com/2007/06/29/MOSS+2007+Development+Virtual+Server+Set+Up.aspx</link>
      <pubDate>Fri, 29 Jun 2007 01:19:48 GMT</pubDate>
      <description>&lt;p&gt;
OK, here we go, the complete guide to setting up a &lt;font style="BACKGROUND-COLOR: rgb(253,255,105)" color=black&gt;MOSS&lt;/font&gt; &lt;font style="BACKGROUND-COLOR: rgb(105,255,105)" color=black&gt;2007&lt;/font&gt; &lt;font style="BACKGROUND-COLOR: rgb(105,255,253)" color=black&gt;Development
Environment&lt;/font&gt;&amp;nbsp;&lt;font style="BACKGROUND-COLOR: rgb(255,125,125)" color=black&gt;Virtual&lt;/font&gt; Machine
&lt;/p&gt;
&lt;p&gt;
[Note: 05/03/2008 Updated to become a downloadable pdf, see below]
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx"&gt;http://blog.keithpatton.com/2008/03/05/MOSS+2007+64+Bit+Virtual+Development+Environment.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=fbbd5c96-13a9-4b0e-8d39-c06717ecf2e4" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,fbbd5c96-13a9-4b0e-8d39-c06717ecf2e4.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=612c04fd-fbcc-4f08-8831-c5f3e70d3ea9</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,612c04fd-fbcc-4f08-8831-c5f3e70d3ea9.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,612c04fd-fbcc-4f08-8831-c5f3e70d3ea9.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=612c04fd-fbcc-4f08-8831-c5f3e70d3ea9</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just had to blog about a really great website i just found for building family trees
called <a href="http://www.geni.com">www.geni.com</a>. It really is one of the most
easy to use websites i've ever seen, have a try. It also doubles as a handy birthday
reminder tool and you can store family photos etc. 
</p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=612c04fd-fbcc-4f08-8831-c5f3e70d3ea9" />
      </body>
      <title>Geni Rocks</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,612c04fd-fbcc-4f08-8831-c5f3e70d3ea9.aspx</guid>
      <link>http://blog.keithpatton.com/2007/06/04/Geni+Rocks.aspx</link>
      <pubDate>Mon, 04 Jun 2007 08:36:12 GMT</pubDate>
      <description>&lt;p&gt;
I just had to blog about a really great website i just found for building family trees
called &lt;a href="http://www.geni.com"&gt;www.geni.com&lt;/a&gt;. It really is one of the most
easy to use websites i've ever seen, have a try. It also doubles as a handy birthday
reminder tool and you can store family photos etc. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=612c04fd-fbcc-4f08-8831-c5f3e70d3ea9" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,612c04fd-fbcc-4f08-8831-c5f3e70d3ea9.aspx</comments>
      <category>Genealogy;Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=65e4db61-a1d0-4962-82b0-6471da7630f3</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,65e4db61-a1d0-4962-82b0-6471da7630f3.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,65e4db61-a1d0-4962-82b0-6471da7630f3.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=65e4db61-a1d0-4962-82b0-6471da7630f3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Steve Jobs and Bill Gates in a very, very rare interview together.
</p>
        <p>
          <a title="http://d5.allthingsd.com/20070530/steve-jobs-and-bill-gates-together-part-1-of-7/" href="http://d5.allthingsd.com/20070530/steve-jobs-and-bill-gates-together-part-1-of-7/">http://d5.allthingsd.com/20070530/steve-jobs-and-bill-gates-together-part-1-of-7/</a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=65e4db61-a1d0-4962-82b0-6471da7630f3" />
      </body>
      <title>Steve and Bill Chinwag</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,65e4db61-a1d0-4962-82b0-6471da7630f3.aspx</guid>
      <link>http://blog.keithpatton.com/2007/06/01/Steve+And+Bill+Chinwag.aspx</link>
      <pubDate>Fri, 01 Jun 2007 11:38:13 GMT</pubDate>
      <description>&lt;p&gt;
Steve Jobs and Bill Gates in a very, very rare interview together.
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://d5.allthingsd.com/20070530/steve-jobs-and-bill-gates-together-part-1-of-7/" href="http://d5.allthingsd.com/20070530/steve-jobs-and-bill-gates-together-part-1-of-7/"&gt;http://d5.allthingsd.com/20070530/steve-jobs-and-bill-gates-together-part-1-of-7/&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=65e4db61-a1d0-4962-82b0-6471da7630f3" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,65e4db61-a1d0-4962-82b0-6471da7630f3.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=fd4392b1-9a2a-47e3-971b-55dc70086edc</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,fd4392b1-9a2a-47e3-971b-55dc70086edc.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,fd4392b1-9a2a-47e3-971b-55dc70086edc.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=fd4392b1-9a2a-47e3-971b-55dc70086edc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
working in software is so much fun;)
</p>
        <img src="http://blog.keithpatton.com/content/binary/project.jpg" border="0" />
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=fd4392b1-9a2a-47e3-971b-55dc70086edc" />
      </body>
      <title>It's all about perception</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,fd4392b1-9a2a-47e3-971b-55dc70086edc.aspx</guid>
      <link>http://blog.keithpatton.com/2007/05/31/Its+All+About+Perception.aspx</link>
      <pubDate>Thu, 31 May 2007 10:06:32 GMT</pubDate>
      <description>&lt;p&gt;
working in software is so much fun;)
&lt;/p&gt;
&lt;img src="http://blog.keithpatton.com/content/binary/project.jpg" border="0"&gt;&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=fd4392b1-9a2a-47e3-971b-55dc70086edc" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,fd4392b1-9a2a-47e3-971b-55dc70086edc.aspx</comments>
      <category>Tech Humour;Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=605cde21-77b0-4f65-a20d-a5ae80f154be</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,605cde21-77b0-4f65-a20d-a5ae80f154be.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,605cde21-77b0-4f65-a20d-a5ae80f154be.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=605cde21-77b0-4f65-a20d-a5ae80f154be</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I <a href="http://blog.keithpatton.com/2007/02/26/Firefox+2+Usability+Trumps+IE7.aspx">posted
previously</a> about the truly awful UI experience in IE7, particularly the fact that
it is not customisable. 
</p>
        <p>
Well, glory be the wonderful free add on <a title="Quero" href="http://www.quero.at/" target="_blank">Quero</a> makes
IE 7 worth using again as it groups all the navigation options (back, forwards, refresh,
stop and home) where they should be, next to each other!
</p>
        <p>
There are also some other nifty features such as search highlighting, themes and the
ability to put the main menu navigation back where it shoudl be, at the top of the
window!
</p>
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Querototherescue_8488/image%7B0%7D%5B3%5D.png" atomicselection="true">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Querototherescue_8488/image%7B0%7D%5B2%5D.png" width="240" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=605cde21-77b0-4f65-a20d-a5ae80f154be" />
      </body>
      <title>Quero to the rescue!</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,605cde21-77b0-4f65-a20d-a5ae80f154be.aspx</guid>
      <link>http://blog.keithpatton.com/2007/05/12/Quero+To+The+Rescue.aspx</link>
      <pubDate>Sat, 12 May 2007 21:26:00 GMT</pubDate>
      <description>&lt;p&gt;
I &lt;a href="http://blog.keithpatton.com/2007/02/26/Firefox+2+Usability+Trumps+IE7.aspx"&gt;posted
previously&lt;/a&gt; about the truly awful UI experience in IE7, particularly the fact that
it is not customisable. 
&lt;/p&gt;
&lt;p&gt;
Well, glory be the wonderful free add on &lt;a title="Quero" href="http://www.quero.at/" target="_blank"&gt;Quero&lt;/a&gt; makes
IE 7 worth using again as it groups all the navigation options (back, forwards, refresh,
stop and home) where they should be, next to each other!
&lt;/p&gt;
&lt;p&gt;
There are also some other nifty features such as search highlighting, themes and the
ability to put the main menu navigation back where it shoudl be, at the top of the
window!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Querototherescue_8488/image%7B0%7D%5B3%5D.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Querototherescue_8488/image%7B0%7D%5B2%5D.png" width="240" border="0"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=605cde21-77b0-4f65-a20d-a5ae80f154be" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,605cde21-77b0-4f65-a20d-a5ae80f154be.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=cad04781-452d-4e4b-b9d4-3cb8914e26b4</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,cad04781-452d-4e4b-b9d4-3cb8914e26b4.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,cad04781-452d-4e4b-b9d4-3cb8914e26b4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=cad04781-452d-4e4b-b9d4-3cb8914e26b4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just downloaded the latest updates for windows vista to find some lovely little
videos you can setup as the background for your desktop environment. 
</p>
        <a href="http://blog.keithpatton.com/content/binary/DreamScene.mpg">DreamScene on
my PC</a> (2.5MB, MPG)<img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=cad04781-452d-4e4b-b9d4-3cb8914e26b4" /></body>
      <title>Vista Ultimate DreamScene</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,cad04781-452d-4e4b-b9d4-3cb8914e26b4.aspx</guid>
      <link>http://blog.keithpatton.com/2007/03/14/Vista+Ultimate+DreamScene.aspx</link>
      <pubDate>Wed, 14 Mar 2007 06:51:18 GMT</pubDate>
      <description>&lt;p&gt;
I just downloaded the latest updates for windows vista to find some lovely little
videos you can setup as the background for your desktop environment. 
&lt;/p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/DreamScene.mpg"&gt;DreamScene on
my PC&lt;/a&gt; (2.5MB, MPG)&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=cad04781-452d-4e4b-b9d4-3cb8914e26b4" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,cad04781-452d-4e4b-b9d4-3cb8914e26b4.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=997a71ac-ef84-4ca1-b7ad-838551feadba</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,997a71ac-ef84-4ca1-b7ad-838551feadba.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,997a71ac-ef84-4ca1-b7ad-838551feadba.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=997a71ac-ef84-4ca1-b7ad-838551feadba</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Now, let me state up front i am no LAMP or Firefox bigot. For better or worse i am
an MS fan, already having converted my household to Vista and OneCare. However...having
used IE7 since the early betas i'm afraid to say that Firefox is by far the most usable,
quicker browser. Although my evidence is anecdotal (i work and consult with many other
developers,project managers, business analysts who all for the most part corroborate
my theory), IE 7 is confusing on a very basic level..
</p>
        <p>
OK, i have a widescreen, so these screenshots look worse than on a normal monitor.
But hey, wasn't Vista developed with widescreen in mind (sidebar gadgetry etc.)? Anyway,
i've marked the key web navigation elements in red below. Note how in IE 7 the back
and forward buttons are standalone, but if you want to Stop or Refresh the page you
have to go to the right of the address bar. And if you want to go home, you have to
go underneath to the tab level, mmm.
</p>
        <p>
I won't even mention the fact that MS broke all previous design and decided to hide
the menu navigation. OK, you can show it, but then it doesn't appear where you would
expect it at the top, but strangely nestled between the address bar level and the
tab level. It just looks well, awkward...
</p>
        <p>
All this would be almost forgivable if like most MS applications you could tinker
with the menus, but lo and behold for some strange reason you can't do diddly except
hide and show things, the position of everything is fixed, damn!
</p>
        <p>
          <strong>IE7</strong>
        </p>
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Firefox2UsabilityTrumpsIE7_13EAF/IE7%5B3%5D.jpg" atomicselection="true">
            <img style="border: 0px none ;" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Firefox2UsabilityTrumpsIE7_13EAF/IE7_thumb%5B1%5D.jpg" border="0" height="306" width="600" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Contrast this with Firefox, which places all the key navigation elements right next
to each other, and logicall places the menu bar at the top were it belongs. You can
drag stuff about levels and the whole experience (particularly on a widescreen) is
so much more pleasant. 
</p>
        <p>
          <strong>Firefox</strong>
        </p>
        <p>
          <a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Firefox2UsabilityTrumpsIE7_13EAF/Firefox%5B3%5D.jpg" atomicselection="true">
            <img style="border: 0px none ;" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Firefox2UsabilityTrumpsIE7_13EAF/Firefox_thumb%5B1%5D.jpg" border="0" height="300" width="600" />
          </a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=997a71ac-ef84-4ca1-b7ad-838551feadba" />
      </body>
      <title>Firefox 2 Usability Trumps IE7</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,997a71ac-ef84-4ca1-b7ad-838551feadba.aspx</guid>
      <link>http://blog.keithpatton.com/2007/02/26/Firefox+2+Usability+Trumps+IE7.aspx</link>
      <pubDate>Mon, 26 Feb 2007 09:40:08 GMT</pubDate>
      <description>&lt;p&gt;
Now, let me state up front i am no LAMP or Firefox bigot. For better or worse i am
an MS fan, already having converted my household to Vista and OneCare. However...having
used IE7 since the early betas i'm afraid to say that Firefox is by far the most usable,
quicker browser. Although my evidence is anecdotal (i work and consult with many other
developers,project managers, business analysts who all for the most part corroborate
my theory), IE 7 is confusing on&amp;nbsp;a very basic level..
&lt;/p&gt;
&lt;p&gt;
OK, i have a widescreen, so these screenshots look worse than on a normal monitor.
But hey, wasn't Vista developed with widescreen in mind (sidebar gadgetry etc.)? Anyway,
i've marked the key web navigation elements in red below. Note how in IE 7 the back
and forward buttons are standalone, but if you want to Stop or Refresh the page you
have to go to the right of the address bar. And if you want to go home, you have to
go underneath to the tab level, mmm.
&lt;/p&gt;
&lt;p&gt;
I won't even mention the fact that MS broke all previous design and decided to hide
the menu navigation. OK, you can show it, but then it doesn't appear where you would
expect it at the top, but strangely nestled between the address bar level and the
tab level. It just looks well, awkward...
&lt;/p&gt;
&lt;p&gt;
All this would be almost forgivable if like most MS applications you could tinker
with the menus, but lo and behold for some strange reason you can't do diddly except
hide and show things, the position of everything is fixed, damn!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;IE7&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Firefox2UsabilityTrumpsIE7_13EAF/IE7%5B3%5D.jpg" atomicselection="true"&gt;&lt;img style="border: 0px none ;" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Firefox2UsabilityTrumpsIE7_13EAF/IE7_thumb%5B1%5D.jpg" border="0" height="306" width="600"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Contrast this with Firefox, which places all the key navigation elements right next
to each other, and logicall places the menu bar at the top were it belongs. You can
drag stuff about levels and the whole experience (particularly on a widescreen) is
so much more pleasant. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Firefox&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Firefox2UsabilityTrumpsIE7_13EAF/Firefox%5B3%5D.jpg" atomicselection="true"&gt;&lt;img style="border: 0px none ;" src="http://blog.keithpatton.com/content/binary/WindowsLiveWriter/Firefox2UsabilityTrumpsIE7_13EAF/Firefox_thumb%5B1%5D.jpg" border="0" height="300" width="600"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=997a71ac-ef84-4ca1-b7ad-838551feadba" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,997a71ac-ef84-4ca1-b7ad-838551feadba.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=f50321cf-7974-4d18-89ef-16c26ebcdd29</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,f50321cf-7974-4d18-89ef-16c26ebcdd29.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,f50321cf-7974-4d18-89ef-16c26ebcdd29.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f50321cf-7974-4d18-89ef-16c26ebcdd29</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
mmm, <a href="http://www.sky.co.nz">www.sky.co.nz</a>. Want to talk with a human being
at nz's digital tv monopoly...try and find the phone number. They changed their website
some months ago and no longer want you to ring them. Poor Sky, they obviously don't
make enough money out of us already that they think a crappy forum system treating
us like 6 year olds is the best way to provide customer service. 
</p>
        <p>
It is there, but you have to hunt
</p>
        <p>
          <a href="http://www.skytv.co.nz/index.cfm?pageid=408">http://www.skytv.co.nz/index.cfm?pageid=408</a>
        </p>
        <img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=f50321cf-7974-4d18-89ef-16c26ebcdd29" />
      </body>
      <title>sky website - hunt the phone number</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,f50321cf-7974-4d18-89ef-16c26ebcdd29.aspx</guid>
      <link>http://blog.keithpatton.com/2007/01/10/sky+Website+Hunt+The+Phone+Number.aspx</link>
      <pubDate>Wed, 10 Jan 2007 01:25:24 GMT</pubDate>
      <description>&lt;p&gt;
mmm, &lt;a href="http://www.sky.co.nz"&gt;www.sky.co.nz&lt;/a&gt;. Want to talk with a human being
at nz's digital tv monopoly...try and find the phone number. They changed their website
some months ago and no longer want you to ring them. Poor Sky, they obviously don't
make enough money out of us already that they think a crappy forum system treating
us like 6 year olds is the best way to provide customer service. 
&lt;/p&gt;
&lt;p&gt;
It is there, but you have to hunt
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.skytv.co.nz/index.cfm?pageid=408"&gt;http://www.skytv.co.nz/index.cfm?pageid=408&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=f50321cf-7974-4d18-89ef-16c26ebcdd29" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,f50321cf-7974-4d18-89ef-16c26ebcdd29.aspx</comments>
      <category>Technical</category>
    </item>
    <item>
      <trackback:ping>http://blog.keithpatton.com/Trackback.aspx?guid=04b3842d-b1fe-4ad5-b309-20e7f0d49533</trackback:ping>
      <pingback:server>http://blog.keithpatton.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.keithpatton.com/PermaLink,guid,04b3842d-b1fe-4ad5-b309-20e7f0d49533.aspx</pingback:target>
      <dc:creator>Keith Patton</dc:creator>
      <wfw:comment>http://blog.keithpatton.com/CommentView,guid,04b3842d-b1fe-4ad5-b309-20e7f0d49533.aspx</wfw:comment>
      <wfw:commentRss>http://blog.keithpatton.com/SyndicationService.asmx/GetEntryCommentsRss?guid=04b3842d-b1fe-4ad5-b309-20e7f0d49533</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">The evolution based game from sim city
creator coming out this year.. 
<p><span style="DISPLAY: block; TEXT-ALIGN: center"><object height="350" width="425"><param name="movie" value="http://www.youtube.com/v/8PXiNNXUUF8" /><param name="wmode" value="transparent" /><embed src="http://www.youtube.com/v/8PXiNNXUUF8" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></span></p><img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=04b3842d-b1fe-4ad5-b309-20e7f0d49533" /></body>
      <title>spore - the best game ever?</title>
      <guid isPermaLink="false">http://blog.keithpatton.com/PermaLink,guid,04b3842d-b1fe-4ad5-b309-20e7f0d49533.aspx</guid>
      <link>http://blog.keithpatton.com/2007/01/07/spore+The+Best+Game+Ever.aspx</link>
      <pubDate>Sun, 07 Jan 2007 19:27:33 GMT</pubDate>
      <description>The evolution based game from sim city creator coming out this year..

&lt;p&gt;
&lt;span style="DISPLAY: block; TEXT-ALIGN: center"&gt; 
&lt;object height=350 width=425&gt;
&lt;param name="movie" value="http://www.youtube.com/v/8PXiNNXUUF8"&gt;
&lt;param name="wmode" value="transparent"&gt;
&lt;embed src='http://www.youtube.com/v/8PXiNNXUUF8' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.keithpatton.com/aggbug.ashx?id=04b3842d-b1fe-4ad5-b309-20e7f0d49533" /&gt;</description>
      <comments>http://blog.keithpatton.com/CommentView,guid,04b3842d-b1fe-4ad5-b309-20e7f0d49533.aspx</comments>
      <category>Technical</category>
    </item>
  </channel>
</rss>