Live Bloging from Devscovery Day 3

9:10am (ME) - Databinding in WPF - interesting information about DataBinding.  Very good so far.   Tip for getting more information abou the DataBinding and run time in the Output windows use the

PresentationTraceSource

10:01 am (ME) - Performance tip.. he says ALWAYS set your DataContext for databinding in Code..  big performance help.. usually in the OnLoaded or Loaded event.

10:42 am (MC) -I'm at the day of threading presentation today. Here are some notes I've taken on the first of the 4 sessions.. I dont know how much sense any of this will make :D

Creating processes incurs way more overhead than creating thread. Creating threads does cause notification of every referenced assembly which does incur some overhead. (DLL attach/detach notifications).

Context switch - A context switch occurs when window switches thread execution. Context switches happen about every 20ms. If windows switches to a thread owned by another process it creates overhead in translating all the virtual addresses for the process memory to physical addresses.

1:47pm (ME) - Lunch was ok.. same as last 2 days.. not great.  The give aways sucked.. really disappointed about that. 

In a WPF 3D talk, very interesting shows a lot of different examples that look good.  I will post the code in a little bit as well.

(rumor) Windows 8 is going to provide a framework that helps eliminate the ability to easily create syncronized threads and encourage async code and thread creation.

feature cut from vista that would of allowed several different managed applications under the same process, which would allow them to share the same instance of CLR components.

 

Process an Appdomains - A process is a container for code and data, esentially address space (A windows concept). AppDomains are a CLR concept. AppDomains logically sub divide a processes virtual address space. They are created/destroyed more cheaply than a process. Also provides managed exe/dll code & data isolation. AppDomains allow you to control CAS. Threads are not automatically created for each AppDomain. Only thread execute code, not the AppDomain, it is just a container. One managed heap is created per process but an appdomain ownes the objects its code creates in the manage heap, and those objects cannot be shared across app domains. Static fields and singletons are per AppDomain, not per process.

 

Threads - every thread created has 1MB of committed user-mode memory and 12Kb/24KB of kernel memory on the stack. This stack is used for parameters and local variables. Threads are confined to a single process address space, they cannot execute code or access data from other processes.

When a process dies, all threads die.

In the CLR threads can cross AppDomain boundaries. Although it can only execute in one AppDomain at a time and it will assume the current AppDomains security and configuration settings.

 

A tool called process explorer allows you to view the number of AppDomains running inside a process. Its like task manager on crack. It can also display number of context switches. You can download it at http://Sysinternals.com.

 

Creating a thread - .net thread objects are light-weight, constructing one doesn't have windows create a thread. Calling the Start() method causes windows to actually create the thread. Once your delegated method returns windows will kill the thread. Optional: You can call Join() on a thread in .net to pause the current thread execution until  your new thread is completed executing.

The CLR run time creates 2 threads in addition to the default one created initially by the process.  Debugging in Visual studio also creates an additional thread for running debug events.

Whenever garbage collection starts it suspends all the threads, walks and compacts their stacks, and then resume all of them. Garbage collection can become very painful with a large number of threads.

10:53 am (ME) -  In the 2nd DataBinding method, and talking about ValueConverters, it is interesting. I'm going to try and post the slides for Threading and Binding now.

11:17am (ME) - Here is are the current slide decks that we are in, and used for the rest of the day.

DataBinding -  Part 1 - http://download.sharethispoint.com/Data-Binding%20in%20WPF-Part%201.pdf

                           Part 2  -   http://download.sharethispoint.com/Data-Binding%20in%20WPF-Part%202.pdf

Day of Threading   - Part 1 - http://download.sharethispoint.com/Day%20of%20Threading%20-%20Part%201.pdf

                                   Part 2  -  http://download.sharethispoint.com/Day%20of%20Threading%20-%20Part%202.pdf

                                   Part 3  -  http://download.sharethispoint.com/Day%20of%20Threading%20-%20Part%203.pdf

                                   Part 4 -  http://download.sharethispoint.com/Day%20of%20Threading%20-%20Part%204.pdf

10:42 am (MC) -

Reasons to create threads – Isolate code from other code for reliability and allow easier creation of code for certain tasks. Concurrent execution on multi-cpu machines.

Examples of good usage for threads:

·         Indexing files

·         Defrag disks

·         Building source code in the bg to provide error lists

·         Spelling/Grammer checking

·         Copying/printing files.

·         Resizing an app window while processing I/O

Internally every thread has a base priority number which ranges from 0(lowest) to 31(highest). 0 is reserved. Windows schedules highest priority threads to run on the cpu first. Most threads in the system run on priority 8.Priority doesn’t affect the speed at which your code runs, it just affects the frequency at which your thread is scheduled for execution. The CLR has priority 1 and 15 reserved. OS threads run in the real time range and any threads you create in that range can adversely affect the OS. You must be admin to run threads as real time.

Environment.ProcessorCount will tell you how many processors are on the machine.

The CLR creates a thread pool. There is one thread pool created for each process. The thread pool facilitates the reuses of threads to help alieviate the overhead associated with creating a new thread.

Interlocked.Increment does a thread safe, atomic, increment on a variable.

Process.ProcessorAffinity tells windows and the thread pool the max number of processors to use.

 1:47pm (ME) - Lunch was same as the last few days.. nothing great.. .and the giveaways were not great at all this year..  In the middle of a WPF 3D presentation.. some very kewl models and how to do it.. trying to see practical approaches to it.  I will post the code later.

3:19 pm (MC) -

Windows I/O completion port – eliminates thread blocking when accessing drivers/hardware. The thread pool is connected to and works with the I/O completion port. The CLR creates 1 IOCP per process.

In vista and windows server 2008 they have added support for I/O priorities. Basically adds several IRP ques to each I/O device. You can PInvoke them from .net.

Asynchronous Programming Model – Supports 3 rendezvous techniques

·         Wait until done – sux, blocks thread entirely, just like normal read.

·         Polling – sux, could block the thread. Allows you to loop or check a variable for the status of the I/O completion.

·         Callback method – the way to go.

Used with the “Begin” and “End” naming conventions. Ie: BeginRead and EndRead of the filestream object.

Every “Begin” method always has two extra params, AsyncCallBack and an object. Each Begin method returns a IAsyncResult object, which is like your recipt for making the request.

If you don’t specify FileOptions.Asynchronous flag BeginRead just creates another thread in bg to simulate asyn I/O. This is really bad, so you should always specify the flag if u want Async operations.

4:53 pm (MC) -

Web services support async operations out of the box by using the “Begin” and “End” method names on your web methods. Automatically uses the thread pool.

Silverlight does not offer an synchronous APIs and there are people on the windows team trying to convert all the legacy synchronous APIs to async.

Make sure to check out the asyncenumerator. Make writing async methods look just like one synchronous method. It uses the SynchronizationContext object on a thread to make sure that you don’t have call BeginInvoke with code inside your iterator and other mechanisms to allow your code to be used by threads other than the owner. Powerthreading library here: http://wintellect.com/powerthreading.aspx Looks really bad ass.

I need to look at reader/writer locks. Reader/writer/gate might be a possible answer to this problem.

Class given by Jeffery Richter from www.wintellect.com.

Live Bloggin from Devscovery (Day 2)

8:57 am (ME) - Coming into our 1st session of the day.  Expression Blend for developers.. could be really good and helpful.

9:19 am (ME) - Expression Blend for developers is going really well.  There are hardly anyone in this though, so I'm really surprised.    He seems pretty knowledge, and there are good questions so far.

10:04 am (MC) - The brush transform tool lets you alter the path of gradients. So you can change the direction of a graditent really easily.

10:40am (ME) - The Expression Blend for developers was very good, some great tips on using Blend, and the start of some ideas to incorporate the Designer/Developer experience.   FallBackValue DataBinding property was interesting, might be able to use some of that,  for helping out the different the design time experience.    Going into the

Deigners + Developers Workflow in WPF & Silverlight - session next..

11:10am (ME) - Good talk so far, about Designer/Developer... the "Integator" or "Devigner" seems to be very key.  Tools for this experience.. Snoop, Mole (moleproject.com), Perforator, TFS   - Designers -  Illustrators, Fireworks, Snoop, Pistachio, Zam 3D.  Very interesting.

Don't use Mole yet, but it is a Add In for Visual Studio, for Snoop.

11:17am (ME) - Pistachi looks kewl, removes the extra resources in WPF

http://www.granthinkson.com/2007/11/08/announcing-pistachio-wpf-resource-visualizer/

 12:15pm (ME) - Ok.. this is bad ass Josh Smith and Grant Hinkson doing a live demo.. developer/designer working together to build an application.    Josh build an application that grabs XML out of a file, binds it to a set of controls, and has a routed command for clicking on event.  Grant Hinkson gets it in Blend, and styles in.  Right in front of everyone. 

This is awesome, bad ass.  Great demo, great idea of how everything works together.  Awesome.. seriously good!

1:37pm (ME) -  Talking about Silverlight 2.0... Silverlight 2 CLR ("CoreCLR")...  Small footprint.. (2MB).. 

SCOOP here -  Silverlight 2 coming out in October this here!!!!! :D  

Interesting talk, talks about the reduction of CoreCLR (silverlight clr)  no CAS, no COM Interop, no remoting and server garbage collection.  removed a bunch..  and Multiple Instances in one process.

1:50pm (ME) - This is the slide deck I'm watching right now

http://download.sharethispoint.com/Building%20Great%20Web%20Applications%20in%20Silverlight%202.pdf

 Silverlight tips and tricks, that is coming up next. I'm not able to get to it.. going to the MVVM lecture.

http://download.sharethispoint.com/Silverlight%20Tips.pdf

This is the MVVM slide deck I'm going to later.

http://download.sharethispoint.com/Implementing%20the%20MVVM%20Pattern%20in%20WPF.pdf

 2:25pm (ME) - Using Silverlight 2.0 to hit REST ful web services.   This is WHAT i'm Talking about Willis!!! SILVERLIGHT WILL RULE THE WORLD!

 

HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(new Uri("http://contoso.com/weather/98052"));
request.BeginGetResponse(new AsyncCallback(OnGetResponseCompleted), request);
...

private void OnGetResponseCompleted(IAsyncResult ar)
{

 HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
 HttpWebResponse response =

 (HttpWebResponse)request.EndGetResponse(ar);
 using (StreamReader reader = new StreamReader(response.GetResponseStream()))
 {
  string result = reader.ReadToEnd();

  ...
 }
}

 

4:14 pm (MC) - Learned a little bit about the yield operator. (http://msdn.microsoft.com/en-us/library/9k7k7cf0(VS.80).aspx)

Live blogging from Devscovery conference

DAY 1 -

8:18am (MC) - Morgan and I are at the Devscovery conference (http://www.devscovery.com/) in Redmond this week. The keynote is about to begin in 30 minutes and I plan on trying to blog about the cool stuff we see at the conference.

8:51am (MC) - The coffee is strong....... http://twinkle.s3.amazonaws.com/s_1219160970971794.jpg

9:07am (ME)  - Listening to Scott Hanselman .. .hilarious speaker..  (Ninja's can't catch you if you are on fire)   - Talking about new stuff in .NET 3.5 SP1 - .. ASP.NET MVC coming in October... very kewl.

9:17am (MC) - Linq to sql looks really cool. Allows you to quickly create some pretty powerfull biz data objects. Makes it easy to have compile time checking on your queries. Scott is pretty funny...

9:56am (MC) - cntrl + . is a nice short cut for the "add using statement" menu. ADO.Net data services (Astoria) look like a great way to expose a db via web services, really wish we had known about this 3 months ago :D.

10:07 (ME) - talking about using MVC in ASP.NET so using MVC on the server side.  Interesting.. codeplex.com uses a combination of MVC and Webforms.

10:18am (MC) - All about asp.net MVC here: http://www.asp.net/mvc/default.aspx?wwwaspnetrdirset=1 . I'm not personally a huge fan of asp.net mvc yet but the web routes are really cool. I would be interested to see if they will web routes in sharepoint.

10:25am (MC) - ASP.Net Dynamic Data looks really really cool. Its kind of a sharepointy meta data framework that is more strongly typed to your data source or entities.  Supports different field templates to match your column/property datatype just like sharepoint. Where does/should the biz logic live in Dynamic Data projects?

11:36am (MC) - We are now at a talk on design patterns. IExtensibleDataObject looks like something that would be good to research. Allows you to sort of add backward compatabilty to your data objects. XML Dictionary encoders  in WCF look like they will be really usefull in reducing message sizes when sending xml.

12:57 pm (ME) - Finishing up lunch and getting ready for the Building LOB systems with WPF from one of the guys from Infragistics.. could be really interesting.    

1:30 pm (ME) - Presenter explained he is talking about the Infragistics control set only, and not generic WPF.  It cleared out the room.. LOL

End of Day 1 (ME) - Great first day.. the Keynote was great.. and had some good information about new features in SP1.. The LOB databinding presentation was OK.. good to see Infragistics new Docking and other controls..

Advanced Databinding presentation was a dud.. the presenter really didn't know his stuff and wasn't smooth at all.  I could have learned everything he said in a 10 min read from MSDN.

The Grand Prix of Programming at the end of the day was INTERESTING.. Will blog more about it tomorrow..

 

Automated Testing in SharePoint with WSSTester

WSSTester is a set of two applications that can be used to automate testing of SharePoint applications. First a little background on automated testing in SharePoint……….
Testing WSS applications and web parts is a very challenging task. Most developers manually build and deploy their web parts and then open the page in a browser to test them out. This process works fine until you start doing major deployments and larger apps in WSS. Testing of interconnected components, controls, assemblies, and all their different configurations can quickly become an impossible task. Most automated web testing tools fall short almost right off the bat when it comes to testing WSS apps due to the way WSS handles authentication. Unit tests only seem to go so far when testing WSS apps since so much of their function depends on other data involved in the actual deployment. (ie Site context or list configuration)
One tool I have found that works well for testing actual deployments of WSS applications is called Watin. Watin is essentially a test harness for internet explorer that allows you to programmatically interact with the browser contents. Oh yeah and did I mention its open source too? What differs Watin from unit testing is that Watin actually looks at the output of the browser and lets you validate that output. This allows you to get a closer view of what a user would see when actually visiting the site. Another separate source forge project called Watin Recorder lets you quickly record Watin tests simply by browsing through the site. The Watin Recorder is pretty nice but it doesn’t work to well with most of the toolbars and navigation items in SharePoint because of the way they use JavaScript. You can execute JavaScript on the page but it isn’t as easy as point and click, it requires some tweaking of the c# generated by the recorder.
Soooo all this stuff is pretty cool but building and record tests for can become a big task as well if you have a lot sites and servers. Fear not, for WSSTester is here to help relieve some of the suck factor. The WSSTester solution contains two applications…
WSSTesterSiteMapBuilder – This is a little app that should be run on your WSS server. It basically generates an XML file listing all the pages on your root SharePoint site. The generated XML file can then be edited by hand to add additional pages that weren’t detected or remove pages you don’t want to test.
WSSTester – This is the main application that actually executes the tests. This application does not have to be run on the server. You load an XML file saved from the site map builder app, enter your site url and credentials and then run the tests. You can export the test results to an XML files after they are complete. Right now WSSTester only runs two simple tests on each page. It checks for the standard SharePoint web part error message and a custom error message that we have built into our web part framework that provides more detail than the standard web part errors. We render a hidden div on the page that contains details that would help a developer debug the issue and only allow the user to see a  friendly version of the error. In the future we are going to add command line support to this app so we can run tests as part of a automated build process.
You can download the source code for the WSSTester project here. You must have Watin installed first before you can compile and run WSSTester. If anyone is out there using this please provide some feedback on your experience. Disclaimer: use at your own risk!
How we use WSSTester
When developing a new web part or set of web parts we build a testing site that contains every possible configuration of the web part and a solid set of test data. We save the testing site as a site template so it can be shared with other devs and installed on staging servers. This is used by the developer to test new builds of the web part and also by the automated build process to run tests after deployment. Once the testing site is complete, or when we add new pages for additional tests, we run the WSSTesterSiteMapBuilder to generate a new list of pages to test. Then after doing a new build of the web part we just run WSSTester on the testing site to determine if the new build has caused any errors.
To Do List for WSSTesterSiteMapBuilder
·         Create the ability to build the list based off of pages available for a specific user.
·         Add true recursion of folders. Right now it only looks 1 level deep in document library folders because this all we initially required based on our current app design.
·         Add recursion of sites. Currently only lists pages for the root site of the collection.
·         Improve UI to allow the user to remove pages in the list without having to manually edit the xml file.
·         Add command line support.
To Do List for WSSTester (Main App)
·         Subclass the logindialoghandler to handle SharePoint forms authentication. Might be able to just record this with the test recorder.
·         Make all tests run in one browser window instance. Currently a new browser window is opened and closed for each page. Watin did not appear to be refreshing the HTML property properly after every page was finished loading. This caused the tests to run against incorrect data. Making tests run in one browser instance will greatly increase the speed.
·         Add tests for Service unavailable, 404, and 401 errors.
·         Add tests to detect redirection to the standard WSS error page and other standard types of errors.
·         Research creating tests that can compare a checksum or hash of a previous version of the page to the current one. Will have to be able to deal with dynamic control id’s generated by asp.net.
-Mark

SharePoint 2007 - EventHandling on Lists

We have been working with the latest Beta 2 of SharePoint 2007, and focusing on all the customizing that is SO much easier, in 2007 then in 2003.  The events are one of the much improved things in 2007, and I have been digging into them in the last week. I thought it might be helpful to post my findings, to see if it is useful to other people.

 

I went pretty thoroughly the events available on a list, creating a custom class that subclasses from the SPItemEventReceiver.  I didn’t touch the ContextMenu event, because I didn’t want to get into that yet. I did override all the other events, and tracked the order in which they fired.  There are some issues where the current SDK for the beta is not correct, and has sample code that doesn’t and can’t work.  I will go through that as well, but here are the results from the order of events, most are as you expected.

 

Order of Events

These results are using the SharePoint UI, I haven’t tracked the order of events on modifying lists programmatically yet.

 

 Action

Event Order

Add an item

ItemAdding

ItemAdded

Update an item

ItemUpdating

ItemUpdated

Add an item with an single attachment (if you add more then one attachment AttachmentAdding and AttachmentAdded will fire as many times as there are attachments)

ItemAdding

ItemAttachmentAdding

ItemAttachmentAdded

ItemAdded

Update an item with adding an Attachment

ItemUpdating

ItemAttachmentAdding

ItemAttachmentAdded

ItemUpdated

Update an item with deleting an Attachment

ItemUpdating

ItemAttachmentDeleting

ItemAttachmentDeleted

ItemUpdated

Checking a file in

ItemCheckingIn

ItemCheckedIn

Updating and Checking in a file from Word 2003 or 2007

ItemUpdating

ItemUpdated

ItemUpdating

ItemCheckingIn

ItemUpdated

ItemCheckedIn

 

 

Moving a file in a document library from one folder to another folder, using Network Share.

ItemAdding

ItemUpdating

ItemAdded

ItemUpdating

ItemUpdated

ItemUpdating

ItemUpdated

ItemDeleting

ItemDeleted

Creating a Folder in a List or Document Library

ItemAdding

ItemAdded

 

 

Those are the events that I have gone through so far. When moving a file while SharePoint Designer (Frontpage), the events don’t fire when moving files from folder to folder. 

 

The events ItemAdding, ItemAdded fire when adding a file using SharePoint Designer, and they do fire when updating a file, but just not when moving.

 

Updating an Item

 

After reading the SDK section, “Creating a Basic Event Handler”, I found that the documentation is just wrong.  The example at the end of the page –

 

public override void ItemAdded(SPItemEventProperties properties)

{

    properties.AfterProperties["Body"] = "Body text maintained by the system.";

}

 

It is just wrong, because the AfterProperties property is read only, and you can only get the properties, same with the BeforeProperties.  I tried to put in some basic auditing using an Updating or Updated event, write to a hidden column on the item, the contents of the changes.  I know there is the ChangeLog in SharePoint 2007, but I was curious to see how to do auditing with events.

 

Since, I couldn’t set the AfterProperties like the SDK explains, I simple update the item programmatically.  I thought it would create an infinite loop, because the event would fire and the item would update itself, and cause the event to fire again.  It didn’t behave that way, it fired 9 times and then stopped. I’m still researching, but it is very unusual. I plan to write some simple logic, that if only the hidden column is being updated then don’t update again, to get around the loop, but I’m not sure if Microsoft is planning to make the AfterProperties able to be set in Beta 2 – TR or if this is the way they are planning to leave it.

 

Well, I will go back to battling w/ the SharePoint 2007, and hammering away on events.  We should have a post about the “joy” of Workflow, soon as well.

 

Morgan



kick it on SharePointKicks.com

?>

Using a SPGridView inside an ASP.net Ajax UpdatePanel

The goal of this post is to demonstrate how to use ASP.net Ajax Extensions inside of WSS to build web parts and controls that are capable of doing async post backs and partial page refreshes. This post will also cover how to use the SPGridView with paging and sorting.

How it works

The web part in the example code uses an SPGridView control to display a data table.  The grid is inside a UpdatePanel which allows all the sorting and pagination to happen asynchronously. What’s all this mean? It means that you can sort and page your grid view without having to refresh the rest of page. This is great for SharePoint because pages can typically have a long life cycle. One thing that is really cool about this approach is that it doesn’t require you to write any javascript at all. The UpdatePanel takes care of all that stuff behind the scenes. You can take the code used in this example and apply it to any other application the UpdatePanel can be used for, such as data entry. You can also use the ASP.net Ajax Control Extenders.

The real secret sauce here is the AjaxBaseWebpart class (credit: Eric). If you aren’t aware already, SharePoint doesn’t play nice with the ASP.net Ajax framework out of the box, so we have to do some ninja tricks to get it to work. This class makes sure that the page contains a ScriptManager which is required by the ASP.net Ajax framework to do partial page refreshes and other ajaxy stuff. It also tweaks some of the SharePoint related JavaScript to allow the UpdatePanel and other Ajax controls to handle the post back correctly. If you want the details on the AjaxBaseWebpart look at Erics post.

Get the sample running..

  1. Modify your SharePoint web.config file with the appropriate settings for the ASP.net Ajax Extensions. Mike Ammerlaan has the details on this.
  2. Download the sample code, build, and install. I have a install.bat file in the bin\debug dir of the cab project that will help you install the web part, just change the server name before you run it. (might have to remove –force the first time)

Know bugs/Problems

  • For some weird reason the first time you use the pagination or sorting it does a refresh of the entire page,  but every time after that it works correctly. Kind of a tweaky little bug, if any one figures out why this is happening please let me know. The updatepanel only seems to do this with the SPGridView.
  • Deployment with all the web.cofig changes is not going to be fun. You will probably need to build a solution package that makes the modifications for you are part of the install process.

Credits/Sources

This is example project is a combination of code and information from several people. Thanks to

 Let me know if you have any questions or improvements.

- Mark Collins

kick it on SharePointKicks.com

SharePoint Templates Available

Microsoft has released the new Application Templates for WSS 3.0, take a look at them.

http://www.microsoft.com/technet/windowsserver/sharepoint/wssapps/templates/default.mspx

I really think, they are a good way to view some of the different ways WSS/MOSS can be applied to a business case.

 

- Morgan

WSS/MOSS 2007 SDK (RTM)

I know other people have put this out, and it has been out for a few days, but I thought i would blog about it because I have been eagerly waiting for it.  I don't mind using the online version, but i just liking having the SDK on my computer, so I can quickly get to it. 

From Bil Simser's blog site (http://weblogs.asp.net/bsimser/default.aspx):

  • SharePoint Server 2007 SDK
  • Windows SharePoint Services v3 SDK

    Here is the link to the official SharePoint blog post:
  •  http://blogs.msdn.com/sharepoint/archive/2007/01/22/download-the-moss-sdk-or-the-wss-sdk.aspx

    Morgan

    Google Gadgets + SharePoint = Neato

    If you haven’t seen them yet Google Gadgets (http://www.google.com/ig/directory?synd=open) are cool little web based components that you can include on the Google home page and inside your own pages.  They are really easy for the community to build so there are all kinds of cool little apps like conversion calculators, daily image feeds, stock tickers, and even asteroids. They are great for easily and quickly adding little chunks of functionality to a website. MS has similar things for windows live that they call widgets.

     

    To add a google gadget to a SharePoint page…

    • Go to the google gadgets site(http://www.google.com/ig/directory?synd=open) and find the one you want and click on the title.
    • Then just click the add to your webpage button.
    • Adjust the available settings to your likings and click the “Get the code” button. Copy the code it generates to the clipboard.
    • Now go to your SharePoint site and add new content editor web part the page you want the gadget on.
    • Click the web part menu (little triangle in the top right) of the  content editor web part and go to Modify shared web part.
    • In the tool pane click the source editor button and then paste the contents  of your clipboard in the window that appears. Click Save on the pop and then OK on the tool pane.

    Thats its! Pretty easy huh? Most the gadgets I tried seem to work fine.

    -Mark

    TR to RTW Upgrade

    fter some fun battling w/ a site servers and a bunch of different site collections, I was able to get our TR upgraded to RTW.  There are two great articles form Shane Young about the upgrade.

    http://msmvps.com/blogs/shane/archive/2006/11/17/upgrade-from-tr-to-rtm-work-around.aspx

    http://msmvps.com/blogs/shane/archive/2006/11/15/installing-moss-2007-rtm-on-a-farm-running-moss-2007-beta2-tr.aspx

    If you read the comments on the 2nd one, I did use a different path in the registry for the when fixing the Index

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Search\Applications\{GUID}

    I found it at

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server\12.0\Search\Applications\{Application GUID}

    The blog posts were great and very helpful.

    Morgan