<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkADQno5eip7ImA9WxBWEk8.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018</id><updated>2010-02-03T13:12:53.422-05:00</updated><title>yuriy.org</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.yuriy.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.yuriy.org/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/qNLt" /><feedburner:info uri="blogspot/qnlt" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><geo:lat>40.692164</geo:lat><geo:long>-74.015245</geo:long><entry gd:etag="W/&quot;CkEGRHw9fSp7ImA9WxVRF0k.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-1160334404085024027</id><published>2009-01-17T23:07:00.000-05:00</published><updated>2009-01-23T14:57:05.265-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-23T14:57:05.265-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="silverlight" /><title>Building a Modal Popup Framework with Silverlight</title><content type="html">This post will demonstrate one way to create a modular and flexible framework for endowing your Controls with the ability to pop up in modal and non-modal modes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Goals:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Allow any Control to be "popped up" in modal and non-modal modes&lt;/li&gt;&lt;li&gt;Construct a framework that is modular and made up of discrete, reusable components&lt;/li&gt;&lt;li&gt;Properly hide implementation details and expose a simple api for developers to utilize.&lt;/li&gt;&lt;li&gt;Reduce the amount of customization to the framework required by front-end developers.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Deconstructing the modal framework:&lt;/span&gt;&lt;br /&gt;When modeling the framework, I thought it appropriate to use a framed painting as a metaphor.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A frame can enclose any painting.  The frame itself can be reused.&lt;/li&gt;&lt;li&gt;A painting can be any painting.  As long as it's a "painting" we can frame it.&lt;/li&gt;&lt;li&gt;A framed painting can be hung on a wall.&lt;/li&gt;&lt;/ul&gt;And so, the modal framework should be modeled similarly:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We want a generic "frame" control that provides possibilities to adorn the frame with elements as well as the ability for the frame control to enclose any other silverlight control.&lt;/li&gt;&lt;li&gt;The "painting" is any silverlight element that subclasses FrameworkElement.  This covers (all?) user and custom controls.&lt;/li&gt;&lt;li&gt;A Dialog factory is responsible for assembling the frame, the painting, and most importantly for providing the modal or non-modal popup behavior for the assembled "painting".&lt;/li&gt;&lt;/ol&gt;The code along with a demo exercising the popups is available for download from:  &lt;a href="http://yuriy.org/downloads/org.yuriy.Silverlight.DialogFramework.zip"&gt;http://yuriy.org/downloads/org.yuriy.Silverlight.DialogFramework.zip&lt;/a&gt;.  It is released under LGPL and I hope it is useful.  The code is decently well documented and I encourage you to explore the implementation.  Of course, please contact me with any errata or feedback.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementation Design&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hi94bdcu3SI/SXoc5r62h7I/AAAAAAAAAU4/D3DC7n1YU2g/s1600-h/DialogFrameworkDemo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 291px;" src="http://1.bp.blogspot.com/_Hi94bdcu3SI/SXoc5r62h7I/AAAAAAAAAU4/D3DC7n1YU2g/s400/DialogFrameworkDemo.png" alt="" id="BLOGGER_PHOTO_ID_5294576089295128498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;AbstractFrame&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt; - &lt;/span&gt;is a custom control comprised of a c# class and associated templating in Themes/generic.xaml.  It is the proverbial "frame" as described in pt 1 above.  Its two responsibilities are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Establish default layout for Header, Body, Footer place holders - ContentPresenters exposed as custom DependencyProperties.&lt;/li&gt;&lt;li&gt;Establish a default theme for our dialog popup.  &lt;/li&gt;&lt;/ol&gt;Imagine that our corporate the branding team already decided on a standard look'and'feel for all dialog popups. We style our generic frame here so that all components utilizing this one get our desired default style for free.&lt;br /&gt;&lt;br /&gt;Additionally, the exposed ContentPresenters grant the developer the "right" amount of flexibility.   Let's refer to this as "Guided Development".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;FrameImpl&lt;/span&gt; - FrameImpl is not a true "implementation" of an abstract class because AbstractFrame is not an "abstract" class.  In fact, both subclass ContentControl.  In a way, Abstraction and Implementation are be modeled in XAML through the use of Dependency Properties and what I'll refer to as Wrapping.  If you take a look at generic.xaml, you will notice that the template for FrameImpl is nothing more than an AbstractFrame declaration with the Header and Body ContentPresenters further defined.  This wrapping behavior is, in a sense, akin to subclassing in OO.&lt;br /&gt;&lt;br /&gt;Through quite a few hours of exploration, I can state that Controls development in Silverlight favors Composition over Inheritance.  Perhaps FrameImpl should have simply assembled three or four individual Controls rather than declare the details of Header, Body and Footer as part of the wrapper.  In any case, to maintain my initial metaphor, I favored Inheritance.&lt;br /&gt;&lt;br /&gt;As stated earlier, the inheritance happens in XAML, NOT within the code-behind classes.  Both FrameImpl and AbstractFrame subclass ContentControl so that Silverlight can guarantee correct binding to XAML.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Buttons and event handlers in FrameImpl&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;One of the important details in FrameImpl's is the declaration of Buttons, a single mechanism for handling button clicks, and a chaining mechanism that notifies the caller of a button click.  Control is returned to the caller with an enum click status and a reference to the included control for easy post-processing that is decoupled from the implementation of the buttons itself.&lt;br /&gt;&lt;br /&gt;Again, the layout, styling and available customizations are configured for desired default behavior and the available interface to the developer is reduced to simplify possible and appropriate customizations.&lt;br /&gt;&lt;br /&gt;The buttons in this demo are specified as a Close Button in the upper right corner, and a ribbon of optional and configurable "left", "center", "right" buttons that can be used to model most common dialogs.  The developer has the option to hide any or all of the buttons.  Again, all the buttons are prewired.  The developer just needs to specify an event handler when working within this framework.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DialogFactory&lt;/span&gt;&lt;br /&gt;The final stage of my implementation is a Factory that:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Exposes static Show() initializers to the developer.  These are overloaded for button config flexibility, accept any Silverlight control as content for the popup, and an event handler to receive notifications of buttons clicks within the Dialog.  These are contained in the &lt;span style="font-weight: bold;"&gt;DialogFactory.static&lt;/span&gt; partial class.&lt;/li&gt;&lt;li&gt;The &lt;span style="font-weight: bold;"&gt;DialogFactory.effects&lt;/span&gt; partial class contains methods that contain point math for dragging of the dialog across the screen as well as resizing and centering the Dialog.  Although not currently implemented, this partial class can also contain entrance and exit animation effects.&lt;/li&gt;&lt;li&gt;The &lt;span style="font-weight: bold;"&gt;DialogFactory&lt;/span&gt; partial class contains the internal constructor, and processors for configuring buttons, handlig events, configuring modality and so on.  DialogFactory appropriately delegates control to FrameImpl and binds app developer's handlers to events generated by FrameImpl.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;DialogFactory has no associated XAML.  It is purely a C# factory that uses the Popup primitive alongside a masking Canvas and a draggable Border to provide the modal popup behavior for any passed in Control.  The Control is, of course, wrapped in a FrameImpl.&lt;br /&gt;&lt;br /&gt;As a side-note, DialogFactory does account for a known Popup/Pulldown bug that causes Silverlight to crash.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Project Structure&lt;/span&gt;&lt;br /&gt;The Solution is split into three Projects:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Controls lib - the framework is contained in a standalone controls dll.  It needs to be referenced in your projects.  If you are implementing controls for your company, odds are they are in a separate library so that multiple apps can use them.  The idea is the same here, even though this demo only has one control!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A Silverlight App - this contains a DialogDemo UserControl that exercises the DialogFramework.Show() istantiators and some sample Controls to be passed into the initializer.&lt;/li&gt;&lt;li&gt;ASP.NET project - this is the project that loads (2).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Run the Demo&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download the code and open it in VS.&lt;/li&gt;&lt;li&gt;Make sure that the ASP.NET project is set as the executing default.  A form that allows you to play with DialogFramework will come up with your browser.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;The Code. The code!&lt;/span&gt;&lt;br /&gt;Again, you can download the code from: &lt;a href="http://yuriy.org/downloads/org.yuriy.Silverlight.DialogFramework.zip"&gt;http://yuriy.org/downloads/org.yuriy.Silverlight.DialogFramework.zip&lt;/a&gt;. It is released under LGPL. I believe it is decently well documented and provides insights into my implementation choices.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Acknolwedgements&lt;/span&gt;&lt;br /&gt;This was my first deep dive into Silverlight.  I read articles from many developers.  The work I present here is a synthesis of great work from several authors, notably:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Azret: &lt;a href="http://community.devexpress.com/blogs/theonewith/archive/2008/08/06/custom-silverlight-controls-creating-a-reusable-messagebox-dialog-part-i.aspx"&gt;http://community.devexpress.com/blogs/theonewith/archive/2008/08/06/custom-silverlight-controls-creating-a-reusable-messagebox-dialog-part-i.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Mike Taulty - &lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/08/18/10670.aspx"&gt;http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/08/18/10670.aspx&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;DevDave: &lt;a href="http://blogs.msdn.com/devdave/archive/2008/06/08/using-popup-to-create-a-dialog-class.aspx"&gt;http://blogs.msdn.com/devdave/archive/2008/06/08/using-popup-to-create-a-dialog-class.aspx&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-1160334404085024027?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=NLVbfNeLP-0:OW3heZCUtHo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=NLVbfNeLP-0:OW3heZCUtHo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=NLVbfNeLP-0:OW3heZCUtHo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=NLVbfNeLP-0:OW3heZCUtHo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=NLVbfNeLP-0:OW3heZCUtHo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=NLVbfNeLP-0:OW3heZCUtHo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=NLVbfNeLP-0:OW3heZCUtHo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=NLVbfNeLP-0:OW3heZCUtHo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/NLVbfNeLP-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/1160334404085024027/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=1160334404085024027" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/1160334404085024027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/1160334404085024027?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/NLVbfNeLP-0/building-modal-popup-framework-with.html" title="Building a Modal Popup Framework with Silverlight" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Hi94bdcu3SI/SXoc5r62h7I/AAAAAAAAAU4/D3DC7n1YU2g/s72-c/DialogFrameworkDemo.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.yuriy.org/2009/01/building-modal-popup-framework-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MDQn89eip7ImA9WxVTE0g.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-7710801741441303157</id><published>2008-12-26T20:05:00.028-05:00</published><updated>2008-12-27T00:24:33.162-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-27T00:24:33.162-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="silverlight" /><title>A Solution to DataGrid with Tooltips Shortcomings</title><content type="html">&lt;span style="font-weight: bold;"&gt;DataGrid with a Custom RowDetailsTemplate&lt;/span&gt;&lt;br /&gt;Silverlight RTM has a DataGrid control.  To learn more about basic usage, please refer to &lt;a href="http://blogs.msdn.com/scmorris/archive/2008/03/21/using-the-silverlight-datagrid.aspx"&gt;http://blogs.msdn.com/scmorris/archive/2008/03/21/using-the-silverlight-datagrid.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Beyond the basics, DataGrid has a few shortcomings.  Let's say we have a static DataGrid declaration that looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;data:datagrid name="dg" rowdetailsvisibilitymode="Visible"&gt;&lt;br /&gt;&lt;data:datagrid.rowdetailstemplate&gt;&lt;br /&gt; &lt;datatemplate&gt;&lt;br /&gt;  &lt;grid&gt;&lt;br /&gt;   &lt;tooltipservice.tooltip&gt;&lt;br /&gt;    &lt;tooltip&gt;&lt;br /&gt;     &lt;tooltip.content&gt;&lt;br /&gt;      &lt;stackpanel orientation="Horizontal"&gt;&lt;br /&gt;       &lt;controls:framedcontentblock width="300" height="300"&gt;&lt;br /&gt;        &lt;controls:framedcontentblock.headercontent&gt;&lt;br /&gt;         &lt;stackpanel orientation="Horizontal"&gt;                                 &lt;br /&gt;          &lt;textblock text="Record # "&gt;&lt;/textblock&gt;&lt;br /&gt;          &lt;textblock text="{Binding ID}"&gt;&lt;/textblock&gt;&lt;br /&gt;         &lt;/stackpanel&gt;&lt;br /&gt;        &lt;/controls:framedcontentblock.headercontent&gt;&lt;br /&gt;       &lt;controls:framedcontentblock.bodycontent&gt;&lt;br /&gt;        &lt;stackpanel orientation="Horizontal"&gt;&lt;br /&gt;         &lt;textblock text="{Binding FirstName}"&gt;&lt;br /&gt;         &lt;textblock text=" "&gt;&lt;br /&gt;         &lt;textblock text="{Binding LastName}"&gt;&lt;br /&gt;         &lt;textblock text=" is "&gt;&lt;br /&gt;         &lt;textblock text="{Binding Age}"&gt;&lt;br /&gt;         &lt;textblock text=" years old."&gt;&lt;br /&gt;        &lt;/textblock&gt;&lt;br /&gt;       &lt;/textblock&gt;&lt;br /&gt;       &lt;stackpanel orientation="Horizontal"&gt;&lt;br /&gt;        &lt;textblock text="Record #"&gt;&lt;br /&gt;        &lt;textblock text="{Binding ID}"&gt;&lt;br /&gt;       &lt;/textblock&gt;&lt;br /&gt;      &lt;/textblock&gt;&lt;br /&gt;     &lt;/stackpanel&gt;&lt;br /&gt;    &lt;/textblock&gt;&lt;br /&gt;   &lt;/textblock&gt;&lt;br /&gt;  &lt;/textblock&gt;&lt;/textblock&gt;&lt;br /&gt; &lt;/stackpanel&gt;&lt;br /&gt;&lt;/controls:framedcontentblock.bodycontent&gt;&lt;br /&gt;&lt;/controls:framedcontentblock&gt;&lt;/stackpanel&gt;&lt;/tooltip.content&gt;&lt;/tooltip&gt;&lt;/tooltipservice.tooltip&gt;&lt;/grid&gt;&lt;/datatemplate&gt;&lt;/data:datagrid.rowdetailstemplate&gt;&lt;/data:datagrid&gt;&lt;/pre&gt;&lt;br /&gt;Where the ItemsSource of the DataGrid is defined by a List&lt;griddata&gt; collection:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;public class GridData&lt;br /&gt;{&lt;br /&gt; public int ID { get; set; }&lt;br /&gt; public string FirstName { get; set; }&lt;br /&gt; public string LastName { get; set; }&lt;br /&gt; public int Age { get; set; }&lt;br /&gt; public bool Available { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DataContext of Grid not associated with ToolTip's DataContext by default&lt;/span&gt;&lt;br /&gt;The first annoyance is ToolTip does not inherit the DataContext (entry in the List&lt;griddata&gt;) associated with the Row that contains it.  Compiling the above code will result in the Record # binding picking up the correct Binding while the custom ToolTip.Content will not.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hi94bdcu3SI/SVWEgsGLqyI/AAAAAAAAATE/yOL8HJAnnuM/s1600-h/122708_0050_SolutiontoD1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 367px;" src="http://1.bp.blogspot.com/_Hi94bdcu3SI/SVWEgsGLqyI/AAAAAAAAATE/yOL8HJAnnuM/s400/122708_0050_SolutiontoD1.png" alt="" id="BLOGGER_PHOTO_ID_5284275434916916002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Solution&lt;/span&gt; is to add a handler for a Loaded Event to the Grid that begins our DataTemplate definition:&lt;br /&gt;&lt;pre name="code" style="xml"&gt; &lt;grid loaded="Grid_DataContext_Fixer"&gt;&lt;br /&gt; &amp;lt;grid loaded=&amp;quot;Grid_DataContext_Fixer&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;tooltipservice.tooltip&amp;gt;&lt;br /&gt;   &amp;lt;tooltip&amp;gt;&amp;lt;/tooltip&amp;gt;&lt;br /&gt;  &amp;lt;/tooltipservice.tooltip&amp;gt;&lt;br /&gt; &amp;lt;/grid&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Inside the handler, we use the ToolTipService to manually set Grid's DataContext to the DataContext of the Tooltip like so:&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;private void Grid_DataContext_Fixer(object sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt; ToolTip t = ToolTipService.GetToolTip(sender as Grid) as ToolTip;&lt;br /&gt; t.DataContext = (sender as Grid).DataContext;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The ToolTip will now properly understand the binding.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hi94bdcu3SI/SVWFtG2g60I/AAAAAAAAATM/HxWIul6NSAU/s1600-h/122708_0050_SolutiontoD2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 361px;" src="http://4.bp.blogspot.com/_Hi94bdcu3SI/SVWFtG2g60I/AAAAAAAAATM/HxWIul6NSAU/s400/122708_0050_SolutiontoD2.png" alt="" id="BLOGGER_PHOTO_ID_5284276747769015106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sorting DataGrid will break ToolTip associations&lt;/span&gt;&lt;br /&gt;When user sorts the DataGrid ToolTips are not re-ordered along with the view.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hi94bdcu3SI/SVWGN-xr3zI/AAAAAAAAATU/C7mVCGrZPVY/s1600-h/122708_0050_SolutiontoD3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 364px;" src="http://2.bp.blogspot.com/_Hi94bdcu3SI/SVWGN-xr3zI/AAAAAAAAATU/C7mVCGrZPVY/s400/122708_0050_SolutiontoD3.png" alt="" id="BLOGGER_PHOTO_ID_5284277312536960818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Why this happens is not clear.  ToolTipService does bind to the right Object reference yet the DataContext remains tied to the ordering of items in the original List&lt;griddata&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; A Solution.&lt;/span&gt;  This time we add a MouseEnter event handler to the same Grid.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" style="xml"&gt;&lt;br /&gt;&amp;lt;grid loaded=&amp;quot;Grid_DataContext_Fixer&amp;quot; mouseenter=&amp;quot;Grid_DataContext_Fixer&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;tooltipservice.tooltip&amp;gt;&lt;br /&gt; &amp;lt;tooltip&amp;gt;...&amp;lt;/tooltip&amp;gt;&lt;br /&gt;&amp;lt;/tooltipservice.tooltip&amp;gt;&lt;br /&gt;&amp;lt;/grid&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In fact, the MouseEnter event will do exactly the same thing as before.  Namely, the Grid's context will be reassigned to the Tooltip.  As shown above, we handle both events with the same handler.&lt;br /&gt;&lt;br /&gt;We now get expected behavior.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hi94bdcu3SI/SVWGh2jMA6I/AAAAAAAAATc/akMpAboDYrc/s1600-h/122708_0050_SolutiontoD4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 366px;" src="http://3.bp.blogspot.com/_Hi94bdcu3SI/SVWGh2jMA6I/AAAAAAAAATc/akMpAboDYrc/s400/122708_0050_SolutiontoD4.png" alt="" id="BLOGGER_PHOTO_ID_5284277653926052770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you have a better solution, please do provide feedback in the Comments.&lt;/griddata&gt;&lt;/griddata&gt;&lt;/griddata&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-7710801741441303157?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=zev2juzKwmY:HkRehxl3_D4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=zev2juzKwmY:HkRehxl3_D4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=zev2juzKwmY:HkRehxl3_D4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=zev2juzKwmY:HkRehxl3_D4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=zev2juzKwmY:HkRehxl3_D4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=zev2juzKwmY:HkRehxl3_D4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=zev2juzKwmY:HkRehxl3_D4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=zev2juzKwmY:HkRehxl3_D4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/zev2juzKwmY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/7710801741441303157/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=7710801741441303157" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7710801741441303157?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7710801741441303157?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/zev2juzKwmY/solution-to-datagrid-with-tooltips.html" title="A Solution to DataGrid with Tooltips Shortcomings" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Hi94bdcu3SI/SVWEgsGLqyI/AAAAAAAAATE/yOL8HJAnnuM/s72-c/122708_0050_SolutiontoD1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/12/solution-to-datagrid-with-tooltips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYESHY8cSp7ImA9WxRaFUU.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-8449572004567640786</id><published>2008-12-18T01:26:00.007-05:00</published><updated>2008-12-18T02:58:29.879-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-18T02:58:29.879-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business intelligence" /><category scheme="http://www.blogger.com/atom/ns#" term="e2.0" /><title>Twitter is Google Search in Reverse</title><content type="html">Remember the search interfaces of yester-years?  Pulldowns, check boxes, and operands defined the experience until Google stripped it all away.  The exposed input box felt naked next to its companions. Yet the babe had brawn.  Over the years the ubiquitous search box came to dominate content retrieval because of its simplicity, expressiveness, and relative clairvoyance.  You typed some text in, Google rewarded you with a best guess of information you must have been looking for.&lt;br /&gt;&lt;br /&gt;Our utterly selfish "give me" relationship with Google quickly earned Google medals in advertising. We were still putting enough "in" to Google's Engine for it to quasi-cleverly match up your key words with the highest-bidding, and content-relevant advertiser.&lt;br /&gt;&lt;br /&gt;Spin up to today and we have a similar input box delivering 140 characters of further indulgence.  "Give me" seemed to evolve social consciousness into an "I am".  Our passive-aggressive social cloud is bloated with micro-summaries of people's whereabouts, whatchados, grandiose plans colored by nuance and mediocrity.  And what with it? Nothing.  Or rather nothing much.&lt;br /&gt;&lt;br /&gt;Those still riding the web2.0-enabled Collaboration and Productivity opportunities are escaping email for what they hope to be a Twitter-gendered repose from Info Glut.  But this is naivete.  Every medium for communication will only alleviate over-saturated predecessors until usage turns into abuse-age.  A much savvier colleague of mine had an insight that, paraphrased, in the consumer world, Twitter creates communication where it does not already exist.  In the workplace, however, we are trying to better direct our information traffic, to reduce abuse, to improve relevancy, and tune interruption.&lt;br /&gt;&lt;br /&gt;Twitter is a cloud of unstructured data.  This data is time sensitive.  A classical use case is "What am I doing now?".  Stretched a bit we can evolve to "I am planning something right now that I will do shortly" and "I have just done something stranger and friends alike should know about".&lt;br /&gt;&lt;br /&gt;As is, this glorified presence system is prime for integration with our Instant Messaging Clients' Status Notes or Away Message.  But this is not very exciting.  As the significance of any single Twitter fades with passing seconds into oblivion, what are we, the Information Workers, gaining from such an exchange?  A Status Feed is great, but really, just the tip of the ice berg.&lt;br /&gt;&lt;br /&gt;Sometimes actual Knowledge is Twittered.  For example,  "I just read a great article on Silverlight about Animations at http://..." or "Firebug just crashed on me after visiting a site with Google Ads again!".&lt;br /&gt;&lt;br /&gt;The first sample is clearly relevant to people interested in Silverlight.  The second is clearly a bug report and a stability alarm.  Perhaps unfiltered noise in the consumer cloud but in the Enterprise access to these streams of consciousness is the very essence of the next generation's competitive edge.&lt;br /&gt;&lt;br /&gt;And so Twitter must become the reversed flow of Google-like search.&lt;br /&gt;&lt;br /&gt;In the Enterpise, search blankets our repositories and knowledge bases, constructing a uniform way for retrieval.  Twitters (micro-content, really) must be deconstructed and filed back in.  To be able to distinguish Status from Knowledge and to create on-demand availability of this type of information mashed up with related information is the cosmic pixie dust of the future.&lt;br /&gt;&lt;br /&gt;Speaking of the future, &lt;a href="http://venturebeat.com/2008/11/24/twitter-buys-a-company-closes-it-keeps-its-founderengineer/"&gt;Twitter recently acquired Values of n&lt;/a&gt; for &lt;a href="http://iwantsandy.com/"&gt;I Want Sandy&lt;/a&gt;, a personal digital secretary.  If Twitters about "right now" generate Knowledge then Twitters about the future must generate Activities.  Activities produce Knowledge: more Twitters, CRM information, documents, blog posts, etc.  When all this information is accounted for it truly seems that the personal Digital Assistant need not be so personal after all.&lt;br /&gt;&lt;br /&gt;To move beyond this "give me" towards a notion of Coordinated Intelligence, we will need to embrace Semantics, Context, Community-friendly Knowledge Management strategies, and that bit of nakedness.  I'll race you there.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-8449572004567640786?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=sdX8KQHNcKM:nqEyQwXvxPk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=sdX8KQHNcKM:nqEyQwXvxPk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=sdX8KQHNcKM:nqEyQwXvxPk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=sdX8KQHNcKM:nqEyQwXvxPk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=sdX8KQHNcKM:nqEyQwXvxPk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=sdX8KQHNcKM:nqEyQwXvxPk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=sdX8KQHNcKM:nqEyQwXvxPk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=sdX8KQHNcKM:nqEyQwXvxPk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/sdX8KQHNcKM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/8449572004567640786/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=8449572004567640786" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/8449572004567640786?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/8449572004567640786?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/sdX8KQHNcKM/twitter-is-inverse-of-google-search.html" title="Twitter is Google Search in Reverse" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/12/twitter-is-inverse-of-google-search.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcNRXg5eip7ImA9WxRRF08.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-5069307822969747579</id><published>2008-09-29T09:08:00.027-04:00</published><updated>2008-09-29T17:34:54.622-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-29T17:34:54.622-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="silverlight" /><title>Silverlight RC0 Custom Controls: App.xaml vs Generic.xaml</title><content type="html">&lt;span style="font-weight: bold;"&gt;Motivation&lt;/span&gt;&lt;br /&gt;Silverlight 2 RC0 is now available to developers and early adopters.  Summary of release and Breaking Changes are reproduced in my previous post available &lt;a href="http://e2pt0.blogspot.com/2008/09/silverlight-2-rc0-is-here.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Best Practices around developing Custom Controls is still a shaping story.  Many tutorials currently available on the web prefer the use of App.xaml or the UserControl itself for custom styling and templates.  In fact, Styles and Templates are still a bit confusing from a design and usage perspective.&lt;br /&gt;&lt;br /&gt;The existence of yet another option, the use of generic.xaml further confuses approach to styling.  For those of you who have been scratching their heads as much as I have been, I hope that the basics I'll outline in this and future posts will help the Silverlight community refine the "right" way approach Custom Control creation, Styling, and Templating.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Goals&lt;/span&gt;&lt;br /&gt;•  Propose strategy for using Generic.xaml and App.xaml&lt;br /&gt;•  Project structure should enable Control  Designers, Control Developers and Application Developers to work independently of one another.&lt;br /&gt;• Create a single Silverlight Control library of reusable Custom and User Controls, each  with customized Look-and-feel.&lt;br /&gt;• Look-and-Feel of each control needs to be "baked in" so that they can be used "as is" by our Application.&lt;br /&gt;• Controls should still be open to further styling and customization by the Application Developer at the application layer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements&lt;/span&gt;&lt;br /&gt;VS 2008 SP1, .net 3.5 SP1, Silverlight Tools with RC0 builds + SP1.  For download locations, see my previous post here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setup&lt;/span&gt;&lt;br /&gt;• a Silverlight Class Library called YControlsLib&lt;br /&gt;• a SilverlightApplication called YControlsDemo&lt;br /&gt;• allowed VS2008 to automagically generate a YControlsDemo.Web asp.net project to host YControlsDemo project&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Download The Solution&lt;br /&gt;&lt;/span&gt;The solution is available &lt;a href="http://digiglue.com/downloads/YControlsLib.zip"&gt;here&lt;/a&gt; for download.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;YControlsLib&lt;/span&gt;&lt;br /&gt;Here, I will wear the Control Developer and Control Designer hats.  The simplest control to play with, in my opinion, is the Button control.&lt;br /&gt;&lt;br /&gt;Controls can fall into three categories:&lt;br /&gt;1. Combine two or more basic controls into a single control&lt;br /&gt;2. Enhance a single, existing control&lt;br /&gt;3. Create something completely new from scratch&lt;br /&gt;&lt;br /&gt;My custom Button resides in the 2nd category.&lt;br /&gt;&lt;br /&gt;Because I am simply enriching an existing control I decided to subclass Button and create my own Custom Control, called Ybutton.  I will customize Button's look-and-feel.  Idea is to be able to use Ybutton with its custom style out-of-the-box in my Application, without the need to override the Button's template.&lt;br /&gt;&lt;br /&gt;Although subclassing does not always make sense, I do feel that there are clear benefits in this case:&lt;br /&gt;• For Application Developer, encapsulates control functionality and branding&lt;br /&gt;• Clearly differentiates your organization's control from the default&lt;br /&gt;• Allows you to customize certain behaviors of the control without modifying the original&lt;br /&gt;• Provides some protection against changes to the original control.  Subclassing or Wrapping (the former in this case) is perhaps an enterprise-friendly approach.&lt;br /&gt;&lt;br /&gt;I started with a simple .cs file without any XAML files.  This is what we can refer to as a lookless control stub.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;YButton.cs&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;namespace YControlsLib&lt;br /&gt;{&lt;br /&gt;public class YButton : Button&lt;br /&gt;{&lt;br /&gt;  public YButton()&lt;br /&gt;  {&lt;br /&gt;     this.DefaultStyleKey = typeof(YButton);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;DefaultStyleKey is important.  This is the only line of custom code needed to bind my custom Button to my custom Template.  This template is defined in &lt;span style="font-weight: bold;"&gt;generic.xaml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Themes/generic.xaml&lt;/span&gt;&lt;br /&gt;As per the Breaking Changes document, generic.xaml needs to reside within the Themes folder.  Your Application will not recognize the template binding if this file lives anywhere else.&lt;br /&gt;&lt;br /&gt;There is no template in VS for creating this file.  I just create a text file and modify its extension.  Also, it has to compiled as a Resource (not an Embedded Resource) for runtime and Blend to know what to do with it.  More on Blend later.&lt;br /&gt;&lt;br /&gt;Here is the basic layout:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODW-sgHeZI/AAAAAAAAAQI/0xapHq3OZh4/s1600-h/img1.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODW-sgHeZI/AAAAAAAAAQI/0xapHq3OZh4/s400/img1.png" alt="" id="BLOGGER_PHOTO_ID_5251433538100099474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;YControlsDemo/Page.xaml&lt;/span&gt;&lt;br /&gt;Page.xaml is authored by the Application Developer.   All Controls required for this project are made available to the App Developer via Silverlight's Default Controls library and the Controls provided by the YControlsLib dll.  For simplicity, the YControlLib project is simply referenced from YControlsDemo.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hi94bdcu3SI/SODXO1uMqLI/AAAAAAAAAQQ/ThIjrazNE4I/s1600-h/img2.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_Hi94bdcu3SI/SODXO1uMqLI/AAAAAAAAAQQ/ThIjrazNE4I/s400/img2.png" alt="" id="BLOGGER_PHOTO_ID_5251433815452985522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Page.xaml is the typical UserControl which defines one View from our Application.  Our App is effectively just a Demo of three Controls:&lt;br /&gt;i. Default Button&lt;br /&gt;ii. My custom button, Ybutton&lt;br /&gt;iii. Ybutton with a tweak from App Developer&lt;br /&gt;&lt;br /&gt;Page.xaml only contains:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt; &amp;lt;UserControl x:Class="YControlsDemo.Page"&lt;br /&gt; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt; xmlns:ycontrols="clr-namespace:YControlsLib;assembly=YControlsLib"&amp;gt;&lt;br /&gt; &amp;lt;StackPanel x:Name="LayoutRoot" Background="White" Orientation="Horizontal"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- (i) This is just a plain ol' boring Button --&amp;gt;&lt;br /&gt;&amp;lt;Button Width="100" Height="45" Content="Button"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- (ii) YButton inherits everything from above Button but also contains it's own&lt;br /&gt;template.  Because the custom  template is inherent to the control, App&lt;br /&gt;Developer can use it as is --&amp;gt;&lt;br /&gt;&amp;lt;ycontrols:YButton Width="100" Height="45" Content="YButton"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- (iii) This is a YButton with a custom Style that App Owner defines in App.xaml.&lt;br /&gt;Useful for disobeying your company's Branding guidelines --&amp;gt;&lt;br /&gt;       &amp;lt;ycontrols:YButton Width="100" Height="45" Content="Ybutton Style"&lt;br /&gt;       Style="{StaticResource TweakedYButtonStyle}"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- (iv) This is a YButton with a custom DataTemplate --&amp;gt;&lt;br /&gt;&amp;lt;ycontrols:YButton Width="100" Height="45"&lt;br /&gt;ContentTemplate="{StaticResource YButtonCustom}"/&amp;gt;&lt;br /&gt; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;lt;/UserControl&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Since we have not yet completed Ybutton with it's custom Template nor defined any custom Style, our Designer will only show us the default Button:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODYY_iaoeI/AAAAAAAAAQY/qFO61ruxpr8/s1600-h/img3.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODYY_iaoeI/AAAAAAAAAQY/qFO61ruxpr8/s400/img3.png" alt="" id="BLOGGER_PHOTO_ID_5251435089398243810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;Back to Themes/generic.xaml&lt;/span&gt;&lt;br /&gt;We now need to wear the Control Designer hat.  For this, we need to use Expression Blend.  The SP1 Preview still does not handle Generic.xaml too well.  Because my YButton Control is lookless, Blend will not understand that I want to create a custom template and keep it in Generic.xaml.&lt;br /&gt;&lt;br /&gt;For a bit of a work-around, I created a UserControl (similar to Page.xaml) called ControlsForBlendsBenefit.xaml.  This goes directly into the YControlLib project.  This item will contain a plain Button and my Ybutton.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ControlsForBlendsBenefit.xaml&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt; &amp;lt;UserControl x:Class="YControlsLib.ControlsForBlend"&lt;br /&gt; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt; Width="400" Height="300"&lt;br /&gt; xmlns:local="clr-namespace:YControlsLib;assembly=YControlsLib"&amp;gt;&lt;br /&gt; &amp;lt;StackPanel x:Name="LayoutRoot" Background="White" Orientation="Vertical"&amp;gt;&lt;br /&gt;    &amp;lt;Button Width="100" Height="45" Content="Button"/&amp;gt;&lt;br /&gt;     &amp;lt;local:YButton Width="100" Height="45" Content="YButton"/&amp;gt;&lt;br /&gt; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;lt;/UserControl&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;The Button is there so that I can "Edit a Copy" of it's default template within Blend.  I will be tethering this modified copy to YButton, making it the Default Template.&lt;br /&gt;&lt;br /&gt;Now, I right-click on the xaml file and "Open in Expression Blend..."&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hi94bdcu3SI/SODY7JzWfAI/AAAAAAAAAQg/bRIN1qCDC0g/s1600-h/img4.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_Hi94bdcu3SI/SODY7JzWfAI/AAAAAAAAAQg/bRIN1qCDC0g/s400/img4.png" alt="" id="BLOGGER_PHOTO_ID_5251435676269181954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Now, Right-Click on Button and select to "Edit a Copy…" of the Button's template.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hi94bdcu3SI/SODZKoWRVgI/AAAAAAAAAQo/ppsdV0eSWgA/s1600-h/img5.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_Hi94bdcu3SI/SODZKoWRVgI/AAAAAAAAAQo/ppsdV0eSWgA/s400/img5.png" alt="" id="BLOGGER_PHOTO_ID_5251435942166746626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;We'll be doing moving generated content around anyway, so where we put the Copy of Button's default template is not very important.  I'll put it within &lt;span style="font-weight: bold;"&gt;ControlsForBlendsBenefit.xaml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hi94bdcu3SI/SODZb_JbXKI/AAAAAAAAAQw/4xIiL1y2xJ0/s1600-h/img6.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_Hi94bdcu3SI/SODZb_JbXKI/AAAAAAAAAQw/4xIiL1y2xJ0/s400/img6.png" alt="" id="BLOGGER_PHOTO_ID_5251436240344669346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Notice that the dialog below is asking me for a Name/Key.  This is the Key that allows an Application view to specify a Style={StaticResource ButtonStyle1}.  This is where things get a bit confusing.  Silverlight provides two ways of overriding Look-and-Feel of controls.  One is through a replacement of the Template itself, or one by simply Key-ing a new Style.  The Style can reside within App.xaml or in a more localized location, the UserControl, or even more scoped, within the Control itself.   The way that Blend generates this Style, the Style will contain the copy of the Template.  My Button will have to use the Style attribute to access it.  This is not what we want.  But for Blend's sake, we'll work through it this way.&lt;br /&gt;&lt;br /&gt;If we peek into the code of ControlsForBlendsBenefit.xaml we'll see something like:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;UserControl x:Class="YControlsLib.ControlsForBlend"&lt;br /&gt; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt; Width="400" Height="300"&lt;br /&gt; xmlns:local="clr-namespace:YControlsLib;assembly=YControlsLib" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"&amp;gt;&lt;br /&gt;&amp;lt;UserControl.Resources&amp;gt;&lt;br /&gt;&amp;lt;Style x:Key="ButtonStyle1" TargetType="Button"&amp;gt;&lt;br /&gt;&amp;lt;Setter Property="Background" Value="#FF1F3B53"/&amp;gt;&lt;br /&gt;&amp;lt;Setter Property="Foreground" Value="#FF000000"/&amp;gt;&lt;br /&gt;&amp;lt;Setter Property="Padding" Value="3"/&amp;gt;&lt;br /&gt;&amp;lt;Setter Property="BorderThickness" Value="1"/&amp;gt;&lt;br /&gt;&amp;lt;Setter Property="BorderBrush"&amp;gt;&lt;br /&gt; …&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;After customizing these pieces from Blend, it is the code block beginning with &lt;style&gt;&lt;/style&gt; that will make its way over to Generic Xaml.  In fact, we can do so now and continue editing from within &lt;span style="font-weight: bold;"&gt;generic.xaml&lt;/span&gt;.  Perhaps, for the final release, the Silverlight team will make working with &lt;span style="font-weight: bold;"&gt;generic.xaml&lt;/span&gt; a bit more straight-forward.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generic.xaml Revisited&lt;/span&gt;&lt;br /&gt;This file will now include a copy of Button's default  Template:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;ResourceDictionary&lt;br /&gt; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt; xmlns:local="clr-namespace:YControlsLib;assembly=YControlsLib"&amp;gt;&lt;br /&gt; &amp;lt;Style x:Key="ButtonStyle1" TargetType="Button"&amp;gt;&lt;br /&gt;…&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;You will notice many &lt;vsm:*&gt; prefixes adorning VisualState prooerties in the newly crafted generic.xaml .  Visual Studio does not like these.  They are relics left behind by Blend.  Looks like it is yet another quirk that the Silverlight Team needs to work out.  A forum post for this is here:&lt;a href="http://silverlight.net/forums/t/23959.aspx"&gt; http://silverlight.net/forums/t/23959.aspx&lt;/a&gt;.  I'll just "Quick Search/Replace" the "vsm:" bits into nothingness.&lt;br /&gt;&lt;br /&gt;The last bit of work to complete here is to remove the generated UserControl.Resources and Style markup from the &lt;span style="font-weight: bold;"&gt;ControlsForBlendsBenefit.xaml&lt;/span&gt;.  Remember, we are not going for inline styles.  We want to override Ybutton's default Template.&lt;br /&gt;&lt;br /&gt;If you are switching between VS and Blend, you may need to recompile your Project in VS for the new generic.xaml to properly expose Templates within Resources tab in the upper right corner.&lt;br /&gt;&lt;br /&gt;Once Blend reload the project you should now see something like this:&lt;br /&gt;&lt;br /&gt;&lt;/vsm:*&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hi94bdcu3SI/SODaTTG3vlI/AAAAAAAAAQ4/Ok13o7F4ETg/s1600-h/img7.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_Hi94bdcu3SI/SODaTTG3vlI/AAAAAAAAAQ4/Ok13o7F4ETg/s400/img7.png" alt="" id="BLOGGER_PHOTO_ID_5251437190595460690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;We will be Editing the ButtonStyle1 resource from now on.  After selecting the Resource for Edit (right-most button along-side the ButtonStyle1), we can click on the icon in the left-most corner and "Edit the Template" itself.&lt;br /&gt;&lt;br /&gt;We should now see all the Parts and States of the Button Template we will be customizing.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hi94bdcu3SI/SODagKseMUI/AAAAAAAAARA/3jNdJqLO4bI/s1600-h/img8.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_Hi94bdcu3SI/SODagKseMUI/AAAAAAAAARA/3jNdJqLO4bI/s400/img8.png" alt="" id="BLOGGER_PHOTO_ID_5251437411675550018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;I'll simply customize some gradients to give this Button template an overall Orange hue.&lt;br /&gt;&lt;br /&gt;Finally, the last step is to apply the Style and Templates to YButton only.  This is done by replacing &lt;span style="font-weight: bold;"&gt;TargetType="Button"&lt;/span&gt; with &lt;span style="font-weight: bold;"&gt;TargetType="local:YButton"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Themes/generic.xaml is now:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt; &amp;lt;ResourceDictionary&lt;br /&gt; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt; xmlns:local="clr-namespace:YControlsLib;assembly=YControlsLib"&amp;gt;&lt;br /&gt; &amp;lt;Style TargetType="local:YButton"&amp;gt;&lt;br /&gt;     &amp;lt;Setter Property="Background" Value="#FF1F3B53"/&amp;gt;&lt;br /&gt;     &amp;lt;Setter Property="Foreground" Value="#FF000000"/&amp;gt;&lt;br /&gt;     &amp;lt;Setter Property="Padding" Value="3"/&amp;gt;&lt;br /&gt;     &amp;lt;Setter Property="BorderThickness" Value="1"/&amp;gt;&lt;br /&gt;     &amp;lt;Setter Property="BorderBrush"&amp;gt;&lt;br /&gt;         &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;             …&lt;br /&gt;         &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;     &amp;lt;/Setter&amp;gt;&lt;br /&gt;     &amp;lt;Setter Property="Template"&amp;gt;&lt;br /&gt;         &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;             &amp;lt;ControlTemplate TargetType="local:YButton"&amp;gt;&lt;br /&gt;                 &amp;lt;Grid&amp;gt;&lt;br /&gt;                     …&lt;br /&gt;                 &amp;lt;/Grid&amp;gt;&lt;br /&gt;             &amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;         &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;     &amp;lt;/Setter&amp;gt;&lt;br /&gt; &amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;lt;/ResourceDictionary&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Editing Styles in App.xaml&lt;/span&gt;&lt;br /&gt;After rebuilding the solution, we should now see the following in the ControlsForBlendsBenefit.xaml:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hi94bdcu3SI/SODbBv2xjiI/AAAAAAAAARI/omv8qMEjevM/s1600-h/img9.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_Hi94bdcu3SI/SODbBv2xjiI/AAAAAAAAARI/omv8qMEjevM/s400/img9.png" alt="" id="BLOGGER_PHOTO_ID_5251437988586556962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;The markup inside is simply:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;UserControl x:Class="YControlsLib.ControlsForBlend"&lt;br /&gt; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt; Width="400" Height="300"&lt;br /&gt; xmlns:local="clr-namespace:YControlsLib;assembly=YControlsLib" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;StackPanel x:Name="LayoutRoot" Background="White" Orientation="Vertical"&amp;gt;&lt;br /&gt;    &amp;lt;Button Width="100" Height="45" Content="Button"/&amp;gt;&lt;br /&gt;     &amp;lt;local:YButton Width="100" Height="45" Content="YButton"/&amp;gt;&lt;br /&gt; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;lt;/UserControl&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div style="text-align: left;"&gt;Notice, there is no Styling within the View.  We have successfully encapsulated the custom template to the YButton Custom Control!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Back to our YControlsDemo&lt;/span&gt;&lt;br /&gt;YControlsDemo simply references the YControlsLib as a DLL containing our Custom Controls.  The code of our Page.xaml is still:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt; &amp;lt;UserControl x:Class="YControlsDemo.Page"&lt;br /&gt; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt; xmlns:ycontrols="clr-namespace:YControlsLib;assembly=YControlsLib"&amp;gt;&lt;br /&gt; &amp;lt;StackPanel x:Name="LayoutRoot" Background="White" Orientation="Horizontal"&amp;gt;&lt;br /&gt;     &amp;lt;Button Width="100" Height="45" Content="Button"/&amp;gt;&lt;br /&gt;     &amp;lt;ycontrols:YButton Width="100" Height="45" Content="YButton"/&amp;gt;&lt;br /&gt;     &amp;lt;ycontrols:YButton Width="100" Height="45" Content="YButton2"&lt;br /&gt;Style="{StaticResource YButtonStyle}"/&amp;gt;&lt;br /&gt; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/UserControl&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;But now the Preview shows us:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODbubGk5AI/AAAAAAAAARQ/v-O0KG_WZn8/s1600-h/img10.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODbubGk5AI/AAAAAAAAARQ/v-O0KG_WZn8/s400/img10.png" alt="" id="BLOGGER_PHOTO_ID_5251438756109804546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hi94bdcu3SI/SODcMHimNaI/AAAAAAAAARY/HzdX7TlSm7k/s1600-h/img11.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_Hi94bdcu3SI/SODcMHimNaI/AAAAAAAAARY/HzdX7TlSm7k/s400/img11.png" alt="" id="BLOGGER_PHOTO_ID_5251439266254697890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;I will simply rotate the Button a bit and change the Background gradient.  My end-result is:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODccOFZDoI/AAAAAAAAARg/2jwKzZEhOOo/s1600-h/img12.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODccOFZDoI/AAAAAAAAARg/2jwKzZEhOOo/s400/img12.png" alt="" id="BLOGGER_PHOTO_ID_5251439542889156226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;Extra Credit: Editing the Ybutton's DataTemplate within App.xaml&lt;/span&gt;&lt;br /&gt;The last tweak I will introduce is one introducing DataTemplate.   Plain ol' Button has a simple TextBlock at its heart.  What if I want something a bit more expressive while retaining the overall Template and Style of the Ybutton?&lt;br /&gt;&lt;br /&gt;Solution is to use Blend to only Edit the DataTemplate of the 4th Control.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hi94bdcu3SI/SODcvE-Au1I/AAAAAAAAARo/1mTEpH__A7I/s1600-h/img13.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_Hi94bdcu3SI/SODcvE-Au1I/AAAAAAAAARo/1mTEpH__A7I/s400/img13.png" alt="" id="BLOGGER_PHOTO_ID_5251439866859797330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;To keep things simple, I only introduced a two-column Grid layout with an Elipse in the first Column and a static TextBlock in the second Column.&lt;br /&gt;&lt;br /&gt;Resulting manifestation of YButton is:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hi94bdcu3SI/SODc45f1IxI/AAAAAAAAARw/uJ4Ci5y3CHU/s1600-h/img14.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_Hi94bdcu3SI/SODc45f1IxI/AAAAAAAAARw/uJ4Ci5y3CHU/s400/img14.png" alt="" id="BLOGGER_PHOTO_ID_5251440035579110162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;App.xaml&lt;br /&gt;&lt;/span&gt;The resulting App.xaml in YControldDemo is then&lt;span style="font-weight: bold;"&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre style="font-weight: normal;"&gt;&amp;lt;Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt;       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt;       x:Class="YControlsDemo.App"&lt;br /&gt;       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"&lt;br /&gt;       xmlns:YControlsLib="clr-namespace:YControlsLib;assembly=YControlsLib" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"&lt;br /&gt;       &amp;gt;&lt;br /&gt;&amp;lt;Application.Resources&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;DataTemplate x:Key="YButtonCustom"&amp;gt;&lt;br /&gt;&amp;lt;Grid ShowGridLines="False"&amp;gt;&lt;br /&gt; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;  &amp;lt;RowDefinition Height="Auto"/&amp;gt;&lt;br /&gt; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt; &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;  &amp;lt;ColumnDefinition Width="40"/&amp;gt;&lt;br /&gt;  &amp;lt;ColumnDefinition Width="60"/&amp;gt;&lt;br /&gt; &amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;br /&gt; &amp;lt;Ellipse Grid.Row="0" Grid.Column="0" Margin="5,0,5,0" HorizontalAlignment="Stretch"&amp;gt;&lt;br /&gt;  &amp;lt;Ellipse.Fill&amp;gt;&lt;br /&gt;   &amp;lt;RadialGradientBrush&amp;gt;&lt;br /&gt;    &amp;lt;GradientStop Color="#FFF4F3ED"/&amp;gt;&lt;br /&gt;    &amp;lt;GradientStop Color="#FFE27259" Offset="1"/&amp;gt;&lt;br /&gt;   &amp;lt;/RadialGradientBrush&amp;gt;&lt;br /&gt;  &amp;lt;/Ellipse.Fill&amp;gt;&lt;br /&gt; &amp;lt;/Ellipse&amp;gt;&lt;br /&gt; &amp;lt;TextBox Text="Click Me" TextWrapping="Wrap" Grid.Row="0" Grid.Column="1" Background="{x:Null}" BorderBrush="{x:Null}"/&amp;gt;&lt;br /&gt;&amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Style x:Key="YButtonStyle" TargetType="YControlsLib:YButton"&amp;gt;&lt;br /&gt;...  &lt;br /&gt;&amp;lt;/Style&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/Application.Resources&amp;gt;&lt;br /&gt;&amp;lt;/Application&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;Done.&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Rebuilding the solution, our Silverlight RC0 Demo App looks like:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hi94bdcu3SI/SODeM3BEuSI/AAAAAAAAAR4/ewaDM-mlfE8/s1600-h/img15.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_Hi94bdcu3SI/SODeM3BEuSI/AAAAAAAAAR4/ewaDM-mlfE8/s400/img15.png" alt="" id="BLOGGER_PHOTO_ID_5251441478022248738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;In this post, I've attempted to exercise three of multiple roles commonly played on a large project:&lt;br /&gt;1. Control Designer&lt;br /&gt;2. Control Developer&lt;br /&gt;3. Application Developer&lt;br /&gt;&lt;br /&gt;Using both Visual Studio 2008 SP1 + Silverlight Tools as well as Expression Blend RC0 Preview, I subclassed a regular Button so as to completely encapsulate a custom Look-and-Feel for my version of the Button without having to re-instrument the entire control.  Through the use of Generic.xaml in the Themes folder of my Control Lib, I was able to specify my custom Template and Styling for my button while giving the Application Developer a simple Control, YButton.&lt;br /&gt;&lt;br /&gt;I also submitted a bit of extra credit by demonstrating how Application Developers retain flexibility to further modify Data Templates and the Content Templates of Custom Controls within App.xaml.&lt;br /&gt;&lt;br /&gt;So what is App.xaml vs Generic.xaml.  Generic.xaml is a compiled Resource.  Silverlight is hardwired to look for default Templates within Generic.xaml.  It is ideal for providing custom templates for a Control Lib.  It will travel with the Control Lib without the need for further intervention by the Application Developer.  It permits custom control look-and-feel out-of-the-box.  App.xaml is simply a scoping mechanism for providing nuance Styling and Templates for the given Application only.  To port Styles and Templates within App.xaml to other application, one would have to copy over App.xaml itself.&lt;br /&gt;&lt;br /&gt;Hope this helps shed additional light on Custom Controls, the Silverlight 2 RC0 way!  If you wish to download the entire Project, the zip archive is available &lt;a href="http://digiglue.com/downloads/YControlsLib.zip"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Articles from fellow Bloggers&lt;br /&gt;&lt;/span&gt;I've spent much time reading other great Blog entries.  Some of them are below:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/25/silverlight-2-release-candidate-now-available.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2008/09/25/silverlight-2-release-candidate-now-available.aspx&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.c-sharpcorner.com/UploadFile/mdobbles/SkinnableCustomControl08212008084459AM/SkinnableCustomControl.aspx"&gt;http://www.c-sharpcorner.com/UploadFile/mdobbles/SkinnableCustomControl08212008084459AM/SkinnableCustomControl.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tocode.blogspot.com/2008/04/silverlight-2-custom-controls-vs-user.html"&gt;http://tocode.blogspot.com/2008/04/silverlight-2-custom-controls-vs-user.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/silverlight/mediabutton.aspx"&gt;http://www.codeproject.com/KB/silverlight/mediabutton.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc721611.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/cc721611.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://silverlight.net/blogs/jesseliberty/archive/2008/09/21/creating-custom-controls-a-common-starter-application.aspx"&gt;http://silverlight.net/blogs/jesseliberty/archive/2008/09/21/creating-custom-controls-a-common-starter-application.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://silverlight.net/learn/tutorials/stylestemplatesvsm.aspx"&gt;http://silverlight.net/learn/tutorials/stylestemplatesvsm.aspx&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-5069307822969747579?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=THn-LScJyf4:c0CUUEQg6Pw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=THn-LScJyf4:c0CUUEQg6Pw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=THn-LScJyf4:c0CUUEQg6Pw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=THn-LScJyf4:c0CUUEQg6Pw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=THn-LScJyf4:c0CUUEQg6Pw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=THn-LScJyf4:c0CUUEQg6Pw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=THn-LScJyf4:c0CUUEQg6Pw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=THn-LScJyf4:c0CUUEQg6Pw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/THn-LScJyf4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/5069307822969747579/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=5069307822969747579" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/5069307822969747579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/5069307822969747579?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/THn-LScJyf4/silverlight-rc0-custom-controls-appxaml_3894.html" title="Silverlight RC0 Custom Controls: App.xaml vs Generic.xaml" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Hi94bdcu3SI/SODW-sgHeZI/AAAAAAAAAQI/0xapHq3OZh4/s72-c/img1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/09/silverlight-rc0-custom-controls-appxaml_3894.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QMQHc9fyp7ImA9WxRRFk4.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-215577813009633877</id><published>2008-09-28T16:47:00.002-04:00</published><updated>2008-09-28T16:56:21.967-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-28T16:56:21.967-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="silverlight" /><title>Silverlight 2 RC0 is here!</title><content type="html">&lt;span xmlns=""&gt;&lt;p style="margin-left: 19pt;"&gt;&lt;strong&gt;RTM is a month away&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin-left: 19pt;"&gt;Silverlight 2 RC0 is here, or rather &lt;a href="http://silverlight.net/GetStarted/sl2rc0.aspx"&gt;here&lt;/a&gt;, which means that RTM is less than a month away!  Developers are asked to gain a head start on remediating Beta 2 applications.  For convenience, the links and Breaking Changes details are reproduced here.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 19pt;"&gt;&lt;strong&gt;Silverlight 2 RC0 Tools for Developers&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=129043"&gt;Microsoft Silverlight Tools for Visual Studio 2008 SP1&lt;/a&gt;&lt;br /&gt;     &lt;/div&gt;&lt;p&gt;This will install the necessary Visual Studio updates, Silverlight project templates, RC0 developer runtime, and SDK.&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;a href="http://www.microsoft.com/expression/try-it/default.aspx?filter=prerelease"&gt;Microsoft Expression Blend 2 Service Pack 1 Preview&lt;/a&gt;&lt;br /&gt;     &lt;/div&gt;&lt;p&gt;This version of Expression Blend is targeted to work with the RC0 developer runtime for Silverlight. &lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-left: 22pt;"&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Breaking Changes Since Beta 2&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 22pt;"&gt;This topic discusses the changes made to the Silverlight runtime and Silverlight tools between the Microsoft Silverlight 2 Beta 2 and the final release of Silverlight 2. The changes discussed in this article are focused on changes that might cause your older Silverlight-based applications to now fail or behave differently, &lt;span style="color:fuchsia;"&gt;&lt;strong&gt;not&lt;/strong&gt;&lt;/span&gt; on new features/enhancements for this release.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 22pt;"&gt;&lt;strong&gt;Note&lt;/strong&gt;   Corrections/Additions to this document (if any) are listed &lt;a href="http://go.microsoft.com/fwlink/?LinkId=119604"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 22pt;"&gt;&lt;strong&gt;Note&lt;/strong&gt;   Applications built with Beta 2 will not run on final runtime builds. End users will see a message informing them that the application was built with an obsolete version of Silverlight. You must rebuild your Beta 2 applications – see &lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;here&lt;/a&gt; for more information.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 22pt;"&gt;&lt;strong&gt;Tip&lt;/strong&gt;   Given the large number of API changes, particularly those listed in the Miscellaneous API Changes section, you may want to search this document by using CTRL+F.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 22pt;"&gt;&lt;strong&gt;Contents:&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Important! Migrating Older Code to the Newer Release&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;ContentPresenter now derives from FrameworkElement instead of Control&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Layout Rendering Slightly Changed&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Cross domain hosts of Silverlight must set the right MIME type for XAP (application/x-silverlight-app)&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Exceptions now thrown in HttpWebRequest.EndGetResponse()&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Font URI is Restricted to Assembly Resource&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Browser.HtmlElementCollection replaced with by Browser.ScriptObjectCollection&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Exceptions When Changing Some Properties on an Active Animation&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;System.Windows.Controls.Extended.dll renamed to System.Windows.Controls.dll&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;VisualStateManager Changes&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;KeyDown Sent Synchronously&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;MeasureOverride/ArrangeOverride on Canvas Now Sealed&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;UriTypeConverter moved to System.dll&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;HtmlPage.UnregisterScriptableObject Removed&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;RenderingEventArgs Changes&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;ContentPresenter and ContentControl Changes&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Removal of FileDialogFileInfo Type and OpenFileDialog.SelectedFile(s) Properties&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Removal of FullAccess Option on the ExternalCallersFromCrossDomain attribute in the Silverlight 2 application manifest&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;KeyFrameCollection Changes&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Request stream must be closed before calling HttpWebRequest.BeginGetResponse()&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;HtmlWindow references on Safari/Mac will no longer evaluate to true&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Address property removed from all WebClient EventArg classes&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Constructors Made Internal&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Exception type change for System.Xml exception type&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Cannot create classes in XAML that do not have accessible constructors&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Get AG_E_UNKNOWN_ERROR in Silverlight 2 but not in Silverlight 1&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Platform looks for generic.xaml as a resource at themes/generic.xaml&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;HTTP Polling Duplex OM Changes and Reengineering&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Breaking change to Silverlight native hosting IXcpControl COM interface&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Content-Type is allowed on cross domain request by default&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Enforcing delegate type check when two delegate objects are combined&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;&lt;span style="color:black;"&gt;Miscellaneous API Changes&lt;/span&gt;&lt;/a&gt;&lt;span style=";font-family:Symbol;color:black;"  &gt;&lt;br /&gt;      &lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Important! Migrating Older Code to the Newer Release&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If you are migrating Silverlight applications that were created for the Silverlight 2 Beta 2 release or earlier to the final release of Silverlight 2, you are going to need to get the newest Silverlight 2 Tools for Visual Studio 2008 and recompile your project(s).&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Get the newest version of Silverlight 2 Tools for Visual Studio 2008. You can get these tools from the SDK or online at &lt;a href="http://go.microsoft.com/fwlink/?LinkID=89558"&gt;Getting Started&lt;/a&gt;. You may have to uninstall any old tools before doing this install.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Open your old project (e.g. .csproj file). A dialog will come up notifying you that your project was created with an older version of Silverlight tools and asks you if you want to upgrade your project. Click the &lt;strong&gt;Yes&lt;/strong&gt; button. &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Open all of the HTML files and change:&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:black;"&gt;The Silverlight MIME type from &lt;strong&gt;application/x-silverlight-2-b1 &lt;/strong&gt;or &lt;strong&gt;application/x-silverlight-2-b2&lt;/strong&gt; to &lt;strong&gt;application/x-silverlight-2&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;The Silverlight installation URL from &lt;a href="http://go.microsoft.com/fwlink/?LinkID=124807"&gt;http://go.microsoft.com/fwlink/?LinkID=108182&lt;/a&gt; or &lt;a href="http://go.microsoft.com/fwlink/?LinkID=115261"&gt;http://go.microsoft.com/fwlink/?LinkID=115261&lt;/a&gt; to &lt;a href="http://go.microsoft.com/fwlink/?LinkID=124807"&gt;http://go.microsoft.com/fwlink/?LinkID=124807&lt;/a&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:black;"&gt;Note: some templates replaced &lt;a href="http://go/"&gt;&lt;/a&gt;&lt;/span&gt;&lt;a href="http://go/"&gt;http://go&lt;span style="color:black;"&gt; with &lt;/span&gt;&lt;/a&gt;&lt;a href="http://go2/"&gt;http://go2&lt;span style="color:black;"&gt;. Be sure to search for both.&lt;/span&gt;&lt;br /&gt;     &lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;Debug. Many of the breaking changes you are likely to encounter can be found in this document.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://go2/"&gt;&lt;br /&gt; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;a href="http://go2/"&gt;&lt;strong&gt;ContentPresenter now derives from FrameworkElement instead of Control&lt;br /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://go2/"&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Applications that use &lt;strong&gt;ContentPresenter&lt;/strong&gt; or objects derived from &lt;strong&gt;ContentPresenter&lt;/strong&gt;.&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://go2/"&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://go2/"&gt;Because &lt;strong&gt;ContentPresenter&lt;/strong&gt; now derives from &lt;strong&gt;FrameworkElement&lt;/strong&gt;, the following properties are no longer exposed by &lt;strong&gt;ContentPresenter&lt;/strong&gt;:&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;Background &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;BorderBrush &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;BorderThickness &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;DefaultStyleKey &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;FontFamily &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;FontSize &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;FontStretch &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;FontStyle &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;FontWeight &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;Foreground &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;HorizontalContentAlignment &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;IsEnabled &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;IsTabStop &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;Padding &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;TabIndex &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;TabNavigation &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;Template &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;&lt;a href="http://go2/"&gt;VerticalContentAlignment&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://go2/"&gt;&lt;br /&gt; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://go2/"&gt;In addition, some APIs were removed from ContentPresenter (see &lt;/a&gt;&lt;a href="file:///C:%5CDOCUME%7E1%5CYURIY_%7E1%5CLOCALS%7E1%5CTemp%5CBreakingChangesBetweenBeta2andRelease.doc"&gt;ContentPresenter and ContentControl Changes&lt;/a&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Remove all these obsolete properties from your &lt;strong&gt;ContentPresenter&lt;/strong&gt; objects, which will likely require you to re-work some of your code to restore your previous UI rendering.&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Layout Rendering Slightly Changed&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; All content using layout might be rendered slightly differently because layout no longer causes elements to be rendered at sub-pixel locations.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The layout system in Silverlight has been modified to round final measure and arrange values to integers when placing elements on the screen ("pixel snapping"). The result is crisper lines, more consistent rendering look, and fewer rendering artifacts.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Layout rounding will be *on* by default, but there is a new inherited property on &lt;strong&gt;UIElement&lt;/strong&gt; called &lt;strong&gt;UseLayoutRounding&lt;/strong&gt; that can be set to &lt;strong&gt;false&lt;/strong&gt; if the old layout behavior is desired.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;   It is possible that this change will affect how your animations render, in which case you might want to set &lt;strong&gt;UseLayoutRounding&lt;/strong&gt; to &lt;strong&gt;false&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;   This change does not affect transforms. If you apply a transform to an element, it may still be rendered at a sub-pixel location.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Cross domain hosts of Silverlight must set the right MIME type for XAP (application/x-silverlight-app)&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected: &lt;/strong&gt;Anyone serving Silverlight 2 apps from cross domain:&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Via a web server that is not IIS7&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;Via a web server where the MIME type for .XAP files is incorrectly configured &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Summary/Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When the XAP is served from a different domain than the host HTML page, Silverlight will validate that the MIME type (Content-Type response header) returned on the HTTP response is &lt;strong&gt;application/x-silverlight-app&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Apache (and perhaps other servers) tend to serve unrecognized content as text/plain, and therefore will be affected by this change. You are required to add an entry for the Silverlight XAP MIME type to your .htaccess file -- e.g. &lt;strong&gt;AddType application/x-silverlight-app xap&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;   IIS7 shipped with the right MIME type configurations for Silverlight XAPs. No action is required if you are using IIS7.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Exceptions now thrown in HttpWebRequest.EndGetResponse()&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 applications that use &lt;strong&gt;HttpWebRequest&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary/Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;For &lt;strong&gt;HttpWebRequest&lt;/strong&gt;:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:fuchsia;"&gt;&lt;strong&gt;Before:&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Some security exceptions (e.g. cross-scheme violations) were being raised in &lt;strong&gt;HttpWebRequest.BeingGetResponse()&lt;/strong&gt;&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;All other request error conditions were being returned as 404s.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:fuchsia;"&gt;&lt;strong&gt;Now:&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;Error conditions are now raised as exceptions in &lt;strong&gt;HttpRequest.EndGetResponse()&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Request security errors (e.g. requests not allowed by cross domain policy) raise &lt;strong&gt;SecurityExceptions&lt;/strong&gt;&lt;br /&gt;        &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Non-successful requests (e.g. those that returned 404s) raise &lt;strong&gt;WebExceptions&lt;/strong&gt;. The &lt;strong&gt;WebException.Response&lt;/strong&gt; is set to &lt;strong&gt;HttpStatusCode.NotFound&lt;/strong&gt;. This is compatible with the desktop.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Font URI is Restricted to Assembly Resource&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 Beta1 or Beta 2 applications (not Silverlight 1.0 applications) that reference fonts (or zip of fonts) via the URI syntax in the &lt;strong&gt;Control.FontFamily&lt;/strong&gt;, &lt;strong&gt;TextBlock.FontFamily&lt;/strong&gt; or &lt;strong&gt;Glyphs.FontUri&lt;/strong&gt; attributes and where the fonts are not embedded within the assembly (dll) of the control or application.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You can specify a font (or in some cases a zip of fonts) in URI format via the &lt;strong&gt;Control.FontFamily&lt;/strong&gt;, &lt;strong&gt;TextBlock.FontFamily&lt;/strong&gt; and the Glyphs.FontUri attributes. If you are, you will need to ensure your font is marked as a "resource" in the project system.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Browser.HtmlElementCollection replaced with by Browser.ScriptObjectCollection&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silvlierlight 2 Beta 2 applications using HTML bridge's &lt;strong&gt;HtmlElementCollection&lt;/strong&gt; will break. The type has been replaced with a new type: &lt;strong&gt;ScriptObjectCollection&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;System.Windows.Browser.HtmlElementCollection&lt;/strong&gt; type was changed to &lt;strong&gt;ScriptObjectCollection&lt;/strong&gt;. All previous references to &lt;strong&gt;HtmlElement&lt;/strong&gt; on the collection have been changed to instead reference &lt;strong&gt;ScriptObject&lt;/strong&gt;. Other areas of the HTML bridge that previously used &lt;strong&gt;HtmlElementCollection&lt;/strong&gt; (i.e. &lt;strong&gt;HtmlElement.Children&lt;/strong&gt;) have been switched to instead return a &lt;strong&gt;ScriptObjectCollection&lt;/strong&gt;. Note that if you retrieve an item from the new &lt;strong&gt;ScriptObjectCollection&lt;/strong&gt; that actually is an &lt;strong&gt;HtmlElement&lt;/strong&gt;, you can still cast the return value back to an &lt;strong&gt;HtmlElement&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The specific benefit from this change is that across all browsers you can now access both element, and non-element, DOM nodes contained in a node collection. We made this change because there is no consistent cross-browser implementation of an HtmlElement-specific collection type.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Change existing references to &lt;strong&gt;HtmlElementCollection&lt;/strong&gt; to &lt;strong&gt;ScriptObjectCollection&lt;/strong&gt;. If your existing code was working with &lt;strong&gt;HtmlElement&lt;/strong&gt; return values you will need to explicitly cast the items returned from a &lt;strong&gt;ScriptObjectCollection&lt;/strong&gt; to an &lt;strong&gt;HtmlElement&lt;/strong&gt;. Since the collection type is now &lt;strong&gt;ScriptObjectCollection&lt;/strong&gt; it is likely that on different browsers the ordinality of the resulting collection will also change. Any code that was relying on fixed offsets into the collection may need to be changed to account for non-element nodes (e.g. text nodes such as whitespace, etc…) in the collection.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Beta 2&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[c#]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;HtmlElement myHtmlElement = someOtherHtmlElement.Children[5];&lt;/span&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Release&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[c#]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;HtmlElement myHtmlElement = (HtmlElement)someOtherHtmlElement.Children[5]; //assuming the desired element is still at offset 5&lt;/span&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Exceptions When Changing Some Properties on an Active Animation&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 1.0 and 2.0 applications that change properties on active animations.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When you change one of the properties listed below on an active &lt;strong&gt;Storyboard&lt;/strong&gt;, an exception is raised at runtime with this message: "Operation is not valid on an active Animation or Storyboard. Root Storyboard must be stopped first."&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The list of properties that cannot be modified on an active animation or &lt;strong&gt;Storyboard&lt;/strong&gt; are listed below:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Attached Properties&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Storyboard.TargetNameProperty&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;Storyboard.TargetPropertyProperty&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Properties on derived classes from Timeline of a collection type&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Storyboard.Children (you cannot add/remove animations from an active storyboard) &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ColorAnimationUsingKeyFrames.KeyFrames&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;DoubleAnimationUsingKeyFrames.KeyFrames&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;PointAnimationUsingKeyFrames.KeyFrames&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;ObjectAnimationUsingKeyFrames.KeyFrames&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Make sure you stop the Storyboard before changing one of these properties. You can do this by using the &lt;strong&gt;Storyboard.Stop&lt;/strong&gt; method.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;System.Windows.Controls.Extended.dll renamed to System.Windows.Controls.dll&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Anyone who uses the extended controls (&lt;strong&gt;Calendar&lt;/strong&gt;, &lt;strong&gt;DatePicker&lt;/strong&gt;, &lt;strong&gt;TabControl&lt;/strong&gt; and &lt;strong&gt;GridSplitter&lt;/strong&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Change all references from &lt;strong&gt;System.Controls.Extended&lt;/strong&gt; to &lt;strong&gt;System.Windows.Controls&lt;/strong&gt; and recompile your application.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;VisualStateManager Changes&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 applications that use &lt;strong&gt;VisualStateManager&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;VisualTransition.Duration&lt;/strong&gt; has changed to &lt;strong&gt;VisualTransition.GeneratedDuration&lt;/strong&gt;. This value will now only affect the generated transitions, and not the &lt;strong&gt;VisualTransition.Storyboard&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In the below XAML, the VSM generated animations for the Pressed-&amp;gt; Normal transition will be created with 1 second durations. The explicit transition &lt;strong&gt;Storyboard&lt;/strong&gt; with its blue &lt;strong&gt;ColorAnimation&lt;/strong&gt; will still be 2 seconds.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[xaml]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;vsm:VisualStateGroup x:Name="CommonStateGroup"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;...&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;vsm:VisualStateGroup.Transitions&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;...&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;vsm:VisualTransition From="Pressed" To="Normal" GeneratedDuration="0:0:1"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;Storyboard&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;ColorAnimation Storyboard.TargetName="MainRect" Duration="0:0:2"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;Storyboard.TargetProperty="Fill" SpeedRatio="2" To="Blue"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/Storyboard&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/vsm:VisualTransition&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/vsm:VisualStateGroup.Transitions&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/vsm:VisualStateGroup&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;VisualStateManager.CustomVisualStateManager&lt;/strong&gt; should be set on the root visual of the &lt;strong&gt;ControlTemplate&lt;/strong&gt; or &lt;strong&gt;UserControl&lt;/strong&gt;, not the Control/UserControl itself. In the example below, the custom visual state manager is set on the &lt;strong&gt;Grid&lt;/strong&gt;, the ControlTemplate's root visual.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[xaml]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;ControlTemplate TargetType="local:CheckBox"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;Grid x:Name="RootElement" HorizontalAlignment="Center"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;VerticalAlignment="Center" Background="Transparent"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;vsm:VisualStateManager.CustomVisualStateManager&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;local:MyVisualStateManager&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/vsm:VisualStateManager.CustomVisualStateManager&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;...&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/Grid&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;KeyDown Sent Synchronously&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; If you previously have been doing operations in the &lt;strong&gt;KeyDown&lt;/strong&gt; event that could cause reentrancy into the Silverlight control, such as calling into the HtmlPage.Window.Alert function, this will no longer be supported.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We switched over our keyboard handling for character input to use the concept of the WM_CHAR windows message. This is used for TextBox/PasswordBox text entry to enable scenarios such as entering AltGr keystrokes. In order for us to do this, the &lt;strong&gt;KeyDown&lt;/strong&gt; event had to be sent synchronously for managed code. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;MeasureOverride/ArrangeOverride on Canvas Now Sealed&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 Beta 2 Applications that use &lt;strong&gt;MeasureOverride&lt;/strong&gt; and &lt;strong&gt;ArrangeOverride&lt;/strong&gt; on &lt;strong&gt;Canvas&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MeasureOverride&lt;/strong&gt; and &lt;strong&gt;ArrangeOverride&lt;/strong&gt; virtual methods on Canvas are sealed. These methods were already sealed for Grid and &lt;strong&gt;StackPanel&lt;/strong&gt;. Any custom panel that requires its own layout logic should subclass &lt;strong&gt;Panel&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;UriTypeConverter moved to System.dll&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 managed code referencing the &lt;strong&gt;UriTypeConverter&lt;/strong&gt; class.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UriTypeConverter&lt;/strong&gt; was moved from &lt;strong&gt;System.Windows.Controls.dll&lt;/strong&gt; to &lt;strong&gt;System.dll&lt;/strong&gt; where it resides on the desktop framework. Applications that reference it just need to be recompiled.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;HtmlPage.UnregisterScriptableObject Removed&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Those using &lt;strong&gt;HtmlPage.UnregisterScriptableObject&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Alternative to using &lt;strong&gt;HtmlPage.UnregisterScriptableObject&lt;/strong&gt;, developers can now re-use the same script registration key for &lt;strong&gt;RegisterScriptableObject&lt;/strong&gt;. This allows developers to change the underlying managed object associated with a scriptable entry point.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;RenderingEventArgs Changes&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 managed code referencing the &lt;strong&gt;RenderingEventArgs&lt;/strong&gt; class.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The following changes have been made to class &lt;strong&gt;RenderingEventArgs&lt;/strong&gt;&lt;br /&gt;     &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;RenderingEventArgs&lt;/strong&gt; is moved from &lt;strong&gt;System.Windows&lt;/strong&gt; to &lt;strong&gt;System.Windows.Media&lt;/strong&gt;&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;RenderingEventArgs.ctor()&lt;/strong&gt; is now internal&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;System.Windows.RenderingEventHandler&lt;/strong&gt; has been removed.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;ContentPresenter and ContentControl Changes&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 managed code that uses either the &lt;strong&gt;ContentPresenter&lt;/strong&gt; or &lt;strong&gt;ContentControl&lt;/strong&gt; classes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The following properties were removed from &lt;strong&gt;ContentPresenter&lt;/strong&gt; and &lt;strong&gt;ContentControl&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TextAlignment&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TextDecorations&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;TextWrapping&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Removal of FileDialogFileInfo Type and OpenFileDialog.SelectedFile(s) Properties&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 applications which use the &lt;strong&gt;OpenFileDialog&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;The &lt;strong&gt;System.Windows.FileDialogFileInfo&lt;/strong&gt; type is being removed. Its functionality is now being exposed via its base &lt;strong&gt;System.IO.FileInfo&lt;/strong&gt; type to transparent code within Silverlight's sandbox. &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;System.Windows.Controls.OpenFileDialog&lt;/strong&gt; has a couple properties which consume and expose &lt;strong&gt;FileDialogFileInfo&lt;/strong&gt;. They were modified to return the &lt;strong&gt;FileInfo&lt;/strong&gt; type. &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;In addition, the property names &lt;strong&gt;SelectedFile&lt;/strong&gt; and &lt;strong&gt;SelectedFiles&lt;/strong&gt; were also changed to &lt;strong&gt;File&lt;/strong&gt; and &lt;strong&gt;Files&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Beta 2&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[c#]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// Returns a File object for the selected file. If multiple files are selected, returns the first selected file&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;public FileDialogFileInfo SelectedFile { get; }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// Returns a collection of File objects for the selected files&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;public IEnumerable&amp;lt;FileDialogFileInfo&amp;gt; SelectedFiles { get; }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Release&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[c#]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// Returns a File object for the selected file. If multiple files are&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// selected, returns the first selected file&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;public FileInfo File { get; }&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// Returns a collection of File objects for the selected files&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;public IEnumerable&amp;lt;FileInfo&amp;gt; Files { get; }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Sample usage of &lt;strong&gt;OpenFileDialog&lt;/strong&gt; with this change:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[c#]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;openFileDialog = new System.Windows.Controls.OpenFileDialog();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;openFileDialog.Multiselect = false;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;openFileDialog.Filter = "Text Files (*.txt)|*.txt|All files (*.*)|*.*";&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;bool? retval = ofd.ShowDialog();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;if (retval != null &amp;amp;&amp;amp; retval == true) {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// Get the filename&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;string filename = openFileDialog.File.Name;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// Open the file&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;System.IO.Stream filestream = openFileDialog.File.OpenRead();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// Do something with the filestream&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;// Close it&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Removal of FullAccess Option on the ExternalCallersFromCrossDomain attribute in the Silverlight 2 application manifest&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Only Silverlight 2 applications that use this combination of features:&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XAP deployed on a different domain than the host HTML page, and&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;with application manifest (AppManifest.xaml) specifying ExternalCallersFromCrossDomain="FullAccess" on the root element are affected. &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The ability for arbitrary scripts to walk the element tree, register for and get notified on events, and use the Silverlight 1.0 Downloader from script has been curtailed in a cross-domain app deployment scenario. The application manifest previously supported the ability for app author to designate the &lt;strong&gt;ExternalCallersFromCrossDomain&lt;/strong&gt; attribute with the values &lt;strong&gt;NoAccess&lt;/strong&gt; (default in cross-domain), &lt;strong&gt;ScriptableOnly&lt;/strong&gt; and &lt;strong&gt;FullAccess&lt;/strong&gt;. Support for the &lt;strong&gt;FullAccess&lt;/strong&gt; option has been removed.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Many of the purposes you would have relied on the &lt;strong&gt;FullAccess&lt;/strong&gt; option can now be fulfilled via the Scriptable object feature, with minor additional work on your part.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;KeyFrameCollection Changes&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary and Fix&lt;/strong&gt;&lt;br /&gt;     &lt;/p&gt;&lt;p&gt;Virtual methods &lt;strong&gt;Add&lt;/strong&gt;, &lt;strong&gt;Contains&lt;/strong&gt;, &lt;strong&gt;Indexof&lt;/strong&gt;, &lt;strong&gt;Insert&lt;/strong&gt;, &lt;strong&gt;Remove&lt;/strong&gt;, &lt;strong&gt;get_Item&lt;/strong&gt;, &lt;strong&gt;set_Item&lt;/strong&gt; are no longer declared on the following collections:&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ColorKeyFrameCollection.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;DoubleKeyFrameCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ObjectKeyFrameCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;PointKeyFrameCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;PointKeyFrameCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;StrokeCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Request stream must be closed before calling HttpWebRequest.BeginGetResponse()&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Silverlight 2 applications that use &lt;strong&gt;HttpWebRequest.BeginGetResponse()&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You must close the request stream on an &lt;strong&gt;HttpWebRequest&lt;/strong&gt; before calling &lt;strong&gt;BeginGetResponse()&lt;/strong&gt;. Previously &lt;strong&gt;BeginGetResponse()&lt;/strong&gt; would close an open request stream.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;HtmlWindow references on Safari/Mac will no longer evaluate to true&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Code that uses &lt;strong&gt;System.Windows.Browser.HtmlWindow&lt;/strong&gt; and that expects two &lt;strong&gt;HtmlWindow&lt;/strong&gt; references pointing at the same DOM window to evaluate to true will now return false when running on Safari 2 or Safari 3 on Mac.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;For example:&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Create a page with one iframe&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;Use the bridge to get two references to the iframe: &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;HtmlWindow myWin = document.GetElementById("myIframe");&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;HtmlWindow myWin2 = document.GetElementById("myIframe");&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;With the change the following comparison will now return false on Safari 2/3 Mac: &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;bool areEqual = (myWin == myWin2);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Address property removed from all WebClient EventArg classes&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Needed&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you were depending on the Address property, you can work around this breaking change in the following way:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Beta 2&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[c#]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;void Callback(object sender, DownloadStringCompletedEventArgs args)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;    DebugPrint(args.Address.ToString());&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;void MakeCall(Uri uri, object userState)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;   webClient.DownloadStringAsync(uri, userState);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Release&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[c#]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;class DownloadState&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  public DownloadState() {}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  public Uri Address;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  public object ActualUserState;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;void Callback(object sender, DownloadStringCompletedEventArgs args)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  DownloadState userState = (DownloadState)args.UserState;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  DebugPrint(userState.Address.ToString());&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;void MakeCall(Uri uri, object userState)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  Uri absoluteUri = uri;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  if (absoluteUri.IsAbsoluteUri == false)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;     absoluteUri = new Uri(new Uri(webClient.BaseAddress), absoluteUri);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;DownloadState downloadState = new DownloadState();&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;downloadState.Address = absoluteUri;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;downloadState.ActualUserState = userState;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;webClient.DownloadStringAsync(uri, downloadState);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Constructors Made Internal&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You can no longer create the objects listed below because their associated constructors have been made internal:&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;SizeChangedEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TextChangedEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;DownloadProgressEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ExceptionRoutedEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;KeyEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;MouseButtonEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;MouseEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;StartupEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Expression&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;GeneralTransform&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Geometry&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ImageSource&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;PathSegment&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;SetterBase&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Transform&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;BindingExpressionBase&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;InputMethod&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Exception type change for System.Xml exception type&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In the methods/constructors shown below, we will no longer be checking for null arguments. As a result, the usage of null arguments will result in a &lt;strong&gt;NullReferenceException&lt;/strong&gt;. In previous builds of Silverlight, use of a null argument would result in an &lt;strong&gt;ArgumentNullException&lt;/strong&gt; being thrown. There is no change in functionality, just the type of exception that is being thrown.&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlReader.IsName method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlReader constructor&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlReader.MoveToAttribute method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlReader:IsNameToken method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlNamespaceManager constructor&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlReader.Nametable.Add method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlReader.Nametable.Get method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlCharCheckingWriter.WriteQualifiedName method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlCharCheckingWriter.WriteDocType method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlConvert.ToBoolean method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlConvert.ToDouble method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;XmlConvert.ToSingle method&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;XmlConvert.ToDateTime method&lt;span style="font-family:Symbol;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Cannot create classes in XAML that do not have accessible constructors&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Certain classes that were defined by the Silverlight runtime were creatable in XAML, even though they did not have an accessible constructor. With this change, you can no longer instantiate those classes in XAML.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;These classes (which only have internal constructors) can no longer be created in XAML:&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TriggerCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;InlineCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;RowDefinitionCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ColumnDefinitionCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;RoutedEventARgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;MouseButtonEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;KeyEventARgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ErrorEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;UIElementCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Downloader&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;InternalWebRequest&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;MultiScaleSubImageCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;MediaAttribute&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;MediaAttributeCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ExceptionROutedEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;DownloadProgressEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;StartupEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TextBoxBase&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TextBoxView&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TextChangedEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;RuntimeHostEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;SizeChangedEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;RenderingEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ItemCollection&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;CorePropertyChangedEventArgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;IsEndabledChangedEventARgs&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TypeProxy&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;ManagedObjectReference&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;AutomationPropertiesEnum&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;DependencyPropertyProxy&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Get AG_E_UNKNOWN_ERROR in Silverlight 2 but not in Silverlight 1&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In previous versions of Silverlight, when media failed because a media file was not available, a &lt;strong&gt;MediaFailed&lt;/strong&gt; event was fired but if the &lt;strong&gt;MediaFailed&lt;/strong&gt; event was not handled by the developer, the end user would not be notified of the failure. Now when a handler is not hooked up to the &lt;strong&gt;MediaFailed&lt;/strong&gt; event, the error bubbles up to the default &lt;strong&gt;OnError&lt;/strong&gt; handler of the plug-in and AG_E_UNKNOWN_ERROR is displayed to the user.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Attach the &lt;strong&gt;MediaFailed&lt;/strong&gt; event to your &lt;strong&gt;MediaElement&lt;/strong&gt; objects and handle errors as appropriate.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Platform looks for generic.xaml as a resource at themes/generic.xaml&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The platform now looks for the generic.xaml resource dictionary as an assembly resource in the "themes" directory rather than the root directory.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Move your generic.xaml resource underneath the "themes" folder under ControlLib in Solutions Explorer in Visual Studio.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;HTTP Polling Duplex OM Changes and Reengineering&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; This will impact anyone using the HTTP Polling Duplex channel.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;PollTimeout&lt;/strong&gt; setting on the server side (&lt;strong&gt;PollingDuplexHttpBinding&lt;/strong&gt; and &lt;strong&gt;PollingDuplexBindingElement&lt;/strong&gt;) has been renamed to &lt;strong&gt;ServerPollTimeout&lt;/strong&gt;&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;PollTimeout&lt;/strong&gt; setting on the &lt;strong&gt;PollingDuplexBindingElement&lt;/strong&gt; (client side) has been renamed to &lt;strong&gt;ClientPollTimeout&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;PollTimeout&lt;/strong&gt; setting on the &lt;strong&gt;PollingDuplexHttpBinding&lt;/strong&gt; (client side) has been cut. In most scenarios, it should not be necessary to change this. If a change is necessary, it can be achieved through the &lt;strong&gt;ClientPollTimeout&lt;/strong&gt; on the &lt;strong&gt;PollingDuplexBindingElement&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Client-side support has been cut from the non-Silverlight (server-side) polling duplex assembly (i.e. &lt;strong&gt;BuildChannelFactory&lt;/strong&gt; will throw a &lt;strong&gt;NotSupportedException&lt;/strong&gt;). That is, in RTM, the client side for polling duplex must be Silverlight (and the server side must be the regular .NET Framework, but this restriction was already in place in Beta2).&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Default timeouts have been changed for the Duplex channel. For most common scenarios, the new out-of-the-box defaults should be appropriate and there is no need to change them.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;An error (404) on a polling request will cause the duplex channel to fault.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Various invalid messages used to be ignored by the Duplex stack but will now be rejected.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;If any HTTP error (404,500,…) is encountered during a SOAP call, a &lt;strong&gt;CommunicationException&lt;/strong&gt; is now thrown instead of a &lt;strong&gt;ProtocolException&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Breaking change to Silverlight native hosting IXcpControl COM interface&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Applications that host Silverlight 2 natively via its COM APIs.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;The following splash screen related properties added to &lt;strong&gt;IXcpControl&lt;/strong&gt; interface are being broken out and being moved to a new &lt;strong&gt;IXcpControl2&lt;/strong&gt; interface:&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;get_OnSourceDownloadComplete&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;get_OnSourceDownloadProgressChanged&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;get_SplashScreenSource&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;put_OnSourceDownloadComplete&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;put_OnSourceDownloadProgressChanged&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;put_SplashScreenSource&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;In addition, the &lt;strong&gt;LoadRuntime&lt;/strong&gt; function is also being moved to IXcpControl2.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Content-Type is allowed on cross domain request by default&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Summary&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Both supported cross domain policy files (crossdomain.xml, clientaccesspolicy.xml) no longer need to explicitly allow the Content-Type request header. The Content-Type header is always settable on POST xdomain requests, as long as the request itself is allowed by a cross domain policy file.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In addition, the &lt;strong&gt;LoadRuntime&lt;/strong&gt; function is also being moved to &lt;strong&gt;IXcpControl2&lt;/strong&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Previously you needed to specify Content-Type in the headers whitelist. Now, Content-Type is always allowed, so the bolded "Content-Type" attribute value is no longer required just for setting the Content-Type (see below).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:fuchsia;"&gt;&lt;strong&gt;&lt;em&gt;clientaccesspolicy.xml&lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:fuchsia;"&gt;&lt;em&gt;Old version that explicitly listed Content-Type as settable.  (This file still works in SL2 RTM.)&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[xaml]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;access-policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;cross-domain-access&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&lt;strong&gt;&amp;lt;allow-from http-request-headers="Content-Type, SOAPAction"&amp;gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;domain uri="*"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/allow-from&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;grant-to&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;resource include-subpaths="true" path="/"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/grant-to&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/cross-domain-access&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/access-policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:fuchsia;"&gt;&lt;em&gt;New version that still allows Content-Type to be set&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[xaml]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;access-policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;cross-domain-access&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&lt;strong&gt;&amp;lt;allow-from http-request-headers="SOAPAction"&amp;gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;domain uri="*"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/allow-from&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;grant-to&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;resource include-subpaths="true" path="/"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/grant-to&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/cross-domain-access&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/access-policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:fuchsia;"&gt;&lt;strong&gt;&lt;em&gt;crossdomain.xml&lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:fuchsia;"&gt;&lt;em&gt;Old version that explicitly listed Content-Type as settable.  (This file still works in SL2 RTM.):&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[xaml]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;allow-access-from domain="* " /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;allow-http-request-headers-from domain="* " &lt;strong&gt;headers="Content-Type, SOAPAction"&lt;/strong&gt; secure="true" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/cross-domain-policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:fuchsia;"&gt;&lt;em&gt;New version that still allows Content-Type to be set:&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;[xaml]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;allow-access-from domain="* " /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;allow-http-request-headers-from domain="* " &lt;strong&gt;headers="SOAPAction"&lt;/strong&gt; secure="true" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;&amp;lt;/cross-domain-policy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Enforcing delegate type check when two delegate objects are combined&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Who Is Affected:&lt;/strong&gt; Code that bypass the delegate type check in Delegate.Combine by calling MulticastDelegate.CombineImpl directly.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix Required&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you want to combine two delegate objects they should be of the exact same delegate type.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:gray;"&gt;&lt;strong&gt;Miscellaneous API Changes&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;UIElement.HitTest&lt;/strong&gt; method has moved to the &lt;strong&gt;VisualTreeHelper&lt;/strong&gt; class and renamed to &lt;strong&gt;VisualTreeHelper.FindElementsInHostCoordinates&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;Moved &lt;strong&gt;DependencyPropertyChangedEventHandler&lt;/strong&gt; delegate type from &lt;strong&gt;System.Windows.Controls&lt;/strong&gt; to &lt;strong&gt;System.Windows&lt;/strong&gt; namespace.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Control.IsTabStop&lt;/strong&gt; defaults to true. Now, all &lt;strong&gt;Control&lt;/strong&gt; derived classes (directly or indirectly) have &lt;strong&gt;IsTabStop&lt;/strong&gt; set to true except, &lt;strong&gt;UserControl&lt;/strong&gt;, &lt;strong&gt;HyperlinkButton&lt;/strong&gt;, &lt;strong&gt;ScrollViewer&lt;/strong&gt; and &lt;strong&gt;ListBox&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;WebHeaderCollection.Keys&lt;/strong&gt; property was replaced with the &lt;strong&gt;AllKeys&lt;/strong&gt; property.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;WebHeaderCollection.Headers&lt;/strong&gt; property was renamed to &lt;strong&gt;Keys&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;WebRequest.RegisterPrefix()&lt;/strong&gt; now returns false in failure cases per the interface contract from the desktop framework rather than throwing an exception.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;WebResponse.Dispose(bool explicitDisposing)&lt;/strong&gt; was removed.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Deployment.PartProperty&lt;/strong&gt; is now read only. &lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Deployment.EntryPointAssemblyProperty&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Deployment.EntryPointTypeProperty&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Deployment.RuntimeVersionProperty&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Deployment.ExternalCallersFromCrossDomainProperty&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Thumb.IsDragging&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Slider.IsFocused&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ButtonBase.IsFocused&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ButtonBase.IsMouseOver&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ButtonBase.IsPressed&lt;/strong&gt; is now read only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ToolTipService.GetToolTip&lt;/strong&gt; is now private.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;IRawElementProviderSimple&lt;/strong&gt; is now sealed and has a private default constructor.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Setter.PropertyProperty&lt;/strong&gt; is now internal. Please use the CLR property instead of the &lt;strong&gt;DependencyProperty&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Slider.UpdateTrackLayout()&lt;/strong&gt; is now internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Slider.OnOrientationChanged()&lt;/strong&gt; is now internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Slider.OnIsFocusChanged(DependencyPropertyChangedEventArgs e)&lt;/strong&gt; is now internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ComboBox.get_IsSelectionActive()&lt;/strong&gt; is now internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ComboBox.ScrollIntoView(Int32 index)&lt;/strong&gt; is now internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ComboBox.get_SelectionBoxItemTemplate()&lt;/strong&gt; now returns &lt;strong&gt;System.Windows.DataTemplate&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;PasswordBox.SelectionChanged&lt;/strong&gt; is now private.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;MouseEventArgs.Handled&lt;/strong&gt; was moved to &lt;strong&gt;MouseButtonEventArgs&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;RenderTargetBitmap&lt;/strong&gt; was renamed to &lt;strong&gt;HostingRenderTargetBitmap&lt;/strong&gt; and moved from &lt;strong&gt;System.Windows.Media.Imaging&lt;/strong&gt; to namespace &lt;strong&gt;System.Windows.Interop&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;AutomationPeer&lt;/strong&gt; constructor is now protected.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;TriggerActionCollection.Item&lt;/strong&gt; now takes &lt;strong&gt;System.Windows.TriggerAction&lt;/strong&gt; instead of &lt;strong&gt;System.Windows.Media.Animation.BeginStoryboard&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;TriggerCollection.Item&lt;/strong&gt; now takes &lt;strong&gt;System.Windows.TriggerBase&lt;/strong&gt; instead of &lt;strong&gt;System.Windows.EventTrigger&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;RoutedEventArgs.Source&lt;/strong&gt; was renamed to &lt;strong&gt;OriginalSource&lt;/strong&gt; and is now read-only.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ITableItemProvider&lt;/strong&gt; and &lt;strong&gt;ITableProvider&lt;/strong&gt; are now derived from &lt;strong&gt;IGridItemProvider&lt;/strong&gt; and &lt;strong&gt;IGridProvider&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;The &lt;strong&gt;KeyboardNavigation&lt;/strong&gt; class is now internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ColumnDefinitionCollection&lt;/strong&gt; constructor was made internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;InlineCollection&lt;/strong&gt; constructor was made internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ItemCollection&lt;/strong&gt; constructor was made internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;RowDefinitionCollection&lt;/strong&gt; constructor was made internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;UIElementCollection&lt;/strong&gt; constructor was made internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;TriggerCollection&lt;/strong&gt; constructor was made internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Listbox&lt;/strong&gt; field &lt;strong&gt;ListBoxItem._itemsControl&lt;/strong&gt; is now internal.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Ink.Stroke&lt;/strong&gt; constructor changed to &lt;strong&gt;ctor(System.Windows.Input.StylusPointCollection)&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;CanConvertFrom(Type sourceType)&lt;/strong&gt; changed its signature to &lt;strong&gt;CanConvertFrom(ITypeDescriptorContext context, Type sourceType)&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;CanConvertTo(Type destinationType)&lt;/strong&gt; changed its signature to &lt;strong&gt;CanConvertTo(ITypeDescriptorContext context, Type destinationType)&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ConvertFrom(object value)&lt;/strong&gt; changed its signature to &lt;strong&gt;ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ConvertFromString(string text)&lt;/strong&gt; now is &lt;strong&gt;ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)&lt;/strong&gt; where value of type string.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ConvertTo(object value, Type destinationType)&lt;/strong&gt; changed its signature to &lt;strong&gt;ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ConvertToString(object value)&lt;/strong&gt; now is &lt;strong&gt;ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)&lt;/strong&gt; with &lt;em&gt;destinationType&lt;/em&gt; of type string.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ItemCollection&lt;/strong&gt; constructor is no longer available so any code that tries to instantiate an &lt;strong&gt;ItemCollection&lt;/strong&gt; directly will no longer compile. This class is supposed to be instantiated only within &lt;strong&gt;ItemsControl&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;ContentPresenter&lt;/strong&gt; now derives from &lt;strong&gt;FrameworkElement&lt;/strong&gt; instead of &lt;strong&gt;Control&lt;/strong&gt;.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;Control.OnIsEnabledChanged&lt;/strong&gt; was removed. Now use &lt;strong&gt;IsEnabledChanged&lt;/strong&gt; for extended controls.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;&lt;strong&gt;DownloadProgressEventHandler&lt;/strong&gt; was removed.&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="color:black;"&gt;The following converters were removed:&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:black;"&gt;TextDecorationCollectionConverter&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;FontStretchConverter&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;FontStyleConverter&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;FontWeightConverter&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:black;"&gt;FontFamilyConverter&lt;span style="font-family:Symbol;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-215577813009633877?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=BONJ7D35o-U:D3h2o1ACoIE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=BONJ7D35o-U:D3h2o1ACoIE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=BONJ7D35o-U:D3h2o1ACoIE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=BONJ7D35o-U:D3h2o1ACoIE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=BONJ7D35o-U:D3h2o1ACoIE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=BONJ7D35o-U:D3h2o1ACoIE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=BONJ7D35o-U:D3h2o1ACoIE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=BONJ7D35o-U:D3h2o1ACoIE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/BONJ7D35o-U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/215577813009633877/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=215577813009633877" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/215577813009633877?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/215577813009633877?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/BONJ7D35o-U/silverlight-2-rc0-is-here.html" title="Silverlight 2 RC0 is here!" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/09/silverlight-2-rc0-is-here.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UBQXY_fCp7ImA9WxRTFEk.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-3786258368893061778</id><published>2008-09-02T20:28:00.007-04:00</published><updated>2008-09-03T09:40:50.844-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-03T09:40:50.844-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enterprise browsers" /><title>Google Chrome for the Enterprise?</title><content type="html">Google's Chrome is an impressive little beta. Performant? Check... Slick? You bet... More intelligence packed into navigation? Yup... Developer tools baked in? As warm as apple pie... &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But does &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt; have an Enterprise twinkle in its eye? &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few things to be excited about:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;javascript running in a VM&lt;br /&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: normal"&gt;As the &lt;a href="http://www.google.com/googlebooks/chrome/"&gt;Google Chrome Comic Book&lt;/a&gt; states running JS within a VM allows the browser to optimize javascript and actually compile the structure into machine code so that "interpreted" code is not over-interpreted. Chrome is supposed to be fast. And this should make Knowledge Workers with 40+ tabs, happy.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;process-level isolation&lt;br /&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: normal"&gt;Process per tab, process per site. every app, be it web app or a component of Chrome runs as it's own application. Many benefits to this, e.g. crashes are limited to impacted process/tab, resources are allocated to active tab not the entire browser, jail-like security per process, and so on. This design boosts overall stability of the browser. &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;developer tools baked in&lt;br /&gt;&lt;/span&gt;Beginnings of a superb JavaScript debugger and analyzer. Dom element highlighting, in-line style info, style metrics and element properties. And the niftiest addition: web-page performance analytics with charts. I'm sure someone will do a punch-for-punch againt Firefox's FireBug extension.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;wrench-&gt;options-&gt;under the hood-&gt;change proxy settings&lt;br /&gt;&lt;/span&gt;Looks like Connection Settings are delegated to Internet Explorer's - now that's interesting. This means that Group Policies that govern IE's settings can also apply to Google Chrome. I wonder what else can be managed...&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;about:memory&lt;br /&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: normal"&gt;Measures memory usage of this multi-threaded browser&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: normal"&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;about:plugins&lt;br /&gt;&lt;/span&gt;There is an about:plugins page that shows loaded plugins. Looks exactly like Firefox's&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Things to look forward to:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Extensions&lt;/li&gt;&lt;li&gt;RSS support&lt;/li&gt;&lt;li&gt;Spell checker&lt;/li&gt;&lt;li&gt;...and so on...&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;As for Enterprise-friendliness. &lt;/span&gt;Much of our ability to adopt Google Chrome in the enterprise will depend on granular Settings Management for Browser and Gears via a MissionControl-like mechanism or GPO. Enforceable and customizeable Security Zones will permit richer interoperability with the Desktop. Perhaps the extension system will facilitate this with ease. But of couse, this is tbd.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;What is Google going after?&lt;/span&gt; As a colleague put it, the web browser is the unsung hero of the desktop. It is perhaps the most important application there. But it is not just a gateway to the net. The web browser is an application container in it's own right. The gap between desktop and web apps is quickly shrinking. Gears are not simply an offline mode but perhaps the bridge to interoperability between the web browser and other desktop-bound components. Perhaps we'll see these concepts in play on our mobile devices sooner than on our desktops. Perhaps Google is really after an ad revenue-powered "virtual" desktop for the consumer, reminiscent of what Citrix is trying to do for the enterprise?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As for Enterprise-wide deployment of Google Chrome, we'll have to look at its about:config equivalent first!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-3786258368893061778?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=k5n1oXtU6hg:OFdf2YCaAes:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=k5n1oXtU6hg:OFdf2YCaAes:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=k5n1oXtU6hg:OFdf2YCaAes:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=k5n1oXtU6hg:OFdf2YCaAes:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=k5n1oXtU6hg:OFdf2YCaAes:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=k5n1oXtU6hg:OFdf2YCaAes:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=k5n1oXtU6hg:OFdf2YCaAes:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=k5n1oXtU6hg:OFdf2YCaAes:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/k5n1oXtU6hg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/3786258368893061778/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=3786258368893061778" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/3786258368893061778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/3786258368893061778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/k5n1oXtU6hg/google-chrome-for-enterprise.html" title="Google Chrome for the Enterprise?" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/09/google-chrome-for-enterprise.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIHQ3w6fSp7ImA9WxdTF0s.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-6121126038499495031</id><published>2008-05-14T23:01:00.001-04:00</published><updated>2008-05-14T08:35:32.215-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-14T08:35:32.215-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business intelligence" /><title>NYBI Meetup #3 Recap</title><content type="html">&lt;span style="font-weight: bold;"&gt;The Recap&lt;/span&gt;&lt;br /&gt;The third Meetup was fully dedicated to discussion.  It was driven by a few PowerPoint slides from one NYBI member's presentation given at the CTO Summit in Summer of 2007.&lt;br /&gt;&lt;br /&gt;One slide of interest was about a proposed BI Ontology reproduced, in part, below:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BI Ontology&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Decision Space&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Decision Purpose&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Decision Frequency&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Decision Impact&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Tool Space&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Data&lt;/li&gt;&lt;li&gt;Models&lt;/li&gt;&lt;li&gt;Experience&lt;/li&gt;&lt;li&gt;Feedback&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;There was another level of detail for each sub-bullet that will become available when I post the original slides.  Ontologies are important because they provide a shared and common understanding of concepts presented and discussed in forum.  The same way that we hope to derive consensus on Trends and Truths within the BI space, so do we hope to establish a descriptive (and shared) language about BI with the aid of the proposed Ontology.&lt;br /&gt;&lt;br /&gt;An introductory slide or two spoke to the "State of Affairs"  as well the "This is how we came to be here" and spurred on 2 full hours of discussion.&lt;br /&gt;&lt;br /&gt;Some highlights:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Most organizations looking to introduce BI into their fold succeed in rolling out a Data Warehouse.  Rolling out Reporting infrastructure is the difficult part.  If the organization is lucky enough to succeed, this reporting infrastructure tends to be the most expensive investment.&lt;/li&gt;&lt;li&gt;The industry itself evolved from ad-hoc tools to very structured tools and mechanisms.  Approach to successful BI implementation became a Trade and a science in of itself.&lt;/li&gt;&lt;li&gt;The BI Ecosystem is very large.  There are a few established Tools and Tool Vendors but community of people that provide quality or reporting services is for these Tools is significantly larger.&lt;/li&gt;&lt;li&gt;Vendor tools, however, are going through mergers and the Vendors are losing independence.  Will a community emerge to not just support the Vendors but to actually drive innovation in the space and offset the aforementioned loss of independence by Vendors?&lt;/li&gt;&lt;li&gt;Paper distribution has been consistently declining over the last 4 years to be replaced by digital systems.  Are paper statements in existence today exercises in Data Summarization?  Why are our banking statements and our bills still so confusing and uninformative?&lt;/li&gt;&lt;li&gt;In turn, with an encroaching demand from end-users to be able to do real-time analytics and trending of their own personal data, why are banks so slow to spice up their online banking systems?  Are new sites like Mint.com and QuickenOnline setting a new standard in personal finance analytics?&lt;/li&gt;&lt;li&gt;How much longer will we wait for the higher activities of analysis?  Is the next step in BI Tools that aid in decision making process rather than just visualization? Can "actions" exposed by these new BI Tools be contextually relevant and drive specific end-results, such as yield competitive advantage?&lt;/li&gt;&lt;li&gt;Volume of data is now manageable.  Tools that are making sense of this volume are driving innovation.&lt;/li&gt;&lt;li&gt;Is the notion of Business Intelligence simply too constrained to fully encompass possibilities?  Are we transitioning to a more general-purpose, behavioral, Collective Intelligence that enables an organization to tap into data previously unaccessible or simply discarded?  Can this aid an organization's process of innovation and feed competitive advantage?&lt;/li&gt;&lt;li&gt;Is it possible to phase out manual Knowledge Management along with paper distribution and plugin in systems that interpret data on a Semantic level?&lt;/li&gt;&lt;li&gt;Are Personalization of Services and Individual Privacy on opposing sides?  Are the notions of privacy on the Internet and a Corporate Intranet so drastic that most innovation in Collective Intelligence will, in fact, occur on the Intranet where Individual Privacy is a more manageable Can of Worms?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Truths and Trends&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Truth: There are lots more data sources of interest than what is currently accessible on the internet&lt;/li&gt;&lt;li&gt;Truth: Improving on what computers tend to do well does not necessarily result in value to the end-user&lt;/li&gt;&lt;li&gt;Truth: Audio processing is more difficult than Video processing&lt;/li&gt;&lt;li&gt;Trend: Use of Voice and Video as datasources is a new frontier. We wonder how much of it is native analysis vs metadata processing.&lt;/li&gt;&lt;li&gt;Trend: More real-time decision-making at the hands of the user.&lt;/li&gt;&lt;li&gt;Trend: Enterprise environment will give way to enterprise community.&lt;/li&gt;&lt;li&gt;Trend: Web2.0 Collaborative tools are becoming more accepted in the enterprise as both the enterprises and the vendors mature&lt;/li&gt;&lt;li&gt;Truth: There are lots more data sources of interest than what is currently accessible on the internet&lt;/li&gt;&lt;li&gt;Truth: Improving on what computers tend to do well does not necessarily result in value to the end-user&lt;/li&gt;&lt;li&gt;Truth: Audio processing is more difficult than Video processing&lt;/li&gt;&lt;li&gt;Trend: Use of Voice and Video as datasources is a new frontier.  We wonder how much of it is native analysis vs metadata processing&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Trend: More real-time decision-making at the hands of the user.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Next Meetup&lt;/span&gt;&lt;br /&gt;SAP Business Objects folks will be joining us to help us explore Xcelsius, their new analytics tool.  They will also speak to the rest of the near-future product road-map.   Details are available on the http://nybimeetup.org  site.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-6121126038499495031?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=MpnQgyXWAe4:dnsFZf6UWIA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=MpnQgyXWAe4:dnsFZf6UWIA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=MpnQgyXWAe4:dnsFZf6UWIA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=MpnQgyXWAe4:dnsFZf6UWIA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=MpnQgyXWAe4:dnsFZf6UWIA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=MpnQgyXWAe4:dnsFZf6UWIA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=MpnQgyXWAe4:dnsFZf6UWIA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=MpnQgyXWAe4:dnsFZf6UWIA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/MpnQgyXWAe4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/6121126038499495031/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=6121126038499495031" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/6121126038499495031?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/6121126038499495031?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/MpnQgyXWAe4/nybi-meetup-3-recap.html" title="NYBI Meetup #3 Recap" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/04/nybi-meetup-3-recap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04HQHY6fyp7ImA9WxZaFkQ.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-3022207197003108404</id><published>2008-05-01T20:18:00.010-04:00</published><updated>2008-05-01T22:38:51.817-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-01T22:38:51.817-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rss" /><category scheme="http://www.blogger.com/atom/ns#" term="e2.0" /><title>Intro to Enterprise RSS</title><content type="html">&lt;p&gt;&lt;strong&gt;Firstly, what is RSS and how does it relate to what is familiar to  the "Enterprise" us?&lt;br /&gt;&lt;/strong&gt;In of itself RSS is nothing special. It is just a format for  "Latest Headlines".  Roughly it says that Content A is about &lt;em&gt;something&lt;/em&gt; and the full posting of the same is located at &lt;a href="http://a/" _fcksavedurl="http://A"&gt;http://A&lt;/a&gt;.  Content  B is about &lt;em&gt;something else&lt;/em&gt; and lives at &lt;a href="http://b/" _fcksavedurl="http://B"&gt;http://B&lt;/a&gt;.  Where-as prior to popularization of  "syndication" the user had to go to sites of interest to  peruse updated content, RSS now allows content producers to simply "push"  updates to us as we busy ourselves with more important tasks.&lt;br /&gt;&lt;br /&gt;Value in RSS is introduced  by the Publisher who takes ownership of publishing the latest headlines in a  known or easily discoverable location that does not change while keeping that list  of headlines up to date.  Value is passed on to the Consumer through software that knows how to deliver fresh content to you, the Knowledge Worker.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;A Use  Case&lt;/strong&gt;&lt;br /&gt;Let's say a Team wants to maintain a  high-level, chronological log of project activity and make this log available  for others to peruse at individual convenience (buzzwords: asynchronous consumption  of syndicated content).  A classical way of disseminating this information (in  the past) has been to spend man-hours designing these headlines into a  Newsletter format and to send the Newsletter out to everyone via email.  Those  who care and those who don't care would receive this email aka spam. &lt;/p&gt; &lt;p&gt;Now let's say this Team hosts an RSS file that is auto-magically updated on a  daily basis by some publishing system that you, the user, should not really know  or care about.   Let's say it's Sharepoint (since Sharepoint 2007 does this very  well...).  The system is pre-configured in such a manner so that whenever a  member of the Team publishes an article via Sharepoint, the RSS file  representing all such articles published is automatically updated with the  latest headlines on published documents.&lt;/p&gt; &lt;p&gt;Those interested in latest headlines from that group can direct their RSS  Client to keep an "eye" on that Feed.  Specifically, your client "pulls" the  latest content on an interval, directly from the "source" without  involving Newsletters and without spamming your Inbox with content of suspect  relevance to you.&lt;br /&gt;&lt;br /&gt;Two important terms here are: &lt;strong&gt;RSS Feed&lt;/strong&gt;  - that which is owned and updated by the content  owner, and &lt;strong&gt;RSS Reader&lt;/strong&gt; (or RSS Client) through which the  end-user maintains subscriptions of interest and by which the end-user can  always see the "latest" headlines coming from the Content Owner.&lt;/p&gt;&lt;p&gt;For further details on what RSS is and is not, please take a look at the &lt;a href="http://en.wikipedia.org/wiki/RSS_%28file_format%29"&gt;Wikipedia entry on RSS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Why are we even bothering  with "centralized" or "IT"-driven RSS?&lt;br /&gt;&lt;/strong&gt;Let's take a very practical (and conservative), risk-minded perspective on infrastructure common to most Fortune 500 enterprise-size companies.  Assumption here is that RSS Clients of all sorts run rampant in the environment's Intranet and RSS content is treated as any other web content.  This means that all outbound requests for web-hosted content on the "out there" internet as well as the content retrieved from the web go through a Proxy tier commonly maintained by some division of Corporate IT.&lt;br /&gt;&lt;br /&gt;Imagine everyone (that's us, to be referred to as "we") in this hypothetical Firm  maintaining a list of 50-100 subscriptions to external and internal sources of  content.  Let's also say that because we always subscribe to Content of Interest  and therefore content of Relevance, we wish our RSS Clients to "keep an eye" on  each feed and to pull interesting updates to our subscriptions every 30  minutes.&lt;br /&gt;&lt;br /&gt;In reality, what this means is that everyone in the Firm is  asking the CNN's of the world for updates on ALL headlines of interest every 30  minutes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A sidebar on Proxies and their role within our environment is  important here.  We know that we access the "outside" internet through Proxies.   Why Proxies?  Proxies do some security things.  More importantly, Proxies do  some content caching and networking and load optimization that are essential to  maintaining healthy connectivity to the internal and external networks.  Proxies  are critical components of an enterprise's infrastructure and are, essentially, Gateway Keepers to the Web.  Most Proxy infrastructures are probably designed  to accommodate Humans perusing sites.   Systems that do demand a high load of network content are usually provisioned, accounted for, and paid for separately as a specific requirement.  The Business Unit requiring such special capacity will usually take on this cost.  Recall in our original assumption that no such "special" considerations were in place for RSS traffic.&lt;br /&gt;&lt;br /&gt;Your RSS Client asking for updates from  the web is equivalent to your Computer perusing sites.  Your Computer can do a  lot of things quickly, such as pull 50-100 subscription updates within a matter  of seconds: something that would take us much more time to do by hand.  What  does this mean?  It means that the amount of traffic to and from the outside  Internet increases drastically. This happens because polling of many CNNs is condensed to a short amount of  time.  This happens per individual with RSS feeds over the course of the day.   In other words, unrestrained RSS Clients Gone Wild in our environment will  create too much unplanned traffic through the Network and will overload the Proxy  servers not provisioned to handle such load.  Risk here is disrupting daily routing and more importantly business  critical applications relying on the network.  Enterprises should deem this as an unacceptable risk.  Does this mean RSS should not be allowed in the environment? Absolutely not!&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;br /&gt;&lt;/span&gt; As mentioned before, Proxies do some caching.  For example, when  you browse for CNN.com homepage and I browse for CNN.com homepage the Proxy is  smart enough to realize that CNN.com is not a unique resource and that more than  one person wants to and will probably want to see the same content.  Rather than using up Networking  resources to deliver content to you from CNN.com directly, Proxies will  simply cache that page locally and serve out the local (cached) copy to the  user for subsequent requests.  This is economical.&lt;/p&gt; &lt;p&gt;The exact same model needs to apply for all RSS traffic in and out of our  environment.  Something needs to sit between your RSS Client and the RSS Feed  Owner to provide exactly the same type of mediation and optimization.&lt;br /&gt;&lt;br /&gt;To enable  RSS within the Firm, the Firm must deploy some RSS-specific Proxy-like infrastructure  to Gatekeep RSS traffic.  IT should own this task.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Now that RSS is going through a centralized "hub", what else can we  do with it?&lt;br /&gt;&lt;/strong&gt;When data is managed in a centralized location, all  sorts of interesting analytics, and intelligence-driven applications can come  into play.  For example, subscription data, read/unread status information in of  itself can yield rough ranking of popularity.  Tagging of content can yield  human-driven meta information that democratizes categorization of content coming  in from a very large and daunting repository: the web.   Popularity ranking and democratized categorization yields  personalized, intelligent recommendations and filtering.  All these buzz words  imply boost to productivity by way of highlighting information we "know" is  relevant to us and by way of not spamming us with content that is  not.&lt;br /&gt;&lt;br /&gt;This subscription-based content-delivery mechanism, when coupled  with such intelligence, is a valuable paradigm in an environment plagued with  info-glut, tight deadlines, and the ever-present abuse of emails.  How many  mailgroups do you belong to?&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Why not simply invest in more Proxies?&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;General-purpose proxy servers commonly purchased are extremely expensive - can cost as much as $80,000 per box&lt;/li&gt;&lt;li&gt;Proxies are not specialized to provide the bells and whistles mentioned in  the previous section and therefore under-represent the value of syndication within an  Enterprise environment&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Taking it a step further&lt;br /&gt;&lt;/strong&gt;Let's imagine that we have this  piece of infrastructure sitting in-house, that allows us to aggregate,  categorize, rank and disseminate content not only intelligently but also via a  standardized and globally-acceptable content format: RSS (XML).  When the Firm  federates this system with already-existing and already invested-in internal Collaborative Platforms, syndicated, relevant content does not have to originate  from traditional "news" sources alone.  In fact, such syndication can expose internally generated data of all sorts.  Think improved portal adoption through Dashboarding, Agile Project Management and Knowledge Bases, system status notifications and so on.    For specific ideas on how to leverage Blogging and syndication for Agile Product  Management and Knowledge Bases, take a look at my Blog's series called  "&lt;a href="http://e2pt0.blogspot.com/search/label/babysteps" _fcksavedurl="http://e2pt0.blogspot.com/search/label/babysteps"&gt;Taking Baby  Steps&lt;/a&gt;".&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Taking it one more step further&lt;br /&gt;&lt;/strong&gt;RSS in the Enterprise can  drive Social discovery of peer-recommended and peer-generated content by virtue  of mining this centralized repository of content and subscriptions.  Cleverly  federated with Collaborative systems like Sharepoint, the Enterprise RSS Server  can socialize boring document repositories and lists in Sharepoint.  Imagine  "following" content generated, reviewed and starred by the head of your  department.  Newsfeeds of social activity made popular by Facebook can be easily  constructed by marrying Enterprise RSS infrastructure with Collaborative  infrastructure such as Sharepoint.  And this is only the beginning...  For  example, semantic analysis of subscriptions and consumed content can yield  better understanding of relevancy and quality of recommendations as well as  intelligent filters and subscriptions.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Conclusion&lt;br /&gt;&lt;/strong&gt;Centralized, enterprise-class RSS  infrastructure is an enabler of more than news consumption.  Social,  asynchronous feedback loops are critical aspects of collaboration and are made  possible by investing in RSS as infrastructure.&lt;/p&gt;&lt;p&gt;Vendors such as &lt;a href="http://newsgator.com/"&gt;NewsGator&lt;/a&gt;, &lt;a href="http://www.attensa.com/"&gt;Attensa&lt;/a&gt;, and &lt;a href="http://www.knownow.com/"&gt;KnowNow&lt;/a&gt; are currently leading the market in providing the Enterprise with a "Buy not Build" option for exactly such infrastructure.  Who of these "gets" Enterprise requirements best?  I urge you to compare their respective offerings against specs outlined in my Blog Post entitled "&lt;a href="http://e2pt0.blogspot.com/2006/12/test.html"&gt;Why Vendors Don't Get Enterprise2.0&lt;/a&gt;".   I have.  Not surprisingly, when compared against core requirements and the extra credit, as outlined above, competition among the three is not as close as analysts and the laggers of the three would like you to believe...&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-3022207197003108404?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=SjDgJVFe78w:8N_iqdN4rCA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=SjDgJVFe78w:8N_iqdN4rCA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=SjDgJVFe78w:8N_iqdN4rCA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=SjDgJVFe78w:8N_iqdN4rCA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=SjDgJVFe78w:8N_iqdN4rCA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=SjDgJVFe78w:8N_iqdN4rCA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=SjDgJVFe78w:8N_iqdN4rCA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=SjDgJVFe78w:8N_iqdN4rCA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/SjDgJVFe78w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/3022207197003108404/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=3022207197003108404" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/3022207197003108404?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/3022207197003108404?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/SjDgJVFe78w/intro-to-enterprise-rss.html" title="Intro to Enterprise RSS" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/05/intro-to-enterprise-rss.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIBSHs7fSp7ImA9WxdTGEw.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-2052495848001960426</id><published>2008-04-02T01:09:00.009-04:00</published><updated>2008-05-14T21:05:59.505-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-14T21:05:59.505-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business intelligence" /><title>NYBI Meetup #2 Recap</title><content type="html">&lt;span style="font-weight: bold;"&gt;The Recap&lt;br /&gt;&lt;/span&gt;The second NYBI Meetup took place in a spacious board room of 1633 Broadway.  The meeting kicked off with an exploration of &lt;a href="http://www.qlikview.com/"&gt;QlikTech&lt;/a&gt;'s in-memory analytics platform called QlikView with Scott Taylor and Nik Boman.  QlikView is seeing success in the financial sector in NY and we wanted to know what made QlikView tick, what made it great, and how the "wisdom" of the NYBI crowd could make it even better.   The PPT presentation of QlikView is available from the NYBIMeetup.org's File download section &lt;a href="http://files.meetup.com/995599/QlikView_in_Banking_1.0.ppt"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;From my recollections and sparse notes&lt;/span&gt;&lt;br /&gt;QlikView is a visualization and analysis tool.&lt;br /&gt;&lt;br /&gt;QlikView allows a Super User to correlate data sets from various data sources (local or remote) and to store a highly compressed (loaded data is 15% on avg of original data size) snapshot of the relational data map into memory.  Coupled with a file structure that permits O(1) access to data and linear, O(n) traversal of data sets, this in-memory storage essentially serves as a Virtual Cube of correlated data for the user to play with.  A very rich interface that is available in client, or embedded form, permits almost serendipitous creation of dashboards with parametric drilling, intelligent filtering - the works.  Controls adjust themselves and each other instantaneously - the Regular User interacts with the charts through intuitive click and drag motions. The assumption is that the data loaded into QlikView is already of high quality/integrity.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hi94bdcu3SI/R_guogybUFI/AAAAAAAAAFU/bGca9SfoR24/s1600-h/qlikview.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Hi94bdcu3SI/R_guogybUFI/AAAAAAAAAFU/bGca9SfoR24/s320/qlikview.png" alt="" id="BLOGGER_PHOTO_ID_5185946244448211026" border="0" /&gt;&lt;/a&gt;When asked "Who is typically the first person among client prospects to go 'Oooh! Aaaah!", response from the QlikTech guys was "Deprived end-users that have to go to IT for cube build-outs that may take months to generate 'ooh and aah'. IT that sanctions ownership supervises, scrutinizes, realizes that QlikView is a boon to them."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Challenges to QlikTech and points of Discussion&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Is not the goal of BI, actionable outputs?&lt;/span&gt; Hypothetically, with QlikView I found my 3 bad products and I want to commit the pricing strategy - I have to write something out/communicate - If I want to do that, I have to interact with other modules (beyond BI modules) to make actions, how do you make the action happen? Should the products not better integrate into popular desktop productivity apps?  For example, how can my interaction with these dashboard be affected if I could key off of an email address to view a Sales Report for that person in a sidebar within Outlook? (reference to Xobni).  As a platform, QlikView has potential for such rich integration - the exercise is left for IT or QlikTech's affiliates.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;What kind of API should BI platforms expose? &lt;/span&gt;What do we really wish to do on the Desktop vs on the Server?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;What about community contributions?&lt;/span&gt;&lt;/span&gt; A community of business partners and affiliates who align to complete a vertical is not necessarily the same things as, let's say, a community of developers writing and contributing extensions to enhance a product's core (i.e. Firefox community and extensions development).  Is there value for BI vendors to stretch beyond affiliate networks in order to establish an open participation and innovation culture?  With respect to NYBI Meetup, what would something like that look like?&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Truths and Trends&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Following above rhetoric, in turn, should not NYBI Meetup be about actionable outputs?  After all, a Community has to deliver value to those it serves.  One baby step forward was to conclude the meetup with "Can we derive any Truths or Trends about BI from topics covered in discussion?"  Here is what we came up with:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Truth: People are looking for a better way to solve the same problems. Core Issues of BI are still prevalent.  Recent advances in BI tech now provide better ways to deal with these Issues.  QlikView is a note-worthy example of such innovation in the space.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In-memory processing is Trend.&lt;/li&gt;&lt;li&gt;RIA (AJAX) adoption and movement to web interfaces is a Trend.&lt;/li&gt;&lt;li&gt;Truth: Data Quality is a Foundation for BI&lt;/li&gt;&lt;li&gt;Truth: BI Tools need to consume WebServices as a datasource&lt;/li&gt;&lt;li&gt;Truth: Killer App = functionality + price&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Next NYBI Meetup is at end of April&lt;/span&gt;&lt;br /&gt;We are always looking for interesting presentations.  To sign up, please visit http://nybimeetup.org.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-2052495848001960426?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=vuTRXo-vHT8:5hV1tvxdjAE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=vuTRXo-vHT8:5hV1tvxdjAE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=vuTRXo-vHT8:5hV1tvxdjAE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=vuTRXo-vHT8:5hV1tvxdjAE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=vuTRXo-vHT8:5hV1tvxdjAE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=vuTRXo-vHT8:5hV1tvxdjAE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=vuTRXo-vHT8:5hV1tvxdjAE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=vuTRXo-vHT8:5hV1tvxdjAE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/vuTRXo-vHT8" height="1" width="1"/&gt;</content><link rel="related" href="http://businessintell.meetup.com/2/calendar/7415158/" title="NYBI Meetup #2 Recap" /><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/2052495848001960426/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=2052495848001960426" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/2052495848001960426?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/2052495848001960426?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/vuTRXo-vHT8/nybi-meetup-2-recap.html" title="NYBI Meetup #2 Recap" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Hi94bdcu3SI/R_guogybUFI/AAAAAAAAAFU/bGca9SfoR24/s72-c/qlikview.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/04/nybi-meetup-2-recap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cERn88fyp7ImA9WxZVFUg.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-432630243839442560</id><published>2008-03-25T00:40:00.007-04:00</published><updated>2008-03-26T13:03:27.177-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-26T13:03:27.177-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google gadgets" /><title>FreeMind Flash Browser Google Gadget</title><content type="html">I finally got around to writing a &lt;a href="http://www.google.com/ig/directory"&gt;Google Gadget&lt;/a&gt; while exploring what a bit of XML and JavaScript can do for &lt;a href="http://sites.google.com/"&gt;Google Sites&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For starters, I decided to bake the FreeMind Flash Browser into a gadget.  You can now embed your &lt;a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page"&gt;FreeMind&lt;/a&gt;-generated MindMaps into a Google Gadget with my &lt;a href="http://www.google.com/ig/directory?url=hosting.gmodules.com/ig/gadgets/file/112066831450079239434/freeMindBrowser.xml"&gt;FreeMind Flash Browser Google Gadget&lt;/a&gt;.    Feedback is welcome - hope you find it useful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;One caveat/limitation.&lt;/span&gt;  Flash security policy will prevent crossdomain loading of your MindMap.  Specifically, the gadget code is hosted on a *.gmodules.com domain.  However, most users will wish to upload/embed MindMaps to their Google Sites (sites.google.com) or another Google domain.    At the moment, this will not work as Google does not host a &lt;a href="http://www.moock.org/asdg/technotes/crossDomainPolicyFiles/"&gt;Crossdomain Policy&lt;/a&gt; file at its root. It is this policy file that allows Flash to load movies across Google's domains.  I've posted an inquiry on the &lt;a href="http://groups.google.com/group/sites-help"&gt;Google Sites Help Group&lt;/a&gt; to see if there is any traction towards enabling such a policy.&lt;br /&gt;&lt;br /&gt;For now, what works for me is:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Upload the MindMap to a hosting account you have control over.&lt;/li&gt;&lt;li&gt;Create a crossdomain.xml policy file:&lt;br /&gt;&lt;div style="overflow: auto; font-size: small; background-color: rgb(229, 229, 229);"&gt;&lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE cross-domain-policy&lt;br /&gt;SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"&amp;gt;&lt;br /&gt;&amp;lt;cross-domain-policy&amp;gt;&lt;br /&gt;&amp;lt;allow-access-from domain="*.google.com" /&amp;gt;&lt;br /&gt;&amp;lt;allow-access-from domain="*.gmodules.com" /&amp;gt;&lt;br /&gt;&amp;lt;allow-access-from domain="*.googlecode.com" /&amp;gt;&lt;br /&gt;&amp;lt;/cross-domain-policy&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Upload the file to the root location of the domain under which your MindMaps are hosted, i.e. http://mydomain.com/crossdomain.xml&lt;/li&gt;&lt;li&gt;Specify the fully qualified url to the MindMap within the &lt;a href="http://www.google.com/ig/directory?url=hosting.gmodules.com/ig/gadgets/file/112066831450079239434/freeMindBrowser.xml"&gt;FreeMind Flash Browser Google Gadget&lt;/a&gt; initLoadFile setting, i.e. http://mydomain.com/mymaps/mindmap.mm.  The gadget should be able to render the map.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-432630243839442560?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=9VoF5_QUXzY:DVipmA78bYI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=9VoF5_QUXzY:DVipmA78bYI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=9VoF5_QUXzY:DVipmA78bYI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=9VoF5_QUXzY:DVipmA78bYI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=9VoF5_QUXzY:DVipmA78bYI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=9VoF5_QUXzY:DVipmA78bYI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=9VoF5_QUXzY:DVipmA78bYI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=9VoF5_QUXzY:DVipmA78bYI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/9VoF5_QUXzY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/432630243839442560/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=432630243839442560" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/432630243839442560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/432630243839442560?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/9VoF5_QUXzY/freemind-flash-browser-google-gadget.html" title="FreeMind Flash Browser Google Gadget" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/03/freemind-flash-browser-google-gadget.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkANRH04cCp7ImA9WxZWEEQ.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-1935354385234480848</id><published>2008-03-09T15:24:00.001-04:00</published><updated>2008-03-09T15:26:35.338-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-09T15:26:35.338-04:00</app:edited><title>Phun - 2D physics sandbox</title><content type="html">Good ol' NYTech meetup.  A member just sent out a link to http://www.phun.at - a 2D physics sandbox.  Kids, let your imagination run wild!&lt;br /&gt;&lt;br /&gt;Phun videos on YouTube: http://www.youtube.com/groups_videos?name=phun&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-1935354385234480848?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=hWXAlH2B1OQ:r8kfVbzUvFY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=hWXAlH2B1OQ:r8kfVbzUvFY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=hWXAlH2B1OQ:r8kfVbzUvFY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=hWXAlH2B1OQ:r8kfVbzUvFY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=hWXAlH2B1OQ:r8kfVbzUvFY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=hWXAlH2B1OQ:r8kfVbzUvFY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=hWXAlH2B1OQ:r8kfVbzUvFY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=hWXAlH2B1OQ:r8kfVbzUvFY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/hWXAlH2B1OQ" height="1" width="1"/&gt;</content><link rel="related" href="http://www.phun.at/" title="Phun - 2D physics sandbox" /><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/1935354385234480848/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=1935354385234480848" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/1935354385234480848?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/1935354385234480848?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/hWXAlH2B1OQ/phun-2d-physics-sandbox.html" title="Phun - 2D physics sandbox" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/03/phun-2d-physics-sandbox.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08BSH4_fSp7ImA9WxZXEUo.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-9139955886973294081</id><published>2008-02-27T19:29:00.008-05:00</published><updated>2008-02-28T00:17:39.045-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-28T00:17:39.045-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business intelligence" /><title>NYBI Meetup #1 Recap</title><content type="html">&lt;span style="font-weight: bold;"&gt;The Recap&lt;/span&gt;&lt;br /&gt;The first &lt;a href="http://businessintell.meetup.com/2/calendar/7274222/"&gt;New York Business Intelligence Meetup&lt;/a&gt; ran about 40 minutes over its 90-minute allocation.  Membership grew from 3 to 26 members in under two weeks.  &lt;a href="http://www.meetup.com/members/576402/"&gt;Ron Moore&lt;/a&gt; played host, in a cozy, makeshift conference room, to 11 members (12 total).  I was the only person constantly looking at the clock - but that came with the job description.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;Agenda was "oatmeal" - basic ingredients congealing into something healthy and edible by a diverse group of specialists and enthusiasts, all feeling out NYBI Meetup's stomping ground.  Introductions and individual identification with the BI space were in order.  There seemed to be an even distribution of hard-core practitioners of BI, entrepreneurs looking to carve out a niche, enthusiasts (like myself) looking for a clue, instructors, and technologists struggling with the "what should I" and "how should I" aspects of the field.&lt;br /&gt;&lt;br /&gt;This naturally lent itself to a prolonged deliberation on various topics.  From philosophy to best practices and usability, the group was etching out boundaries and establishing interest camps.  For a taste, some thoughts floating around covered:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Who's job is it to define Vision for BI within an organization?  What role do Technologists play?&lt;/li&gt;&lt;li&gt;How does one go from a home-brewed analytics engine with Excel as the interface to a sustainable, cost-friendly vendor solution?&lt;/li&gt;&lt;li&gt;What do end-users want  out of BI? Do they even know?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;What are some common applications of BI? What are the new, creative applications that are enabled by recent trends in how people and systems exchange information?&lt;/li&gt;&lt;li&gt;What is the balance between need-based drivers and "cool" technology-based drivers?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Who's job is it to create awareness and to sell?&lt;/li&gt;&lt;li&gt;Why is the Microsoft stack more attractive than other stacks? What is the criteria?&lt;/li&gt;&lt;li&gt;What is the BI Pyramid and what is it's Tip?&lt;/li&gt;&lt;li&gt;Why is data integrity so darn difficult?&lt;/li&gt;&lt;li&gt;Can Open Source solutions compete?&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; Some entertaining, but paraphrased, sound bites:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Technologists tend to lead innovation within BI because they can build "It".  However, technologists also build a lot of "S. H. It".&lt;/li&gt;&lt;li&gt;If the computer looked like a frying pan maybe my grandma would be more willing to use it.  Shouldn't the same hold true for BI visualization tools?&lt;/li&gt;&lt;li&gt;So, you could trade 2 Julia Roberts for 1 Richard Gere? -- In reference to a startup in Russia that created a data-mining driven "forex" market where people trade the perceived value of a celebrity&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Ron passed up his presentation on Essbase for these discussions to continue.  We did however, get to see a brief intro to Microsoft's Performance Point Server from &lt;strong style="font-weight: normal;"&gt;&lt;/strong&gt;&lt;strong style="font-weight: normal;"&gt;&lt;a href="http://businessintell.meetup.com/2/members/4560286/"&gt;Victor Shamanovsky&lt;/a&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;For a wrap up, I wanted to set a clearer trajectory for the Meetup and to focus conversations towards more tangible/practical means.  Consensus appears to be: 50% Process/50% Technology.  Philosophy, high-level discussion akin to what's highlighted above would fall into the former category. Product demos and real hands on BI technologies for the latter one.  Essbase and PPS presentations will roll over to the next event.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My take...&lt;br /&gt;&lt;/span&gt;Achieving topical focus for a diverse group of interests and experiences is quite challenging.  Discussion should most likely pivot (horrible pun intended) on:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Business sectors and verticals.  Past, current, future role of BI.  Practical applications, best practices, room for innovation, market leaders, vendors, entrepreneurs etc.&lt;/li&gt;&lt;li&gt;The discipline itself.  Warehousing, ETL, working with structured/unstructured data, core technologies, architecture, data design and integrity, reporting, UI.&lt;/li&gt;&lt;/ul&gt;Perhaps each get-together should recognize a focal point for the Process portion, ie, Profitability modeling in Finance or Sentiment Analysis and Tonality. The Technology section should then dive into available solutions, innovation, and best practices within the realm of the topics discussed in the Process portion.&lt;br /&gt;&lt;br /&gt;Where can this take us?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A high-caliber Meetup around BI can obviously provide a business networking forum for industry professionals.  Strengthening NYBI's reputation and brand will attract high caliber sponsors, vendors, and professionals.  I would love for employers to look to the meetup for capable talent pool, for entrepreneurs to find collaborators, and so on.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Can this meetup influence the trajectory of innovation within BI?  Will vendors and entrepreneurs be interested in vetting new products and ideas through the meetup? Can we do more than discuss and look at demos and actually deliver our musings, evaluations and conclusions to the vendors themselves?  In turn, can we build a reputation and level of trust for all of this to become a reality??&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I submit the above as evidence of a budding Meetup.  I leave it to the members to keep my optimism grounded.    Thanks to everyone who could make it.  To those who couldn't, hope to see you next time!  Special thanks to &lt;strong style="font-weight: normal;"&gt;&lt;/strong&gt;&lt;strong style="font-weight: normal;"&gt;&lt;a href="http://businessintell.meetup.com/2/members/4338540/"&gt;Alon P&lt;/a&gt;&lt;/strong&gt;, my buddy and co-organizer of the Meetup and to &lt;span class="truncateMe maxChars300" title="Show full description"&gt;&lt;a href="http://www.meetup.com/members/576402/"&gt;Ron Moore&lt;/a&gt;&lt;/span&gt; for hosting.&lt;br /&gt;&lt;br /&gt;To sign up, please visit the &lt;a href="http://businessintell.meetup.com/2"&gt;NYBI Meetup Homepage&lt;/a&gt;.  There will be a healthy amount of activity through the &lt;a href="mailto:businessintell-2@meetup.com"&gt;businessintell-2@meetup.com&lt;/a&gt; mail-list as we build and prepare for our next event in March.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-9139955886973294081?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=yoxrgXiRQSo:T0oRN9qAYBM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=yoxrgXiRQSo:T0oRN9qAYBM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=yoxrgXiRQSo:T0oRN9qAYBM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=yoxrgXiRQSo:T0oRN9qAYBM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=yoxrgXiRQSo:T0oRN9qAYBM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=yoxrgXiRQSo:T0oRN9qAYBM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=yoxrgXiRQSo:T0oRN9qAYBM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=yoxrgXiRQSo:T0oRN9qAYBM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/yoxrgXiRQSo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/9139955886973294081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=9139955886973294081" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/9139955886973294081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/9139955886973294081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/yoxrgXiRQSo/nybi-meetup-1-recap.html" title="NYBI Meetup #1 Recap" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/02/nybi-meetup-1-recap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EBSXw7fCp7ImA9WxZQGEw.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-7351132188907248334</id><published>2008-02-23T20:55:00.006-05:00</published><updated>2008-02-23T21:20:58.204-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-23T21:20:58.204-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="business intelligence" /><title>New York Business Intelligence First Meetup!</title><content type="html">In my musings on the next-generation enterprise, I keep coming back to the position that any social and contextual insights gleamed from provisioning new collaborative working models must influence an organization's business intelligence systems.  This is not limited to rich interfaces and better interactivity.  In fact, collaborative revolutions within the Enterprise will both feed and consume information from internally facing BI systems - the true neural network for an enterprise's brain.&lt;br /&gt;&lt;br /&gt;I also recognize that my understanding of BI is rather rudimentary and lacks the perspective to truly participate in innovation within this field.  And so, the &lt;a href="http://businessintell.meetup.com/2/"&gt;New York Business Intelligence Meetup&lt;/a&gt; is born.  &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; width: 214px; font-family: tahoma,verdana,sans serif; font-size: 12px;"&gt;&lt;embed src="http://www.meetup.com/swf/membership_badge.swf?chapterid=995599" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" height="142" width="214"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;a href="http://businessintell.meetup.com/2/?track=i3/mu_zxyx0ryxzq"&gt;Click here to check out&lt;br /&gt;The New York Business Intelligence Meetup!&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;First meetup is Tuesday, February 23rd at 7pm and is sponsored by Ron Moore, Founder and President of Marketing Technologies Group, an Essbase consulting and training firm.  Ron has also, graciously offered his office space for the event, conveniently located in the Financial District, 55 Broad St. 10th Floor.&lt;br /&gt;&lt;br /&gt;For more details, please visit the &lt;a href="http://businessintell.meetup.com/2/calendar/7274222/"&gt;Event Page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-7351132188907248334?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=xg6LrTBvqZU:9lJhYiqMSFo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=xg6LrTBvqZU:9lJhYiqMSFo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=xg6LrTBvqZU:9lJhYiqMSFo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=xg6LrTBvqZU:9lJhYiqMSFo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=xg6LrTBvqZU:9lJhYiqMSFo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=xg6LrTBvqZU:9lJhYiqMSFo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=xg6LrTBvqZU:9lJhYiqMSFo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=xg6LrTBvqZU:9lJhYiqMSFo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/xg6LrTBvqZU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/7351132188907248334/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=7351132188907248334" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7351132188907248334?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7351132188907248334?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/xg6LrTBvqZU/new-york-business-intelligence-first_23.html" title="New York Business Intelligence First Meetup!" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/02/new-york-business-intelligence-first_23.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cGQnc6fyp7ImA9WxZRE0s.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-9036244883349089076</id><published>2008-02-06T10:29:00.000-05:00</published><updated>2008-02-07T01:17:03.917-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-07T01:17:03.917-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise firefox" /><title>Customizing Firefox's Reporter for the Enterprise</title><content type="html">&lt;span style="font-weight: bold;"&gt;Objective&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;This post will provide a step-through for customizing Mozilla Firefox's Reporter Extension.  Goal is to rewire publishing functionality so that submissions via &lt;span style="font-style: italic;"&gt;Help-&gt;Report Broken Web Site...&lt;/span&gt; can be directed to the Enterprise's internal repository rather than Mozilla's.  Caveat: modifications have been tested and are in production for deployments of Firefox 2.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hi94bdcu3SI/R6nbiQS4NuI/AAAAAAAAAEk/miwKjJdAqjs/s1600-h/help_rbws1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://1.bp.blogspot.com/_Hi94bdcu3SI/R6nbiQS4NuI/AAAAAAAAAEk/miwKjJdAqjs/s400/help_rbws1.png" alt="" id="BLOGGER_PHOTO_ID_5163899829293168354" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Motivation&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Early in the adoption process, not every site/webapp on the Intranet will be Firefox-friendly.  A balanced view of "low hanging fruit" is required to prioritize remediation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Reporting will help you identify applications causing the most "pain" to end-users.  Every submission of a URL is essentially a Vote.  Parlaying  popularity with business criticality of the application itself will aid the remediation teams in scheduling work that takes into account, both, the needs of community members and your institution.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In short, creating transparency for what could be a tedious process along with active engagement of your community of users is&lt;/li&gt;&lt;ul&gt;&lt;li&gt; a crowd pleaser&lt;br /&gt;&lt;/li&gt;&lt;li&gt;will allow you to avoid lonesome hours of investigating and cataloging broken apps&lt;br /&gt;&lt;/li&gt;&lt;li&gt;will enable you to leverage your community for all phases of the remediation process, from discovery to testing&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;"Wall of Shame" Dashboard&lt;br /&gt;&lt;/span&gt;Where should these results be published?  The ideal data structure is a basic list.   The important columns are already provided by "vanilla" Reporter:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Hi94bdcu3SI/R6n0ZAS4NvI/AAAAAAAAAEs/ukK6BwVacZI/s1600-h/fill_out_report1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 248px; height: 216px;" src="http://4.bp.blogspot.com/_Hi94bdcu3SI/R6n0ZAS4NvI/AAAAAAAAAEs/ukK6BwVacZI/s320/fill_out_report1.png" alt="" id="BLOGGER_PHOTO_ID_5163927158170072818" border="0" /&gt;&lt;/a&gt;&lt;ol&gt;&lt;li&gt;Web site URL&lt;/li&gt;&lt;li&gt;Problem Type&lt;/li&gt;&lt;li&gt;Describe Problem&lt;/li&gt;&lt;li&gt;Email -&gt; For the Enterprise, this Optional field is changed to Required, is locked and is auto-populated with the user's domain UID, basically whatever is used to log on to the work environment and is set to the Environment's %USERNAME% variable.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Whether you decide to build your own database with a frontend + REST/SOAP interface or simply leverage something like Sharepoint, where list-based reporting of this exact nature is the bread and butter of the platform, a few things are recommended:&lt;ol&gt;&lt;li&gt;Make your data Public - allow anyone in the Firm to view the list of "broken" websites.  Depending on your company's culture, you may even wish to induce a meme to the effect of "not supporting Firefox is shameful...".  My preference is to title the Dashboard "Wall of Shame".&lt;/li&gt;&lt;li&gt;Group entries by "Product" not by "URL".  Since all you are getting from the report is a potentially long URL, without getting too fancy, you may wish to simply truncate it at the top directory level.   At this point, grouping by "URL" is good enough.&lt;/li&gt;&lt;li&gt;If you are piping the data into something that also facilitates Status Tracking data columns, you should expose the status of remediation efforts for that Product to the public.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;High level overview of How Reporter Works&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;User fills out a form, some fields are automatically picked up, i.e. URL, firefox build etc&lt;/li&gt;&lt;li&gt;User submits form.  Under the hood, a POST request is sent over HTTP, via XMLHttpRequest object, to some designated Web Service.&lt;/li&gt;&lt;li&gt;The Web Service enters form data into it's database and throws back a response.&lt;/li&gt;&lt;li&gt;Reporter renders success/failure page.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Anatomy of the Reporter Extension&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Hi94bdcu3SI/R6naPgS4NtI/AAAAAAAAAEc/02lzlPI2K58/s1600-h/dir_structure1.png"&gt;&lt;img style="border: 1px solid gray; margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_Hi94bdcu3SI/R6naPgS4NtI/AAAAAAAAAEc/02lzlPI2K58/s400/dir_structure1.png" alt="" id="BLOGGER_PHOTO_ID_5163898407658993362" /&gt;&lt;/a&gt;&lt;span&gt;In source code,&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;Reporter lives in&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt;root/extensions/reporter.  &lt;/span&gt;Layout of source code is shown to the right.  For clarity, only the tweaked source files are shown.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;After compilation and packaging, the &lt;span style="font-weight: bold;"&gt;resources&lt;/span&gt; folder becomes &lt;span style="font-style: italic;"&gt;bin/chrome/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;reporter.jar&lt;/span&gt;.  T&lt;/span&gt;&lt;span&gt;he &lt;span style="font-weight: bold;"&gt;locales&lt;/span&gt;&lt;/span&gt; section is merged into &lt;span style="font-style: italic;"&gt;bin/chrome/en-US.jar/locale/en-US/reporter.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Privacy Notice -&gt; Splash Page&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span&gt;Let's start by customizing the Privacy Notice dialog -- the very first thing our end-users will see when reporting a broken web site.  Caveat: to disable the dialog that asks the user to acknowledge Mozilla's Privacy Policy, set &lt;span style="font-weight: bold;"&gt;extensions.reporter.hidePrivacyStatement &lt;/span&gt;in your global/default settings.  I default this setting to true via Mission Control but using GPOs or CCK just to get that pref into the profile will work as well.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;resources/skin/classic/reporter/firefoxlogo.gif&lt;/span&gt; -&lt;br /&gt;Any changes to the file name have to be reflected in reportWziard.xul (below).  I replace the logo with the logo of my team, to visually indicate to the user that they are, in fact, interacting with my internal system.  My image is a gif, sized 350x133 pixels.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Hi94bdcu3SI/R6n72QS4NwI/AAAAAAAAAE0/S9YwuYAw8rA/s1600-h/splash1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; cursor: pointer; width: 275px; height: 241px;" src="http://1.bp.blogspot.com/_Hi94bdcu3SI/R6n72QS4NwI/AAAAAAAAAE0/S9YwuYAw8rA/s320/splash1.png" alt="" id="BLOGGER_PHOTO_ID_5163935357262640898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;resources/content/reporter/reportWizard.xul&lt;/i&gt; - any changes to logo or layout of splash page happen here&lt;br /&gt;This is what I have:&lt;br /&gt;&lt;div style="overflow: auto; background-color: rgb(229, 229, 229); font-size: small;" 300px=""&gt;&lt;pre&gt;&amp;lt;!-- Privacy Notice --&amp;gt;&lt;br /&gt;&amp;lt;wizardpage id="privacyNotice"&lt;br /&gt;onpageshow="initPrivacyNotice()"&lt;br /&gt;label = "&amp;amp;privacyNotice.label;"&amp;gt;&lt;br /&gt;&amp;lt;!--description&amp;gt;&amp;amp;reportWizardPrivacy.description;&amp;lt;/description--&amp;gt;&lt;br /&gt;&amp;lt;vbox id="privacyFrame" flex="1" style="padding:10px"&amp;gt;&lt;br /&gt;&amp;lt;hbox&amp;gt;&lt;br /&gt;&amp;lt;html:img width="350px" height="133px"&lt;br /&gt;src="chrome://reporter/skin/firefoxlogo.gif" /&amp;gt;&lt;br /&gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;hbox height="100px"&amp;gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;hbox style="padding:4px;"&amp;gt;&lt;br /&gt;&amp;lt;description align="end" flex="1"&lt;br /&gt;style="text-align:right;"&amp;gt;&amp;amp;reportWizardPrivacy.description;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;/vbox&amp;gt;&lt;br /&gt;&amp;lt;/wizardpage&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;locales/en_US/chrome/reportWizard.dtd -&lt;/span&gt;&lt;span&gt; just changing text here...&lt;/span&gt;&lt;br /&gt;&lt;div style="overflow: auto; background-color: rgb(229, 229, 229); font-size: small;" 300px=""&gt;&lt;pre&gt;&amp;lt;!ENTITY privacyNotice.label ""My" Firefox Reporter Agent"&amp;gt;&lt;br /&gt;&amp;lt;!ENTITY reportWizardPrivacy.description "This tool allows you to tell the MY.Team about web sites that do not work properly in &amp;amp;brandShortName;, or shut &amp;amp;brandShortName; out. This is your way to help us ensure the best possible experience for &amp;amp;brandShortName; users."&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Report Form&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;resources/content/reporter/reportWizard.xul&lt;/i&gt; - only change is in disabling the textbox (since it will auto-populate)&lt;br /&gt;&lt;div style="overflow: auto; background-color: rgb(229, 229, 229); font-size: small;" width="300"&gt;&lt;pre&gt; &amp;lt;row align="center"&amp;gt;&lt;br /&gt;&amp;lt;label control="email" value="&amp;amp;reportForm.email.title;" accesskey="&amp;amp;reportForm.email.accesskey;"/&amp;gt;&lt;br /&gt;&amp;lt;textbox id="email" size="60" class="noborder" disabled="true"/&amp;gt;&lt;br /&gt;&amp;lt;/row&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;locales/en_US/chrome/reportWizard.dtd &lt;/span&gt;&lt;span&gt;- only cosmetic changes here as well...&lt;/span&gt;&lt;br /&gt;&lt;div style="overflow: auto; background-color: rgb(229, 229, 229); font-size: small;" width="300"&gt;&lt;pre&gt;&amp;lt;!ENTITY reportForm.email.title  "Username (Required):"&amp;gt;&lt;br /&gt;&amp;lt;!ENTITY reportForm.email.accesskey  "U"&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;resources/content/reporter/reportWizard.js &lt;/i&gt;- the username is pulled from the environment in this snippet.  getUsername() is the function of interest.&lt;br /&gt;&lt;div style="overflow: auto; background-color: rgb(229, 229, 229); font-size: small;"&gt;&lt;pre&gt;function initForm() {&lt;br /&gt;var strbundle=document.getElementById("strings");&lt;br /&gt;var reportWizard = document.getElementById('reportWizard');&lt;br /&gt;&lt;br /&gt;reportWizard.canRewind = true;&lt;br /&gt;document.getElementById('url').value = gURL;&lt;br /&gt;document.getElementById('email').value = getUsername();&lt;br /&gt;&lt;br /&gt;// Change next button to "submit report"&lt;br /&gt;reportWizard.getButton('next').label = strbundle.getString("submitReport") + " &amp;gt;";&lt;br /&gt;&lt;br /&gt;// We don't let the user go forward until they fufill certain requirements - see validateform()&lt;br /&gt;reportWizard.canAdvance = false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getUsername() {&lt;br /&gt;var env = Components.classes["@mozilla.org/process/environment;1"]&lt;br /&gt;.getService(Components.interfaces.nsIEnvironment);&lt;br /&gt;&lt;br /&gt;var username = env.get('USERNAME');&lt;br /&gt;return username;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Send Data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;All&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; interesting pieces happen under the hood.  In my environment, a SOAP envelope is constructed from the input form and is sent via XMLHttpRequest to a Sharepoint 2003 list.  Obviously the implementation will have to be tweaked to work in your specific environment.  However, the process of gathering and sending data over REST via XMLHttpRequest object should not change. Please explore the full listing of &lt;span style="font-weight: bold;"&gt;reportWizard.js&lt;/span&gt; available below.&lt;br /&gt;&lt;br /&gt;Note-worthy areas are:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;const declarations&lt;/span&gt; - POST parameters: url, operationName, listName, soapAction, myXMLNS, actionURI&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;prepareRequest()&lt;/span&gt; - converts form data into a qualified SOAP envelope for Sharepoint.  See Example Envelop comment in the function.&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;callReporter() &lt;span style="font-weight: normal;"&gt;- executes the AJAX POST against the server and depending on response prepares the Results pane of the wizard&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;sendReport() &lt;span style="font-style: italic; font-weight: normal;"&gt;- &lt;/span&gt;&lt;span style="font-weight: normal;"&gt;this is the master function, it pulls visible and hidden data from the form, stuffs it into an Array, calls prepareRequest() to convert the array into the SOAP envelope, and finally, calls callReporter() to fire off the data to my Sharepoint server.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;The Results Page&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;At this point, our submission either succeeded or not.  A &lt;span style="font-weight: bold;"&gt;report.xhtml&lt;/span&gt; or an &lt;span style="font-weight: bold;"&gt;error.xhtml&lt;/span&gt; page are rendered into an iframe on the final screen.  These pages are dynamically populated by JavaScript.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;resources/content/reporter/reportWizard.xul&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="overflow: auto; font-size: small; background-color: rgb(229, 229, 229);"&gt;&lt;pre&gt;&amp;lt;!-- Finish --&amp;gt;&lt;br /&gt;&amp;lt;wizardpage id="finish"&lt;br /&gt;     label="&amp;amp;finish.label;"&amp;gt;&lt;br /&gt;&amp;lt;textbox id="finishSummary" size="60" readonly="true"/&amp;gt;&lt;br /&gt;&amp;lt;hbox&amp;gt;&lt;br /&gt;&amp;lt;checkbox id="showDetail" label="&amp;amp;reportResults.showDetail.title;" accesskey="&amp;amp;reportResults.showDetail.accesskey;" oncommand="showDetail()"/&amp;gt;&lt;br /&gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;vbox id="finishExtendedFrame" flex="1"&amp;gt;&lt;br /&gt;&amp;lt;iframe id="finishExtendedSuccess" type="content" src="report.xhtml" flex="1"/&amp;gt;&lt;br /&gt;&amp;lt;iframe id="finishExtendedFailed" type="content" src="error.xhtml" flex="1"/&amp;gt;&lt;br /&gt;&amp;lt;/vbox&amp;gt;&lt;br /&gt;&amp;lt;/wizardpage&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/wizard&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;resources/content/reporter/report.xhtml&lt;/i&gt;&lt;div style="overflow: auto; font-size: small; background-color: rgb(229, 229, 229); height: 300px;"&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [&lt;br /&gt;&amp;lt;!ENTITY % reporterDTD SYSTEM "chrome://reporter/locale/reportResults.dtd" &amp;gt;&lt;br /&gt;%reporterDTD;&lt;br /&gt;]&amp;gt;&lt;br /&gt;&amp;lt;!-- ***** BEGIN LICENSE BLOCK *****&lt;br /&gt;- Version: MPL 1.1/GPL 2.0/LGPL 2.1&lt;br /&gt;-&lt;br /&gt;- The contents of this file are subject to the Mozilla Public License Version&lt;br /&gt;- 1.1 (the "License"); you may not use this file except in compliance with&lt;br /&gt;- the License. You may obtain a copy of the License at&lt;br /&gt;- http://www.mozilla.org/MPL/&lt;br /&gt;-&lt;br /&gt;- Software distributed under the License is distributed on an "AS IS" basis,&lt;br /&gt;- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License&lt;br /&gt;- for the specific language governing rights and limitations under the&lt;br /&gt;- License.&lt;br /&gt;-&lt;br /&gt;- The Original Code is Mozilla Reporter (r.m.o).&lt;br /&gt;-&lt;br /&gt;- The Initial Developer of the Original Code is&lt;br /&gt;-      Robert Accettura &amp;lt;robert@accettura.com&amp;gt;.&lt;br /&gt;-&lt;br /&gt;- Portions created by the Initial Developer are Copyright (C) 2004&lt;br /&gt;- the Initial Developer. All Rights Reserved.&lt;br /&gt;-&lt;br /&gt;- Contributor(s):&lt;br /&gt;-&lt;br /&gt;- Alternatively, the contents of this file may be used under the terms of&lt;br /&gt;- either the GNU General Public License Version 2 or later (the "GPL"), or&lt;br /&gt;- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),&lt;br /&gt;- in which case the provisions of the GPL or the LGPL are applicable instead&lt;br /&gt;- of those above. If you wish to allow use of your version of this file only&lt;br /&gt;- under the terms of either the GPL or the LGPL, and not to allow others to&lt;br /&gt;- use your version of this file under the terms of the MPL, indicate your&lt;br /&gt;- decision by deleting the provisions above and replace them with the notice&lt;br /&gt;- and other provisions required by the LGPL or the GPL. If you do not delete&lt;br /&gt;- the provisions above, a recipient may use your version of this file under&lt;br /&gt;- the terms of any one of the MPL, the GPL or the LGPL.&lt;br /&gt;-&lt;br /&gt;- ***** END LICENSE BLOCK ***** --&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;reporter&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" type="text/css" href="chrome://reporter/skin/reportResults.css"/&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportSite;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="urlStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportProblemType;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="problemTypeStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportDecsription;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="descriptionStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportPlatform;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="platformStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportProduct;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="productStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportoscpu;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="oscpuStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportGecko;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="geckoStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportBuildConfig;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="buildConfigStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportUseragent;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="userAgentStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportLanguage;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="langStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th&amp;gt;&amp;amp;reportEmail;:&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span id="emailStri"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;resources/content/reporter/error.xhtml&lt;/i&gt;&lt;div style="overflow: auto; font-size: small; background-color: rgb(229, 229, 229); height: 300px;"&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"&lt;br /&gt;"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [&lt;br /&gt;&amp;lt;!ENTITY % reporterDTD SYSTEM "chrome://reporter/locale/reportResults.dtd" &amp;gt;&lt;br /&gt;%reporterDTD;&lt;br /&gt;]&amp;gt;&lt;br /&gt;&amp;lt;!-- ***** BEGIN LICENSE BLOCK *****&lt;br /&gt;- Version: MPL 1.1/GPL 2.0/LGPL 2.1&lt;br /&gt;-&lt;br /&gt;- The contents of this file are subject to the Mozilla Public License Version&lt;br /&gt;- 1.1 (the "License"); you may not use this file except in compliance with&lt;br /&gt;- the License. You may obtain a copy of the License at&lt;br /&gt;- http://www.mozilla.org/MPL/&lt;br /&gt;-&lt;br /&gt;- Software distributed under the License is distributed on an "AS IS" basis,&lt;br /&gt;- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License&lt;br /&gt;- for the specific language governing rights and limitations under the&lt;br /&gt;- License.&lt;br /&gt;-&lt;br /&gt;- The Original Code is Mozilla Reporter (r.m.o).&lt;br /&gt;-&lt;br /&gt;- The Initial Developer of the Original Code is&lt;br /&gt;-      Robert Accettura &amp;lt;robert@accettura.com&amp;gt;.&lt;br /&gt;-&lt;br /&gt;- Portions created by the Initial Developer are Copyright (C) 2004&lt;br /&gt;- the Initial Developer. All Rights Reserved.&lt;br /&gt;-&lt;br /&gt;- Contributor(s):&lt;br /&gt;-&lt;br /&gt;- Alternatively, the contents of this file may be used under the terms of&lt;br /&gt;- either the GNU General Public License Version 2 or later (the "GPL"), or&lt;br /&gt;- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),&lt;br /&gt;- in which case the provisions of the GPL or the LGPL are applicable instead&lt;br /&gt;- of those above. If you wish to allow use of your version of this file only&lt;br /&gt;- under the terms of either the GPL or the LGPL, and not to allow others to&lt;br /&gt;- use your version of this file under the terms of the MPL, indicate your&lt;br /&gt;- decision by deleting the provisions above and replace them with the notice&lt;br /&gt;- and other provisions required by the LGPL or the GPL. If you do not delete&lt;br /&gt;- the provisions above, a recipient may use your version of this file under&lt;br /&gt;- the terms of any one of the MPL, the GPL or the LGPL.&lt;br /&gt;-&lt;br /&gt;- ***** END LICENSE BLOCK ***** --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;reporter&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" type="text/css" href="chrome://reporter/skin/reportResults.css"/&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h3&amp;gt;&amp;amp;error;&amp;lt;/h3&amp;gt;&lt;br /&gt;&amp;lt;div id="messagediv"&amp;gt;&amp;lt;b&amp;gt;Error Code: &amp;lt;/b&amp;gt;&amp;lt;span id="faultCode"/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;b&amp;gt;Error Message: &amp;lt;/b&amp;gt;&amp;lt;span id="faultMessage"/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;Full Listing of reportWizard.js&lt;/span&gt;&lt;br /&gt;&lt;div style="overflow: auto; font-size: small; background-color: rgb(229, 229, 229); height: 300px;"&gt;&lt;pre&gt;/* ***** BEGIN LICENSE BLOCK *****&lt;br /&gt;* Version: MPL 1.1/GPL 2.0/LGPL 2.1&lt;br /&gt;*&lt;br /&gt;* The contents of this file are subject to the Mozilla Public License Version&lt;br /&gt;* 1.1 (the "License"); you may not use this file except in compliance with&lt;br /&gt;* the License. You may obtain a copy of the License at&lt;br /&gt;* http://www.mozilla.org/MPL/&lt;br /&gt;*&lt;br /&gt;* Software distributed under the License is distributed on an "AS IS" basis,&lt;br /&gt;* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License&lt;br /&gt;* for the specific language governing rights and limitations under the&lt;br /&gt;* License.&lt;br /&gt;*&lt;br /&gt;* The Original Code is Mozilla Reporter (r.m.o).&lt;br /&gt;*&lt;br /&gt;* The Initial Developer of the Original Code is&lt;br /&gt;*      Robert Accettura &lt;robert@accettura.com&gt;.&lt;br /&gt;*&lt;br /&gt;* Portions created by the Initial Developer are Copyright (C) 2004&lt;br /&gt;* the Initial Developer. All Rights Reserved.&lt;br /&gt;*&lt;br /&gt;* Contributor(s):&lt;br /&gt;*    Boris Zbarsky &lt;bzbarsky@mit.edu&gt;&lt;br /&gt;*&lt;br /&gt;* Alternatively, the contents of this file may be used under the terms of&lt;br /&gt;* either the GNU General Public License Version 2 or later (the "GPL"), or&lt;br /&gt;* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),&lt;br /&gt;* in which case the provisions of the GPL or the LGPL are applicable instead&lt;br /&gt;* of those above. If you wish to allow use of your version of this file only&lt;br /&gt;* under the terms of either the GPL or the LGPL, and not to allow others to&lt;br /&gt;* use your version of this file under the terms of the MPL, indicate your&lt;br /&gt;* decision by deleting the provisions above and replace them with the notice&lt;br /&gt;* and other provisions required by the GPL or the LGPL. If you do not delete&lt;br /&gt;* the provisions above, a recipient may use your version of this file under&lt;br /&gt;* the terms of any one of the MPL, the GPL or the LGPL.&lt;br /&gt;*&lt;br /&gt;* ***** END LICENSE BLOCK ***** */&lt;br /&gt;&lt;br /&gt;/********************************************************&lt;br /&gt;*                *** Warning ****&lt;br /&gt;*   DO _NOT_ MODIFY THIS FILE without first contacting&lt;br /&gt;*   Robert Accettura &lt;robert@accettura.com&gt;&lt;br /&gt;*   or a reporter.mozilla.org Admin!&lt;br /&gt;*******************************************************/&lt;br /&gt;&lt;br /&gt;const gURL = window.arguments[0];&lt;br /&gt;const gLanguage = window.navigator.language;&lt;br /&gt;const gRMOvers = "0.2"; // Do not touch without contacting reporter admin!&lt;br /&gt;&lt;br /&gt;// Globals&lt;br /&gt;var gReportID;&lt;br /&gt;var gSysID;&lt;br /&gt;var gFaultCode;&lt;br /&gt;var gFaultMessage;&lt;br /&gt;var gSOAPerror = false;&lt;br /&gt;var gPrefBranch;&lt;br /&gt;const gAsync = false;&lt;br /&gt;var gButton;&lt;br /&gt;var reportWizard;&lt;br /&gt;&lt;br /&gt;var myRequest;&lt;br /&gt;var xmlEnvelope;&lt;br /&gt;var consoleService;&lt;br /&gt;/* SOAP Services for Sharepoint 2003 */&lt;br /&gt;const url = 'http://myshareporint/sites/MyMozillaSite/_vti_bin/Lists.asmx';&lt;br /&gt;const operationName = 'UpdateListItems';&lt;br /&gt;const listName = 'MyReporterList';&lt;br /&gt;const soapAction = 'SOAPAction';&lt;br /&gt;const myXMLNS = 'http://schemas.microsoft.com/sharepoint/soap/';&lt;br /&gt;const actionURI = myXMLNS+operationName;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function getReporterPrefBranch() {&lt;br /&gt;if (!gPrefBranch) {&lt;br /&gt;gPrefBranch = Components.classes["@mozilla.org/preferences-service;1"]&lt;br /&gt;                .getService(Components.interfaces.nsIPrefService)&lt;br /&gt;                .getBranch("extensions.reporter.");&lt;br /&gt;}&lt;br /&gt;return gPrefBranch;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function getBoolPref(prefname, aDefault) {&lt;br /&gt;try {&lt;br /&gt;var prefs = getReporterPrefBranch();&lt;br /&gt;return prefs.getBoolPref(prefname);&lt;br /&gt;} catch(ex) {&lt;br /&gt;return aDefault;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function getCharPref(prefname, aDefault) {&lt;br /&gt;try {&lt;br /&gt;var prefs = getReporterPrefBranch();&lt;br /&gt;return prefs.getCharPref(prefname);&lt;br /&gt;} catch(ex) {&lt;br /&gt;return aDefault;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function initPrivacyNotice() {&lt;br /&gt;var strbundle=document.getElementById("strings");&lt;br /&gt;var reportWizard = document.getElementById('reportWizard');&lt;br /&gt;&lt;br /&gt;// Change next button to "submit report"&lt;br /&gt;reportWizard.getButton('next').label = "Next &gt;";&lt;br /&gt;&lt;br /&gt;reportWizard.canRewind = false;&lt;br /&gt;reportWizard.canAdvance = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function setPrivacyPref(){&lt;br /&gt;if (document.getElementById('dontShowPrivacyStatement').checked){&lt;br /&gt;var prefs = getReporterPrefBranch();&lt;br /&gt;prefs.setBoolPref("hidePrivacyStatement", true);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function initForm() {&lt;br /&gt;var strbundle=document.getElementById("strings");&lt;br /&gt;var reportWizard = document.getElementById('reportWizard');&lt;br /&gt;&lt;br /&gt;reportWizard.canRewind = true;&lt;br /&gt;document.getElementById('url').value = gURL;&lt;br /&gt;document.getElementById('email').value = getUsername();&lt;br /&gt;&lt;br /&gt;// Change next button to "submit report"&lt;br /&gt;reportWizard.getButton('next').label = strbundle.getString("submitReport") + " &gt;";&lt;br /&gt;&lt;br /&gt;// We don't let the user go forward until they fufill certain requirements - see validateform()&lt;br /&gt;reportWizard.canAdvance = false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getUsername() {&lt;br /&gt;var env = Components.classes["@mozilla.org/process/environment;1"]&lt;br /&gt; .getService(Components.interfaces.nsIEnvironment);&lt;br /&gt;&lt;br /&gt;var username = env.get('USERNAME');&lt;br /&gt;return username;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function validateForm() {&lt;br /&gt;var canAdvance = document.getElementById('problem_type').value != "0";&lt;br /&gt;document.getElementById('reportWizard').canAdvance = canAdvance;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function registerSysID(){&lt;br /&gt;var param = new Array();;&lt;br /&gt;param[0] = new SOAPParameter(gLanguage, "language");&lt;br /&gt;&lt;br /&gt;// get sysID&lt;br /&gt;callReporter("register", param, setValSysID);&lt;br /&gt;&lt;br /&gt;// saving&lt;br /&gt;if (gSysID != undefined){&lt;br /&gt;var prefs = getReporterPrefBranch();&lt;br /&gt;prefs.setCharPref("sysid", gSysID);&lt;br /&gt;return gSysID;&lt;br /&gt;}&lt;br /&gt;return "";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function getSysID() {&lt;br /&gt;var sysId = getCharPref("sysid", "");&lt;br /&gt;if (sysId == "")&lt;br /&gt;//sysId = registerSysID();&lt;br /&gt;&lt;br /&gt;return sysId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function sendReport() {&lt;br /&gt;// we control the user path from here.&lt;br /&gt;var reportWizard = document.getElementById('reportWizard');&lt;br /&gt;&lt;br /&gt;reportWizard.canRewind = false;&lt;br /&gt;reportWizard.canAdvance = false;&lt;br /&gt;// why would we need a cancel button?&lt;br /&gt;reportWizard.getButton("cancel").disabled = true;&lt;br /&gt;&lt;br /&gt;var strbundle=document.getElementById("strings");&lt;br /&gt;var statusDescription = document.getElementById('sendReportProgressDescription');&lt;br /&gt;var statusIndicator = document.getElementById('sendReportProgressIndicator');&lt;br /&gt;&lt;br /&gt;// Data from form we need&lt;br /&gt;var myData = new Array();&lt;br /&gt;myData['rmoVers']  = gRMOvers;&lt;br /&gt;myData['url']  = gURL;&lt;br /&gt;myData['problem_type']  = document.getElementById('problem_type').value;&lt;br /&gt;myData['description']  = document.getElementById('description').value;&lt;br /&gt;myData['behind_login']  = (document.getElementById('behind_login').checked ? 'Yes' : 'No');&lt;br /&gt;myData['platform'] = navigator.platform;&lt;br /&gt;myData['oscpu']  = navigator.oscpu;&lt;br /&gt;&lt;br /&gt;myData['gecko']  = getGecko();&lt;br /&gt;myData['product']  = getProduct();&lt;br /&gt;myData['useragent'] = navigator.userAgent;&lt;br /&gt;myData['buildconfig'] = getBuildConfig();&lt;br /&gt;myData['language'] = gLanguage;&lt;br /&gt;myData['email']   = document.getElementById('email').value;&lt;br /&gt;myData['sysid']  = getSysID();&lt;br /&gt;&lt;br /&gt;//build XMLHttpRequest&lt;br /&gt;consoleService = Components.classes['@mozilla.org/consoleservice;1'].getService(Components.interfaces.nsIConsoleService);&lt;br /&gt;&lt;br /&gt;doLog("init(): creating xmlEnvelope");&lt;br /&gt;xmlEnvelope = prepareRequest(operationName,listName,myData);&lt;br /&gt;&lt;br /&gt;var s = new XMLSerializer();&lt;br /&gt;//var strMessage = s.serializeToString(xmlEnvelope);&lt;br /&gt;doLog("doc: "+s.serializeToString(xmlEnvelope));&lt;br /&gt;&lt;br /&gt;statusIndicator.setAttribute("value", "5%");&lt;br /&gt;statusDescription.setAttribute("value", strbundle.getString("sendingReport"));&lt;br /&gt;&lt;br /&gt;//CALL REPORTER&lt;br /&gt;callReporter(operationName, xmlEnvelope); //setValReportID);&lt;br /&gt;&lt;br /&gt;var finishSummary = document.getElementById('finishSummary');&lt;br /&gt;var finishExtendedFailed = document.getElementById('finishExtendedFailed');&lt;br /&gt;var finishExtendedSuccess = document.getElementById('finishExtendedSuccess');&lt;br /&gt;if (!gSOAPerror) {&lt;br /&gt;// If successful&lt;br /&gt;finishExtendedFailed.setAttribute("class", "hide");&lt;br /&gt;&lt;br /&gt;statusIndicator.setAttribute("value", "95%");&lt;br /&gt;statusDescription.setAttribute("value", strbundle.getString("reportSent"));&lt;br /&gt;&lt;br /&gt;reportWizard.canAdvance = true;&lt;br /&gt;statusIndicator.setAttribute("value", "100%");&lt;br /&gt;&lt;br /&gt;// Send to the finish page&lt;br /&gt;reportWizard.advance();&lt;br /&gt;&lt;br /&gt;// report ID returned from the web service&lt;br /&gt;finishSummary.setAttribute("value", strbundle.getString("successfullyCreatedReport") + " " + gReportID);&lt;br /&gt;&lt;br /&gt;finishExtendedDoc = finishExtendedSuccess.contentDocument;&lt;br /&gt;finishExtendedDoc.getElementById('urlStri').textContent         = myData['url'];&lt;br /&gt;finishExtendedDoc.getElementById('problemTypeStri').textContent = myData['problem_type'];&lt;br /&gt;finishExtendedDoc.getElementById('descriptionStri').textContent = myData['description'];&lt;br /&gt;finishExtendedDoc.getElementById('platformStri').textContent    = myData['platform'];&lt;br /&gt;finishExtendedDoc.getElementById('oscpuStri').textContent       = myData['oscpu'];&lt;br /&gt;finishExtendedDoc.getElementById('productStri').textContent     = myData['product'];&lt;br /&gt;finishExtendedDoc.getElementById('geckoStri').textContent       = myData['gecko'];&lt;br /&gt;finishExtendedDoc.getElementById('buildConfigStri').textContent = myData['buildconfig'];&lt;br /&gt;finishExtendedDoc.getElementById('userAgentStri').textContent   = myData['useragent'];&lt;br /&gt;finishExtendedDoc.getElementById('langStri').textContent        = myData['language'];&lt;br /&gt;finishExtendedDoc.getElementById('emailStri').textContent       = myData['email'];&lt;br /&gt;&lt;br /&gt;reportWizard.canRewind = false;&lt;br /&gt;} else {&lt;br /&gt;doLog('Failed to update list!');&lt;br /&gt;// If there was an error from the server&lt;br /&gt;finishExtendedSuccess.setAttribute("class", "hide");&lt;br /&gt;&lt;br /&gt;// Change the label on the page so users know we have an error&lt;br /&gt;var finishPage = document.getElementById('finish');&lt;br /&gt;finishPage.setAttribute("label",strbundle.getString("finishError"));&lt;br /&gt;&lt;br /&gt;reportWizard.canAdvance = true;&lt;br /&gt;reportWizard.advance();&lt;br /&gt;&lt;br /&gt;finishSummary.setAttribute("value",strbundle.getString("failedCreatingReport"));&lt;br /&gt;&lt;br /&gt;finishExtendedDoc = finishExtendedFailed.contentDocument;&lt;br /&gt;finishExtendedDoc.getElementById('faultCode').textContent = gFaultCode;&lt;br /&gt;finishExtendedDoc.getElementById('faultMessage').textContent = gFaultMessage;&lt;br /&gt;}&lt;br /&gt;document.getElementById('finishExtendedFrame').collapsed = true;&lt;br /&gt;reportWizard.canRewind = false;&lt;br /&gt;reportWizard.getButton("cancel").disabled = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function showDetail() {&lt;br /&gt;var hideDetail = document.getElementById('showDetail').checked ? false : true;&lt;br /&gt;document.getElementById('finishExtendedFrame').collapsed = hideDetail;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function getBuildConfig() {&lt;br /&gt;// bz and Biesi are my heroes for writing/debugging this chunk.&lt;br /&gt;try {&lt;br /&gt;netscape.security.PrivilegeManager&lt;br /&gt;.enablePrivilege("UniversalXPConnect UniversalBrowserRead UniversalBrowserWrite");&lt;br /&gt;var ioservice =&lt;br /&gt;Components.classes["@mozilla.org/network/io-service;1"]&lt;br /&gt;    .getService(Components.interfaces.nsIIOService);&lt;br /&gt;var channel = ioservice.newChannel("chrome://global/content/buildconfig.html", null, null);&lt;br /&gt;var stream = channel.open();&lt;br /&gt;var scriptableInputStream =&lt;br /&gt;Components.classes["@mozilla.org/scriptableinputstream;1"]&lt;br /&gt;    .createInstance(Components.interfaces.nsIScriptableInputStream);&lt;br /&gt;scriptableInputStream.init(stream);&lt;br /&gt;var data = "";&lt;br /&gt;var curBit = scriptableInputStream.read(4096);&lt;br /&gt;while (curBit.length) {&lt;br /&gt;data += curBit;&lt;br /&gt;curBit = scriptableInputStream.read(4096);&lt;br /&gt;}&lt;br /&gt;// Strip out the  part, since it's not valid XML&lt;br /&gt;data = data.replace(/^]*&gt;/, "");&lt;br /&gt;// Probably not strictly needed, but what the heck&lt;br /&gt;data = data.replace(/^/, "");&lt;br /&gt;var parser = new DOMParser();&lt;br /&gt;var buildconfig = parser.parseFromString(data, "application/xhtml+xml");&lt;br /&gt;var text = buildconfig.getElementsByTagName("body")[0].textContent;&lt;br /&gt;var start= text.indexOf('Configure arguments')+19;&lt;br /&gt;return text.substring(start);&lt;br /&gt;} catch(ex) {&lt;br /&gt;dump(ex);&lt;br /&gt;return "Unknown";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Execute an AJAX call&lt;br /&gt;function callReporter(method, message) {&lt;br /&gt;//var serviceURL = getCharPref("serviceURL", myServiceURL);&lt;br /&gt;&lt;br /&gt;doLog("init(): sending request to "+url);&lt;br /&gt;myRequest = new XMLHttpRequest();&lt;br /&gt;&lt;br /&gt;myRequest.onreadystatechange=function() {&lt;br /&gt;if (myRequest.readyState==4) {&lt;br /&gt;if (myRequest.status==200) {&lt;br /&gt;doLog("URL Exists!");&lt;br /&gt;doLog(myRequest.getAllResponseHeaders());&lt;br /&gt;doLog(myRequest.responseText);&lt;br /&gt;alert("URL '"+url+"' exists");&lt;br /&gt;alert(myRequest.responseText);&lt;br /&gt;} else if(myRequest.status==404) {&lt;br /&gt;doLog("URL doesn't exist!");&lt;br /&gt;&lt;br /&gt;} else if(myRequest.status==500) {&lt;br /&gt;doLog("Server Failed "+myRequest.status);&lt;br /&gt;doLog("theResponse: "+myRequest.responseText);&lt;br /&gt;gSOAPerror = true;&lt;br /&gt;gFaultCode = myRequest.status;&lt;br /&gt;gFaultMessage = myRequest.responseText;&lt;br /&gt;} else {&lt;br /&gt;doLog("unknown error!");&lt;br /&gt;gSOAPerror = true;&lt;br /&gt;doLog("Server Failed "+myRequest.status);&lt;br /&gt;doLog("theResponse: "+myRequest.responseText);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;doLog("xmlEvenlope: Serialized -- "+message);&lt;br /&gt;&lt;br /&gt;try{&lt;br /&gt;myRequest.open("POST", url,gAsync);&lt;br /&gt;myRequest.setRequestHeader(soapAction,actionURI);&lt;br /&gt;myRequest.setRequestHeader('Content-Type','text/xml');&lt;br /&gt;doLog("myRequest: "+myRequest);&lt;br /&gt;myRequest.send(message);&lt;br /&gt;doLog("myRequest: sent -- \n"+message);&lt;br /&gt;&lt;br /&gt;if(!gAsync) {&lt;br /&gt;if(myRequest.status != 200) {&lt;br /&gt;gSOAPerror = true;&lt;br /&gt;gFaultCode = myRequest.status;&lt;br /&gt;gFaultMessage = myRequest.responseText;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;} catch(e) {&lt;br /&gt;doLog("exception: "+e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function setValSysID(results) {&lt;br /&gt;if (results) {&lt;br /&gt;var params = results.getParameters(false,{});&lt;br /&gt;for (var i = 0; i &lt; gsysid =" params[i].value;" params =" results.getParameters(false,{});" i =" 0;" greportid =" params[i].value;" appinfo =" Components.classes[" appinfo =" Components.classes[" doc =" document.implementation.createDocument(myXMLNS," env =" document.createElement(" body =" document.createElement(" operation =" document.createElement(" listname =" document.createElement(" op ="=" op ="=" env="http://schemas.xmlsoap.org/soap/envelope/" xsi="http://www.w3.org/2001/XMLSchema-instance" xsd="http://www.w3.org/2001/XMLSchema"&gt;&lt;env:body&gt;&lt;a0:updatelistitems a0="http://schemas.microsoft.com/sharepoint/soap/"&gt;&lt;a0:listname&gt;Reporter&lt;/a0:listname&gt;&lt;a0:updates&gt;&lt;batch onerror="Return" listversion="1"&gt;&lt;method id="1" cmd="New"&gt;&lt;field name="ID"&gt;New&lt;/field&gt;&lt;field name="Title"&gt;krylovy&lt;/field&gt;&lt;/method&gt;&lt;/batch&gt;&lt;/a0:updates&gt;&lt;/a0:updatelistitems&gt;&lt;/env:body&gt;&lt;/robert@accettura.com&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// XML document&lt;br /&gt;var Updates = document.createElement("a0:updates");&lt;br /&gt;Operation.appendChild(Updates);&lt;br /&gt;&lt;br /&gt;var Batch = document.createElement("Batch");&lt;br /&gt;Batch.setAttribute("OnError","Return");&lt;br /&gt;Batch.setAttribute("ListVersion","1");&lt;br /&gt;Updates.appendChild(Batch);&lt;br /&gt;&lt;br /&gt;var Method = document.createElement("Method");&lt;br /&gt;Method.setAttribute("ID","1");&lt;br /&gt;Method.setAttribute("Cmd","New");&lt;br /&gt;Batch.appendChild(Method);&lt;br /&gt;&lt;br /&gt;var Field;&lt;br /&gt;var key;&lt;br /&gt;&lt;br /&gt;//one-time operations&lt;br /&gt;Field = createField('ID','New');&lt;br /&gt;Method.appendChild(Field);&lt;br /&gt;&lt;br /&gt;Field = createField('Title',data['url']);&lt;br /&gt;Method.appendChild(Field);&lt;br /&gt;&lt;br /&gt;for(key in data) {&lt;br /&gt;doLog('key: '+key+' value: '+data[key]);&lt;br /&gt;Field = createField(key,data[key]);&lt;br /&gt;Method.appendChild(Field);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return Doc;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function createField(key,value) {&lt;br /&gt;var field = document.createElement('Field');&lt;br /&gt;field.setAttribute('Name',key);&lt;br /&gt;&lt;br /&gt;var text = document.createTextNode(value);&lt;br /&gt;field.appendChild(text);&lt;br /&gt;&lt;br /&gt;return field;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function doLog(aMessage) {&lt;br /&gt;consoleService.logStringMessage("MSReporter: "+aMessage);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/bzbarsky@mit.edu&gt;&lt;/robert@accettura.com&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Full Listing of reportWizard.xul&lt;br /&gt;&lt;div style="overflow: auto; height: 300px; font-size: small; background-color: rgb(229, 229, 229);"&gt;&lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;!-- ***** BEGIN LICENSE BLOCK *****&lt;br /&gt;- Version: MPL 1.1/GPL 2.0/LGPL 2.1&lt;br /&gt;-&lt;br /&gt;- The contents of this file are subject to the Mozilla Public License Version&lt;br /&gt;- 1.1 (the "License"); you may not use this file except in compliance with&lt;br /&gt;- the License. You may obtain a copy of the License at&lt;br /&gt;- http://www.mozilla.org/MPL/&lt;br /&gt;-&lt;br /&gt;- Software distributed under the License is distributed on an "AS IS" basis,&lt;br /&gt;- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License&lt;br /&gt;- for the specific language governing rights and limitations under the&lt;br /&gt;- License.&lt;br /&gt;-&lt;br /&gt;- The Original Code is Mozilla Reporter (r.m.o).&lt;br /&gt;-&lt;br /&gt;- The Initial Developer of the Original Code is&lt;br /&gt;-      Robert Accettura &amp;lt;robert@accettura.com&amp;gt;.&lt;br /&gt;-&lt;br /&gt;- Portions created by the Initial Developer are Copyright (C) 2004&lt;br /&gt;- the Initial Developer. All Rights Reserved.&lt;br /&gt;-&lt;br /&gt;- Contributor(s):&lt;br /&gt;-&lt;br /&gt;- Alternatively, the contents of this file may be used under the terms of&lt;br /&gt;- either the GNU General Public License Version 2 or later (the "GPL"), or&lt;br /&gt;- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),&lt;br /&gt;- in which case the provisions of the GPL or the LGPL are applicable instead&lt;br /&gt;- of those above. If you wish to allow use of your version of this file only&lt;br /&gt;- under the terms of either the GPL or the LGPL, and not to allow others to&lt;br /&gt;- use your version of this file under the terms of the MPL, indicate your&lt;br /&gt;- decision by deleting the provisions above and replace them with the notice&lt;br /&gt;- and other provisions required by the LGPL or the GPL. If you do not delete&lt;br /&gt;- the provisions above, a recipient may use your version of this file under&lt;br /&gt;- the terms of any one of the MPL, the GPL or the LGPL.&lt;br /&gt;-&lt;br /&gt;- ***** END LICENSE BLOCK ***** --&amp;gt;&lt;br /&gt;&amp;lt;?xml-stylesheet href="chrome://global/skin/" type="text/css"?&amp;gt;&lt;br /&gt;&amp;lt;?xml-stylesheet href="chrome://reporter/skin/reportWizard.css" type="text/css"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE wizard [&lt;br /&gt;&amp;lt;!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd"&amp;gt;&lt;br /&gt;%brandDTD;&lt;br /&gt;&amp;lt;!ENTITY % reportWizardDTD SYSTEM "chrome://reporter/locale/reportWizard.dtd"&amp;gt;&lt;br /&gt;%reportWizardDTD;&lt;br /&gt;]&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;wizard id="reportWizard" title="&amp;amp;reportWizard.title;"&lt;br /&gt;xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"&lt;br /&gt;xmlns:html="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;script type="application/x-javascript" src="chrome://reporter/content/reportWizard.js"/&amp;gt;&lt;br /&gt;&amp;lt;stringbundle id="strings" src="chrome://reporter/locale/reportWizard.properties"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Privacy Notice --&amp;gt;&lt;br /&gt;&amp;lt;wizardpage id="privacyNotice"&lt;br /&gt;    onpageshow="initPrivacyNotice()"&lt;br /&gt;    label = "&amp;amp;privacyNotice.label;"&amp;gt;&lt;br /&gt;&amp;lt;!--description&amp;gt;&amp;amp;reportWizardPrivacy.description;&amp;lt;/description--&amp;gt;&lt;br /&gt;&amp;lt;vbox id="privacyFrame" flex="1" style="padding:10px"&amp;gt;&lt;br /&gt;&amp;lt;hbox&amp;gt;&lt;br /&gt;&amp;lt;html:img width="350px" height="133px" src="chrome://reporter/skin/firefoxlogo.gif" /&amp;gt;&lt;br /&gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;hbox height="100px"&amp;gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;hbox style="padding:4px;"&amp;gt;&lt;br /&gt;&amp;lt;description align="end" flex="1" style="text-align:right;"&amp;gt;&amp;amp;reportWizardPrivacy.description;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;/vbox&amp;gt;&lt;br /&gt;&amp;lt;/wizardpage&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Report Form --&amp;gt;&lt;br /&gt;&amp;lt;wizardpage id="reportForm"&lt;br /&gt;    onpageshow="initForm()"&lt;br /&gt;    label="&amp;amp;reportForm.label;"&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;amp;reportForm.description;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;separator /&amp;gt;&lt;br /&gt;&amp;lt;grid&amp;gt;&lt;br /&gt;&amp;lt;columns&amp;gt;&lt;br /&gt;&amp;lt;column/&amp;gt;&lt;br /&gt;&amp;lt;column flex="1"/&amp;gt;&lt;br /&gt;&amp;lt;/columns&amp;gt;&lt;br /&gt;&amp;lt;rows&amp;gt;&lt;br /&gt;&amp;lt;row align="center"&amp;gt;&lt;br /&gt;&amp;lt;label control="url" value="&amp;amp;reportForm.url.title;"/&amp;gt;&lt;br /&gt;&amp;lt;textbox id="url" size="60" readonly="true" class="noborder"/&amp;gt;&lt;br /&gt;&amp;lt;/row&amp;gt;&lt;br /&gt;&amp;lt;row align="center"&amp;gt;&lt;br /&gt;&amp;lt;spacer/&amp;gt;&lt;br /&gt;&amp;lt;checkbox id="behind_login" label="&amp;amp;reportForm.behind_login.title;" accesskey="&amp;amp;reportForm.behind_login.accesskey;"/&amp;gt;&lt;br /&gt;&amp;lt;/row&amp;gt;&lt;br /&gt;&amp;lt;row align="center"&amp;gt;&lt;br /&gt;&amp;lt;label control="problem_type" value="&amp;amp;reportForm.problem_type.title;" accesskey="&amp;amp;reportForm.problem_type.accesskey;"/&amp;gt;&lt;br /&gt;&amp;lt;!-- XXX: Perhaps this should eventually/maybe come from somewhere else?  Eh, not sure so lets just hardcode this for now. --&amp;gt;&lt;br /&gt;&amp;lt;menulist label="problem_type" id="problem_type" oncommand="validateForm()"&amp;gt;&lt;br /&gt;  &amp;lt;menupopup&amp;gt;&lt;br /&gt;    &amp;lt;!-- ************* WARNING *************** --&amp;gt;&lt;br /&gt;    &amp;lt;!-- DO *NOT* Add/change/modify without consulting with r.m.o server admin first! --&amp;gt;&lt;br /&gt;    &amp;lt;!-- ************ /WARNING *************** --&amp;gt;&lt;br /&gt;    &amp;lt;menuitem label="&amp;amp;reportForm.problem_type.chooseOne.title;" value="0"/&amp;gt;&lt;br /&gt;    &amp;lt;menuitem label="&amp;amp;reportForm.problem_type.item1.title;" value="1"/&amp;gt;&lt;br /&gt;    &amp;lt;menuitem label="&amp;amp;reportForm.problem_type.item2.title;" value="2"/&amp;gt;&lt;br /&gt;    &amp;lt;menuitem label="&amp;amp;reportForm.problem_type.item3.title;" value="3"/&amp;gt;&lt;br /&gt;    &amp;lt;menuitem label="&amp;amp;reportForm.problem_type.item4.title;" value="4"/&amp;gt;&lt;br /&gt;    &amp;lt;menuitem label="&amp;amp;reportForm.problem_type.item5.title;" value="5"/&amp;gt;&lt;br /&gt;    &amp;lt;menuitem label="&amp;amp;reportForm.problem_type.item6.title;" value="6"/&amp;gt;&lt;br /&gt;    &amp;lt;menuitem label="&amp;amp;reportForm.problem_type.item7.title;" value="7"/&amp;gt;&lt;br /&gt;  &amp;lt;/menupopup&amp;gt;&lt;br /&gt;&amp;lt;/menulist&amp;gt;&lt;br /&gt;&amp;lt;/row&amp;gt;&lt;br /&gt;&amp;lt;row&amp;gt;&lt;br /&gt;&amp;lt;label control="description" value="&amp;amp;reportForm.describe.title;" accesskey="&amp;amp;reportForm.describe.accesskey;"/&amp;gt;&lt;br /&gt;&amp;lt;textbox id="description" value="" cols="40" rows="5" multiline="true" size="40" class="noborder"/&amp;gt;&lt;br /&gt;&amp;lt;/row&amp;gt;&lt;br /&gt;&amp;lt;row align="center"&amp;gt;&lt;br /&gt;&amp;lt;label control="email" value="&amp;amp;reportForm.email.title;" accesskey="&amp;amp;reportForm.email.accesskey;"/&amp;gt;&lt;br /&gt;&amp;lt;textbox id="email" size="60" class="noborder" disabled="true"/&amp;gt;&lt;br /&gt;&amp;lt;/row&amp;gt;&lt;br /&gt;&amp;lt;!--row align="center"&amp;gt;&lt;br /&gt;&amp;lt;spacer/&amp;gt;&lt;br /&gt;&amp;lt;hbox&amp;gt;&lt;br /&gt;  &amp;lt;label id="privacyPolicy" class="text-link"&lt;br /&gt;         value="&amp;amp;reportForm.privacyPolicy.title;"&lt;br /&gt;         tooltiptext="&amp;amp;reportForm.privacyPolicy.tooltip;"/&amp;gt;&lt;br /&gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;/row--&amp;gt;&lt;br /&gt;&amp;lt;/rows&amp;gt;&lt;br /&gt;&amp;lt;/grid&amp;gt;&lt;br /&gt;&amp;lt;/wizardpage&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Send Data --&amp;gt;&lt;br /&gt;&amp;lt;wizardpage id="sendReport"&lt;br /&gt;    onpageshow="sendReport()"&lt;br /&gt;    label="&amp;amp;sendReport.label;"&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;&amp;amp;sendReport.description;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;separator /&amp;gt;&lt;br /&gt;&amp;lt;description id="sendReportProgressDescription"/&amp;gt;&lt;br /&gt;&amp;lt;progressmeter id="sendReportProgressIndicator" mode="undetermined" value="0%"/&amp;gt;&lt;br /&gt;&amp;lt;/wizardpage&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Finish --&amp;gt;&lt;br /&gt;&amp;lt;wizardpage id="finish"&lt;br /&gt;    label="&amp;amp;finish.label;"&amp;gt;&lt;br /&gt;&amp;lt;textbox id="finishSummary" size="60" readonly="true"/&amp;gt;&lt;br /&gt;&amp;lt;hbox&amp;gt;&lt;br /&gt;&amp;lt;checkbox id="showDetail" label="&amp;amp;reportResults.showDetail.title;" accesskey="&amp;amp;reportResults.showDetail.accesskey;" oncommand="showDetail()"/&amp;gt;&lt;br /&gt;&amp;lt;/hbox&amp;gt;&lt;br /&gt;&amp;lt;vbox id="finishExtendedFrame" flex="1"&amp;gt;&lt;br /&gt;&amp;lt;iframe id="finishExtendedSuccess" type="content" src="report.xhtml" flex="1"/&amp;gt;&lt;br /&gt;&amp;lt;iframe id="finishExtendedFailed" type="content" src="error.xhtml" flex="1"/&amp;gt;&lt;br /&gt;&amp;lt;/vbox&amp;gt;&lt;br /&gt;&amp;lt;/wizardpage&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/wizard&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Testing and Packaging&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Backup the .jar's with Reporter's components.  For quick/dirty tests, simply open up each of the aforementioned jars with something like WinRAR and simply overwrite/add the pristine files with your version.  Changes should take effect after restart of the browser.&lt;br /&gt;&lt;br /&gt;Optionally, and I have not done this, you can create the manifests and treat reporter as just another extension under development.  This is probably the best way to go if changes to the extension are significant.&lt;br /&gt;&lt;br /&gt;My team compiles our own version of Firefox for internal distribution.  Changes to the reporter extension are part of our "pre-build" process.  Luckily, this extension has not changed over the lifetime of Firefox 2.&lt;br /&gt;&lt;br /&gt;Other options are simply to use CCK or a wrapper to drop in your replacement jars prior to roll-out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spread the word&lt;br /&gt;&lt;/span&gt;Users need to know that the "Report a Broken Website..." has been customized and is available for use.  Within a few weeks we accumulated over 300 entries with around 10 unique sites making our "To be Remediated List".  Yeah, I wussed out on the "Wall of Shame" title =)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Wrap up&lt;/span&gt;&lt;br /&gt;Hopefully, the walk-through illustrated some strategies in customizing the Reporter extension.  Although my example publishes to Sharepoint in SOAP format, the mechanisms for submitting to any Web Service are standard and should be fairly straight-forward to customize for your own needs.  The resulting Dashboard/Reporting aspect is community-friendly and provides useful statistics to guide the prioritization of remediation work&lt;span style="font-style: italic;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Errata will certainly follow in the form of comments and I of course welcome corrections, opinions, feedback and your own stories from the frontier.  Cheers.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-9036244883349089076?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cjBvQn7G9b4:_7-bDtbp0uc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cjBvQn7G9b4:_7-bDtbp0uc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cjBvQn7G9b4:_7-bDtbp0uc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cjBvQn7G9b4:_7-bDtbp0uc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=cjBvQn7G9b4:_7-bDtbp0uc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cjBvQn7G9b4:_7-bDtbp0uc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cjBvQn7G9b4:_7-bDtbp0uc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=cjBvQn7G9b4:_7-bDtbp0uc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/cjBvQn7G9b4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/9036244883349089076/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=9036244883349089076" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/9036244883349089076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/9036244883349089076?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/cjBvQn7G9b4/customizing-firefoxs-reporter-for.html" title="Customizing Firefox's Reporter for the Enterprise" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Hi94bdcu3SI/R6nbiQS4NuI/AAAAAAAAAEk/miwKjJdAqjs/s72-c/help_rbws1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.yuriy.org/2008/02/customizing-firefoxs-reporter-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEBQ3ozcSp7ImA9WxZSEUw.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-7485415523511672381</id><published>2008-01-23T01:28:00.000-05:00</published><updated>2008-01-23T13:40:52.489-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-23T13:40:52.489-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="babysteps" /><title>Taking Baby Steps (part 4): The Ten-Step Plan</title><content type="html">Here it is.  Feedback is always welcome.  Naturally.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Need a Blog: &lt;/span&gt;Pick a Blogging platform but do your best to leverage an in-house platform, if one exists.  Please, do not simply download some Blogging software into your work environment.  Reach out to your friendly, neighborhood IT dept for guidance.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Put a project into your "lab": &lt;/span&gt;Pick a small project that can benefit from improved transparency.  By "small" I mean one that is not super critical and one that you have some leeway to experiment with.   These tend to be the types of  projects where Delivering is your primary responsibility and not Joe's...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Don't overdo it: &lt;/span&gt;Establish guidelines about what kind of information is worth "tracking".  I've outlined some ideas in my previous posts ("&lt;a href="http://e2pt0.blogspot.com/search/label/babysteps"&gt;Taking Baby Steps&lt;/a&gt;" series).   In essence, establish a Knowledge Base of some sort, even if you have to cobble something together.  Don't over-engineer your posts.  Like a good workout program, keep it lively, keep it real, reduce obstacles so you can sustain.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Dogfood: &lt;/span&gt;Spend a few weeks being selfish and commit information to the KB that helps you be successful on your project.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Dangle the carrot: &lt;/span&gt;Give the link or RSS Feed to this KB to your manager and your team-mates.  Use the content as a basis for your meeting agendas and follow-ups.  Work on getting your colleagues to read your post prior to the meetings.  One way to do this is to send a plain-old-email with a link to your post an hour ahead of a meeting.  Make it clear that the meeting will cover the agenda enumerated there and you'd like to spend less time regurgitating and spend more time decision-making.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Aggressively seek the ever-elusive "manager" comments on your blog. Period.  &lt;/span&gt;Your efforts will not succeed without a completed Feedback loop.  Active participation is key.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Manage expectations: &lt;/span&gt;This is not a be all, end all solution.  Make sure that your social network is aware of this fact.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Tag it up: &lt;/span&gt;Create a taxonomy of "special" Tags and standardize them.  That is agree, for example, that all weekly summaries posted to individual product blogs should be Tagged as "weekly" and that all 2-week look-aheads should be Tagged as "iteration".&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Roll it up: &lt;/span&gt;Construct a Dashboard Tab that may be of value to your manager's manager by rolling up RSS feeds filtered by your "weekly" and "iteration" tags.  Get your manager's, manager's manager to acknowledge its usefulness.  If you can pull this off, send me an email and I will honor you with the &lt;span style="font-weight: bold;"&gt;Order of Blogging Ninja&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Road show:  &lt;/span&gt;Leverage your network to identify like-minded individuals who will benefit from a similar set up.  Document the set-up process, best practices and your experiences on a Wiki as you explain the process to your buddy.  Encourage your buddy to contribute to this Wiki as (s)he works out the implementation and goes through the process.  Rinse and repeat.  After a month or two, put together a Forum of sorts and present your findings to your department.  Please don't be boring.  Then, go to Disney World.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;I'll let the 10th point act as the transition into the world of Wikis; coming up next.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-7485415523511672381?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=LHtt6cMgNo4:BfGPOYrtfy0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=LHtt6cMgNo4:BfGPOYrtfy0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=LHtt6cMgNo4:BfGPOYrtfy0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=LHtt6cMgNo4:BfGPOYrtfy0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=LHtt6cMgNo4:BfGPOYrtfy0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=LHtt6cMgNo4:BfGPOYrtfy0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=LHtt6cMgNo4:BfGPOYrtfy0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=LHtt6cMgNo4:BfGPOYrtfy0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/LHtt6cMgNo4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/7485415523511672381/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=7485415523511672381" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7485415523511672381?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7485415523511672381?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/LHtt6cMgNo4/taking-baby-steps-part-4-ten-step-plan.html" title="Taking Baby Steps (part 4): The Ten-Step Plan" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/09/taking-baby-steps-part-4-ten-step-plan.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYGSXYzeip7ImA9WB9REkw.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-7413557404793638663</id><published>2007-10-12T14:18:00.000-04:00</published><updated>2007-10-12T14:35:28.882-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-12T14:35:28.882-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><title>Creating backups of Folders with C#.NET</title><content type="html">Zipping up folders for backup purposes with C# in .NET2 is painful.  Using 3rd party libs is bulky.  &lt;a href="http://www.codeproject.com/csharp/compresswithwinshellapics.asp?df=100&amp;amp;forumid=227893&amp;amp;select=2269435&amp;amp;msg=2269435"&gt;CodeProject and Geralrd Gibson Jr &amp; Friends to the Rescue&lt;/a&gt;.  And because regurgitation is useful for later retrieval, here is the "Silent Mode" code snippet that works for me:&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow:auto; background-color:#cfcfcf; width="300px";"&gt;&lt;pre&gt;internal void Backup()&lt;br /&gt;{&lt;br /&gt;  LogHelper.Info(String.Format("Backing up Folder to {0}...", Config.General.ApplicationDataDir));&lt;br /&gt;  string backupFolder = String.Concat(Config.General.ApplicationDataDir,Config.General.DirectorySeparatorStr,"Backup");&lt;br /&gt;  string backupZip = String.Concat(backupFolder,Config.General.DirectorySeparatorStr,"Backup_",DateTime.Now.ToFileTime(),".zip");&lt;br /&gt;  if(!Directory.Exists(backupFolder)) Directory.CreateDirectory(backupFolder);&lt;br /&gt;            &lt;br /&gt;  byte[] emptyzip = new byte[]{80,75,5,6,0,0,0,0,0, &lt;br /&gt;                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};&lt;br /&gt;&lt;br /&gt;  FileStream fs = File.Create(backupZip);&lt;br /&gt;  fs.Write(emptyzip, 0, emptyzip.Length);&lt;br /&gt;  fs.Flush();&lt;br /&gt;  fs.Close();&lt;br /&gt;  fs = null;&lt;br /&gt;&lt;br /&gt;  //Copy a folder and its contents into the newly created zip file&lt;br /&gt;  Shell32.ShellClass sc = new Shell32.ShellClass();&lt;br /&gt;  Shell32.Folder SrcFlder = sc.NameSpace(Config.General.LocalRootPath);&lt;br /&gt;  Shell32.Folder DestFlder = sc.NameSpace(backupZip); &lt;br /&gt;  //Shell32.FolderItems items = SrcFlder.Items();&lt;br /&gt;  //1564 =&lt;br /&gt;  //+ 4     Do not display a progress dialog box.&lt;br /&gt;  //+ 16     Click "Yes to All" in any dialog box displayed.&lt;br /&gt;  //+ 512     Do not confirm the creation of a new directory if the operation requires one to be created.&lt;br /&gt;  //+ 1024 Do not display a user interface if an error occurs.&lt;br /&gt;  DestFlder.CopyHere(SrcFlder, 1564);&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-7413557404793638663?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cYSUZtQsWOE:Qpkvdx1rX9c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cYSUZtQsWOE:Qpkvdx1rX9c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cYSUZtQsWOE:Qpkvdx1rX9c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cYSUZtQsWOE:Qpkvdx1rX9c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=cYSUZtQsWOE:Qpkvdx1rX9c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cYSUZtQsWOE:Qpkvdx1rX9c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=cYSUZtQsWOE:Qpkvdx1rX9c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=cYSUZtQsWOE:Qpkvdx1rX9c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/cYSUZtQsWOE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/7413557404793638663/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=7413557404793638663" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7413557404793638663?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7413557404793638663?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/cYSUZtQsWOE/creating-backups-of-folders-with-cnet.html" title="Creating backups of Folders with C#.NET" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/10/creating-backups-of-folders-with-cnet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUINR3s-fyp7ImA9WB9TFkw.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-4227662834763303245</id><published>2007-09-24T14:21:00.000-04:00</published><updated>2007-09-24T01:59:56.557-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-09-24T01:59:56.557-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="babysteps" /><title>Taking Baby Steps (part 3): Dashboards - A managerial love story</title><content type="html">&lt;span style="font-weight: bold;"&gt;Overview&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Part 2  of this series "&lt;a href="http://e2pt0.blogspot.com/2007/07/taking-baby-steps-part-2-only-one.html"&gt;Taking Baby Steps (part 2): Only one person reads my Blog and I've already won&lt;/a&gt;" discussed some ways in which posts to personal, work-related Blogs (aka Knowledge Bases) are relevant to our team-mates and managers.  Additionally, techniques on targeting posts through use of Tags were also presented.&lt;br /&gt;&lt;br /&gt;In this 3rd post, I will talk about Dashboards, what they're for and how to set them up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Basic Unit of Information about which people relate at work&lt;/span&gt;&lt;br /&gt;Projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Just the "sweet spot", please&lt;br /&gt;&lt;/span&gt;There is an inverse relationship between someone's social proximity (in a "Social Degrees of Separation" sense) and   their&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;Tolerance for Irrelevant Information&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Amount of time willingly spent extrapolating "important" information&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span&gt;That is, the farther apart two people are in a socio-professional environment, the smaller their overlap of interests.  Let's say 70% of my time is dedicated to Project A and 30% to Project B.  My colleague Bob also dedicates 30% of his time to Project B.  What this means is that out of all the information and knowledge I deal with on a daily basis, only 30% of it is relevant to Bob and I only have 30% of my time available to share this information.&lt;br /&gt;&lt;br /&gt;Furthermore, depending on the roles being played, it is important to understand which 30% of Project B Bob focuses on.  If Bob is the Project Manager, odds are that the details of your application's algorithm beyond a statement that "it works" is not very relevant to Bob.   Including Bob in day-to-day, back-and-forth conversation about algorithm optimizations negatively impacts Bobs productivity given his slice of the pie.   This should not be interpreted as "Bob should be left in the dark for the other 70%".  Rather:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Amount of information sent through the pipe is important.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Quality of information is very important&lt;/li&gt;&lt;li&gt;Order of information is also important&lt;/li&gt;&lt;/ul&gt;Some elaboration.  For example, most people skim through email until something of importance catches their eye.  Then they will read around that which jumped out.  This is an act of validation.  The reader is Gauging and Confirming Level of Relevancy.  As was stated earlier, we all have a threshold.  Whether this is acknowledged or not, we all associate Quality of information relayed to us with the originator of the communication.  We even have functionality built into our email clients to reward those sources of information that we believe to consistently relay High Quality information.  People whose communications I wish to help penetrate through "my" noise get their own Mail Folder and a Rule.   The Folder makes it into my Top 5 and so on.   Rather than skimming I tend to read these communications "normally".  High Quality/Highly Relevant information from the originator creates a level of Trust.   Perhaps its a bit too cliche to claim that Trust allows for solid Feedback Loops.  Rather, its very clear that a lack of Trust results in a well stocked Trash.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Ideally, communications to Bob are well targeted bringing the 30% of the project Bob is involved in to the forefront.   (Bob thanks me for not wasting his time.)&lt;br /&gt;&lt;br /&gt;A not so "Side Note".  I really dislike emails that say "FYI" followed by a long thread of bracketed who-knows-what.  Figuring out the part that is in fact For My Information will require me to skim not just one email, but all the accompanying threads.  Cliff Notes at the top, please!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Information Trickle&lt;br /&gt;&lt;/span&gt;Why do "executive" summaries exist everywhere but in our routine communications within our Social Networks?  The "Cliff Notes" quip above actually deserves some discussion.  Clues about content subject matter and how it pertains to "me" are very helpful because they grant me the opportunity to cash out sooner rather than later.  Tags are great but not as great as a one-sentence summary that speaks right to my forehead.  Descriptive titles/subjects also help a great deal!&lt;br /&gt;&lt;br /&gt;Whether we skim, or jump back and forth as we consume written information, it is still done (for must of us) in a linear way.  Pardon the nerdy analogy but this is like a Disk Head tracking back and forth over a Hard Drive.  Meta information about files, directories etc in all File Systems is also at the "top".  &lt;/span&gt;&lt;span&gt;Search Engines construct indexes  that pull out relevant information so that from then on the engine can gauge a match - "this data is relevant" - as quickly and efficiently as possible.  There are many other examples of almost identical optimizations that happen in technology because we demand it.  Somehow, similar optimizations fail to make it into routine meeting, emails, phone conversations, and so on.  It would be nice to have that Trickle from High Level but High Quality information to Low Level details in all mediums of communication.&lt;br /&gt;&lt;br /&gt;Dashboards are about creating this kind of Information Trickle for other forms of Project-related information.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Dashboards and RSS Feeds go hand in hand&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;My Dashboard at work contains the following:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Tab 1: 20,000 feet&lt;/span&gt; -&lt;br /&gt;Idea here is to create that High-level but informative "At-A-Glance" View of team-wide activity.  This High Level but High Quality landing page is relevant to anyone who may be interested in the activities of the team.  For a manager 1 or more Social Degrees away, this is a good place to begin "dipping" into our "world" without being overwhelmed by all the details.  For my team-mates, this Tab can serve as the Sync-Point for meeting agendas, follow-ups, Iteration refinement and so on.  My team-mates will most likely want/need to drill deeper, the manager 1 or more Social Degrees away will not!&lt;br /&gt;&lt;br /&gt;Specifically, our first Tab contains:&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Changes to Production &lt;/span&gt;- Feeds that describe changes to portions of the "production" environment we are responsible for.  This is a feed coming out of our Turnover Control System.  It's not RSS at this point but hopefully will be soon.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Work plan for the entire team spanning 2 weeks time (this is the Two-week Iteration).  This is just an aggregate feed that collates Two-week Iterations from individual product blogs based on the "iteration" Tag.&lt;/li&gt;&lt;li&gt;Top 5 Bugs or Issues spanning all our products.  This is yet another RSS Feed filtered for items tagged or flagged as "important" from our issue tracking system.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Links that allow the reader to subscribe to any of the RSS feeds exposed on the page&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Tab 2-x: Product-specific pages&lt;/span&gt;&lt;br /&gt;Each of these Tabs is dedicated to a specific Product/Project the team works on.  These tabs are a natural "drill-target" from the 1st Tab.  My Product Tabs contain:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Changes to productions affecting this specific product&lt;/li&gt;&lt;li&gt;Iteration posts for this product.  This is a regular RSS Feed coming form my Product Blog filtered on the "iteration" tag.&lt;/li&gt;&lt;li&gt;News Items or Alerts coming from the Blog or the Product Site.  (The Product Site tends to target the end-user/customer.  It's not very technical but provides enough insight about the Product's stage in it's life cycle, and the standard "what" and "how")&lt;/li&gt;&lt;li&gt;Top 5 Bugs or Issues for this specific product/project&lt;/li&gt;&lt;li&gt;Links that allow the reader to subscribe to any of the RSS feeds exposed on the page&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;RSS Feeds are a natural way to "summarize" content that lives elsewhere.  As you can see, no content is actually managed by the Dashboard.  The Dashboard simply assembles information into easily consumable pieces.  The Trickle is enabled by:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;At-a-Glance views of tightly-correlated information&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ability to stay High-Level yet still obtain more detail.  The reader can explore Product-specific Tabs without leaving the context of the Dashboard.&lt;/li&gt;&lt;li&gt;Link-backs to the source of information.  The reader can drill even deeper by clicking on any item in any of the feeds and be taken to the full "article".  The reader does this by choice - this is key.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Technologies at Play&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Blogs with RSS capabilities&lt;/span&gt;&lt;span style="font-style: italic;"&gt; -&lt;/span&gt;&lt;br /&gt;Blogs tend to be more appropriate for Weekly Summaries and Iteration posts.  My Blog allows me to publish via email so I don't have to change my habits to post.  I publish from my Email Client.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;RSS Web Part -&lt;/span&gt;&lt;br /&gt;RSS is not just about getting news from slashdot.  It can be a very powerful Glue for information that lives everywhere yet needs to be correlated in a single View.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;A portal framework with a Tabs Layout -&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;The Sharepoints of the world all have this built in.  Acquiring RSS Web Parts is also not too difficult.  Some Wikis out there (like Twiki or Confluence) allow you to inject all sorts of content into a single page view, including RSS.  These are all basic things.  As always, your friendly neighborhood IT department will have some options for you.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;How to get started&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Naturally, I recommend taking "baby" steps.  Most teams will fall into two categories:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;A lot of unorganized documentation floating around in multiple formats&lt;/li&gt;&lt;li&gt;All project-related know-how is stored in the brain of the guy two weeks away from retirement&lt;/li&gt;&lt;/ol&gt;For folks that fall into the 1st group, it's a matter of figuring out the kind of information that is most useful to highlight on a dashboard.  Some teams I've worked with went straight to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Top Bugs&lt;/li&gt;&lt;li&gt;Testing Results&lt;/li&gt;&lt;li&gt;Latest activity around portfolio work for a client&lt;/li&gt;&lt;/ul&gt;Folks falling into the 2nd category should consider starting with &lt;a href="http://e2pt0.blogspot.com/2007/07/taking-baby-steps-personal-ad-hoc-kb.html"&gt;Personal, Ad-hoc Knowledge Bases&lt;/a&gt; and expanding out from there.&lt;br /&gt;&lt;br /&gt;In general, the type of information that is of Highest Value to your social network should be exposed first.  The gains will be emergent and will inspire further investment into not just the Dashboards but also into creating and persisting the High Quality data underneath.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion and what's up next&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Dashboards just front the Collaborative Environment.   If the information in Product Blogs, Wikis, etc is not up-to-date, Dashboard's highlights are meaningless.  It does take some work and consistency to provide this kind of transparency to your team, your manager and your customers.&lt;br /&gt;&lt;br /&gt;Typically, gate-keeping Knowledge Bases and their Dashboards is the responsibility of Team Leads and Product or Project Managers.  To get started though, all you need is a Champion, someone who will get the team going, while incrementally proving value.  Once your manager is convinced (unless of course you are the manager) some top-down "encouragement" never hurts.&lt;br /&gt;&lt;br /&gt;In my next post, I will propose a 10-Step Plan to putting these concepts to practice so we can move on to topics such as Wikis, Issue Tracking, and Interruption Management.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-4227662834763303245?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=3fTW2Zp2Wyw:gBLQhq4D_8E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=3fTW2Zp2Wyw:gBLQhq4D_8E:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=3fTW2Zp2Wyw:gBLQhq4D_8E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=3fTW2Zp2Wyw:gBLQhq4D_8E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=3fTW2Zp2Wyw:gBLQhq4D_8E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=3fTW2Zp2Wyw:gBLQhq4D_8E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=3fTW2Zp2Wyw:gBLQhq4D_8E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=3fTW2Zp2Wyw:gBLQhq4D_8E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/3fTW2Zp2Wyw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/4227662834763303245/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=4227662834763303245" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/4227662834763303245?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/4227662834763303245?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/3fTW2Zp2Wyw/taking-baby-steps-part-3-dashboards.html" title="Taking Baby Steps (part 3): Dashboards - A managerial love story" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/07/taking-baby-steps-part-3-dashboards.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUNQXg5eSp7ImA9WB9TFEQ.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-7297057976473501498</id><published>2007-09-19T13:54:00.000-04:00</published><updated>2007-09-22T17:24:50.621-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-09-22T17:24:50.621-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enterprise firefox" /><title>Firefox EWG - Meeting #3</title><content type="html">&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;Call on Sept 19th was about useful Extensions for the Enterprise.  A larger portion of the meeting, however focused on the apparent dwindling interest in Enterprise Firefox within the larger community.&lt;br /&gt;&lt;br /&gt;Is the Enterprise simply not ready to bring Firefox in-house? Or, are the majority of institutional adopters simply happy with a consumer product floating about?&lt;br /&gt;&lt;br /&gt;Perhaps one of the problems is that we still talk about Firefox as a Web Browser as opposed to a "Productivity Platform" for the Desktop.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Firefox is a Productivity Platform&lt;/span&gt;&lt;br /&gt;All the features that make Firefox a consumer favorite deal with productivity.  Tabs, keywords, search bars, extensions, dictionaries, etc help us be effective and productive in our work and home lives.  When consumer says "better usability", enterprise says "better productivity".&lt;br /&gt;&lt;br /&gt;Mike Kaply spoke about adoption at IBM.  Developers are finding ways to enhance the end-user experience by writing custom extensions for Firefox.  Whether the extensions glue several applications together or simply automate the tedious process of filling out web-forms, end result is a boost to productivity.&lt;br /&gt;&lt;br /&gt;If Firefox is the gateway or glue between what's on the Desktop and what's on the network, potential for productivity-boosting application is something to ponder.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Raising awareness&lt;br /&gt;&lt;/span&gt;Mike and I are going to take lead on a few initiatives to help raise awareness on the Enterprise Firefox front:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;10 Steps to adopting Firefox in the Enterprise&lt;/span&gt; -&lt;br /&gt;Now that we've begun to pool experiences, we should be able to bake out a definitive guide of sorts for things to consider when bringing Firefox into an enterprise environment&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Good Ol' Conference&lt;/span&gt; -&lt;br /&gt;We will begin looking at opportunities to present at some Conferences&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Blogging -&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; check...&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Code Day and Training&lt;/span&gt; -&lt;br /&gt;The learning curve for any kind of Mozilla-related development is rather high.  Perhaps training targeting institutions and enterprises (like an Enterprise track) will help developers scale this wall.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Enterprise Firefox Incubator&lt;/span&gt; -&lt;br /&gt;Talk has alway been cheap.  As we address settings management, security, tools etc we will kick off projects within the Enterprise Working Group.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Enterprise Working Group Incubator&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;On my end, I'm going to kick off some projects for the Incubator.  Specifically there has been interest in:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Mission Control&lt;/span&gt; - how to get up and running, what the back-end implementation can look like and benefits over GPO&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Customized Reporter Extension&lt;/span&gt; - so that you can redirect Broken Website reports to a repository on your intranet&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Managed Security Zones for Firefox &lt;/span&gt;- how to configure and lock capabilitiy.policy settings in Firefox, how to create a "trusted" zone and fully leverage Web2.0 technologies within your trusted intranet.&lt;/li&gt;&lt;/ul&gt;As always, if any of these topics or projects are of interest to you, please visit http://enterprisefirefox.org, participate in the calls or simply leave a comment on this here Blog.&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-7297057976473501498?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=GVmPBboiLuQ:sxBkhGAEXkc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=GVmPBboiLuQ:sxBkhGAEXkc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=GVmPBboiLuQ:sxBkhGAEXkc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=GVmPBboiLuQ:sxBkhGAEXkc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=GVmPBboiLuQ:sxBkhGAEXkc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=GVmPBboiLuQ:sxBkhGAEXkc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=GVmPBboiLuQ:sxBkhGAEXkc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=GVmPBboiLuQ:sxBkhGAEXkc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/GVmPBboiLuQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/7297057976473501498/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=7297057976473501498" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7297057976473501498?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/7297057976473501498?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/GVmPBboiLuQ/firefox-ewg-meeting-3.html" title="Firefox EWG - Meeting #3" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/09/firefox-ewg-meeting-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQAQ384fSp7ImA9WB5UFkg.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-3994329368380486153</id><published>2007-08-20T21:04:00.000-04:00</published><updated>2007-08-20T21:05:42.135-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-20T21:05:42.135-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enterprise firefox" /><title>Third Firefox Enterprise Working Group Meeting August 22nd</title><content type="html">&lt;p&gt;Third call is scheduled for Wednesday, August 22th at 10:00am Pacific, 1:00pm Eastern, 17:00 UTC. Details: &lt;/p&gt; &lt;ul&gt;&lt;li&gt; 650-903-0800 or 650-215-1282 x91 Conf# 280 (US/INTL)&lt;/li&gt;&lt;li&gt;1-800-707-2533 (pin 369) Conf# 280 (US)&lt;/li&gt;&lt;li&gt;IRC - irc.mozilla.org - #ewg&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt; The theme is “Extensions.” Please check out the &lt;a href="http://wiki.mozilla.org/Enterprise"&gt;EWG Wiki page&lt;/a&gt; for more information.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-3994329368380486153?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=EYoA87kqNmk:IQaAFrvtiL0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=EYoA87kqNmk:IQaAFrvtiL0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=EYoA87kqNmk:IQaAFrvtiL0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=EYoA87kqNmk:IQaAFrvtiL0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=EYoA87kqNmk:IQaAFrvtiL0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=EYoA87kqNmk:IQaAFrvtiL0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=EYoA87kqNmk:IQaAFrvtiL0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=EYoA87kqNmk:IQaAFrvtiL0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/EYoA87kqNmk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/3994329368380486153/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=3994329368380486153" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/3994329368380486153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/3994329368380486153?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/EYoA87kqNmk/third-firefox-enterprise-working-group.html" title="Third Firefox Enterprise Working Group Meeting August 22nd" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/08/third-firefox-enterprise-working-group.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUGQng5eip7ImA9WB5VFUQ.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-1935957830484053142</id><published>2007-08-08T13:17:00.000-04:00</published><updated>2007-08-08T14:37:03.622-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-08T14:37:03.622-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enterprise firefox" /><title>Firefox EWG - Meeting #2</title><content type="html">&lt;span style="font-weight: bold;"&gt;Overview&lt;/span&gt;&lt;br /&gt;This call focused on the Enterprise Wishlist.  What are some common problems that need resolving and what features can we vote "up" as a Community?&lt;br /&gt;&lt;br /&gt;Topics covered:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Addon Management&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Do enterprises wish to control updates to addons or the application itself?&lt;br /&gt;The general sentiment seems to be "yes".  At one extreme an enterprise may wish to allow the user's browser to pull updates directly from Mozilla.  At the other extreme, an enterprise may wish to provide an intermediary point so that all internal browsers pull updates from this point.  The intermediary infrastructure then has to have a way of pulling latest updates from Mozilla, either manually or automatically.&lt;br /&gt;&lt;br /&gt;So, first, we need to understand how to configure for each scenario.  Second we need to understand how to set up our internal infrastructure to facilitate the second scenario.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Distribution&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MSI packaging -This seems to be something everyone wants.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Ability to easily repackage the browser so we can add in our own "default" addons.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Distributors that create packages for others to deploy cannot use the Firefox brand as part of their package.  However, enterprises that deploy for internal audience only can use the Firefox brand.  Can we work through these issues to make distribution channels more accessible?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Settings Management&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Group Policy - a non-trivial problem to solve.  Need to work on proper GPO integration!&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;GPO vs Mission Control - pros and cons - will schedule a separate meeting to discuss these issues.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Security Zones&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;By design, Firefox does not allow cross-domain scripting.  For an intranet, this can effectively break Web2.0 where developers want web technologies to federate.  With IE, subdomains on a common domain are placed in a Trusted Security Zone.  The relaxed security settings allow full-blow AJAX federation and interoperability.  Similar capabilities exist in Firefox but they are no where near on par with IE.&lt;br /&gt;&lt;br /&gt;Firefox has a notion of a "security setting".  There are even &lt;span style="font-style: italic;"&gt;policy.*&lt;/span&gt; settings that make it possible to simulate Security Zones.  This is great!  However, Firefox treats policy.* and other security settings differently from rest of the settings.  In fact - according to Mike Kaply - it is a completely different API.   Mission Control cannot manage these settings which means we can't enable them across the Firm.  This is a real challenge.  How can we allow Mission Control or GPOs to enable these settings in a managed manner?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Personal Musings&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;My team compiles our own version of Firefox from the latest "stable" source.  We make no changes to the code base.  Why do we do this?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Set our own version and timestamp info for the executable and the dlls.  This helps us differentiate between "supported" Firefox and a "renegade" Firefox within the Firm.  We actively discourage users from installing vanilla or "renegade" versions of anything.  This is simply a security precaution for a Fortune 500.  All software deployment goes through this pipeline.  An unpatched Firefox within our environment that admits an exploit vector could be disastrous for business.&lt;/li&gt;&lt;li&gt;We enable and compile in the "Autoconfig" mode that allows us to run Mission Control for settings management.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We introduce some custom extensions and themes that we want to include in our package.&lt;/li&gt;&lt;li&gt;We drop in config files for Mission Control&lt;/li&gt;&lt;/ol&gt;Points 3 and 4 don't really have much to do with compilation.  Using Mike Kaply's technique for repackaging Firefox (see &lt;a href="http://www.kaply.com/weblog/2007/07/27/manually-repackaging-the-firefox-installer-on-windows/"&gt;here&lt;/a&gt;) we can drop in our custom stuff without having to re-compile.  Points 1 and 2, however really prevent us from taking advantage of a third-party MSIs.  In fact all packages of "vanilla" Firefox are pretty much useless to us.&lt;br /&gt;&lt;br /&gt;My point, we really do need an Enterprise Firefox package that's separate from the Consumer package.  But what is it?  What's the common denominator?  One enterprise will want to manage settings with GPOs.  Another one will want Mission Control.  A third will want both.  Is it possible to instrument a flexible package that can be configured?  Maybe asking enterprises to compile their own version is not such a big deal when instructions on doing so are bullet proof.  Much to think about...&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-1935957830484053142?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=Mmd-FDbY7x8:YneJYDSjAoA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=Mmd-FDbY7x8:YneJYDSjAoA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=Mmd-FDbY7x8:YneJYDSjAoA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=Mmd-FDbY7x8:YneJYDSjAoA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=Mmd-FDbY7x8:YneJYDSjAoA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=Mmd-FDbY7x8:YneJYDSjAoA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=Mmd-FDbY7x8:YneJYDSjAoA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=Mmd-FDbY7x8:YneJYDSjAoA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/Mmd-FDbY7x8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/1935957830484053142/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=1935957830484053142" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/1935957830484053142?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/1935957830484053142?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/Mmd-FDbY7x8/firefox-ewg-meeting-2.html" title="Firefox EWG - Meeting #2" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/08/firefox-ewg-meeting-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQHRngyeip7ImA9WB5WGEQ.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-6426736968235924426</id><published>2007-07-31T10:52:00.001-04:00</published><updated>2007-07-31T11:05:37.692-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-31T11:05:37.692-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="pm" /><title>Agile Development Methodology</title><content type="html">The original version of this document was created and put into action by my friend and ninja, Azubuko (Buko) Obele while we worked at our first start-up.  The document has since undergone some revisions as I've adopted it for my own purposes over time.  This is an agile, iterative approach to product life-cycle management and it work in small and large firms alike.  (Buko, you're a genius).&lt;br /&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;" &gt;Processes and Methodologies&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;This document specifies recommendations for the software development process and the IT infrastructure strategy for developers and managers.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;strong&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;br /&gt;Overview&lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Philosophy&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;The intent of this document is to establish a foundation for development traditions and ultimately a company culture whose &lt;strong&gt;central philosphy of the development strategy is to maximize communication, collaboration, feedback and transparency&lt;/strong&gt;.&lt;span style=""&gt;  &lt;/span&gt;In doing so, the company will succeed in constructing an adaptive development infrastructure that can rapidly address changing business requirements and market realities.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Communication&lt;/span&gt;&lt;/em&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt; &lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;will ensure that the company's software and infrastructure development efforts are focused on addressing concrete business requirements. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Colaboration&lt;/span&gt;&lt;/em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt; will allow the company to encapslate areas such as knowledge and distribution, reuse and automation, and proper allocation and management of resources.&lt;span style=""&gt;  &lt;/span&gt;This will ensure productivity and efficiency.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Transparency &lt;/span&gt;&lt;/em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;will ensure that the company's development efforts are generating value and that risks are apparent.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Feedback &lt;/span&gt;&lt;/em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;will ensure that the development efforts are in fact meeting concrete business requirements and allow governence teams to understand the "current" situation and plan for the future.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Core Competency&lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Middle-tier vendors are moving into the forefront consolidating and standardizing services that may be purchased "off the shelf".&lt;span style=""&gt;  &lt;/span&gt;This long list of solutions includes groupware solutions, Customer Resource Management (CRM) solutions, datasource abstraction tools, corporate communication tools, and enterprise-level SDKs and utilities among many.&lt;span style=""&gt;  &lt;/span&gt;While it may "seem" easier to integrate vendor components, long-term customization and Quality of Service (QoS) costs may hinder the company's competitive edge.&lt;span style=""&gt;  &lt;/span&gt;On the other hand there is no sense to "re-invent the wheel" especially when the middle-tier vendors have nearly perfected the services and components they sell.&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;Finally, it is always advantageous for the company to participate in IT Infrastructure Strategies mentorship and advisory programs offered by such industry leaders as the META Group, Inc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;/span&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Product Driven&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Development Teams are encouraged to think in terms of "products" as opposed to "projects". A product is a deliverable with a well defined cost and risk and one that will create some well-defined value for the customer and company.&lt;span style=""&gt;  &lt;/span&gt;A "product" should include all implementation, development, and operation costs of underlying infrustructure and application. The composite should be treated as part of the company's "portfolio".&lt;span style=""&gt;  &lt;/span&gt;Tactical and Strategic methodologies will allow the company to effeciently grow and reassess the portfolio.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Tactical or "per-project"&lt;/span&gt;&lt;/em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt; planning is conducted for each new application or infrustructure-driven project.&lt;span style=""&gt;  &lt;/span&gt;The phases of Tactical planning are described as part of the &lt;em&gt;Development Process&lt;/em&gt; section.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Strategic or "periodic" &lt;/span&gt;&lt;/em&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;processes deal with periodic reassessment of the company's IT portflio, including Infrastructure Impact Assessment (IIA) and Prdictive Cost Modeling (PCM). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Agility and Velocity&lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;The development process should capitalize on the company's energy and small size.&lt;span style=""&gt;  &lt;/span&gt;The ability to quickly respond to evolving requirements and market conditions will allow the company to remain agile and adaptive.&lt;span style=""&gt;  &lt;/span&gt;The ability to quickly initiate product development while sustaining a high, predicatble rate of development will allow the company to retain a high velocity.&lt;span style=""&gt;  &lt;/span&gt;To accomplish this, the development process itself must follow "Agile" methodologies with a focus on Test-driven development while keeping unnecessary documentation and meetings to a minimum.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Risk Management&lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Enterprise-scale infrastructure deployment and large-scale software development is inherently a high-risk/high-rewards endeavor.&lt;span style=""&gt;  &lt;/span&gt;Methodologies and processes must reduce risk whenever possible.&lt;span style=""&gt;  &lt;/span&gt;Risk assessment must take complexity, time to market, and specific business-related value into account.&lt;span style=""&gt;  &lt;/span&gt;Commitment to collaboration, communication, transparency and feedback will also help make high-risk scenarios manageable.&lt;span style=""&gt;  &lt;/span&gt;Long-term projects with large iterations should be avoided as they tend to require large investments of time and resources and are inherently lacking in agility.&lt;span style=""&gt;  &lt;/span&gt;It is recommended that focus is on test-driven development, continuous integration, short iterations to create immediate value and to produce tangible returns, centralization, and portfolio view of infrastructure patterns and services.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Development Process&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;a href="http://forum.ms.com/ctg/msforum/webapp/forum/editpost?post=2988271&amp;offset=0#design" name="design"&gt;&lt;/a&gt;&lt;br /&gt;Inception&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;The goal of the product inception phase is to identify and define the business problem. The result of the inception phase is a high-level description of the product's purpose and a non-exhaustive set of produt requirements.&lt;span style=""&gt;  &lt;/span&gt;It should be clear from the onset who the product is used by, what "pain" the product should "cure" or "alleviate", what potential value the poduct brings to the company and in technology-neutral, abstract terms, what the product should do. &lt;em&gt;How&lt;/em&gt; the product will work is irrelevant at this stage; only the &lt;em&gt;Why &lt;/em&gt;and &lt;em&gt;What&lt;/em&gt; matter.&lt;span style=""&gt;  &lt;/span&gt;A product idea may only pass this phase if the risk is justified by value.&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Business, Infrastructure, and Software development governance teams should be heavily involved in this process to present a holistic view of risk and reward.&lt;span style=""&gt;  &lt;/span&gt;The deliverables of this phase should be (1) Meeting Notes and (2) Product Requisition Document (PRD).&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Service Level Metrics, Feature Planning, Use Case Definition&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;The goal of this phase is to evaluate risk and to ultimately bring it under control.&lt;span style=""&gt;  &lt;/span&gt;At this stage, the infrustructure planner should work with the product managers to define a potential solution and agree upon service levels. The product managers should describe a series of well-defined use cases and rate them in terms of risk.&lt;span style=""&gt;  &lt;/span&gt;These use cases will describe the solution to the business problem from the application perspective. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Business specialists working with Software development management teams and Infrastructure planners should deliver a Feature Specification Document (FSD), Service Level Metrics Document (SLMD). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Development Planning&lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;The primary goal of the stage is to bring the technical risks under control. Issues such as performance, scalability, reliability, and security should be addressed and metrics for product success should be established.&lt;span style=""&gt;  &lt;/span&gt;The infrastructure planner should leverage as much existing infrastructure as possible, and infrastructure standards and processes where innovation allows. The planner should propose a blue-print for solving the business problem on the infrastructure level.&lt;span style=""&gt;  &lt;/span&gt;Application management teams should define the solution in terms of application architecture.&lt;span style=""&gt;  &lt;/span&gt;The infrastructure planner and application managers should collaborate to address technical risk and anticipate future risks and requirements.&lt;span style=""&gt;  &lt;/span&gt;Application architecture and infrustructure architecture must address services, service level matrices, the complexity of the solution, estimated time to market and provide a model of projected costs. A basic prototype or other form of "proof-of-concept" should be used in a Test Lab setting to evaluate the doability of the proposed solution.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;br /&gt;At this stage, the deliverables are a Release Plan (RP), Application Architecture Specification (AAS), Assemble Infrastructure Plan Draft (AIPD), and Predictive Cost Model Document (PCMD), Functional Prototype (optional).&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Implementation&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;In this phase product development is borken down into a series of iteration cycles.&lt;span style=""&gt;  &lt;/span&gt;The length of the iteration cycle will depend on the complexity and scope of the product.&lt;span style=""&gt;  &lt;/span&gt;It is recommended that the iteration cycle be between two and four weeks in length.&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;This strategy puts concrete deliverables in the hands of customers who will inevitably provide invaluable feedback.&lt;span style=""&gt;  &lt;/span&gt;The result of this kind of iterative loop is a quantifiable reduction of risk.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;The deliverables are Iteration Plans and Checkpoints.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Release&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;A product is expected to transition through multiple "minor releases" before a "major release".&lt;span style=""&gt;  &lt;/span&gt;Minor releases should occur frequently (at the discretion of product management).&lt;span style=""&gt;  &lt;/span&gt;The purpose of any release is to determine of a set of risks has been successfully eliminated.&lt;span style=""&gt;  &lt;/span&gt;Major releases will generally evaluate a much larger set of risks than Minor releases and will ultimately determine the success or failure of the product.&lt;span style=""&gt;  &lt;/span&gt;Each release must be accompanied by a Release Contract in order to define and hold accountable every party involved in the release.&lt;span style=""&gt;  &lt;/span&gt;The Release Contract must be approved by each party involved before the Release Conract is executed.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;All functionality deemed in "alpha" or "beta" stages should adhere to release procedures as they will ultimately face some or all clients.&lt;span style=""&gt;  &lt;/span&gt;Monitoring utilities should be enabled on live systems, customer feedback forms should be integrated into the product along with automated critical error/crash reports if possible.&lt;span style=""&gt;  &lt;/span&gt;Feedback and system logs are envaluable in qualifying product performance in "live" environments.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;Deliverables for this stage are Release Contract, Product, Product Evaluation&lt;strong&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Deployment&lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Test-driven development requires continuous integration of code written by the development teams.&lt;span style=""&gt;  &lt;/span&gt;Integration may take on the form of code merges within a Code Versioning repository (CVS) followed by deployment to Testing or Staging servers in the Test Lab.&lt;span style=""&gt;  &lt;/span&gt;A "Release" is merely a deployment to "Live" (client-facing) environment with the assumption that the release passed all testing in the Testing Lab under live conditions.&lt;span style=""&gt;  &lt;/span&gt;Deployments to Testing environments should occur frequently (on a daily or even bi-daily basis) by developers acting individually or in teams.&lt;span style=""&gt;  &lt;/span&gt;Focus must be on unit, functinoal, and stress testing which for most cases, can be automated by easily atainable tools and utilities (JUnit, Cactus, etc.).&lt;span style=""&gt;    &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;strong&gt;&lt;span style=";font-family:&amp;quot;;" &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;Testing will provide insights into the problem domain and expose architectural weaknesses in the infrastructure and the application forcing the management teams to revisit the planning stages.&lt;strong&gt; &lt;/strong&gt;All "bugs", suggestions, and issues must be submitted to a task management application (JIRA) and resolving the riskiest ones should be a priority while the problem area is still "fresh".&lt;span style=""&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.0001pt; line-height: normal;" class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;Deliverables for this stage are Regression Testing Reports (RTR) as well as tuned Application Architecture Specification (AAS), Assemble Infrastructure Plan Draft (AIPD), and Predictive Cost Model (PCMD) documents.&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: right;"&gt;original: Azubuko Obele&lt;br /&gt;contributions: Yuriy Krylov&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-6426736968235924426?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=dwaJPGJjrLs:xkN8PqZQosY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=dwaJPGJjrLs:xkN8PqZQosY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=dwaJPGJjrLs:xkN8PqZQosY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=dwaJPGJjrLs:xkN8PqZQosY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=dwaJPGJjrLs:xkN8PqZQosY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=dwaJPGJjrLs:xkN8PqZQosY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=dwaJPGJjrLs:xkN8PqZQosY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=dwaJPGJjrLs:xkN8PqZQosY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/dwaJPGJjrLs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/6426736968235924426/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=6426736968235924426" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/6426736968235924426?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/6426736968235924426?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/dwaJPGJjrLs/agile-development-methodology.html" title="Agile Development Methodology" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/07/agile-development-methodology.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcCRn8zcCp7ImA9WB5WGEg.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-3696145093598755659</id><published>2007-07-31T01:46:00.000-04:00</published><updated>2007-07-30T22:47:47.188-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-30T22:47:47.188-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="babysteps" /><category scheme="http://www.blogger.com/atom/ns#" term="e2.0" /><title>Taking Baby Steps (part 2): Only one person reads my Blog and I've already won</title><content type="html">&lt;span style="font-weight: bold;"&gt;Overview&lt;br /&gt;&lt;/span&gt;My last post entitled "&lt;a href="http://e2pt0.blogspot.com/2007/07/taking-baby-steps-personal-ad-hoc-kb.html"&gt;Taking Baby Steps (part 1): Personal, Ad-hoc, KB&lt;/a&gt;", suggested that Knowledge Workers should embrace a Blog (at work) as a personal Knowledge Base.  The focus was on the Network of One and some of the wins on a, facetiously, "selfish" level.  Laying a foundation for productivity-focused collaboration is realizing that the "hidden hand" also works wonders in a collaborative setting.&lt;br /&gt;&lt;br /&gt;In this post, I will talk about some ways in which this Network of One also benefits folks One Social Degree away -- even if it's just one other person.  This is the Network of Two.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Who is One Social Degree Away?&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;People who directly depend on your work&lt;/li&gt;&lt;li&gt;People whose work you directly depend on&lt;/li&gt;&lt;li&gt;Your manager&lt;/li&gt;&lt;li&gt;Your intern&lt;/li&gt;&lt;li&gt;Your service team overseas&lt;/li&gt;&lt;li&gt;Your client&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;At work, our "social network" of peers is typically well established.  We are hired into teams, we have colleagues, team-mates, customers.  Someone depends on what you produce - these people will benefit from the knowledge you share.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Syndicate updates via RSS/Atom&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Any good Blogging software already has syndication capabilities built in.   Simply advertise the URL to your Blog's "feed".   All you need is an RSS reader.  Some come integrated with your email client, others are standalone or web-based.  Your friendly, neighborhood IT department should have something to meet your needs.&lt;br /&gt;&lt;br /&gt;But this is a post on the Network of Two.  Your manager is, in fact, the first person to whom you should advertise your RSS feed.  Your immediate manager will always be your #1 fan.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Managers love Workstreaming&lt;br /&gt;&lt;/span&gt;Once your manager subscribes to your RSS Feed, and you make a selfish commitment to maintain your very own knowledge base, you will automagically keep your manager concurrent with the happenings in your daily work-life.&lt;br /&gt;&lt;br /&gt;The Network of Two and effective Workstreaming will emerge when you begin to cater "some" posts to your immediate audience.  Hint to your manager that something is especially important to her with Tags such as "important" or "for larry".&lt;br /&gt;&lt;br /&gt;The key is to allow the Blog/KB to become part of your natural routine.  There are no rules of how much to post or how often.  Just keep things relevant.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Completing the Feedback Loop&lt;/span&gt;&lt;span&gt;&lt;br /&gt;You know you've established a successful Feedback Loop within your Network of Two when:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;You find a "comment" on your Blog from your manager&lt;/li&gt;&lt;/ul&gt;I really want that first point to stand out - there are other indicators and emergent efficiencies when this Feedback Loop is completed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Meetings between you and your manager are shorter and more to the point&lt;/li&gt;&lt;li&gt;You spend less time figuring out things you've forgotten&lt;/li&gt;&lt;li&gt;You manager seems more helpful and, in general, more knowledgeable about what you are working on&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sometimes the last point allows your manager to spot problems early and offer some very timely wisdom.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;And so on...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Extra Brownie Points&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;The rarely seen but often sought after "Manager's Blog" where you get to leave comments.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reverse Mentorship&lt;/span&gt;&lt;br /&gt;I read my intern's blog every morning and I learn a book's worth every week.  Just yesterday, I received a very in-depth refresher course in Java's SOAP API.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What about the team-mates?&lt;/span&gt;&lt;br /&gt;My team works on many projects at the same time.  I'm only a lead on one or two of them.  This means that I need extra help staying up to speed on projects where I play a secondary or tertiary role.  I read my peers' Weekly Update-tagged posts only.  Good Blogging software will allow you to subscribe to a filtered subset of all the posts based on one or more Tags.  How does my RSS reader know it's a Weekly Update?  The Tag is "weekly".&lt;br /&gt;&lt;br /&gt;For these secondary projects, reading "weekly" posts is enough for me to stay on track.  This is especially helpful when I come back from vacation and dread opening my INBOX.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;Non-urgent Information Only&lt;/span&gt;&lt;br /&gt;Many folks try to misuse RSS by using it for Alerting purposes.  This is not what the syndication medium is for.  If you want to catch someone's attention because you require Immediate Feedback, use the phone, send an instant message, meet them at the Cooler.&lt;br /&gt;&lt;br /&gt;RSS is best suited for Knowledge sharing that does not require immediate response.  Your audience consumes the content at their own leisure, at their own pace.  If you use RSS for anything else, it will very soon become as noisy and convoluted as email is today.&lt;br /&gt;&lt;br /&gt;Final note of advice here -- turn desktop popups for RSS Updates off.  Unless the Alerting mechanism is really smart, it will never know what is truly important to justify the time wasted recovering from the Interruption.  I'm busy and need to focus, stop competing for my attention because my feed from pizza.com has an update.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Up Next, &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Too many Feedback Loops?  &lt;/span&gt;&lt;br /&gt;Every communication medium will be abused and misused.  You may find yourself subscribed to too many feeds claiming importance.  My next post will talk about cutting through noise with RSS and Tag-powered Dashboards.&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-3696145093598755659?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=XeAlGf6bGb8:-BUhqJw-kf8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=XeAlGf6bGb8:-BUhqJw-kf8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=XeAlGf6bGb8:-BUhqJw-kf8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=XeAlGf6bGb8:-BUhqJw-kf8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=XeAlGf6bGb8:-BUhqJw-kf8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=XeAlGf6bGb8:-BUhqJw-kf8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=XeAlGf6bGb8:-BUhqJw-kf8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=XeAlGf6bGb8:-BUhqJw-kf8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/XeAlGf6bGb8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/3696145093598755659/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=3696145093598755659" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/3696145093598755659?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/3696145093598755659?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/XeAlGf6bGb8/taking-baby-steps-part-2-only-one.html" title="Taking Baby Steps (part 2): Only one person reads my Blog and I've already won" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/07/taking-baby-steps-part-2-only-one.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYARnczeip7ImA9WB5WE0Q.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-2958751290768684322</id><published>2007-07-25T16:12:00.000-04:00</published><updated>2007-07-25T16:59:07.982-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-25T16:59:07.982-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enterprise firefox" /><title>Firefox EWG's first call is a success!</title><content type="html">Thanks to everyone who attended the first Enterprise Working Group for Firefox call.  We're still waiting for a statistic on how many folks were on the call and on the irc channel -- I'd ballpark the figure to be somewhere in the mid 20s.&lt;br /&gt;&lt;br /&gt;Special thanks to Mike Kaply for MCing the call and to JT Batson and Basil Hashem from Mozilla for providing insight and effectively validating this initiative.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Very Brief Summary&lt;/span&gt;&lt;br /&gt;The theme of this meeting was "Experience".  Folks on the call shared their personal experience with Firefox in an enterprise environment.  There were clear areas of interest and overlap.&lt;br /&gt;&lt;br /&gt;My main take-away has been this: It cannot be understated nor unappreciated that "Enterprises" do, in fact, share pain-points and challenges and therefore  must come together to form a real, effective Community.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Some identified synergies&lt;/span&gt;&lt;br /&gt;By no means a completed list, but here is what jumped out at me:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Packaging.&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Story around MSIs and MSTs vs some open source formats.  Most Enterprises are heavy Windows users.  At what point does the lack of these hinder adoption?&lt;/li&gt;&lt;li&gt;What is feasible?  What can Mozilla own and what can and should the Enterprise Community own?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Patch Management.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;If an organization is not very Agile and agility assumes that not everything is perfect out of the box, is Mozilla's patch cycle too agile for "enterprises"?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How are others patching Firefox on desktops without having to uninstall and install the entire product?&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Settings Management.&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;What are some trade-offs between GPO and Mission Control?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Not all settings are manageable.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;What settings should be exposed by all extensions to enable pref-level lockdown?&lt;/li&gt;&lt;li&gt;Can we drive best practices for deploying plugins and extensions?  There is very little documentation on where Plugins should go and how to configure in the registry.&lt;/li&gt;&lt;li&gt;How do we prevent some critical settings from being "tattooed" into prefs.js? I.e. mcontrol and user agent settings should never be written to prefs.js when in Enterprise mode.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;User Profiles&lt;/li&gt;&lt;ul&gt;&lt;li&gt;How can profiles/certificates be migrated with minimum impact to the end-users?&lt;/li&gt;&lt;li&gt;Does having Firefox and IE share bookmarks help adoption?  Can Firefox "piggy-back" on Favorites? How can it be done easily?&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Follow-ups&lt;/span&gt;&lt;br /&gt;Attendees were asked to contribute content to the http://wiki.mozilla.org/Enterprise wiki.  Content will be refactored as we overflow.  Mike and I will put up a page for each Meeting where we can post and track agendas, follow-ups etc and will work to keep content organized.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Up Next (August 8th)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;Next call is scheduled for August 8th, same time, same station.  Topic will be "Enterprise Wish List" and should be a fun, rowdy call!&lt;br /&gt;&lt;br /&gt;Come one, come all.  Help us spread the word.&lt;br /&gt;&lt;br /&gt;To be politely blunt, we're committed to helping this community thrive.  There will be wins.  To my "enterprise" peers, you cannot afford to not have your interests represented - the potential for the Enterprise Web Browser as the Knowledge Worker's Killer App is too real.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-2958751290768684322?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=4y2s4OqfAes:SAJYZTr5VGs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=4y2s4OqfAes:SAJYZTr5VGs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=4y2s4OqfAes:SAJYZTr5VGs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=4y2s4OqfAes:SAJYZTr5VGs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=4y2s4OqfAes:SAJYZTr5VGs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=4y2s4OqfAes:SAJYZTr5VGs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=4y2s4OqfAes:SAJYZTr5VGs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=4y2s4OqfAes:SAJYZTr5VGs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/4y2s4OqfAes" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/2958751290768684322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=2958751290768684322" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/2958751290768684322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/2958751290768684322?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/4y2s4OqfAes/firefox-ewgs-first-call-is-success.html" title="Firefox EWG's first call is a success!" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/07/firefox-ewgs-first-call-is-success.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8FQH05cSp7ImA9WB5WEU8.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-5475460274363170570</id><published>2007-07-21T09:40:00.000-04:00</published><updated>2007-07-22T14:10:11.329-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-22T14:10:11.329-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="babysteps" /><category scheme="http://www.blogger.com/atom/ns#" term="blogs" /><category scheme="http://www.blogger.com/atom/ns#" term="e2.0" /><title>Taking Baby Steps (part 1): Personal, Ad-hoc KB</title><content type="html">&lt;span style="font-weight: bold;"&gt;Overview&lt;/span&gt;&lt;br /&gt;This collection of posts is part ideology and part methodology aimed at Knowledge Workers still struggling to embrace the Blog and Wiki whateveryoucallit.  I don't blame them.  The words "Blog", "Wiki", "Tag", and so on, meant very little to me as well until I put each of the technologies to a very specific use.&lt;br /&gt;&lt;br /&gt;What started out as a system to manage developer teams overseas turned into a Pipeline for  Knowledge Sharing within a Team.&lt;br /&gt;&lt;br /&gt;To me, collaboration is a Bottom-to-Top story.  It begins with a very selfish Network of One.  And that's OK!  If you can't prove value to yourself, how can you prove it to the guy sitting next to you at meetings?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Mental Filters&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Like many Knowledge Workers, I suffer from information overload and a bad memory.   First step is always admitting you have a problem, right?   Now, I tend to ask myself two questions whenever I deal with information:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Is it useful to me now?&lt;/li&gt;&lt;li&gt;Might it be useful to me later?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;If there's even a remote chance that I'm dealing with Useful Information, it needs to go into my Knowledge Base.  This is my Mental Filter.  All incoming information competing for my attention goes through this and other filters.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;A Blog is a Personal, Ad-hoc Knowledge Base&lt;br /&gt;&lt;/span&gt;It just so happens that the simplest and most complete Knowledge Base I know of is my Blog.  It's mine. It's for me.  I don't care about structure, colorful phrasings, or a full bibliography.  I just need useful knowledge sans the BS.  If I take the time out of my Very Busy Schedule to throw something into my Knowledge Base (KB), I owe it to no-one but myself to only post useful and Highly Relevant information.&lt;br /&gt;&lt;br /&gt;I also haven't figured out how to not live in my INBOX so I want to be able to email my KB.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Side Note: But wait, why not store everything in email and search there?  With Blogging, selfishness turns into something very useful for the rest of the Team.  Email just doesn't have that kind of potential for collaboration.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Finally, I want control over the organization of my Knowledge Base but I don't have time to organize into pretty folders.  I just want the information I need at my fingertips with minimum management.  And while on the topic of being selfish, I want the search functionality to work for me; I want to help it help me.  I want to be able to Tag my KB posts with words or phrases that serve as Keys to Knowledge in my head.  It should be easy for me to share these Keys with the cyborg extension to my head that is my personal KB.  The search functionality in my KB should pay special attention to these Tags a.k.a Keys.  It's a matter of improving relevancy and hence my productivity.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A note about Privacy Concerns&lt;br /&gt;&lt;/span&gt;Start with a Blog that your Firm provides for you.  It should be internal and inaccessible from the outside world by the outside world.  Don't worry about protecting your posts from the prying eyes of colleagues.  Focus on yourself.  Only your immediate network will ever care about what you have to say anyway.  Post openly, but only post work-related information.  Remember, you don't have the time to post on anything else.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What kinds of things should I post about?&lt;/span&gt;&lt;br /&gt;It took me a bit of trial and error to figure out my Blogging sweet-spot.  At first you'll post too much or too little.  Remember, it's for you so figure out what works for you.&lt;br /&gt;&lt;br /&gt;Some ideas on what you may want to track in your KB:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You figure out how to do something, save yourself brain space, write yourself a mini how-to&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You solve a problem, post solution so you don't have to solve it again&lt;/li&gt;&lt;li&gt;Someone owes you a TPS report&lt;/li&gt;&lt;li&gt;You've identified follow-up items at your 3-hour meeting&lt;/li&gt;&lt;li&gt;You wish to condense your meeting to 15 minutes by posting an Agenda to your KB&lt;/li&gt;&lt;li&gt;Someone else posted something that may be useful to you later&lt;/li&gt;&lt;/ul&gt;Ans so on...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;When picking out a KB starter-kit, be selfish.  My recommendation is to go with a Blog.  Blogs have many useful features; clearly I've only scratched the surface.  But really, the other features will come in handy later.  Here is what you should ask of your Personal, Ad-hoc Knowledge Base Blog:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Can you email it?&lt;/li&gt;&lt;li&gt;Can you tag posts?&lt;/li&gt;&lt;li&gt;Can you tag posts within your email?&lt;/li&gt;&lt;li&gt;Can you search it?&lt;/li&gt;&lt;li&gt;Are your search results influenced by the tags you assign to your posts?&lt;/li&gt;&lt;/ul&gt;Good news is most Blog implementations already do this.  Your friendly, neighborhood IT department will help you set one up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Up Next&lt;/span&gt;&lt;br /&gt;In my next post, I will talk about how KB-directed Selfishness is, in fact, very useful to Team-mates.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-5475460274363170570?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=t_0PcJbwpEs:iocD8gERPCU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=t_0PcJbwpEs:iocD8gERPCU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=t_0PcJbwpEs:iocD8gERPCU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=t_0PcJbwpEs:iocD8gERPCU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=t_0PcJbwpEs:iocD8gERPCU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=t_0PcJbwpEs:iocD8gERPCU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=t_0PcJbwpEs:iocD8gERPCU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=t_0PcJbwpEs:iocD8gERPCU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/t_0PcJbwpEs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/5475460274363170570/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=5475460274363170570" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/5475460274363170570?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/5475460274363170570?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/t_0PcJbwpEs/taking-baby-steps-personal-ad-hoc-kb.html" title="Taking Baby Steps (part 1): Personal, Ad-hoc KB" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/07/taking-baby-steps-personal-ad-hoc-kb.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YER3wyeSp7ImA9WB5XGE0.&quot;"><id>tag:blogger.com,1999:blog-8652016769421756018.post-1132263928080229876</id><published>2007-07-18T20:06:00.001-04:00</published><updated>2007-07-18T20:31:46.291-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-18T20:31:46.291-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="extensions" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><title>Ant Build Script for Mozilla Extensions</title><content type="html">I play with Mozilla Extensions in EclipseIDE and generally like the Ant build system.  Not an expect at Ant by any means so if anyone out there wants to make improvements to these, please share. The relative paths to directories are set in the &lt;b&gt;build.properties&lt;/b&gt; file so that it shouldn't matter what folder layout one uses.  If I make improvements to this over time, will post updates, feel free to drop feedback.   &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;build.xml&lt;/span&gt;&lt;div style="overflow:auto; width="300px";"&gt;&lt;pre&gt;&amp;#60;?xml version="1.0"?&amp;#62;&lt;br /&gt;&lt;br /&gt;&amp;#60;project name="Firefox Extension Builder" basedir="." default="package"&amp;#62;&lt;br /&gt; &amp;#60;property file="build.properties" /&amp;#62;&lt;br /&gt; &lt;br /&gt; &amp;#60;target name="setup" description="create dir structure for project"&amp;#62;&lt;br /&gt;  &amp;#60;mkdir dir="${content.dir}"/&amp;#62;&lt;br /&gt;  &amp;#60;mkdir dir="${skin.dir}"/&amp;#62;&lt;br /&gt;  &amp;#60;mkdir dir="${install.dir}"/&amp;#62;&lt;br /&gt;  &amp;#60;mkdir dir="${locale.dir}"/&amp;#62;&lt;br /&gt;  &amp;#60;mkdir dir="${defaults.dir}"/&amp;#62;&lt;br /&gt; &amp;#60;/target&amp;#62;&lt;br /&gt; &amp;#60;target name="clean" description="Delete previously generated jars"&amp;#62;&lt;br /&gt;  &amp;#60;delete file="${install.dir}/**" verbose="true"/&amp;#62;&lt;br /&gt; &amp;#60;/target&amp;#62;&lt;br /&gt;   &amp;#60;target name="createjar"&amp;#62;&lt;br /&gt;    &amp;#60;delete file="${install.dir}/${project.name}.jar" verbose="true" failonerror="false"/&amp;#62;&lt;br /&gt;     &amp;#60;zip destfile="${install.dir}/${project.name}.jar" excludes="*CVS*/**"&amp;#62;&lt;br /&gt;      &amp;#60;zipfileset dir="."&lt;br /&gt;           includes="${content.dir}/**, ${skin.dir}/**, ${locale.dir}/**"/&amp;#62;&lt;br /&gt;     &amp;#60;/zip&amp;#62;&lt;br /&gt;   &amp;#60;/target&amp;#62;&lt;br /&gt;&lt;br /&gt;   &amp;#60;target name="createxpi" depends="gen_manifest,createjar"&amp;#62;&lt;br /&gt;     &amp;#60;zip destfile="${install.dir}/${project.name}.xpi"&amp;#62;&lt;br /&gt;        &amp;#60;zipfileset dir="${install.dir}" includes="${project.name}.jar" &lt;br /&gt;                  prefix="chrome" /&amp;#62;&lt;br /&gt;            &amp;#60;zipfileset dir="${install.dir}" includes="${manifest.src}"/&amp;#62;      &lt;br /&gt;      &amp;#60;zipfileset dir="." includes="${install.src}" /&amp;#62;&lt;br /&gt;      &lt;br /&gt;   &amp;#60;/zip&amp;#62;&lt;br /&gt;   &amp;#60;/target&amp;#62;&lt;br /&gt;   &lt;br /&gt;   &amp;#60;target name="gen_manifest"&amp;#62;&lt;br /&gt;    &amp;#60;copy file="${manifest.src}" tofile="${install.dir}/${manifest.src}" overwrite="true"/&amp;#62;&lt;br /&gt;    &amp;#60;replaceregexp file="${install.dir}/${manifest.src}" &lt;br /&gt;     match="^(content\s+\S*\s+)(\S*/)$"&lt;br /&gt;     replace="\1jar:chrome/${project.name}.jar!/\2"&lt;br /&gt;     flags="g" byline="true"/&amp;#62;&lt;br /&gt;    &amp;#60;replaceregexp file="${install.dir}/${manifest.src}"&lt;br /&gt;     match="^(skin|locale)(\s+\S*\s+\S*\s+)(.*/)$"&lt;br /&gt;     replace="\1\2jar:chrome/${project.name}.jar!/\3"&lt;br /&gt;     flags="g" byline="true"/&amp;#62;&lt;br /&gt;   &amp;#60;/target&amp;#62;&lt;br /&gt;   &amp;#60;target name="package" depends="clean,createjar,gen_manifest,createxpi"/&amp;#62;       &lt;br /&gt;&amp;#60;/project&amp;#62;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;build.properties&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;project.name=${your_project_name}&lt;br /&gt;content.dir=chrome/content&lt;br /&gt;skin.dir=chrome/skin&lt;br /&gt;locale.dir=locale&lt;br /&gt;defaults.dir=defaults&lt;br /&gt;install.dir=install&lt;br /&gt;manifest.src=chrome.manifest&lt;br /&gt;install.src=install.rdf&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;a href="http://www.linkedin.com/in/yuriykrylov" &gt;&lt;img src="http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif" width="80" height="15" border="0" alt="View Yuriy Krylov's profile on LinkedIn"/&gt;&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8652016769421756018-1132263928080229876?l=blog.yuriy.org' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=-8MRCYervM4:7FuI2M_v-Kk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=-8MRCYervM4:7FuI2M_v-Kk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=-8MRCYervM4:7FuI2M_v-Kk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=-8MRCYervM4:7FuI2M_v-Kk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=-8MRCYervM4:7FuI2M_v-Kk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=-8MRCYervM4:7FuI2M_v-Kk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/qNLt?a=-8MRCYervM4:7FuI2M_v-Kk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/qNLt?i=-8MRCYervM4:7FuI2M_v-Kk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/qNLt/~4/-8MRCYervM4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.yuriy.org/feeds/1132263928080229876/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8652016769421756018&amp;postID=1132263928080229876" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/1132263928080229876?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8652016769421756018/posts/default/1132263928080229876?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/qNLt/~3/-8MRCYervM4/ant-build-script-for-mozilla-extensions.html" title="Ant Build Script for Mozilla Extensions" /><author><name>Yuriy Krylov</name><uri>http://www.blogger.com/profile/18284056633754047436</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="15494113552360788133" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.yuriy.org/2007/07/ant-build-script-for-mozilla-extensions.html</feedburner:origLink></entry></feed>
