<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Suman Chakrabarti - Coding for Office Apps</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/sumanc/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/sumanc/feed.xml</link>
    <description>Office Collaboration, .NET dev, Social Computing and other random bits of goodness</description>
    <lastBuildDate>Tue, 16 Apr 2019 05:31:13 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>How to change the lock state via CSOM</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/how-to-change-the-lock-state-via-csom</link>
      <pubDate>Wed, 19 Nov 2014 10:05:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2014/11/19/how-to-change-the-lock-state-via-csom/</guid>
      <description><![CDATA[PowerShell Approach
Setting the lock state for a site collection has a few rules that aren't...]]></description>
      <content:encoded><![CDATA[<h2>PowerShell Approach</h2>
<p>Setting the lock state for a site collection has a few rules that aren't entirely clear. You can set the lock state via PowerShell using the Set-SPOSite command:</p>
<pre class="code">Set-SPOSite https://[tenant].sharepoint.com/sites/targetsite -LockState [NoAccess|Unlock]</pre>
<p>You can read more about that on the TechNet article for it here:&nbsp;<a href="https://technet.microsoft.com/en-us/library/cc263238(v=office.15).aspx">https://technet.microsoft.com/en-us/library/cc263238(v=office.15).aspx</a></p>
<h2>Rules</h2>
<p>The site must not be one of the following:</p>
<ul>
<li>Tenant admin site (duh! obvious)</li>
<li>Root site collection (https://[tenant].sharepoint.com)</li>
<li>Search site collection (https://[tenant].sharepoint.com/search, or whatever yours is)</li>
<li>Public site (https://[tenant]-public.sharepoint.com)</li>
</ul>
<h2>CSOM Approach</h2>
<div>To do this in CSOM, you can utilize the TenantAdministration API; however, this is only available in the v16 SharePoint Online API.</div>
<!-- HTML generated using hilite.me -->
<div style="margin-top: 8px; margin-bottom: 8px; background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em; padding: .2em .6em;">
<pre style="margin: 0; line-height: 125%; font-size: 1.1em;"><span style="color: #0000ff;">using</span> (<span style="color: #2b91af;">var</span> clientContext = <span style="color: #0000ff;">new</span> ClientContext(tenantUrl)) {
    clientContext.Credentials = spoCredentials;
    <span style="color: #2b91af;">var</span> tenant = <span style="color: #0000ff;">new</span> Tenant(clientContext);
    <span style="color: #2b91af;">var</span> siteProperties = tenant.GetSitePropertiesByUrl(siteUrl, <span style="color: #0000ff;">true</span>);
    clientContext.Load(siteProperties);
    clientContext.ExecuteQuery();

    Console.WriteLine(<span style="color: #a31515;">"LockState: {0}"</span>, siteProperties.LockState);

    siteProperties.LockState = <span style="color: #a31515;">"Unlock"</span>;
    siteProperties.Update();
    clientContext.ExecuteQuery();
}
</pre>
</div>
<p>This will will also be a future OfficeDevPnP.Core extension (in the dev branch, now). The method is TenantExtensions.SetSiteLockState(this Tenant tenant, string siteUrl, SiteLockState lockState).</p>
<p>When the site is locked, you'll see it in the admin site with a lock icon next to it as seen below.</p>
<div><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/3568.spo-lockedsite.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30/3568.spo_2D00_lockedsite.png" alt="" /></div>]]></content:encoded>
    </item>
    <item>
      <title>How to change the logo in Office 365</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/how-to-change-the-logo-in-office-365</link>
      <pubDate>Wed, 19 Nov 2014 09:42:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2014/11/19/how-to-change-the-logo-in-office-365/</guid>
      <description><![CDATA[One thing I had trouble finding was how to change the logo in&nbsp;my Office 365 tenant. It's not...]]></description>
      <content:encoded><![CDATA[<p>One thing I had trouble finding was how to change the logo in&nbsp;my Office 365 tenant. It's not obvious and things are changing so rapidly, so I hope this helps some folks.</p>
<p>First, you'll need to navigate to the Office 365 Admin Settings from the Settings gear. This will take you to the Admin dashboard where you'll find a link in the top right corner.</p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/6215.office365adminhome.png" original-url="https://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30/6215.office365adminhome.png" alt="" border="0" /></p>
<p>This will take you to the Tenant customization settings page. Choose <strong>Custom Theming</strong> in the left navigation to get to the <strong>Manage Custom Themes</strong> view:</p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/0042.office365-managecustomthemes.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30/0042.office365_2D00_managecustomthemes.png" alt="" border="0" /></p>
<p>You can modify the following settings from here:</p>
<ul>
<li>URL the suite bar navigates the user</li>
<li>Color of the suite bar</li>
<li>Color of the text links that appear to the right (this includes icons for notifications)</li>
<li>You can select from one of the selected colors to set as the Office 365 logo. Note, the words <strong>powered by </strong>and the logo for Office 365 are still displayed here.</li>
</ul>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/7024.office365-newheader.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30/7024.office365_2D00_newheader.png" alt="" border="0" /></p>
<p>&nbsp;</p>
<p>Cheers!</p>]]></content:encoded>
    </item>
    <item>
      <title>How we decided to unit test the OfficeDevPnP core</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/how-we-decided-to-unit-test-the-officedevpnp-core</link>
      <pubDate>Wed, 03 Sep 2014 22:19:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2014/09/03/how-we-decided-to-unit-test-the-officedevpnp-core/</guid>
      <description><![CDATA[Overview
Unit testing the&nbsp;Office Developer Patterns &amp; Practices Core solution was...]]></description>
      <content:encoded><![CDATA[<h1><a href="https://aka.ms/OfficeDevPnP"><img style="float: right;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/4035.OfficeDevPnP-Logo.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30/4035.OfficeDevPnP_2D00_Logo.png" alt="Office Dev Patterns &amp; Practices" width="300" height="116" /></a>Overview</h1>
<p>Unit testing the&nbsp;<a href="https://aka.ms/OfficeDevPnP">Office Developer Patterns &amp; Practices</a> Core solution was definitely a challenge for us. Since it was grown from community code samples, most of the testing was done by refactoring similar code so it worked across many samples. The problem is that the Core component has become more and more reliable and the method signatures are not tested unless we run individual tests.</p>
<h1>Fakes vs. Real Tenant</h1>
<p>Mock objects, or Fakes as they're called in VS, are a great solution for unit testing. They allow us the ability to act as both the server and the client to abstract our tests from SharePoint. However, given that there isn't a fakes framework already developed for SharePoint, it's very difficult to implement all the scaffolding for SharePoint CSOM and be able to ensure that objects are properly initialized as expected. This led us to believe that the effort of building such a thing is less valued than testing the Core solution against a developer tenant.</p>
<h1>Console Application?</h1>
<p>The console application is the old faithful. Anyone can write a Console app to unit test code and write out all their assertions and exceptions. This tried and true method has been a great solution for C++ developers; however, given the number of options out there, this was obviously not feasible. We wanted build integration via TFS and we wanted the community to be able to easily extend the app, which wouldn't happen this way. Ironically, when quickly testing a change to the API I was actually testing via console app in an ignored path&hellip;do what you have to, you know?</p>
<h1>Client ID/Secret?</h1>
<p>Using OAuth to test against the developer tenant is a great approach and would definitely validate a connection and that your code functions. Given that the Core assembly assumes that what is being passed in is a valid ClientContext object and almost all methods use a server object, the assumption is that authorization has already been established. The complexity of configuring the app with a client id/secret with the SP server during testing, it doesn't exactly seem the right approach when the wish is to test that all unit tests are valid for tenant-level permissions.</p>
<h1>Ah, SharePointOnlineCredentials!</h1>
<p>In the end, the right solution for this was decided to be to use SharePointOnlineCredentials to initialize the ClientContext object. This means that we can supply an app.config file that has dev site and tenant URLs to properly along with username and password. To initialize a ClientContext, one can simply use the format:</p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: #0000cc;">var</span>&nbsp;spCredentials&nbsp;=&nbsp;<span style="color: #0000cc;">new</span>&nbsp;SharePointOnlineCredentials(username,&nbsp;password);<br /><span style="color: #0000cc;">using</span>&nbsp;(<span style="color: #0000cc;">var</span>&nbsp;clientContext&nbsp;=&nbsp;<span style="color: #0000cc;">new</span>&nbsp;ClientContext(devSiteUrl)){<br />&nbsp;&nbsp;&nbsp;&nbsp;clientContext.Credentials&nbsp;=&nbsp;spCredentials;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green;">//&nbsp;perform&nbsp;CSOM&nbsp;operations</span><br />} </span></p>
<h1>Put My Password in App.Config?</h1>
<p>Obviously, it's <strong><em>not a good practice</em></strong> to put your username/password in the App.config file, especially since this is shared code that is community driven and you don't want it to accidentally get pushed to your fork. So, we simply added the <strong>App.config</strong> file to <em>.gitignore</em> to leave it out leaving that responsibility to you. The <strong>App.config.sample</strong> file in the new <strong>OfficeDevPnP.Core.Tests</strong> project which can be copied in your local solution, renamed to app.config, filled in, and you can unit test. Check it out in the <strong>dev</strong> branch.</p>
<p>Cheers!</p>]]></content:encoded>
    </item>
    <item>
      <title>So, You Want to Build an Office Mail App</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/so-you-want-to-build-an-office-mail-app</link>
      <pubDate>Mon, 12 May 2014 06:19:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2014/05/12/so-you-want-to-build-an-office-mail-app/</guid>
      <description><![CDATA[Facebook, Twitter, Yammer, Pinterest, and all the other social media outlets have an amazing...]]></description>
      <content:encoded><![CDATA[<p>Facebook, Twitter, Yammer, Pinterest, and all the other social media outlets have an amazing aptitude for communication, but the one comprehensive and reliable communication channel is still email. Email is the start and end of every business's day--and sometimes into the wee hours of the morning.</p>
<p>Mail apps for Office are an integration of what we are already chained to and the capability to empower email to be more insightful. They can give an old application a new interface to grow.</p>
<h2>Office AMS 2.0</h2>
<p>In the recent release of <a href="https://aka.ms/officeams" target="_blank">Office AMS 2.0</a>, we added a simple mail app for picking up YouTube video urls from an email and present them in the Outlook interface in both the web and desktop clients. It is located in the [OfficeAMS]<strong>\Samples\Core.MailApps</strong> folder.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/2330.OfficeAMS-FolderStructure_21A15FDB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/2330.OfficeAMS_2D00_FolderStructure_5F00_21A15FDB.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="OfficeAMS-FolderStructure" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/1881.OfficeAMS-FolderStructure_thumb_3CD9B8DC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/1881.OfficeAMS_2D00_FolderStructure_5F00_thumb_5F00_3CD9B8DC.png" alt="OfficeAMS-FolderStructure" width="414" height="205" border="0" /></a></p>
<h2>Office Mail Apps AppManifest.xml</h2>
<p>Visual Studio will structure your application into 2 parts: the Office application manifests and the web applications that support them. <span style="background-color: #ffff00;">You <em>can</em> have multiple Mail App manifests in one Office App project</span>, but for the purpose of this release, only one is included.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/5658.OfficeAMS-MailApp-ProjectStructure_63828C4F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/5658.OfficeAMS_2D00_MailApp_2D00_ProjectStructure_5F00_63828C4F.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="OfficeAMS-MailApp-ProjectStructure" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/1563.OfficeAMS-MailApp-ProjectStructure_thumb_29FF7C58.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/1563.OfficeAMS_2D00_MailApp_2D00_ProjectStructure_5F00_thumb_5F00_29FF7C58.png" alt="OfficeAMS-MailApp-ProjectStructure" width="246" height="260" border="0" /></a></p>
<p>When you double-click the app <strong>Core.YouTubeApp</strong>, you will be presented with the deployment properties interface. It has tabs for:</p>
<ul>
<li><strong>General</strong> &ndash; Details about the app</li>
<li><strong>Read Form</strong> &ndash; What scenarios cause the app to become available when the reading pane is visible</li>
<li><strong>Compose Form</strong> &ndash; What scenarios cause the app to become available when the compose pane is visible</li>
<li><strong>App Domains</strong> &ndash; What site URLs are available to be opened from your app when making cross-domain calls</li>
</ul>
<p>The AppManifest.xml file describes the app to the Office client application. You can modify the same features available in the tabbed experience in XML directly. The XML for the YouTube app is as follows:</p>
<div id="codeSnippetWrapper" style="overflow: auto; cursor: text; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 400px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;">
<div id="codeSnippet" style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">OfficeApp</span> <span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="https://schemas.microsoft.com/office/appforoffice/1.0"</span> <span style="color: #ff0000;">xmlns:xsi</span><span style="color: #0000ff;">="https://www.w3.org/2001/XMLSchema-instance"</span> <span style="color: #ff0000;">xsi:type</span><span style="color: #0000ff;">="MailApp"</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Id</span><span style="color: #0000ff;">&gt;</span>e1c173ce-6df8-479e-86c1-59fa33774441<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Id</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Version</span><span style="color: #0000ff;">&gt;</span>1.0.0.0<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Version</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ProviderName</span><span style="color: #0000ff;">&gt;</span>Contoso<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ProviderName</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">DefaultLocale</span><span style="color: #0000ff;">&gt;</span>en-US<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">DefaultLocale</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">DisplayName</span> <span style="color: #ff0000;">DefaultValue</span><span style="color: #0000ff;">="YouTube"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Description</span> <span style="color: #ff0000;">DefaultValue</span><span style="color: #0000ff;">="YouTube video player"</span><span style="color: #0000ff;">/&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Capabilities</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Capability</span> <span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="Mailbox"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Capabilities</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">DesktopSettings</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">SourceLocation</span> <span style="color: #ff0000;">DefaultValue</span><span style="color: #0000ff;">="~remoteAppUrl/AppRead/YouTube/YouTube.html"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">RequestedHeight</span><span style="color: #0000ff;">&gt;</span>350<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">RequestedHeight</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">DesktopSettings</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Permissions</span><span style="color: #0000ff;">&gt;</span>ReadItem<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Permissions</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Rule</span> <span style="color: #ff0000;">xsi:type</span><span style="color: #0000ff;">="RuleCollection"</span> <span style="color: #ff0000;">Mode</span><span style="color: #0000ff;">="Or"</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Rule</span> <span style="color: #ff0000;">xsi:type</span><span style="color: #0000ff;">="ItemIs"</span> <span style="color: #ff0000;">ItemType</span><span style="color: #0000ff;">="Message"</span><span style="color: #0000ff;">/&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Rule</span> <span style="color: #ff0000;">xsi:type</span><span style="color: #0000ff;">="ItemHasKnownEntity"</span> <span style="color: #ff0000;">EntityType</span><span style="color: #0000ff;">="Url"</span> <span style="color: #ff0000;">IgnoreCase</span><span style="color: #0000ff;">="true"</span> <span style="color: #ff0000;">FilterName</span><span style="color: #0000ff;">="YouTubeVideos"</span> <span style="color: #ff0000;">RegExFilter</span><span style="color: #0000ff;">="youtube\.com\/watch"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Rule</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;">  <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">DisableEntityHighlighting</span><span style="color: #0000ff;">&gt;</span>false<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">DisableEntityHighlighting</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF-->
<pre style="overflow: visible; font-size: 8pt; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: white; border-style: none; padding: 0px;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">OfficeApp</span><span style="color: #0000ff;">&gt;</span></pre>
<!--CRLF--></div>
</div>
<h3>General Tab</h3>
<p>The general tab has basic settings for your app. You can set the Display Name (which appears on the apps tab in the Reading Pane), set the version, list the provider, provide a description and icon, and you can set permissions. You can see it in the image below.</p>
<p>In the Office AMS sample, we&rsquo;re only going to be reading the email and not modifying the email or modifying the user&rsquo;s mailbox in any manner. <a href="https://msdn.microsoft.com/library/fp161087.aspx" target="_blank">Read more about permissions here.</a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/2110.image_137CA6C0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/2110.image_5F00_137CA6C0.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/5165.image_thumb_759E22BE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/5165.image_5F00_thumb_5F00_759E22BE.png" alt="image" width="546" height="484" border="0" /></a></p>
<h3>Read Form Tab</h3>
<p>The Read Form tab specifies what items cause the app to be activated. It allows you to create rules based on regular expressions which may or may not already exist. Any or All of the scenarios must match (depending on the top-level rule) in order for the app to be activated. The Office API will automatically detect all URLs, email addresses, phone numbers and some other items, but you can further filter these with your own regular expressions.</p>
<p>In the YouTube scenario, we&rsquo;re looking for the presence of a <strong>youtube.com/watch</strong> address. If this regular expression matches in the message or subject, the app will appear in the Reading Pane in Outlook or Outlook Web Access. Note that the Filter name has been set. This enables us to find the items by name during runtime.</p>
<p>The <strong>Source Location</strong> points to the web address your app will point to once the app is activated.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/0842.OfficeAMS-MailApps-ReadForm_6F0B4317.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/0842.OfficeAMS_2D00_MailApps_2D00_ReadForm_5F00_6F0B4317.jpg"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="OfficeAMS-MailApps-ReadForm" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/6811.OfficeAMS-MailApps-ReadForm_thumb_37C4BBDC.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/6811.OfficeAMS_2D00_MailApps_2D00_ReadForm_5F00_thumb_5F00_37C4BBDC.jpg" alt="OfficeAMS-MailApps-ReadForm" width="544" height="425" border="0" /></a></p>
<p>The only drawbacks with the filters, right now, manifest themselves when using the <strong>Item is appointment</strong> filter. If you are trying to use the location as a filter (maybe trying to find a PIN code for teleconference calls, you may have issues. Forwarded meeting invites do not appear as appointments, they are considered a &ldquo;message&rdquo;, so you may not see your app activated with just &ldquo;appointment&rdquo;. It&rsquo;s worth experimenting with, though.</p>
<h2>The Web Application</h2>
<p>The YouTube application is very simple. The web site hosts a basic HTML page with no server-side code. We could easily implement server-side code here to perform operations such as OAuth authorizations, dynamic views of content, or event write a data entry application; however, in this simple example we will find all of the YouTube entries in the email message and put them into a nice viewing window in Outlook.</p>
<p>The web application has a folder already configured with an AppRead folder for the Read Form view. There is nothing special with the name, just ensure that the name matches what is in the AppManifest when it is published and consumed by your Outlook client in the Source Location attribute (currently ~remoteAppUrl/AppRead/YouTube/YouTube.html):</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/8372.image_419532F0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/8372.image_5F00_419532F0.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/64/30/metablogapi/0044.image_thumb_15E468F4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-64-30-metablogapi/0044.image_5F00_thumb_5F00_15E468F4.png" alt="image" width="183" height="150" border="0" /></a></p>
<h2>Script Me Some YouTube Videos!</h2>
<p>The <strong>YouTube.js </strong>script is very simple.</p>
<ol>
<li>Get the item from the <strong>Office.context.mailbox.item</strong> object hierarchy.</li>
<li>Call <strong>item.getFilteredEntitiesByName("YouTubeVideos")</strong> which will provide all the entities that are picked up by the interface. In the sample, I wrote the code to point to the item.getEntities() because there is a separate regular expression filter on the URL, anyways. The separate regular expression is to find the ID of the YouTube video for use in the youtube.com/embed url which is used to display the video.</li>
<li>Provide the video ID to individual tabs for use when the tab is clicked.</li>
<li>Upon click, set the event to replace the contents of the video frame with the embedded player path for <strong>YouTube</strong> and provide a link to the video.</li>
</ol>
<h2>Deployment</h2>
<p>The deployment is a very simple process as well.</p>
<ol>
<li>Deploy the app to a web host. This could be your own web host running on an Apache server or Windows server. Or, Windows Azure can be your web host (remember that you get 10 web sites for free).</li>
<li>Find a location to host the AppManifest.xml file. Upon building the project, I copy the Core.YouTubeApp.xml to a folder within the web site called Apps and set the ~remoteAppUrl to whatever the actual site URL is. This is actually done by a file called <strong>UpdateAppUrl.ps1</strong> stored in the Core.MailApps directory and is run from the Mail App project. You can update the UpdateAppUrl.ps1 file with your actual domain address.</li>
<li>If your administrator allows it, from within the Outlook Web Access site you can add the app directly as a trusted app by pointing directly to the appmanifest URL.</li>
<li>You can also submit this app as an Office store app.</li>
</ol>
<p>There you have it, a simple YouTube app. Now, I want to see one in the store and one for Channel 9.</p>]]></content:encoded>
    </item>
    <item>
      <title>How-to Get and Install SharePoint 2010 Language Packs</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/how-to-get-and-install-sharepoint-2010-language-packs</link>
      <pubDate>Tue, 06 Mar 2012 11:36:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2012/03/06/how-to-get-and-install-sharepoint-2010-language-packs/</guid>
      <description><![CDATA[Many organizations I've worked with are trying to ensure multilingual support in their SharePoint...]]></description>
      <content:encoded><![CDATA[<p>Many organizations I've worked with are trying to ensure multilingual support in their SharePoint enterprise instances. What's funny is the language packs download process doesn't entirely make sense. In most cases, downloaders go to the language pack download page and&nbsp;get the English (or browser preferred language) and think that includes all the language packs.</p>
<p>It doesn't.</p>
<h2>How do I get the language packs?</h2>
<p>To get the language packs, go to the respective language pack page:</p>
<ul>
<li><a href="https://www.microsoft.com/download/en/details.aspx?id=4731">SharePoint Foundation 2010 Language Pack</a></li>
<li><a href="https://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=3411">Language Pack for SharePoint Server 2010, Project Server 2010, Office Web Apps 2010 bundle</a> (note that this includes SharePoint Foundation 2010)</li>
</ul>
<p>After reaching this page, change the dropdown that says <strong>Change Language</strong> from <strong>English </strong>(or your browser default language) to the language that you want and it will navigate you to the other language page so you can download the language pack for your target language. You will simply click the download button (it will be translated into the target language).</p>
<p>The files from all the language packs are named <strong>SharePointLanguagePack.exe</strong> (Foundation) and <strong>ServerLanguagePack.exe </strong>(Server), so I would suggest that you rename the file to include the language global name (e.g. ServerLanguagePack_de-de.exe).</p>
<h2>How do I get Service Packs?</h2>
<p>Language Packs do have service packs. Unfortunately, there is a glitch with the naming in Microsoft Download in which the title of the SharePoint Server language pack is improperly named. The process for selecting the language is the same as before, but each file is named with both the KB article identifier as well as the language that it is updating (e.g. serverlanguagepack2010sp1-kb2460056-x64-fullfile-de-de.exe).</p>
<p>The locations for SharePoint language pack service pack 1 downloads are:</p>
<ul>
<li><a href="https://www.microsoft.com/download/en/details.aspx?id=26629">Service Pack 1 for SharePoint Foundation 2010 Language Pack (KB2460059)</a></li>
<li><a href="https://www.microsoft.com/download/en/details.aspx?id=26621">Service Pack 1 for Server Language Pack 2010 (KB2460056)</a> (note that this is the SharePoint Server language pack update which includes the SharePoint Foundation 2010 Language Pack update)</li>
</ul>
<p>If you have to install a lot of language packs, it is easier to download, extract and slipstream them all in advance, then run through each install and finally finish it all with a SharePoint Configuration Wizard PSConfigUI.exe (or you can use psconfig.exe -cmd upgrade -inplace v2v).</p>
<p>To slipstream the installs you'll need to extract the core language file:</p>
<pre><code class="cplusplus">ServerLanguagePack_de-de.exe /extract:&lt;extract-location&gt;</code></pre>
<p>Then you'll need to extract the update to the language <strong>Updates</strong> folder:</p>
<pre><code class="cplusplus">serverlanguagepack2010sp1-kb2460056-x64-fullfile-de-de.exe<br /> /extract:&lt;extract-location&gt;\Updates</code></pre>
<p>When you run the base install of the language pack, it will install the language with all updates in place.</p>
<h2>What about Cumulative Updates (CUs)?</h2>
<p>Cumulative Updates are different from service packs because they contain all the language pack updates in the entire package. Note that instead of the CUs being created with a language noted in the file name (i.e. EN, DE, FR), they have the letters GLB for GLoBal in the file name. This means that when you update your servers, your language packs will get upgraded as well.</p>
<p>Enjoy!</p>]]></content:encoded>
    </item>
    <item>
      <title>Create a Setup Project for a 64-bit Windows Service in Visual Studio 2010</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/create-a-setup-project-for-a-64-bit-windows-service-in-visual-studio-2010</link>
      <pubDate>Thu, 03 Nov 2011 10:14:44 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2011/11/03/create-a-setup-project-for-a-64-bit-windows-service-in-visual-studio-2010/</guid>
      <description><![CDATA[I was having a lot of trouble with this, so I'm going to share it. Visual Studio 2010 setup projects...]]></description>
      <content:encoded><![CDATA[<p>I was having a lot of trouble with this, so I'm going to share it. Visual Studio 2010 setup projects still do not fix the way you create a setup project. The problem is that Visual Studio doesn't add the x64 version of InstallUtilLib.dll to the MSI and so you will receive a BadFormatException error message and the installer will crash and burn.</p>
<p>The workaround is explained here:</p>
<p><a href="https://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx">https://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Must-read articles on string comparison performance</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/must-read-articles-on-string-comparison-performance</link>
      <pubDate>Wed, 26 May 2010 07:25:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2010/05/26/must-read-articles-on-string-comparison-performance/</guid>
      <description><![CDATA[I've always wondered which is the fastest technique to do a string comparison? using the...]]></description>
      <content:encoded><![CDATA[<p>I've always wondered which is the fastest technique to do a string comparison? using the StringComparison enums or ToUpper and ToLower? The following entry also answers what is fastest among the StringComparison enums.</p>
<p><a href="https://blogs.msdn.com/b/noahc/archive/2007/06/29/string-equals-performance-comparison.aspx">https://blogs.msdn.com/b/noahc/archive/2007/06/29/string-equals-performance-comparison.aspx</a></p>
<p>This article has more detail on do's and don'ts for stringcomparisons:</p>
<p><a href="https://msdn.microsoft.com/en-us/library/ms973919.aspx">https://msdn.microsoft.com/en-us/library/ms973919.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Cannot use Visual Studio Unit Tests to test against a live SharePoint 2007 site if on a 64-bit machine</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/cannot-use-visual-studio-unit-tests-to-test-against-a-live-sharepoint-2007-site-if-on-a-64-bit-machine</link>
      <pubDate>Fri, 16 Apr 2010 09:12:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2010/04/16/cannot-use-visual-studio-unit-tests-to-test-against-a-live-sharepoint-2007-site-if-on-a-64-bit-machine/</guid>
      <description><![CDATA[I scoured Bing (and Google) to find out why my Visual Studio unit tests will not allow me to test my...]]></description>
      <content:encoded><![CDATA[<p>I scoured Bing (and Google) to find out why my Visual Studio unit tests will not allow me to test my SharePoint code failing with the message:</p><p class="code"><code>Initialization method Contoso.Test.BreakingNewsTest threw exception.<br>System.IO.FileNotFoundException: System.IO.FileNotFoundException:<br>The Web application at https://intranet.contoso.com/ could not be found. Verify that you have typed the URL correctly. If the URL should be serving existing content, the system administrator may need to add a new request URL mapping to the intended application.</code></p><p>I finally asked a colleague of mine (Jeremy Jameson) how he resolved it. Thankfully, he's already created an excellent post on it here: <a mce_href="https://blogs.msdn.com/jjameson/archive/2009/10/08/web-application-at-could-not-be-found-error-on-moss-2007-x64.aspx" href="https://blogs.msdn.com/jjameson/archive/2009/10/08/web-application-at-could-not-be-found-error-on-moss-2007-x64.aspx">https://blogs.msdn.com/jjameson/archive/2009/10/08/web-application-at-could-not-be-found-error-on-moss-2007-x64.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Needed to replace full hard drive with larger one - Backup/Restore</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/needed-to-replace-full-hard-drive-with-larger-one-backuprestore</link>
      <pubDate>Mon, 12 Apr 2010 08:01:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2010/04/12/needed-to-replace-full-hard-drive-with-larger-one-backuprestore/</guid>
      <description><![CDATA[So, I had the exact same problem as Tim Heuer (New hard drive means re-install everything). 150GB...]]></description>
      <content:encoded><![CDATA[<DIV>So, I had the exact same problem as Tim Heuer (<A href="https://timheuer.com/blog/archive/2010/03/30/repaving-my-machine-my-baseline-dev-workstation-tools.aspx" mce_href="https://timheuer.com/blog/archive/2010/03/30/repaving-my-machine-my-baseline-dev-workstation-tools.aspx">New hard drive means re-install everything</A>). 150GB drive and bought a nice 320GB 7200RPM with shock protection. I found the easiest way to get myself up and running was to use Win7's backup/restore feature. I backed up my drive to my home server (which creates a WIM, FWIW) and restored my new drive from my home server booting with Win7 PXE boot and restore. It took a while to backup and restore all of that, but it all worked out ok.</DIV>
<DIV><BR></DIV>
<DIV>The gotchas...</DIV>
<DIV>I had bitlocker enabled (per company policy) and that obviously did not help with my disk partitioning because the 300MB partition was in the middle of my disk, so I couldn't just expand the disk partition for C:\. I had to disable and remove bitlocker and delete the partition. I also had to use BCDBOOT and point it to C:\Windows so it would automatically create my new boot config on C (since I purged it on the secondary drive)--if you fail to remember this part, you can do it using the PXE boot command prompt. I created another partition&nbsp;(for my boot to VHD drives) and re-enabled bitlocker. Then, reboot to validate everything went okay</DIV>]]></content:encoded>
    </item>
    <item>
      <title>New years resolution...get back into writing</title>
      <link>https://docs.microsoft.com/archive/blogs/sumanc/new-years-resolution-get-back-into-writing</link>
      <pubDate>Tue, 05 Jan 2010 05:31:00 GMT</pubDate>
      <dc:creator><![CDATA[Suman Chakrabarti]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sumanc/2010/01/05/new-years-resolution-get-back-into-writing/</guid>
      <description><![CDATA[With all the microblogging I do, I've found myself writing less informative blogs. I started a...]]></description>
      <content:encoded><![CDATA[<p>With all the microblogging I do, I've found myself writing less informative blogs. I started a series for SharePoint How-tos then got very bored with that. Lately, I've been working on learning more about MVC and cloud computing; both of which perplex me. These aren't difficult technologies, but they do take experience to pick up. I feel like I'm going backwards in development when I use the Html.* helper class and write &lt;% %&gt; tags in the asp.net form (I left legacy ASP and never, ever want to go back!!!). Unfortunately, MVC is here to stay and so that makes it a legitimate obstacle for me to surmount.</p><p>Additionally, my hobby as a photographer has taken over more of my life than coding for fun. I enjoy it more than deciphering the latest Silverlight release, fiddling with SharePoint 2010 or tinkering with ASP.NET 4. I can't do it all, I guess...</p><p>My commitment is to begin writing again, although, I'm not committing myself to more than 12 entries this year (or one per month). With the betas of SharePoint 2010 and eventual release, I'm sure I'll have some ideas to blog more frequently.</p><p>Cheers and welcome 2010!&nbsp;</p>]]></content:encoded>
    </item>
  </channel>
</rss>