<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.claritycon.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">rpowers WebLog</title><subtitle type="html">Musings on Agile Development and Visual Studio ALM Tools</subtitle><id>http://blogs.claritycon.com/blogs/ryan_powers/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.claritycon.com/blogs/ryan_powers/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2007-06-11T23:48:00Z</updated><entry><title>tfs 2010 RC Agile Process template update – New Task progress report</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2010/03/12/tfs-2010-rc-agile-process-template-update-new-task-progress-report.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2010/03/12/tfs-2010-rc-agile-process-template-update-new-task-progress-report.aspx</id><published>2010-03-12T19:49:34Z</published><updated>2010-03-12T19:49:34Z</updated><content type="html">&lt;p&gt;Maybe my next post will just be about why I am so excited and impressed with the out of the box templates.&amp;#160; But, for this first blog with my new focus, I thought I would just walk through the process I went through to create a task progress report (to enhance the out of the box Agile template).&lt;/p&gt;  &lt;p&gt;So, I started with the MSF for Agile Development 5.0 RC template.&amp;#160; After reviewing the template, I came away pretty excited about many of the new reports.&amp;#160; I am especially excited about the reporting services reports.&amp;#160; The big advantage I see here is that these are querying the Warehouse directly instead of the Analysis Services Cube which means that they are much closer to real-time which I find very important for reports like Burndown and task status.&amp;#160; One report that I focused on right away was the User Story Progress Report.&amp;#160; An overview is shown below:&lt;/p&gt;  &lt;p&gt;&lt;img alt="Example Stories Progress Report" src="http://i.msdn.microsoft.com/Dd380641.ProcGuid_RepStoriesProgress(en-us,VS.100).png" width="409" height="253" /&gt;&lt;/p&gt;  &lt;p&gt;This report is very useful, but a lot of our internal managers really prefer to manage at the task level and either don’t have stories in TFS or would like to view this type of report for tasks in addition to the User Stories.&amp;#160; So, what did I do?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 1: Download the Agile Template&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In VS 2010 RC, open Process Template Manager from Team-&amp;gt;Team Project Collection Settings.&amp;#160; Download the MSF for Agile Development template to your local file system.&amp;#160; A project template is a folder of xml files.&amp;#160; There is a ProcessTemplate.xml in the root and then a bunch of directories for things like Work Item Definitions and Queries, Reports, Shared Documents and Source Control Settings.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.claritycon.com/blogs/ryan_powers/image_02CB5D1A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.claritycon.com/blogs/ryan_powers/image_thumb_4295439F.png" width="400" height="281" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 2: Copy the folder &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;My plan here is to make a new template with all of my modifications.&amp;#160; You can also just enhance update the MSF template.&amp;#160; However, I think it is cleaner when you start making modifications to make your own template.&amp;#160; So, copy the folder and name it with your new template name.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 3: Change Template Name&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Open ProcessTemplate.xml and change the &amp;lt;name&amp;gt; of the template.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 4: Copy the rdl of the Report you want to use a starting point&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In my case, I copied Stories Progress.rdl and named the file Task Progress Breakdown.rdl.&amp;#160; I reviewed the requirements for the new report with some of the users here and came up with this plan.&amp;#160; Should show tasks and be expandable to show subtasks.&amp;#160; Should add Assigned To and Estimated Finish Date as 2 extra columns.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 5: Walkthrough the existing report to understand how it works&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The main thing that I do here is try to get the sql to run in SQL Management Studio.&amp;#160; So, I can walkthrough the process of building up the data for the report. &lt;/p&gt;  &lt;p&gt;After analyzing this particular report I found a couple of very useful things.&amp;#160; One, this report is already built to display subtasks if I just flip the IncludeTasks flag to 1.&amp;#160; So, if you are using Stories and have tasks assigned to each story.&amp;#160; This might give you everything you want.&amp;#160; &lt;/p&gt;  &lt;p&gt;For my purposes, I did make that change to the Stories Progress report as I find it to be a more useful report to be able to see the tasks that comprise each story.&amp;#160; But, I still wanted a task only version with the additional fields.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 6: Update the report definition&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I tend to work on rdl in visual studio directly as xml.&amp;#160; Especially when I am just altering an existing report, I find it easier than trying to deal with the BI Studio designer.&amp;#160; For my report I made the following changes.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Updated Fields      &lt;ul&gt;       &lt;li&gt;Removed Stack Rank and Replaced with Priority since we don’t use Stack Rank &lt;/li&gt;        &lt;li&gt;Added FinishDate and AssignedTo &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Changed the root deliverable SQL to pull @tasks instead of @deliverablecategory and added a join CurrentWorkItemView for FinishDate and Assigned to &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;cwi.[System_Id]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;ID&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;[CurrentWorkItemView]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;cwi&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;cwi.[System_WorkItemType]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;IN&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(@Task)&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;AND&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;cwi.[ProjectNodeGUID]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@ProjectGuid&lt;/font&gt; &lt;/div&gt;    &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/div&gt;    &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;lh.SourceWorkItemID&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;ID&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;FactWorkItemLinkHistory&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;lh&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;INNER&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;JOIN&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;[CurrentWorkItemView]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;cwi&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;ON&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;lh.TargetWorkItemID&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;cwi.[System_Id]&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;WHERE&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;lh.WorkItemLinkTypeSK&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@ParentWorkItemLinkTypeSK&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;AND&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;lh.RemovedDate&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;CONVERT&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;DATETIME&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;9999&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;126&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;AND&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;lh.TeamProjectCollectionSK&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@TeamProjectCollectionSK&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;AND&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;cwi.[System_WorkItemType]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;NOT&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;IN&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(@DeliverableCategory)&lt;/font&gt; &lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Added AssignedTo and FinishDate columns to the @Rollups table &lt;/li&gt;    &lt;li&gt;Added two columns to the table used for column headers &lt;/li&gt; &lt;/ul&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Tablix&lt;/font&gt;&lt;font color="#ff0000"&gt; Name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;ProgressTable&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;TablixBody&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumns&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;2.7625in&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;0.5125in&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;3.4625in&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;0.7625in&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;Width&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;      &lt;br /&gt;&lt;/font&gt;&lt;font color="#008000"&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;TablixColumn&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;lt;Width&amp;gt;1.25in&amp;lt;/Width&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;/TablixColumn&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;TablixColumn&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;lt;Width&amp;gt;1.25in&amp;lt;/Width&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumn&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;TablixColumns&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div class="code"&gt;Added Cells for the two new headers&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div class="code"&gt;Added Cells to the data table to include the two new values (Assigned to &amp;amp; Finish Date)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div class="code"&gt;Changed a bunch of widths that would change the format of the report to display landscape and have room for the two additional columns&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div class="code"&gt;Set the Value of the IncludeTasks Parameter to 1&lt;/div&gt;      &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;ReportParameter&lt;/font&gt;&lt;font color="#ff0000"&gt; Name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;IncludeTasks&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;DataType&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;Integer&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;DataType&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;DefaultValue&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Values&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Value&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;=1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;Value&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;Values&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;DefaultValue&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Prompt&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;IncludeTasks&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;Prompt&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Hidden&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;true&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;Hidden&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;ReportParameter&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div class="code"&gt;Change a few descriptions on how the report should be used&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p class="code"&gt;This is the resulting report&lt;/p&gt;  &lt;p class="code"&gt;&lt;a href="http://blogs.claritycon.com/blogs/ryan_powers/image_5B9113E4.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.claritycon.com/blogs/ryan_powers/image_thumb_227A36E2.png" width="639" height="314" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p class="code"&gt;I have attached the final &lt;a href="http://employees.claritycon.com/rpowers/blog/TaskProgressBreakdown.zip"&gt;rdl&lt;/a&gt;. &lt;/p&gt;  &lt;p class="code"&gt;&lt;strong&gt;Step 7: Update ReportTasks.xml&lt;/strong&gt;&lt;/p&gt;  &lt;p class="code"&gt;Last step before the template is ready for use is to update the reportTasks.xml file in the reports folder.&amp;#160; This file defines the reports that are available in the template.&lt;/p&gt;  &lt;div class="code"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;report&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Task Progress Breakdown&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; filename&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Reports\Task Progress Breakdown.rdl&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; folder&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Project Management&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; cacheExpiration&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;30&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;parameters&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;parameter&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;ExplicitProject&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&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;/&lt;/font&gt;&lt;font color="#800000"&gt;parameters&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;datasources&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;reference&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/Tfs2010ReportDS&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; dsname&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;TfsReportDS&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&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;/&lt;/font&gt;&lt;font color="#800000"&gt;datasources&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;report&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 8: Upload the template&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Open the process Template Manager just like Step 1.&amp;#160; And upload the new template.&lt;/p&gt;  &lt;p&gt;That’s it.&amp;#160; One other note, if you want to add this report to existing team project you will have to go into reportmanager (the reporting services portal) and upload the rdl to that projects directory.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=116953" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author></entry><entry><title>Blog Rebranding</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2010/03/12/blog-rebranding.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2010/03/12/blog-rebranding.aspx</id><published>2010-03-12T17:20:51Z</published><updated>2010-03-12T17:20:51Z</updated><content type="html">&lt;p&gt;I have been spending more and more time on learning as much as I can on Agile Development and also have been fairly immersed in rolling out TFS 2010 in our environment.&amp;#160; I feel like it is time to talk about some of my experiences.&amp;#160; With that, I am rebranding my blog to focus on these topics.&amp;#160; I am going to start with a bunch of blogs on the process I have gone through getting TFS 2010 configured for our development teams.&lt;/p&gt;  &lt;p&gt;Last week, Brian Harry was in our office and gave a great talk on the improved tools in TFS 2010 and how Microsoft uses the tools internally.&amp;#160; I followed that up with a high-level overview of the improved out of the box process templates and the process to customize them.&amp;#160; I am definitely very excited about the new features in 2010 and hopefully will keep up my motivation to blog about it.&amp;#160; I am writing my first post right now about the process I went through to build a task progress report based on the user story progress report in the MSF for Agile Development template.&amp;#160; Stay tuned…&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=116950" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author></entry><entry><title>Walkthrough of Smiley.NET the FBML sample packaged with the Facebook Developer Toolkit</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2009/05/22/walkthrough-of-smiley-net-the-fbml-sample-packaged-with-the-facebook-developer-toolkit.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2009/05/22/walkthrough-of-smiley-net-the-fbml-sample-packaged-with-the-facebook-developer-toolkit.aspx</id><published>2009-05-22T16:03:38Z</published><updated>2009-05-22T16:03:38Z</updated><content type="html">&lt;p&gt;Smiley.NET is an FBML facebook application that uses the &lt;a href="http://facebooktoolkit.codeplex.com"&gt;Facebook Developer Toolkit&lt;/a&gt;.&amp;#160; This sample is meant to mimick the Smiley sample produced by Facebook in PHP.&amp;#160; The idea behind this application is to show techniques for integrating your application within the Facebook Platform and also ideas for writing an FBML app in ASP.NET.&amp;#160; Before we walkthrough the code, I thought it would make sense to link to a couple of places that anyone writing a Facebook application should know.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Useful Links&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://developers.facebook.com/"&gt;The platform homepage&lt;/a&gt; – This includes links to various articles, tools and documentation&lt;/p&gt;  &lt;p&gt;&lt;a href="http://wiki.developers.facebook.com/index.php/Anatomy_of_a_Facebook_App"&gt;Anatomy of a Facebook Application&lt;/a&gt; – This walks through the various concepts that explain how an application fits into the facebook platform.&amp;#160; This article actually uses the smiley app as an example for several of the concepts.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devtacular.com/articles/bkonrad/how-to-use-the-facebook-developer-toolkit-20/"&gt;How to write an ASP.NET Facebook Application&lt;/a&gt; – A great walkthrough explaining the basics of using the facebook developer toolkit.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://facebooktoolkit.codeplex.com"&gt;Facebook Developer Toolkit&lt;/a&gt; – Open source project that wraps much of the Facebook platform to make it easier to use from .NET.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://wiki.developers.facebook.com/index.php/API"&gt;Facebook API Doc&lt;/a&gt; – Part of the facebook developer wiki where the various API methods are described.&lt;/p&gt;  &lt;p&gt;Now let’s take a look at the code.&amp;#160; This sample is in the following directory in the codeplex source $/FacebookToolkit/Samples/FBMLCanvasSample.&lt;/p&gt;  &lt;p&gt;The first thing to do is setup your facebook application at &lt;a href="http://www.facebook.com/developers"&gt;the facebook develop application&lt;/a&gt;.&amp;#160; This is where you will name your application and also get an API Key and Secret.&amp;#160; You really can’t do anything without your API Key and Secret.&amp;#160; After getting this setup, you can get Smiley.NET to function.&amp;#160; &lt;/p&gt;  &lt;p&gt;I am going to look at the code first, and second describe the process of setting this application up to run.&amp;#160; So, to start making this application I created a new Web Application.&amp;#160; In this Web application, I added references to facebook.dll and facebook.web.dll from the toolkit.&amp;#160; The facebook assembly has the code that I can use to call the various facebook apis.&amp;#160; facebook.web assembly has some controls and code that I can leverage to make it much easier for my app to live in the facebook platform.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Setup.aspx (Application configuration and Template creation) &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If you plan to have your application integrated with the feed system and the publisher, you will need to learn about how these work.&amp;#160; The links below are great starting points.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://wiki.developers.facebook.com/index.php/Feed" href="http://wiki.developers.facebook.com/index.php/Feed"&gt;http://wiki.developers.facebook.com/index.php/Feed&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://wiki.developers.facebook.com/index.php/New_Design_Publisher" href="http://wiki.developers.facebook.com/index.php/New_Design_Publisher"&gt;http://wiki.developers.facebook.com/index.php/New_Design_Publisher&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now that you have the overview,&amp;#160; You will need to setup up the feed and publisher urls and create your templates.&amp;#160; To do this you can use the tools on the facebook developer site as described in the links below, or you can use the facebook REST api.&amp;#160; For this sample, we constructed a page that needs to be invoked one time after the application is deployed.&amp;#160; The page is config/setup.aspx.&amp;#160; This page has code to set the app properties, and create two feed templates.&amp;#160; After these are created, the web.config is updated with the ids that were generated and then we can start publishing.&lt;/p&gt;  &lt;p&gt;Here is the code used to set the app properties, this is done in place of the edit settings feature at &lt;a href="http://www.facebook.com/developers"&gt;www.facebook.com/developers&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;dict&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;application_name&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;Smiley.NET&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;callback_url&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,callback},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;tab_default_name&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;Smile.NET&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;profile_tab_url&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;mysmiles.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;publish_action&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;Smile at!&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;publish_url&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,callback&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;handlers/otherPublishHandler.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;publish_self_action&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;Smile!&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;publish_self_url&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,callback&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;handlers/publishHandler.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;info_changed_url&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,callback&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;handlers/infoHandler.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;},&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;wide_mode&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;1&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.API.admin.setAppProperties(dict)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;Next we setup 2 feed template bundles.&amp;#160; Each template bundle contains a 1 line version, a short story version and a long version.&amp;#160; An app can have up to 100 templates.&amp;#160; In this case, we have one for what is published to the users feed (via New Smiley functionality) and 1 bundle for when a smile is sent to a friend via Send Smiley functionality.&amp;#160; I have included the code for creating one of the bundles here.&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;one_line_story&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;List&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;{*actor*} is feeling {*mood*} today&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;short_story&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;List&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;feedTemplate&amp;gt;()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;short_story_template&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;feedTemplate&lt;/font&gt;&lt;font color="#808080"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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;#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;/font&gt;&lt;font color="#000000"&gt;TemplateTitle&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;{*actor*} is feeling so {*mood*} today&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&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;#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;/font&gt;&lt;font color="#000000"&gt;TemplateBody&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;{*actor*} just wanted to let you know that he is so {*mood*} today&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&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;#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;/font&gt;&lt;font color="#000000"&gt;PreferredLayout&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;1&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;&amp;#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;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;short_story.Add(short_story_template)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;full_story&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;feedTemplate&lt;/font&gt;&lt;font color="#808080"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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;#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;/font&gt;&lt;font color="#000000"&gt;TemplateTitle&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;{*actor*} is feeling very {*mood*} today&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&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;#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;/font&gt;&lt;font color="#000000"&gt;TemplateBody&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;&amp;lt;div style=\&amp;quot;padding: 10px;width : 200px;height : 200px;margin: auto;text-align: center;border: black 1px;cursor: pointer;border: black solid 2px;background: orange;color: black;text-decoration: none;\&amp;quot;&amp;gt;&amp;lt;div style=\&amp;quot;font-size: 60pt;font-weight: bold;padding: 40px;\&amp;quot;&amp;gt;{*emote*}&amp;lt;/div&amp;gt;&amp;lt;div style=\&amp;quot;font-size: 20px; font-weight:bold;\&amp;quot;&amp;gt;{*mood*}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&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;&amp;#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;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.IsNullOrEmpty(t1))&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;long&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;bundle1id&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.API.feed.registerTemplateBundle(one_line_story,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;short_story,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;full_story)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Masterpage&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now, I create my masterpage.&amp;#160; In this case, I needed to pick between using a masterpage to handle the facebook authentication handshake and a basepage.&amp;#160; The masterpage is a little cleaner in my opinion and really fits exactly how I want this application to work.&amp;#160; In this project the master page is called FBMLMaster.master.&amp;#160; Let’s look at what this contains.&amp;#160; &lt;/p&gt;  &lt;p&gt;It defines some placeholder labels for fbml content I want to write from the codebehind, it also defines the dashboard and tabs that will be the container for my application, lastly it defines a content area where each “page” will display its content.&amp;#160; &lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:label&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; id&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;css&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:label&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; id&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;js&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:label&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; id&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;header&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:dashboard&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:tabs&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:tab-item&lt;/font&gt;&lt;font color="#ff0000"&gt; title&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Public&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160; href&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;default.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; selected&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&amp;lt;%=Convert.ToInt32(selected==&amp;quot;default&amp;quot;) %&amp;gt;&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:tab-item&lt;/font&gt;&lt;font color="#ff0000"&gt; title&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Home&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160; href&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;home.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; selected&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&amp;lt;%=Convert.ToInt32(selected==&amp;quot;home&amp;quot;) %&amp;gt;&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:tab-item&lt;/font&gt;&lt;font color="#ff0000"&gt; title&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;My Smiles&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160; href&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;mysmiles.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; selected&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&amp;lt;%=Convert.ToInt32(selected==&amp;quot;mysmiles&amp;quot;) %&amp;gt;&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:tab-item&lt;/font&gt;&lt;font color="#ff0000"&gt; title&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;New Smiley&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160; href&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;newsmiley.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; selected&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&amp;lt;%=Convert.ToInt32(selected==&amp;quot;newsmiley&amp;quot;) %&amp;gt;&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:tab-item&lt;/font&gt;&lt;font color="#ff0000"&gt; title&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Send Smiley&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160; href&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;sendsmiley.aspx&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; selected&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&amp;lt;%=Convert.ToInt32(selected==&amp;quot;sendsmiley&amp;quot;) %&amp;gt;&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;fb:tabs&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;asp:label&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;font color="#ff0000"&gt; id&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;main_body&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:ContentPlaceHolder&lt;/font&gt;&lt;font color="#ff0000"&gt; ID&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;body&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;asp:ContentPlaceHolder&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;The code-behind for the master page has a couple of critical things going on.&amp;#160; First it derives from facebook.web.CanvasFBMLMasterPage.&amp;#160; This is the base MasterPage that will handle the authentication handshake with facebook.&amp;#160; &lt;/p&gt;  &lt;p&gt;The other 2 things that you will find here are.&amp;#160; 1) the SetSelectedTab function.&amp;#160; This a function that can be called from each “page” such that we can set the selected property in the fb:tabs markup.&amp;#160; 2) Insertion of the CSS and Javascript.&amp;#160; In the load of the master page, I am checking if the current page is being shown in a profile tab or if it is being shown in the application canvas.&amp;#160; When shown in the profile, I need to inject the CSS inline and hide the tabs, when in the canvas, I can just add a link reference that the fbml rendering engine at facebook can handle.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Page_Load(&lt;/font&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;sender,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;EventArgs&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;e)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(!&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.IsNullOrEmpty(Request.Params[&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;fb_sig_in_profile_tab&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;]))&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;header.Visible&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;false;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;css.Text&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;FBMLControlRenderer.RenderFBML(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;~/controls/FBMLCSS.ascx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;css.Text&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.Format(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;&amp;lt;link rel=\&amp;quot;stylesheet\&amp;quot; type=\&amp;quot;text/css\&amp;quot; href=\&amp;quot;{0}css/page.css?id={1}\&amp;quot; /&amp;gt;&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;callback,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;cssVersion)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;js.Text&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;FBMLControlRenderer.RenderFBML(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;~/controls/FBMLJS.ascx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;The one thing you might notice is the call here to FBMLControlRenderer.RenderFBML.&amp;#160; The FBMLControlRenderer is a class defined in facebook.web.&amp;#160; This will just output raw FBML given a particular usercontrol.&amp;#160; I find writing fbml directly in the user control and using this utility as a very clean way to format and write my fbml (much better than trying to piece it together in a code-behind).&amp;#160; If you look at any of the UserControls in the controls directory of the Sample application you will see this in action.&amp;#160;&amp;#160; There is another concept supported by the FBMLControlRenderer which relates to dynamic content.&amp;#160; But, we will look at that with the ProfileBox.ascx.&lt;/p&gt;  &lt;p&gt;Now that we have MasterPage that is linking our CSS and JS and controlling the authentication flow, we now need to implement the pages that are associated with the tab described above.&amp;#160; The first page is Default.aspx.&amp;#160; This page is included to demonstrate one thing, and that is a page that is accessible without logging into facebook.&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Default.aspx (publically available canvas page)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The default page just includes some text within the content placeholder and then sets the RequireLogin property of the login and sets the Selected Tab.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Page_PreInit(&lt;/font&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;sender,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;EventArgs&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;e)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;Master.RequireLogin&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;false;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;Master.SetSelectedTab(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;default&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;A couple of important notes, this page is using the MasterType attribute so that we get a strongly typed instance of the master page in the code-behind without needing to cast.&amp;#160; &lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#000000"&gt;&amp;lt;%@&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;MasterType&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;VirtualPath&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;~/FBMLMaster.Master&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;%&amp;gt;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;The other is that interaction with the master page needs to occur in Page_PreInit.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Home.aspx (Profile box, Application Info Sections and Extended Permissions)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This page demonstrates various things a canvas application can do to integrate with a user’s profile.&amp;#160; The first thing we are doing is in the page_load we are storing a variable on facebook to indicate whether we have setup this user before.&amp;#160; If we have we don’t need to do it again.&amp;#160; The other thing we are doing is creating the info section for this app and the profile box.&amp;#160; This is not a recommended approach, instead you should do this based on user action rather than just at load, but this just shows how to do it in the code-behind.&amp;#160; We will also see how to add a button to your app for accomplishing the same things.&amp;#160; &lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Page_Load(&lt;/font&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;sender,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;EventArgs&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;e)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#006400"&gt;// You need to set info or profile box in order for the buttons on the page to show up.     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;// Don&amp;#39;t set them every time.     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;pref&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.Master.API.data.getUserPreference(&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(pref&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;!&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;set&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.Master.API.profile.setInfo(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;My Smiles&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;5&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;getSampleInfo(),&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.Master.API.uid)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.Master.API.profile.setFBML(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.Master.API.uid,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;getUserProfileBox(),&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.Master.API.data.setUserPreference(&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;set&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;The profile box and info tab section are described in the anatomy of a facebook app.&amp;#160; They are shown below in this context&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Profile Box&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://wiki.developers.facebook.com/images/c/cd/Anatomy_profileBox.png"&gt;&lt;img height="410" alt="Image:Anatomy profileBox.png" src="http://wiki.developers.facebook.com/images/thumb/c/cd/Anatomy_profileBox.png/419px-Anatomy_profileBox.png" width="286" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Info Sections&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="302" src="http://wiki.developers.facebook.com/images/1/12/Anatomy_appInfoSection.png" width="295" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Next will look at the actual content of Home.aspx.&amp;#160; This page demonstrates several more ways to integrate your application.&amp;#160; Here is a view of the page, we will then examine each section (how it is done and what it does)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://employees.claritycon.com/rpowers/Wal.NETtheFBMLsamplepackagedwiththeFaceb_B54D/image.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="421" alt="image" src="http://employees.claritycon.com/rpowers/Wal.NETtheFBMLsamplepackagedwiththeFaceb_B54D/image_thumb.png" width="531" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The first section is a button for adding a profile box (as shown above) for this application.&amp;#160; The fbml for this button is &lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#006400"&gt;&amp;lt;!-- Profile box -&amp;gt;     &lt;br /&gt;Here is an button for adding a box to your profile. This will go away if you add the box:      &lt;br /&gt;&amp;lt;div class=&amp;quot;section_button&amp;quot;&amp;gt;&amp;lt;fb:add-section-button section=&amp;quot;profile&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt; &lt;/font&gt; &lt;/div&gt;  &lt;p&gt;The way that the add-section-button will work for the profile is that facebook will callback to the publisher that you have specified as the &lt;b&gt;Self-Publish Callback URL&lt;/b&gt;.&amp;#160; You need to implement a handler that supports the publisher interface to tell facebook what to display in the profile box.&amp;#160; The publisher interaction is among the most complicated parts of building a facebook application.&amp;#160; I am not going to go into the details here, but we can revisit in a future blog post if people are interested.&amp;#160; In the meantime, there is a pretty good walkthrough out on the wiki.&amp;#160; &lt;a title="http://wiki.developers.facebook.com/index.php/CSharp_InLine_Publisher" href="http://wiki.developers.facebook.com/index.php/CSharp_InLine_Publisher"&gt;http://wiki.developers.facebook.com/index.php/CSharp_InLine_Publisher&lt;/a&gt;.&amp;#160; In this case the Publisher for the profile box is publishHandler.aspx in the handlers folder.&lt;/p&gt;  &lt;p&gt;The next section is the similar to the first.&amp;#160; Except this time it is for an info section and the publisher for this is infoHandler.aspx.&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#006400"&gt;&amp;lt;!-- Info section --&amp;gt;     &lt;br /&gt;Here is an button for adding an info section to your profile. This will go away if you add the section:      &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;font color="#ff0000"&gt; class&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;section_button&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:add-section-button&lt;/font&gt;&lt;font color="#ff0000"&gt; section&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;info&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;The next section demonstrates how to prompt the user for application specific permission.&amp;#160; In the screen above, we see a link to enable email.&amp;#160; This link disappears after the user grants the permission.&amp;#160; The fbml here is:&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#006400"&gt;&amp;lt;!-- Permissions --&amp;gt;     &lt;br /&gt;These are FBML tags that can prompt users for extended permissions from the canvas page.&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;br&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;These will go away if you grant these permissions:&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;br&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:prompt-permission&lt;/font&gt;&lt;font color="#ff0000"&gt; perms&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;email&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;Enable Email&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;fb:prompt-permission&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;br&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fb:prompt-permission&lt;/font&gt;&lt;font color="#ff0000"&gt; perms&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;infinite_session&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;Enable Permanent Login&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;fb:prompt-permission&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;When the user clicks this link, they are prompted to allow the application to send emails, as shown here.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://employees.claritycon.com/rpowers/Wal.NETtheFBMLsamplepackagedwiththeFaceb_B54D/image_3.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="400" alt="image" src="http://employees.claritycon.com/rpowers/Wal.NETtheFBMLsamplepackagedwiththeFaceb_B54D/image_thumb_3.png" width="580" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The last section shows how to have an input form that requests a specific permissions and submits some data.&lt;/p&gt;  &lt;div class="code"&gt;   &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;Upon submitting the form below, you will be prompted to grant email permissions (unless you&amp;#39;ve already done so for this app):&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;form&lt;/font&gt;&lt;font color="#ff0000"&gt; promptpermission&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;email&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;br&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;How often would you like to be notified of new smilies?&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;br&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;input&lt;/font&gt;&lt;font color="#ff0000"&gt; type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;text&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;frequency&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;input&lt;/font&gt;&lt;font color="#ff0000"&gt; type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;submit&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Notify Me&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;form&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;&lt;strong&gt;&lt;font size="4"&gt;MySmiles.aspx (canvas page with dynamic content)&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This page is a simple content page, that formats some fbml to show what we have stored about the user.&amp;#160; This page shows a call to the data store api to get what we have stored.&amp;#160; This application stores all historical smiles in the UserPreference bucket of the datastore api.&amp;#160; There really isn’t anything else going on.&amp;#160; The interesting thing about this page, is that it doubles as the profile tab (if the user adds our app as the profile tab).&amp;#160; It doesn’t even have any code to handle this.&amp;#160; This was all done in the master page, so this page can just function and it will work whether it is in our application canvas or a profile tab.&lt;/p&gt;  &lt;div class="code"&gt;&lt;strong&gt;&lt;font size="4"&gt;NewSmiley.aspx (Feeds and Publisher)&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;  &lt;div class="code"&gt;This page shows how to publish to the user profile using a feed form, also it show a little bit about using FBJS and AJAX.&amp;#160; This page builds a grid of smiley images that when clicked will store your selected smile using the data store and then prompt to publish the selection to your wall.&lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;First is the code used to store the selected Smile.&amp;#160; It is not obvious how this works.&amp;#160; First you must look at the BuildEmoticonGrid function in the BasePage.&amp;#160; This builds the grid and sets the javascript events to call our javascript functions.&amp;#160; In this case, we are using the EmoticonGrid that utilizes the javascript function called final which we will look at shortly.&amp;#160; In other places, this same grid is used without this function.&amp;#160; When we don’t use the function, we are demonstrating used the feed form instead of the javascript showFeedDialog function that is used in the final function.&amp;#160; More on that here, &lt;a title="http://wiki.developers.facebook.com/index.php/Facebook.showFeedDialog" href="http://wiki.developers.facebook.com/index.php/Facebook.showFeedDialog"&gt;http://wiki.developers.facebook.com/index.php/Facebook.showFeedDialog&lt;/a&gt;.&amp;#160; The main difference between the versions of BuildEmoticonGrid are what javascript function is tied to onclick.&amp;#160; In this page, it is final.&amp;#160; &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;BuildEmoticonGrid(&lt;/font&gt;&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moods,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;callback,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;suffix,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;useFinalFunction)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ret&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;ret.Append(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;&amp;lt;div class=\&amp;quot;table\&amp;quot;&amp;gt;&amp;lt;div class=\&amp;quot;row\&amp;quot;&amp;gt;&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;i&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;i&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moods.Count&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;i++)&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;js&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.Format(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;final(&amp;#39;{0}&amp;#39;,&amp;#39;{1}&amp;#39;,&amp;#39;{2}&amp;#39;,&amp;#39;{3}&amp;#39;,&amp;#39;{4}&amp;#39;,&amp;#39;{5}&amp;#39;,&amp;#39;{6}&amp;#39;)&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;FeedTemplate1,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;callback&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;images&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;http://apps.facebook.com/&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;suffix,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;callback,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moods.ElementAt(i).Key,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moods.ElementAt(i).Value,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;i)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(!useFinalFunction)&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;js&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.Format(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;select(&amp;#39;{0}&amp;#39;,&amp;#39;{1}&amp;#39;,&amp;#39;{2}&amp;#39;)&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moods.ElementAt(i).Key,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moods.ElementAt(i).Value,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;i)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(i&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;i&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;%&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;3&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;ret.Append(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;div class=\&amp;quot;row\&amp;quot;&amp;gt;&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;ret.Append(&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.Format(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;&amp;lt;div onclick=\&amp;quot;{0}\&amp;quot; onmouseover=\&amp;quot;over(&amp;#39;{3}&amp;#39;)\&amp;quot; onmouseout=\&amp;quot;out(&amp;#39;{3}&amp;#39;)\&amp;quot; class=\&amp;quot;box\&amp;quot; id=\&amp;quot;sm_{3}\&amp;quot;&amp;gt;&amp;lt;div class=\&amp;quot;smiley\&amp;quot;&amp;gt;{2}&amp;lt;/div&amp;gt;&amp;lt;div id=\&amp;quot;smt_{3}\&amp;quot; class=\&amp;quot;title\&amp;quot;&amp;gt;{1}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;js,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moods.ElementAt(i).Key,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moods.ElementAt(i).Value,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;i))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;ret.Append(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ret.ToString()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;Examining this code, the real key is that the js variable is assigned to the onclick property of each image.&amp;#160; Now, let’s look at the javascript.&amp;#160; If you remember in the master page, the javascript is injected into the FBML from FBMLJS.ascx.&amp;#160; Looking in this usercontrol, we find where the action is happening.&lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;final&lt;/font&gt;&lt;font color="#000000"&gt;(template_id,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;image_src,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;base,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;callback,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;title,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;emote,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;id)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;select(title,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;emote,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;id)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;image&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;image_src&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;/smile&amp;#39; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;id&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;.jpg&amp;quot;&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;template_data&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;mood&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;title,&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;#39;emote&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;emote,&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;#39;mood_src&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;image,&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;#39;images&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;[{&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;href&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;base,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;src&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;image}]&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ajax&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Ajax()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;ajax.responseType&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Ajax.RAW&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;ajax.post(callback+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#39;handlers/jsFeed.aspx&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#39;picked&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;:id})&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;Facebook.showFeedDialog(template_id,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;template_data,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;[],&lt;/font&gt;&lt;font color="#808080"&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;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#0000ff"&gt;document&lt;/font&gt;&lt;font color="#000000"&gt;.setLocation(base&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;/mysmiles.aspx&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#000000"&gt;})&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;There are two things going on.&amp;#160; First is an ajax call that is used to store the selected smile in the user’s data store.&amp;#160; This is done with a callback to jsFeed.aspx.&amp;#160; This class takes in the selected index and updated the user’s data store.&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Page_Load(&lt;/font&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;sender,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;EventArgs&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;e)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(!&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.IsNullOrEmpty(Request.Params[&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;picked&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;]))&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;picked&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#000000"&gt;.Parse(Request.Params[&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;picked&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;])&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;moodList&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;JSONHelper.ConvertFromJSONArray(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.API.data.getUserPreference(&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;moodList.Insert(&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;picked.ToString())&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.API.data.setUserPreference(&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;JSONHelper.ConvertToJSONArray(moodList))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;oldCount&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(!&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.IsNullOrEmpty(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.API.data.getUserPreference(&lt;/font&gt;&lt;font color="#800000"&gt;2&lt;/font&gt;&lt;font color="#000000"&gt;)))&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;oldCount&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#000000"&gt;.Parse(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.API.data.getUserPreference(&lt;/font&gt;&lt;font color="#800000"&gt;2&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.API.data.setUserPreference(&lt;/font&gt;&lt;font color="#800000"&gt;2&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(oldCount&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;).ToString())&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;After this is done, the final function used some FBJS to pop a publisher dialog to allow the user to publish data.&amp;#160; This is using passed in template id and the Facebook.showFeedDialog javascription function.&amp;#160; We pass mysmiles as the return page after the publisher dialog is complete.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;SendSmiley.aspx (Multifeed Story Form)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This page is a demostration of how to publish stories to the wall of one of the user’s friends.&amp;#160; This will use the other publisher that you have specified in your application properties.&amp;#160; In this case, our other publisher (that handles publishing to friend’s walls is in multiFeedHandler.aspx).&amp;#160; To learn more about the multi feed form, read the following wiki page, &lt;a title="http://wiki.developers.facebook.com/index.php/MultiFeedStory_form" href="http://wiki.developers.facebook.com/index.php/MultiFeedStory_form"&gt;http://wiki.developers.facebook.com/index.php/MultiFeedStory_form&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In this case, the send smiley page is very simple.&amp;#160; Set the action of the multifeed form to the multiFeedHandler and display the Emoticon grid that is not using the final javascript function.&amp;#160; In this case, the onclick of the image will just set the style to show which is clicked, and the multi feed form will submit it to the selected friends.&amp;#160; &lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Page_Load(&lt;/font&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;sender,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;EventArgs&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;e)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;multiFeedHandler&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.Format(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;{0}handlers/multiFeedHandler.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Master.callback)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&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; &lt;/font&gt;&lt;font color="#000000"&gt;grid.Text&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;BuildEmoticonGrid(getOtherMoods(),&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Master.callback,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Master.suffix,&lt;/font&gt;&lt;font color="#0000ff"&gt;false&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;The only other thing to note, is that a multi friend selector is included in this page to allow the user to select the friends they want to target the smiley.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;lt;fb:multi-friend-input /&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://employees.claritycon.com/rpowers/Wal.NETtheFBMLsamplepackagedwiththeFaceb_B54D/image_4.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="285" alt="image" src="http://employees.claritycon.com/rpowers/Wal.NETtheFBMLsamplepackagedwiththeFaceb_B54D/image_thumb_4.png" width="442" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Conclusion&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Creating an fbml application that really leverages all of the avenues of integration with facebook is not trivial.&amp;#160; Hopefully, this sample application and the source code avaiable at &lt;a href="http://facebooktoolkit.codeplex.com"&gt;codeplex&lt;/a&gt; will help people overcome the learning curve.&amp;#160; I am going to do my best to support the toolkit better and provide some more articles in the upcoming weeks.&amp;#160; In the next article, I want to examine leveraging facebook connect with the toolkit.&amp;#160; I imagine that it will lead to some updates to the toolkit.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=76172" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author></entry><entry><title>Facebook Developer Toolkit Explained at CNUG</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/11/19/3505.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/11/19/3505.aspx</id><published>2007-11-20T04:33:27Z</published><updated>2007-11-20T04:33:27Z</updated><content type="html">&lt;p&gt;I just finished presenting to the Chicago .NET User Group on Facebook Development using the Microsoft stack.&amp;nbsp; I focused primarily on the Facebook Developer Toolkit for obvious reasons (it is just what I know).&amp;nbsp; The session covered an overview of the Facebook API and the Facebook Platform.&amp;nbsp; We then talked in depth about using the Facebook Developer Toolkit to leverage the Facebook API and to write Canvas pages hosted within the Facebook Platform.&amp;nbsp; Thanks to my colleague Jonathan Schuster who did the code demos and saved me a bunch of prep time.&amp;nbsp; I was also able to demo leveraging Silverlight 1.1 on a Facebook IFrame Canvas page.&lt;/p&gt; &lt;p&gt;This is part of the deck where I described an overview of the Facebook Platform.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;a href="http://employees.claritycon.com/rpowers/FacebookDeveloperToolkitatCNUG_11D17/image.png"&gt;&lt;img height="228" alt="image" src="http://employees.claritycon.com/rpowers/FacebookDeveloperToolkitatCNUG_11D17/image_thumb.png" width="397" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;If you are new to the Facebook Platform, I'd recommend the recording we made of the session (linked at the end of this post) or check out the interview we did on Thirsty Developer&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;The turn out was good.&amp;nbsp; I think we had 40+ people and most were new to Facebook development.&amp;nbsp; It was fun to introduce this platform to a new group of .net developers.&amp;nbsp; If you are interested in the presentation, the slides, demos and a video of the presentation can be accessed at &lt;a href="http://www.claritycon.com/claritytv/clarityTvWatch.aspx?id=14"&gt;clarityTV&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3505" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author></entry><entry><title>Facebook Developer Toolkit Version 1.3 Released</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/11/19/3504.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/11/19/3504.aspx</id><published>2007-11-20T04:32:17Z</published><updated>2007-11-20T04:32:17Z</updated><content type="html">&lt;p&gt;My thanks go out to my colleague Jonathan Schuster, who took over support of the &lt;a href="http://www.codeplex.com/FacebookToolkit"&gt;Facebook Developer Toolkit&lt;/a&gt; for the past few weeks.&amp;nbsp; He was able to push his way through a bunch of enhancements and bug fixes that the users have been waiting very patiently for.&amp;nbsp; &lt;/p&gt; &lt;p&gt;This release marks a good milestone for the Toolkit as the majority of known issues with the support of Canvas applications are solved.&amp;nbsp; In my opinion, the canvas support is now very solid and will really ease the learning curve for new developers who want to leverage the toolkit.&lt;/p&gt; &lt;p&gt;One of the big features of Release 1.3 is support for the compact framework.&amp;nbsp; Many thanks to Peter Foote who dedicated a bunch of time to work on these features.&amp;nbsp; For those of you interested, the release contains the following items.&lt;/p&gt; &lt;p&gt;&lt;a href="http://employees.claritycon.com/rpowers/FacebookDeveloperToolkitVersio.3Released_11B96/image.png"&gt;&lt;img height="492" alt="image" src="http://employees.claritycon.com/rpowers/FacebookDeveloperToolkitVersio.3Released_11B96/image_thumb.png" width="421" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Thanks to all of the people who have kept this project alive as I was pulled away.&amp;nbsp; Pretty cool.&amp;nbsp; We have had close to 500 downloads already.&amp;nbsp; I am hoping to re-engage and help add support for new things that Facebook is releasing.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3504" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author></entry><entry><title>Hosting Vista File Previews in Managed Code</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/26/3245.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/26/3245.aspx</id><published>2007-07-26T21:14:00Z</published><updated>2007-07-26T21:14:00Z</updated><content type="html">&lt;P&gt;As part of my work on the Coding4Fun Developer Kit 2008, I created a WinForm control encapsulating the flow to display file previews.&amp;nbsp; The host is dependent on an improved version of Stephen Toub's framework, originally published &lt;A href="http://msdn.microsoft.com/msdnmag/issues/07/01/PreviewHandlers"&gt;here&lt;/A&gt;.&amp;nbsp; My enhancements were basically to make the COM wrapper classes public so that they can be used by the Managed PreviewHandlers and also by my Preview Handler Host.&amp;nbsp; The source for this project including the updated framework, Stephen's sample preview handlers, my host control and a sample application using the host control are available &lt;A href="http://employees.claritycon.com/rpowers/C4F/PreviewHandlers.zip"&gt;here&lt;/A&gt;.&amp;nbsp; Also, they can be downloaded from the codeplex project for the &lt;A href="http://www.codeplex.com/C4FDevKit"&gt;Coding4Fun Developer Kit 2008&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;A couple of quick notes before I describe how the managed preview handler host works.&amp;nbsp; &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;For any of this to work, the C4F.DevKit.PreviewHandlerFramework.dll needs to be installed in GAC. 
&lt;LI&gt;Also, this host will work with all non-managed preview handlers and any managed preview handlers that were built against the PreviewHandlerFramework mentioned above.&amp;nbsp; Any Managed Preview Handlers that were compiled using Stephen's original framework or another method will not work with this host.&amp;nbsp; &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To host the results generated by any registered file preview handler in managed code, the PreviewHandlerFramework’s COM Wrappers are leveraged. In addition, part of this host needs to look up the preview handler that is currently registered with a particular file extension. To accomplish this, the PreviewHandlerHost leveraged the registry code from Stephen Toub’s Preview Handler Association Editor (&lt;A href="http://blogs.msdn.com/toub/archive/2006/12/14/preview-handler-association-editor.aspx"&gt;http://blogs.msdn.com/toub/archive/2006/12/14/preview-handler-association-editor.aspx&lt;/A&gt;). With the code to find the registered handler in hand, we constructed a control to implement the preview handler Data Flow as shown below (all of this code is part of PreviewHandlerHost project, PreviewHandlerHostControl.cs): 
&lt;UL&gt;
&lt;LI&gt;Declare an object that is the PreviewHandler (this will be cast to different COM Interfaces as needed) 
&lt;LI&gt;Unload any existing previews before generating a new preview 
&lt;UL&gt;
&lt;LI&gt;Call Unload of IPreviewHandler Interface (dDefined in PreviewHandlerFramework as a wrapper to existing COM interface)&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;B&gt;Visual C#&lt;/B&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:e0faa62c-32c7-4b60-9182-71f5e78b5e05&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;private&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;object&lt;/SPAN&gt;&lt;SPAN&gt; _comInstance &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;null&lt;/SPAN&gt;&lt;SPAN&gt;; 
&lt;/SPAN&gt;&lt;SPAN&gt;private&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;void&lt;/SPAN&gt;&lt;SPAN&gt; GeneratePreview() 
{ 
&lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (_comInstance &lt;/SPAN&gt;&lt;SPAN&gt;!=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;null&lt;/SPAN&gt;&lt;SPAN&gt;) 
{ 
((IPreviewHandler)_comInstance).Unload(); 
}
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;Visual Basic&lt;/B&gt; 
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:4d96deec-86e6-4335-81f4-7c47cbee8c0c&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;Private&lt;/SPAN&gt;&lt;SPAN&gt; _filePath &lt;/SPAN&gt;&lt;SPAN&gt;As&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;String&lt;/SPAN&gt;&lt;SPAN&gt; 
&lt;/SPAN&gt;&lt;SPAN&gt;Private&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;Sub&lt;/SPAN&gt;&lt;SPAN&gt; GeneratePreview() 
&lt;/SPAN&gt;&lt;SPAN&gt;If&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;Not&lt;/SPAN&gt;&lt;SPAN&gt; _comInstance &lt;/SPAN&gt;&lt;SPAN&gt;Is&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;Nothing&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;Then&lt;/SPAN&gt;&lt;SPAN&gt; 
&lt;/SPAN&gt;&lt;SPAN&gt;CType&lt;/SPAN&gt;&lt;SPAN&gt;(_comInstance, IPreviewHandler).Unload() 
&lt;/SPAN&gt;&lt;SPAN&gt;End&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;If&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;Build a RECT struct using the bounds of the visible area where the preview handler can draw. In this case, that is the full bounds of the PreviewHandlerHostControl&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;B&gt;Visual C#&lt;/B&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:7d849aa2-615e-4e29-be54-92f46c1a26c8&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;RECT r; 
r.top &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;; 
r.bottom &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.Height; 
r.left &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;; 
r.right &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.Width;
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;Visual Basic&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:ba216484-53ff-497e-846e-6cfbee439b30&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt;&lt;SPAN&gt; r &lt;/SPAN&gt;&lt;SPAN&gt;As&lt;/SPAN&gt;&lt;SPAN&gt; RECT 
r.top &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt; 
r.bottom &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;Me&lt;/SPAN&gt;&lt;SPAN&gt;.Height 
r.left &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt; 
r.right &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;Me&lt;/SPAN&gt;&lt;SPAN&gt;.Width
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Find the CLSID of the preview handler registered for the file extension of the file using registry lookup. This is typically done by looking in the registry under HKEY_CLASSES_ROOT\%file_extension%\shellex\{8895b1c6-b41f-4c1c-a562-0d564250836f}. This Registry key will have a value pointed to the Class ID (CLSID) of the COM registration of the registered preview handler. For more information about how preview handlers can be found in the registry, see this &lt;A href="http://msdn2.microsoft.com/en-us/library/aa969369.aspx"&gt;article&lt;/A&gt;. 
&lt;LI&gt;Create an instance of the preview handler using Reflection and the CLSID found in the registry.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;B&gt;Visual C#&lt;/B&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:c16e385d-6981-46a7-a3fb-01d8011523bf&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;Type comType &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; Type.GetTypeFromCLSID(&lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt;&lt;SPAN&gt; Guid(handler.ID)); 
_comInstance &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; Activator.CreateInstance(comType);
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;Visual Basic&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:29f6ea5a-c5d2-452a-8777-a6fa6d518514&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;Dim&lt;/SPAN&gt;&lt;SPAN&gt; comType &lt;/SPAN&gt;&lt;SPAN&gt;As&lt;/SPAN&gt;&lt;SPAN&gt; Type &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; Type.GetTypeFromCLSID(&lt;/SPAN&gt;&lt;SPAN&gt;New&lt;/SPAN&gt;&lt;SPAN&gt; Guid(handler.ID)) 
_comInstance &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; Activator.CreateInstance(comType)
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Call the appropriate initialize for the create preview handler (either passing in a stream or filepath) 
&lt;UL&gt;
&lt;LI&gt;If the preview handler is a stream previewhandler, using a COM IStream Wrapper to handle Stream marshalling to COM&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;B&gt;Visual C#&lt;/B&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:4ddc20e8-4dde-4a50-9c86-c9c167f7157b&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (_comInstance &lt;/SPAN&gt;&lt;SPAN&gt;is&lt;/SPAN&gt;&lt;SPAN&gt; IInitializeWithFile) 
{ 
((IInitializeWithFile)_comInstance).Initialize(_filePath, &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;); 
} 
&lt;/SPAN&gt;&lt;SPAN&gt;else&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (_comInstance &lt;/SPAN&gt;&lt;SPAN&gt;is&lt;/SPAN&gt;&lt;SPAN&gt; IInitializeWithStream) 
{ 
&lt;/SPAN&gt;&lt;SPAN&gt;if&lt;/SPAN&gt;&lt;SPAN&gt; (File.Exists(_filePath)) 
{ 
StreamWrapper stream &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt;&lt;SPAN&gt; StreamWrapper(File.Open(_filePath, FileMode.Open)); 
((VSExpressDevPack.PreviewHandlerFramework.IInitializeWithStream)_comInstance).Initialize(stream, &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;); 
} 
&lt;/SPAN&gt;&lt;SPAN&gt;else&lt;/SPAN&gt;&lt;SPAN&gt; 
{ 
&lt;/SPAN&gt;&lt;SPAN&gt;throw&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt;&lt;SPAN&gt; Exception(&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;File not found&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;); 
} 
}
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;Visual Basic&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:7049fc2b-330c-478c-a66b-469818ceea07&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;If TypeOf _comInstance Is IInitializeWithFile Then 
CType(_comInstance, IInitializeWithFile).Initialize(_filePath, &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;) 
ElseIf TypeOf _comInstance Is IInitializeWithStream Then 
If File.Exists(_filePath) Then 
Dim stream As StreamWrapper &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; New StreamWrapper(File.Open(_filePath, FileMode.Open)) 
CType(_comInstance, VSExpressDevPack.PreviewHandlerFramework.IInitializeWithStream).Initialize(stream, &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;) 
Else 
Throw New Exception(&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;File not found&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;) 
End If 
End If
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Call SetWindow on the PreviewHandler, passing in a handle to the control and the bounds (RECT created earlier)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;B&gt;Visual C#&lt;/B&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:2f721402-8d99-4b35-ad10-f83642920e62&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;((IPreviewHandler)_comInstance).SetWindow(&lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.Handle, &lt;/SPAN&gt;&lt;SPAN&gt;ref&lt;/SPAN&gt;&lt;SPAN&gt; r);
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;Visual Basic&lt;/B&gt; 
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:9f56952d-9c6c-4ecc-9c4a-96a6e417a738&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;CType&lt;/SPAN&gt;&lt;SPAN&gt;(_comInstance, IPreviewHandler).SetWindow(&lt;/SPAN&gt;&lt;SPAN&gt;Me&lt;/SPAN&gt;&lt;SPAN&gt;.Handle, r)
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;Call DoPreview on the PreviewHandler&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;B&gt;Visual C#&lt;/B&gt; 
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:b45b3448-311d-4f54-b10e-a8faa468c676&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;((IPreviewHandler)_comInstance).DoPreview();
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;Visual Basic&lt;/B&gt; 
&lt;P&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:5603ceea-f2c3-4fcb-8475-7c341142c31a&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;CType&lt;/SPAN&gt;&lt;SPAN&gt;(_comInstance, IPreviewHandler).DoPreview()
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;If you are interested in more information, the zip file included with this project has all of the source and a document describing a walkthrough of using this control.&amp;nbsp; Additionally, the Coding4Fun Developer Pack 2008 Vol.1 Codeplex project has all the info and will also have any fixes/enhancements.&lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3245" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="Windows Forms" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Forms/default.aspx" /><category term="Windows Forms" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Forms/default.aspx" /></entry><entry><title>Coding4Fun Developer Kit 2008 Vol.1 Beta Released on Codeplex</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/26/3244.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/26/3244.aspx</id><published>2007-07-26T21:13:00Z</published><updated>2007-07-26T21:13:00Z</updated><content type="html">&lt;P&gt;Recently, I have been spending most of my time helping put together the Coding4Fun Developer Kit that was released today on &lt;A href="http://www.codeplex.com/C4FDevKit"&gt;Codeplex&lt;/A&gt;.&amp;nbsp; This is a Kit put together by Microsoft to open up many of the new and powerful APIs avaiable in Vista and Visual Studio 2008 to enable simple programming interfaces that can be used from managed code.&lt;/P&gt;
&lt;P&gt;This developer kit contains .net wrappers and sample projects for the following Vista APIs&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Bluetooth 
&lt;LI&gt;Contacts 
&lt;LI&gt;Digital Sound Recording 
&lt;LI&gt;Messaging/Email 
&lt;LI&gt;Picture Sharing 
&lt;LI&gt;Picture Acquisition 
&lt;LI&gt;Power Management 
&lt;LI&gt;Preview Handlers 
&lt;LI&gt;Feeds 
&lt;LI&gt;Desktop Search&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;I made two big contributions to this developer kit.&amp;nbsp; The first was building the Preview Handler Wrapper.&amp;nbsp; This Wrapper included enhancing the managed preview handler framework built by Stephen Toub and published in the &lt;A href="http://msdn.microsoft.com/msdnmag/issues/07/01/PreviewHandlers"&gt;January Edition of MSDN Magazine&lt;/A&gt;.&amp;nbsp; In addition, I wrote a managed preview handler host, to enable displaying any preview handler within a .net winform application.&amp;nbsp; Watch for my next post describing, Hosting File Previews In Managed Code.&amp;nbsp; My other contribution to the project was pulling the various projects together and building the installer.&amp;nbsp; I used &lt;A href="http://wix.sourceforge.net/"&gt;WIX&lt;/A&gt;.&amp;nbsp; It was a tedious process at times, but ultimately pretty effective.&amp;nbsp; I promise to write another post detailing my experience with WIX and what I did to put this installer together.&lt;/P&gt;
&lt;P&gt;Check out the codeplex site for the Coding4Fun Developer Kit 2008 vol.1.&amp;nbsp; Definitely some cool and interesting stuff.&lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3244" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="ASP.NET" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/ASP.NET/default.aspx" /><category term="Windows Forms" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Forms/default.aspx" /><category term="ASP.NET 2.0" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/ASP.NET+2.0/default.aspx" /><category term="Windows Presentation Foundation (WPF)" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Presentation+Foundation+_2800_WPF_2900_/default.aspx" /><category term="ASP.NET" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/ASP.NET/default.aspx" /><category term="Windows Forms" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Forms/default.aspx" /><category term="Windows Presentation Foundation (WPF)" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Presentation+Foundation+_2800_WPF_2900_/default.aspx" /></entry><entry><title>SQL 2005 Performance Tuning using DMVs - Part 4 of 7 - I/O Health</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/06/3220.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/06/3220.aspx</id><published>2007-07-06T20:28:32Z</published><updated>2007-07-06T20:28:32Z</updated><content type="html">&lt;p&gt;In my previous 3 posts in this series, I went through an introduction to Dynamic Management Views and an in depth look at how DMVs can be used to analyze and pinpoint CPU bottlenecks.&amp;nbsp; In today's post we will take a look at using DMVs for analyzing I/O Health and pressure.&lt;/p&gt; &lt;p&gt;You can use the following DMV query to find currently pending I/O requests. You can execute this query periodically to check the health of I/O subsystem and to isolate physical disk(s) that are involved in the I/O bottlenecks.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:783c7b17-9844-4b2e-9531-ccbda6c99fea"&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; 
    database_id, 
    &lt;/span&gt;&lt;span&gt;file_id&lt;/span&gt;&lt;span&gt;, 
    io_stall,
    io_pending_ms_ticks,
    scheduler_address 
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt;    
    sys.dm_io_virtual_file_stats(&lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;)t1
&lt;/span&gt;&lt;span&gt;INNER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;span&gt;
       sys.dm_io_pending_io_requests &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; t2
&lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt;    t1.file_handle &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; t2.io_handle&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;If you find, that you regularly have a high number of pending I/O requests, you can use the following query to determine which SQL batches use the most I/O.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:367193bc-77b2-49dd-ae38-183c01fbb561"&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; 
    (total_logical_reads&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;execution_count) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; avg_logical_reads,
    (total_logical_writes&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;execution_count) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; avg_logical_writes,
    (total_physical_reads&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;execution_count) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; avg_phys_reads,
     Execution_count, 
    statement_start_offset &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; stmt_start_offset, 
    st.&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;, 
    qp.query_plan
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; sys.dm_exec_query_stats  qs
&lt;/span&gt;&lt;span&gt;CROSS&lt;/span&gt;&lt;span&gt; APPLY sys.dm_exec_sql_text(qs.sql_handle) st
&lt;/span&gt;&lt;span&gt;CROSS&lt;/span&gt;&lt;span&gt; APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
&lt;/span&gt;&lt;span&gt;ORDER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; 
 (total_logical_reads &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; total_logical_writes) &lt;/span&gt;&lt;span&gt;Desc&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;If you are troubleshooting blocked I/O realtime, you can use dm_tran_locks and dm_waiting_tasks to determine what sql is blocking and what is waiting.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:e1b7bf55-6e66-45ca-a98b-8477c706bd56"&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; 
    t1.resource_type,
    &lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;database&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;db_name&lt;/span&gt;&lt;span&gt;(resource_database_id),
    &lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;blk object&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; t1.resource_associated_entity_id,
    t1.request_mode,
    t1.request_session_id,
    t2.blocking_session_id     
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; 
    sys.dm_tran_locks &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; t1
&lt;/span&gt;&lt;span&gt;INNER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;span&gt; 
    sys.dm_os_waiting_tasks &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; t2
&lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt; 
    t1.lock_owner_address &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; t2.resource_address &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt;
    t1.request_session_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; t1.request_session_id
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The last thing to check when analyzing I/O is the utlization of tempDB.&amp;nbsp; You can use dm_db_file_space_usage to determine the amount of space that is being used in tempdb by user_objects, internal_objects and the version_store.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:c62c6ba8-41cd-4276-9176-79d4e43d36ae"&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt;
    &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt; (user_object_reserved_page_count)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; user_objects_kb,
    &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt; (internal_object_reserved_page_count)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; internal_objects_kb,
    &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt; (version_store_reserved_page_count)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; version_store_kb,
    &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt; (unallocated_extent_page_count)&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; freespace_kb
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; sys.dm_db_file_space_usage
&lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; database_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;That's it for this edition, in the next installment we will look at finding Problem Queries.&lt;/p&gt;
&lt;p&gt;The&amp;nbsp;code from this post is available &lt;a href="http://employees.claritycon.com/rpowers/dmv/Demo4_IOHealth.sql"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3220" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="SQL Server 2005" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/SQL+Server+2005/default.aspx" /></entry><entry><title>Facebook Developer Toolkit Version 1.2 Released</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/06/3219.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/06/3219.aspx</id><published>2007-07-06T20:09:08Z</published><updated>2007-07-06T20:09:08Z</updated><content type="html">&lt;p&gt;I have been spending most of time working on the Facebook Developer Toolkit and monitoring our &lt;a href="http://www.codeplex.com/FacebookToolkit"&gt;codeplex site&lt;/a&gt;.&amp;nbsp; Things have been going pretty, the response has been pretty positive and the help from the other site contributors has been great.&amp;nbsp; We even just became the 10th most popular project on CodePlex.&amp;nbsp; Which is a pretty cool accomplishment and pretty impressive company.&lt;/p&gt; &lt;p&gt;&lt;a href="http://employees.claritycon.com/rpowers/FacebookDeveloperToolkitVersio.2Released_D513/image03.png"&gt;&lt;img height="253" src="http://employees.claritycon.com/rpowers/FacebookDeveloperToolkitVersio.2Released_D513/image0_thumb1.png" width="456" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Today, we released Version 1.2 of the Toolkit.&lt;/p&gt; &lt;p&gt;Included in this release are:&lt;/p&gt; &lt;li&gt;Refactored FacebookService  &lt;li&gt;Added AsyncFacebookService  &lt;li&gt;Refactored Parsers and Entities into their own directory and namespace  &lt;li&gt;Added improved photo api  &lt;li&gt;Added Canvas Base pages to Facebook.WebControls  &lt;li&gt;Added Canvas samples to Facebook.WebControls  &lt;li&gt;Added IFrame Ajax sample  &lt;li&gt;Added IFrame Silverlight Example  &lt;li&gt;Updated to new notifications API &lt;b&gt;*INTERFACE CHANGE*&lt;/b&gt; &lt;li&gt;Updated PublishStory and PublishAction interfaces &lt;b&gt;*INTERFACE CHANGE*&lt;/b&gt; &lt;li&gt;Updated CreateAlbum interface to return created Album &lt;b&gt;*INTERFACE CHANGE*&lt;/b&gt; &lt;li&gt;Added SetFBML override taking in userid  &lt;li&gt;Added small and big picture url and bitmap to photo and user  &lt;li&gt;Added GetFriendsNonAppUsers method&lt;/li&gt; &lt;p&gt;The major change is the Canvas base pages, these should help new developers solve the riddle of building Facebook Canvas applications.&lt;/p&gt; &lt;p&gt;Thanks to everyone who helped with code and feedback.&amp;nbsp; I think we continue to make good progress on this project.&amp;nbsp;&amp;nbsp;You can&amp;nbsp;download the release or documentation &lt;a href="http://www.codeplex.com/FacebookToolkit/Release/ProjectReleases.aspx?ReleaseId=5387"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3219" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="ASP.NET" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/ASP.NET/default.aspx" /><category term="Windows Forms" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Forms/default.aspx" /><category term="ASP.NET 2.0" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/ASP.NET+2.0/default.aspx" /><category term="ASP.NET" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/ASP.NET/default.aspx" /><category term="Windows Forms" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Forms/default.aspx" /></entry><entry><title>SQL 2005 Performance Tuning using DMVs - Part 3 of 7 - Alleviating CPU Pressure</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/02/3214.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/07/02/3214.aspx</id><published>2007-07-02T21:53:46Z</published><updated>2007-07-02T21:53:46Z</updated><content type="html">&lt;p&gt;This is the third installment on my series on using Dynamic Views to help with SQL 2005 performance tuning.&amp;nbsp; The previous post on Identifying CPU Pressure can be found &lt;a href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/13/3190.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;After identifying that a database is cpu constrained, the next step is to find out what is using all the cpu.&amp;nbsp; The first step is to identify the SQL batches that are using the most CPU.&amp;nbsp; To find these batches, you use dm_exec_query_stats and join to dm_exec_sql_text to get the actual SQL statement.&amp;nbsp;The following query will yield the top 10 (currently cached) sql statements for cpu utilization.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:eb5d8df7-13ba-4514-a062-bf57031a2a4a"&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; 
    derived_table.total_cpu_time,
    derived_table.total_execution_count,
    derived_table.total_cpu_time&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;derived_table.total_execution_count &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; cpu_per_execution,
    derived_table.number_of_statements,
    Plans.query_plan
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt;    
(
&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TOP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; 
    &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt;(qs.total_worker_time) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; total_cpu_time, 
    &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt;(qs.execution_count) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; total_execution_count,
    &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;  number_of_statements, 
    qs.plan_handle
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; 
    sys.dm_exec_query_stats qs
&lt;/span&gt;&lt;span&gt;GROUP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; qs.plan_handle
&lt;/span&gt;&lt;span&gt;ORDER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SUM&lt;/span&gt;&lt;span&gt;(qs.total_worker_time) &lt;/span&gt;&lt;span&gt;desc&lt;/span&gt;&lt;span&gt;) derived_table
&lt;/span&gt;&lt;span&gt;CROSS&lt;/span&gt;&lt;span&gt; APPLY sys.dm_exec_query_plan(plan_handle) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; Plans
&lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;by&lt;/span&gt;&lt;span&gt; derived_table.total_cpu_time&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;derived_table.total_execution_count &lt;/span&gt;&lt;span&gt;desc&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Another common cause of CPU over-utilization on a database server is query optimization time.&amp;nbsp; If you take periodic snapshots of the dm_exec_query_optimizer_info DMV, you can get a good idea of the amount of time spent optimizing.&amp;nbsp; The other way to look at optimization time is to examine how often queries are recompiled.&amp;nbsp; The following SQL is useful for this examination:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:577cd0d1-87ca-4e81-8ddc-771831104567"&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;To examine queries that recompile often,&lt;/span&gt;&lt;span&gt;
--&lt;/span&gt;&lt;span&gt;plan_generation_num indicates the number of times &lt;/span&gt;&lt;span&gt;
--&lt;/span&gt;&lt;span&gt;the query has recompiled. &lt;/span&gt;&lt;span&gt;
--&lt;/span&gt;&lt;span&gt;The following sample query gives you the top 10 stored procedures &lt;/span&gt;&lt;span&gt;
--&lt;/span&gt;&lt;span&gt;that have been recompiled.&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;top&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;
    sql_text.&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,
    sql_handle,
    plan_generation_num,
    execution_count,
    dbid,
    objectid 
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; 
    sys.dm_exec_query_stats a
    &lt;/span&gt;&lt;span&gt;CROSS&lt;/span&gt;&lt;span&gt; APPLY sys.dm_exec_sql_text(sql_handle) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; sql_text
&lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt;
    plan_generation_num &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;ORDER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; plan_generation_num &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Another common cause of high CPU database server is queries that require parallel processing.&amp;nbsp; You can use a combination of dm_exec_requests, dm_os_tasks and dm_exec_sessions to find all active requests utilizing parallel processing.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:e144def4-1d67-4b74-b041-85cb27044caf"&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; 
    r.session_id,
    r.request_id,
    &lt;/span&gt;&lt;span&gt;MAX&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ISNULL&lt;/span&gt;&lt;span&gt;(exec_context_id, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; number_of_workers,
    r.sql_handle,
    r.statement_start_offset,
    r.statement_end_offset,
    r.plan_handle
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; 
    sys.dm_exec_requests r
&lt;/span&gt;&lt;span&gt;INNER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;span&gt; sys.dm_os_tasks t &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; r.session_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; t.session_id
&lt;/span&gt;&lt;span&gt;INNER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;span&gt; sys.dm_exec_sessions s &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; r.session_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; s.session_id
&lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; 
    s.is_user_process &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x1&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;span&gt;GROUP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; 
    r.session_id, r.request_id, 
    r.sql_handle, r.plan_handle, 
    r.statement_start_offset, r.statement_end_offset
&lt;/span&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MAX&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ISNULL&lt;/span&gt;&lt;span&gt;(exec_context_id, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, you can just identify all cached plans that allow parallel execution.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:f0a65373-5446-4b79-a541-0055866d8588"&gt;&lt;pre&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; 
    p.&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;, 
    q.&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;,
    cp.plan_handle
&lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; 
    sys.dm_exec_cached_plans cp
&lt;/span&gt;&lt;span&gt;CROSS&lt;/span&gt;&lt;span&gt; APPLY sys.dm_exec_query_plan(cp.plan_handle) p
&lt;/span&gt;&lt;span&gt;CROSS&lt;/span&gt;&lt;span&gt; APPLY sys.dm_exec_sql_text(cp.plan_handle) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; q
&lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; 
    cp.cacheobjtype &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;Compiled Plan&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;
    &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; p.query_plan.value(&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;declare namespace p=&amp;quot;http://schemas.microsoft.com/sqlserver/2004/07/showplan&amp;quot;;
        max(//p:RelOp/@Parallel)&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;float&lt;/span&gt;&lt;span&gt;'&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This should help you identify and address the causes of high CPU usage.&amp;nbsp; Next installment will take a look at identifying I/O bottlenecks.&amp;nbsp; You can download the source for these examples &lt;a href="http://employees.claritycon.com/rpowers/dmv/Demo3_CPUUsers.sql"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3214" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="SQL Server 2005" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/SQL+Server+2005/default.aspx" /></entry><entry><title>Silverlight 1.1 on Facebook Canvas Page using ASP.NET and Facebook Developer Toolkit</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/27/3207.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/27/3207.aspx</id><published>2007-06-27T22:29:00Z</published><updated>2007-06-27T22:29:00Z</updated><content type="html">&lt;P&gt;A couple weeks ago, working with Microsoft we delivered the facebook developer toolkit to help developers write Facebook applications using .net.&amp;nbsp; Since then, we created a &lt;A href="http://www.codeplex.com/FacebookToolkit"&gt;codeplex&lt;/A&gt; project to help keep the toolkit up to date and relevant.&amp;nbsp; It has been fun, and the response/involvement from the community has been great.&lt;/P&gt;
&lt;P&gt;Yesterday, I spent some time working on how to build canvas pages leveraging the toolkit.&amp;nbsp; A canvas page is a page that is accessed directly within facebook.com and the result is integrated into the user experience on facebook. These canvas pages were a major part of the new F8 facebook platform.&amp;nbsp; For more information, check out the Facebook Developer &lt;A href="http://developers.facebook.com/"&gt;documentation&lt;/A&gt;.&amp;nbsp; Anyway, after struggling with the flow of authentication and application adding, I finally got it working and&amp;nbsp;created 2 new canvas base pages (one for FBML type and one for IFrame).&amp;nbsp; I posted on codeplex about the changes &lt;A href="http://www.codeplex.com/FacebookToolkit/Thread/View.aspx?ThreadId=11859"&gt;here&lt;/A&gt;.&amp;nbsp; I also posted some very simple Canvas page examples for both FBML and IFrame.&lt;/P&gt;
&lt;P&gt;Now that I had a good framework in place for building the canvas page,&amp;nbsp;I wanted to see if I could get a Silverlight control with Facebook context showing up in my IFrame canvas page.&amp;nbsp; From past experience, I knew there were some major obstacles.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Some namespaces used in the Facebook.dll (wrapper to the API) are not supported in Silverlight namespace.&amp;nbsp;&amp;nbsp;Most notably:&amp;nbsp;System.XML, System.Web. 
&lt;LI&gt;Silverlight 1.1 Alpha does not support cross domain posts. 
&lt;LI&gt;It will be tough to manage the facebook login process from the Silverlight control, since we can not show the facebook hosted login page.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;With this in mind, I had a plan.&amp;nbsp; And after a frustrating day, just got a Silverlight control showing on a canvas page with some facebook context.&amp;nbsp; Here's how.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Added a new webservice (SilverlightService.asmx) to my ASPNETPlatformSamples web site.&amp;nbsp; This webservice is a proxy used by the silverlight application to call facebook 
&lt;LI&gt;Updated the ASPNETPlatformSamples web.config to support the web service. 
&lt;LI&gt;Added a ScriptService attribute to SilverlightService to enable it to support JSON calls 
&lt;LI&gt;Added WebMethod GetFriends wrapping the FacebookService.GetFriends(), this method needs to take the 4 parameters that comprise a facebook session, so that calls can maintain context. 
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:9b49ac3a-a3d9-45db-a517-ba1fc2afe5f9&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;[System.Web.Script.Services.ScriptService]
&lt;/SPAN&gt;&lt;SPAN&gt;public&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;class&lt;/SPAN&gt;&lt;SPAN&gt; SilverlightService : System.Web.Services.WebService
{
    Facebook.Components.FacebookService _fbService &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt;&lt;SPAN&gt; Facebook.Components.FacebookService();


    [WebMethod]
    &lt;/SPAN&gt;&lt;SPAN&gt;public&lt;/SPAN&gt;&lt;SPAN&gt; UserJSON[] GetFriends(&lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt; api, &lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt; secret, &lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt; session, &lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt; userid)
    {
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;LI&gt;Created a stripped down version of the Facebook.Entity.User class that is serializiable by JSON.&amp;nbsp; JSON can't serialize enums or subclasses.&amp;nbsp; So, for this I just stripped them out.&amp;nbsp; This is called UserJSON&amp;nbsp;and is&amp;nbsp;currently&amp;nbsp;just a member of my ASPNETPlatformSamples web site.&amp;nbsp; 
&lt;LI&gt;In the GetFriends WebMethod, converted Collection of Users returned from Facebook call to Array of JSON compatible users. 
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:e6e4d4aa-eba1-414b-8463-2ce2340e41b2&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;        Collection&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;Facebook.Entity.User&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt; friends &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; _fbService.GetFriends();
        UserJSON[] x &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; UserJSON.ConvertFacebookUserArray(friends);
        &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&lt;SPAN&gt; x;
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;LI&gt;Created a new Canvas page (IFrame\Silverlight.aspx),&amp;nbsp;alongside to my other IFrame canvas samples 
&lt;LI&gt;Added a placeholder for the&amp;nbsp;Silverlight control and 4 hidden fields to store the facebook context. 
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:fd9dbaca-74b9-429e-af2c-9f95032eeba7&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;head&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
    &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;title&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;Silverlight Project Test Page &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;title&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
    
    &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;script type&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;text/javascript&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; src&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;Silverlight.js&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;script&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
    &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;script type&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;text/javascript&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; src&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;CreateSilverlight.js&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;script&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;head&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;

&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;body&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;form id&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;Form1&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; runat&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;server&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;asp:HiddenField ID&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;hidAPI&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; runat&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;server&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;asp:HiddenField ID&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;hidSecret&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; runat&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;server&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;asp:HiddenField ID&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;hidSession&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; runat&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;server&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;asp:HiddenField ID&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;hidUser&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; runat&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;server&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
    &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;div id&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;SilverlightControlHost&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
        &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt;script type&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;text/javascript&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
            createSilverlight();
        &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;script&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
    &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;div&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN&gt;form&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;LI&gt;Added code in code-behind to populate hidden fields (so they can be accessed by silverlight control). 
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:5af2dffd-a9f5-4ab1-9257-d6bf826a08ad&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;public&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;partial&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;class&lt;/SPAN&gt;&lt;SPAN&gt; _Default : CanvasIFrameBasePage 
{
    &lt;/SPAN&gt;&lt;SPAN&gt;private&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;const&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt; FACEBOOK_API_KEY &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;c559128010f3edee33796fd4205361c2&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;;
    &lt;/SPAN&gt;&lt;SPAN&gt;private&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;const&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt; FACEBOOK_SECRET &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;85887d1c9a8334e5059742468a5400ee&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;;

    &lt;/SPAN&gt;&lt;SPAN&gt;new&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;protected&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;void&lt;/SPAN&gt;&lt;SPAN&gt; Page_Load(&lt;/SPAN&gt;&lt;SPAN&gt;object&lt;/SPAN&gt;&lt;SPAN&gt; sender, EventArgs e)
    {
        &lt;/SPAN&gt;&lt;SPAN&gt;base&lt;/SPAN&gt;&lt;SPAN&gt;.Api &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; FACEBOOK_API_KEY;
        &lt;/SPAN&gt;&lt;SPAN&gt;base&lt;/SPAN&gt;&lt;SPAN&gt;.Secret &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; FACEBOOK_SECRET;
        &lt;/SPAN&gt;&lt;SPAN&gt;base&lt;/SPAN&gt;&lt;SPAN&gt;.Page_Load(sender, e);
        hidAPI.Value &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.FBService.ApplicationKey;
        hidSecret.Value &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.FBService.Secret;
        hidSession.Value &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.FBService.SessionKey;
        hidUser.Value &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;this&lt;/SPAN&gt;&lt;SPAN&gt;.FBService.UserId;

    }
}
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;LI&gt;Created a new silverlight project using Orcas called SilverlightWebServiceClient 
&lt;LI&gt;Added a web reference to the above WebService 
&lt;LI&gt;Added code in page_loaded event handler of xaml code behind to call the GetFriends method&amp;nbsp;on the WebService to retrieve an&amp;nbsp;array of friends. 
&lt;LI&gt;Then simply wrote&amp;nbsp;text to a textblock with the count that was found. 
&lt;LI&gt;I then needed to add a Silverlight Reference into&amp;nbsp;the ASPNETPlatformSamples.&amp;nbsp; This essentially copies the .xaml from the&amp;nbsp;Silverproject, and the compiled .xaml.cs into a ClientBin folder of the web site project so they can be accessed from within the website. 
&lt;LI&gt;You can see it in action, by going to my IFrame canvas &lt;A href="http://apps.facebook.com/aspnetcanvasiframe"&gt;sample&lt;/A&gt;.&amp;nbsp;&amp;nbsp;&amp;nbsp;After logging in and adding the application, you should have a Silverlight demo link which will show the Silverlight page.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;A href="http://employees.claritycon.com/rpowers/Silverlig.NETandFacebookDeveloperToolkit_F607/image04.png"&gt;&lt;IMG height=301 src="http://employees.claritycon.com/rpowers/Silverlig.NETandFacebookDeveloperToolkit_F607/image0_thumb2.png" width=420 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;I checked the updated c# code for ASPNETPlatformSamples and a new project for the Silverlight Control into the codeplex &lt;A href="http://www.codeplex.com/FacebookToolkit/SourceControl/ListDownloadableCommits.aspx"&gt;site&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Now we need to build some cool Silverlight canvas apps.&amp;nbsp; If anyone has better ways to do this, I'd be interested in learning about them.&lt;/P&gt;
&lt;P&gt;Next up, Silverlight in FBML Canvas page.&lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3207" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="ASP.NET 2.0" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/ASP.NET+2.0/default.aspx" /></entry><entry><title>SQL 2005 Performance Tuning using DMVs - Part 2 of 7 - Identifying CPU Pressure</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/13/3190.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/13/3190.aspx</id><published>2007-06-13T13:57:00Z</published><updated>2007-06-13T13:57:00Z</updated><content type="html">&lt;P&gt;In the my first &lt;A href="/blogs/ryan_powers/archive/2007/06/12/3189.aspx"&gt;post&lt;/A&gt; on DMVs, I gave an introduction to Dynamic Management Views and talked about some of the tuning activities that DMVs make easier.&amp;nbsp; I also gave my top 10 DMV list.&lt;/P&gt;
&lt;P&gt;In this installment, I am going to review how DMVs can be used to analyze CPU utilization on a machine running SQL Server.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Identifying if a System has CPU Pressure&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Prior to DMVs, the typical approach to checking whether a server was experiencing CPU bottlenecks was to use the Processor Queue Length performance counter.&amp;nbsp; This counter should typically be near 0 for systems not experiencing CPU pressure.&lt;/P&gt;
&lt;P&gt;This approach is still valid, but is not necessarily a good measure for a server used for SQL Server.&amp;nbsp; To see why this is the case, we must&amp;nbsp;examine SQL Server Execution Model. &lt;/P&gt;
&lt;P&gt;SQL Server uses a User Mode Scheduler (UMS) to control the execution of SQL Server user requests (SPIDs or session_ids). The UMS manages the execution of SQL Server requests (without returning control to Windows). So when SQL Server gets its time slice from the Windows scheduler, the SQL Server UMS manages what user requests are run during this time. &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;In a 4-proc scenario, there will be 4 User Mode Schedulers, one for each CPU. Each UMS uses a number of constructs (queues, lists and worker threads) to govern execution. At any given time, each UMS will have at most a single running thread, a runnable queue of requests that are &lt;BR&gt;waiting for CPU, a waiter list (for resources such as IO, locks, memory), and a work queue (user requests that are waiting for worker threads). &lt;/P&gt;
&lt;P&gt;Whenever the current running thread needs I/O it is moved to the wait list.&amp;nbsp; When this occurs, the next request from the runnable queue is started.&amp;nbsp; When the thread&amp;nbsp;needing I/O completes, it is moved back to the end of the&amp;nbsp;runnable queue.&amp;nbsp; 
&lt;P&gt;The time waiting for a resource is shown as Resource Waits. The time waiting in the runnable queue for CPU is called Signal Waits. In SQL Server 2005, waits are shown in the Dynamic Management View (DMV), sys.dm_os_wait_stats.&amp;nbsp; In this DMV, high Signal Wait % indicates&amp;nbsp;a CPU constraint.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;The query to measure cpu pressure using sys.dm_os_wait_stats is as follows:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:5acafadb-2a9f-45ed-ae17-e872d3093567&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;SELECT&lt;/SPAN&gt;&lt;SPAN&gt;     
    &lt;/SPAN&gt;&lt;SPAN&gt;sum&lt;/SPAN&gt;&lt;SPAN&gt;(signal_wait_time_ms) &lt;/SPAN&gt;&lt;SPAN&gt;AS&lt;/SPAN&gt;&lt;SPAN&gt; signal_wait_time_ms,
    &lt;/SPAN&gt;&lt;SPAN&gt;cast&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;100.0&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;sum&lt;/SPAN&gt;&lt;SPAN&gt;(signal_wait_time_ms) &lt;/SPAN&gt;&lt;SPAN&gt;/&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;sum&lt;/SPAN&gt;&lt;SPAN&gt; (wait_time_ms) &lt;/SPAN&gt;&lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; numeric(&lt;/SPAN&gt;&lt;SPAN&gt;20&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;2&lt;/SPAN&gt;&lt;SPAN&gt;)) &lt;/SPAN&gt;&lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;'&lt;/SPAN&gt;&lt;SPAN&gt;%signal (cpu) waits&lt;/SPAN&gt;&lt;SPAN&gt;'&lt;/SPAN&gt;&lt;SPAN&gt;,
    &lt;/SPAN&gt;&lt;SPAN&gt;sum&lt;/SPAN&gt;&lt;SPAN&gt;(wait_time_ms &lt;/SPAN&gt;&lt;SPAN&gt;-&lt;/SPAN&gt;&lt;SPAN&gt; signal_wait_time_ms) &lt;/SPAN&gt;&lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; resource_wait_time_ms,
    &lt;/SPAN&gt;&lt;SPAN&gt;cast&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;100.0&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;*&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;sum&lt;/SPAN&gt;&lt;SPAN&gt;(wait_time_ms &lt;/SPAN&gt;&lt;SPAN&gt;-&lt;/SPAN&gt;&lt;SPAN&gt; signal_wait_time_ms) &lt;/SPAN&gt;&lt;SPAN&gt;/&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;sum&lt;/SPAN&gt;&lt;SPAN&gt; (wait_time_ms) &lt;/SPAN&gt;&lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; numeric(&lt;/SPAN&gt;&lt;SPAN&gt;20&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;2&lt;/SPAN&gt;&lt;SPAN&gt;)) &lt;/SPAN&gt;&lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;'&lt;/SPAN&gt;&lt;SPAN&gt;%resource waits&lt;/SPAN&gt;&lt;SPAN&gt;'&lt;/SPAN&gt;&lt;SPAN&gt;
&lt;/SPAN&gt;&lt;SPAN&gt;FROM&lt;/SPAN&gt;&lt;SPAN&gt; 
    sys.dm_os_wait_stats
&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can also monitor the SQL Server schedulers using the sys.dm_os_schedulers view to see if&lt;BR&gt;the number of runnable tasks is typically nonzero. A nonzero value indicates that tasks have to wait for their time slice to run; high values for this counter are a symptom of a CPU bottleneck. You can use the following query to list all the schedulers and look at the number of runnable tasks. 
&lt;P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV class=wlWriterSmartContent id=F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:505a9cbb-54dd-4337-b0a2-08114b1ae1c1&gt;&lt;PRE&gt;&lt;DIV&gt;&lt;SPAN&gt;SELECT&lt;/SPAN&gt;&lt;SPAN&gt; 
    scheduler_id,
    current_tasks_count,
    runnable_tasks_count
&lt;/SPAN&gt;&lt;SPAN&gt;FROM&lt;/SPAN&gt;&lt;SPAN&gt;
    sys.dm_os_schedulers
&lt;/SPAN&gt;&lt;SPAN&gt;WHERE&lt;/SPAN&gt;&lt;SPAN&gt;  
    scheduler_id &lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;255&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;That's it for this installment, see you next time as we find out how to determine the likely causes of the CPU pressure we just identified.&lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3190" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="SQL Server 2005" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/SQL+Server+2005/default.aspx" /></entry><entry><title>SQL 2005 Performance Tuning using DMVs - Part 1of 7</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/12/3189.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/12/3189.aspx</id><published>2007-06-12T06:47:00Z</published><updated>2007-06-12T06:47:00Z</updated><content type="html">&lt;P&gt;A few months ago, I researched and put together an internal presentation on one of the more interesting features in SQL 2005 (Dynamic Management Views).&amp;nbsp; This topic is not quite as cutting edge now as it was when I researched it.&amp;nbsp; But, I think it is still useful to blog what I found.&amp;nbsp; First off, thanks to Kim Tripp at SQL at &lt;A href="http://www.sqlskills.com" target=_blank&gt;www.sqlskills.com&lt;/A&gt;.&amp;nbsp; I first became interested in this topic when watching some of her webcasts.&amp;nbsp; I also found many of my good samples of DMV useage from some of her posts.&lt;/P&gt;
&lt;P&gt;I am going to break this up into parts, this first part is just an intro.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Microsoft made a big effort with SQL Server 2005 to make the server more transparent to administrators and developers. The result is DMVs, which should make database tuning and maintenance easier.&lt;/P&gt;
&lt;P&gt;“DMVs can expedite the diagnosis process by eliminating the need to generate and analyze physical dumps in most cases. DMVs provide a simplified and familiar relational interface for getting critical system information. This information can be used for monitoring purposes to alert administrators to any potential problems. Or, the information can be polled and collected periodically for detailed analysis later.” 
&lt;P&gt;DMVs are very useful in diagnosing different SQL performance problems.&amp;nbsp; I will go into more specifics with the future posts here.&amp;nbsp; But in general, you will find great resources for looking into any of the following: 
&lt;UL&gt;
&lt;LI&gt;Resource Bottlenecks 
&lt;UL&gt;
&lt;LI&gt;CPU 
&lt;LI&gt;Memory 
&lt;LI&gt;I/O&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;TempDB Bottlenecks 
&lt;LI&gt;Slow Queries 
&lt;UL&gt;
&lt;LI&gt;Bad Plans 
&lt;LI&gt;Missing Indexes 
&lt;LI&gt;Blocking&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Index Fragmentation&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Here is a good list of the Naming Conventions of the DMVs that are available:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;CLR Related 
&lt;UL&gt;
&lt;LI&gt;dm_clr_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Database Related 
&lt;UL&gt;
&lt;LI&gt;dm_db_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Execution Related 
&lt;UL&gt;
&lt;LI&gt;dm_exec_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Full Text Search Related 
&lt;UL&gt;
&lt;LI&gt;dm_fts_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Index Related 
&lt;UL&gt;
&lt;LI&gt;dm_db_index_ 
&lt;LI&gt;dm_missing_index_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;SQL OS Related 
&lt;UL&gt;
&lt;LI&gt;dm_os_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;I/O Related 
&lt;UL&gt;
&lt;LI&gt;dm_io_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Query Notifications Related 
&lt;UL&gt;
&lt;LI&gt;dm_qn_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Replication Related 
&lt;UL&gt;
&lt;LI&gt;dm_repl_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Service Broker Related 
&lt;UL&gt;
&lt;LI&gt;dm_broker_&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Transaction Related 
&lt;UL&gt;
&lt;LI&gt;dm_tran_&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;After playing around with all the DMVs I could find, I put together a list of my 10 favorites:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;dm_exec_query_stats – performance stats of all queries 
&lt;LI&gt;dm_exec_sql_text – returns exact sql for entire batch given a sql handle 
&lt;LI&gt;dm_exec_query_plan – return query plan for entire batch given a plan handle 
&lt;LI&gt;dm_db_index_usage_stats – displays how often each index is used, show Read Seeks, Read Scans, Write Seeks and Write Scans 
&lt;LI&gt;dm_db_index_physical_stats – replace DBCC SHOWCONTIG used to check index fragmentation 
&lt;LI&gt;dm_db_index_operational_stats – use to check for index contention and blocking 
&lt;LI&gt;dm_os_wait_stats – Used to determine the types of waits (signal or resource that are occurring) 
&lt;LI&gt;dm_os_waiting_tasks – Used to help identify blocking 
&lt;LI&gt;dm_tran_locks – Used to help indentify blocking 
&lt;LI&gt;dm_os_performance_counters – Query Access to SQL Server Performance counters&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;The last thing I wanted to cover in this initial post, was just methods for writing queries to identify the DMVs and their types.&amp;nbsp; Some DMVs are actual views, while others are tabled valued functions.&amp;nbsp; Again, thanks to Kim Tripp for most of this knowledge.&lt;/P&gt;
&lt;P&gt;Download a script for identifying DMVs and syntax to querying each &lt;A title=Demo1_IdentifyDMVs.sql href="http://Employees.claritycon.com/rpowers/dmv/Demo1_IdentifyDMVs.sql"&gt;here&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3189" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="SQL Server 2005" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/SQL+Server+2005/default.aspx" /></entry><entry><title>Mixed Authentication- ASP.NET Forms and IIS 6.0 Windows Integrated</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/12/3187.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/12/3187.aspx</id><published>2007-06-12T05:41:00Z</published><updated>2007-06-12T05:41:00Z</updated><content type="html">&lt;P&gt;Recently I was working on a website that needed to leverage both Integrated Windows and Forms Authentication.&amp;nbsp; The idea is that this website has some users that are on Active Directory and should be able to gain access without being challenged from credentials when they are logged into the domain.&amp;nbsp; Additionally, these users should be allowed to enter their AD credentials and access the site if they access the site remotely (while not logged in to AD).&amp;nbsp; This is all handled by IIS Integrated Windows Authentication.&amp;nbsp; However, for our situation we also have users who are not in AD at all and need to access the site.&amp;nbsp; We preferred to not create AD accounts for these users just to permit access to the site.&amp;nbsp; The solution we wanted was try windows integrated, if it fails, use forms authentication.&amp;nbsp; This problem will go away with the integrated pipeline of IIS 7.0 (more on this with a later post).&amp;nbsp; But, in IIS 6.0 this problem proved very tough to solve.&lt;/P&gt;
&lt;P&gt;After doing some research,&amp;nbsp;we found this article.&amp;nbsp; &lt;A href="http://msdn2.microsoft.com/en-us/library/ms972958.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms972958.aspx&lt;/A&gt;.&amp;nbsp; This was a great article and provided the basic approach to the solution.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;To summarize&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Set site to use Forms Authentication 
&lt;LI&gt;Set web.config authorization to deny anonymous users 
&lt;LI&gt;You need to set one page in your web application to use Windows Integrated Authentication (this was a revelation to me, setting one page to different IIS authentication than others in same app).&amp;nbsp; In this case we call it WinLogin.aspx 
&lt;OL&gt;
&lt;LI&gt;In this page, capture the Request Variable "LOGON_USER" and then call FormsAuthentication.RedirectFromLoginPage. 
&lt;LI&gt;This allows you to mimick a forms logon for the windows user.&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;Set Forms loginUrl to page from step 3 
&lt;LI&gt;Handle Windows Integrated failures.&amp;nbsp; Add a custom handler for 401 errors, and in the static HTM page.&amp;nbsp; Use a javascript function to forward to the real ASP.NET forms login page (WebLogin.aspx).&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;IMG alt="" src="http://msdn2.microsoft.com/ms972958.mixedsecurity_fig02(en-us,MSDN.10).gif" border=0&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;6.&amp;nbsp; Update web.config to allow anonymous access of WebLogin.aspx.&lt;/P&gt;
&lt;P&gt;7.&amp;nbsp; Redirect to original requested URL&lt;/P&gt;
&lt;P&gt;&lt;IMG alt="" src="http://msdn2.microsoft.com/ms972958.mixedsecurity_fig03(en-us,MSDN.10).gif" border=0&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This was very helpful and got us a solution that solved most problems.&amp;nbsp; However, we quickly ran into one problem that we couldn't live with.&amp;nbsp;For IE users who did not have our site as a "Trusted Site", Windows Integrated would popup a login dialog prompting for credentials prior to our custom 404 provider.&amp;nbsp; So, our non AD users would have to press cancel on this to get to our login form.&amp;nbsp; Just not acceptable.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Some more research brought us to another great post that ultimately gave us they framework for our solution.&amp;nbsp; The article that we used to help us solve this problem is here &lt;A title=http://glazkov.com/blog/credentials-screening/ href="http://glazkov.com/blog/credentials-screening/"&gt;http://glazkov.com/blog/credentials-screening/&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;We were not able to get his exact implementation working, and ended up changing the code quite a bit.&amp;nbsp; But, the essence of the approach is exactly as described in that post (and the subsequent updates).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The short explanation of how this works is:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Create an HTTPModule to handle incoming requests 
&lt;LI&gt;In this module, emit a javascript function to try to load the page that is setup as requiring Windows Integrated.&amp;nbsp; 
&lt;LI&gt;Back in the module, check the LOGON_USER server variable.&amp;nbsp; (If javascript succeeded in accessing that file, this variable will be populated) 
&lt;LI&gt;Continue with redirect&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The key to the solution that solves the original problem is the javascript load of the page set to require Windows Integrated Authentication.&amp;nbsp; What this accomplishes is pre-empting the load of this&amp;nbsp;page that IIS will do and allows our code (in the handler) to respond the results of the check prior to IIS potentially popping up a dialog.&lt;/P&gt;
&lt;P&gt;The last thing we needed to do was simply added AD integration into the weblogin form.&amp;nbsp; So, we could still allow AD users who access the site without being logged into the domain use the domain credentials.&amp;nbsp; I will discuss this in my next post.&amp;nbsp; The code I am posting with this blog does not have the AD integration&amp;nbsp;on the login page itself.&amp;nbsp; (As it will take more work for me to factor that out into a digestable snippet).&lt;/P&gt;
&lt;P&gt;You can download a sample &lt;A href="http://employees.claritycon.com/rpowers/MixedAuthentication.zip"&gt;here&lt;/A&gt;.&amp;nbsp; &lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3187" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="ASP.NET 2.0" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/ASP.NET+2.0/default.aspx" /></entry><entry><title>CNUG Silverlight Presentation</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/11/3186.aspx" /><id>http://blogs.claritycon.com/blogs/ryan_powers/archive/2007/06/11/3186.aspx</id><published>2007-06-12T04:48:00Z</published><updated>2007-06-12T04:48:00Z</updated><content type="html">&lt;P&gt;Our CTO, Jon Rauschenberger, and I did a presentation on Silverlight at the Chicago .NET User Group last week.&amp;nbsp; Jon presented the slides and I did a few technical demos.&amp;nbsp; The first demo included a simple introduction to Expression Blend and Media support.&amp;nbsp; The second demo included some programming Silverlight with .NET examples including HTML integration, POX, JSON WebServices, Proxy WebServices and some simple XAML constructs.&lt;/P&gt;
&lt;P&gt;The session was very well attended.&amp;nbsp; And we had some good discussions around the Silverlight architecture and where it really fits into the Microsoft development stack.&amp;nbsp; If you are interested in learning more about Silverlight, we recorded the session.&amp;nbsp; The recording and resources (deck and demos) are available here.&amp;nbsp; &lt;A href="http://www.claritycon.com/claritytv/"&gt;http://www.claritycon.com/claritytv/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=3186" width="1" height="1"&gt;</content><author><name>rpowers</name><uri>http://blogs.claritycon.com/members/rpowers.aspx</uri></author><category term="Windows Presentation Foundation (WPF)" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Presentation+Foundation+_2800_WPF_2900_/default.aspx" /><category term="Windows Presentation Foundation (WPF)" scheme="http://blogs.claritycon.com/blogs/ryan_powers/archive/tags/Windows+Presentation+Foundation+_2800_WPF_2900_/default.aspx" /></entry></feed>