Archives / 2006 / May
  • Forum update coming after TechEd, CodeCamp code sooner

    Just trying to get ahead of the game here. There's a small update for the SharePoint Forums Web Part coming on June 19th (or so, after TechEd anyways) on the forums. Here's a sample:

    Additions are boxes to quotes (might make this configurable) so you can see them better, better navigation, and a few other goodies.

    Check out the Issue Tracker and Release Road Map to see what's going on.

    I'll be posting the code and slides for the Calgary Code Camp sessions. This includes a complete ASP.NET 2.0 site built during the presentation (I've cleaned up the layout so it doesn't look like a retard built it) and the tools list with some notes.

  • Project OneShot

    Yeah, at first I thought this was more spam for a new porn flick, but alas no. It’s a SharePoint Web Part from those whacky guys at Omnisys.

    If you can’t wait until Microsoft Office SharePoint Server (oh god why is it so long to type this?) 2007, then check this out. It allows getting a single view of all the details from multiple projects (on a Project Server) on a joint time scale.

    Are your legs all a jitter? Mine are.

    Well, no. Not really.

    Okay, so it looks like a pretty slick Web Part and something that’s missing OOTB from Microsoft. Omnisys always has quality stuff so if you’re into looking for something to supplement your Project Server, give it a shot. You can get all the information and download the Web Part from here.

    Man, I should get paid for this junk.

  • Calgary Code Camp, a huge success!

    We’re very happy with the turnout for yesterdays Calgary Code Camp. It was a first for us and yeah, we made mistakes but we had hoped for about 50 people but got around 80. With two tracks running, both rooms we filled well on each session and it seems everyone had fun. I’ll be posting slides and code from my sessions in a day or so after I recover from the event ;)

  • Calgary Code Camp, tommorow!

    Hey kids, it’s almost time for the first ever Calgary Code Camp! Tommorow morning, bright and early starting at 8AM at the 5 Calgary Downtown Suites Hotel we’re going out and doing it.

    I’m giving two presentations at the camp. First is a development session on using ASP.NET 2.0 Web Parts (not SharePoint), Master Pages, and Providers to build your own personal portals and web sites. Right after that I’ll be going through 20 essential .NET tools you can’t do without (20 tools in 75 minutes, that’s 3 minutes per tool plus startup and question time, pretty wild). There’s also plenty of cool presentations all day from John Bristowe, James Kovacs, Richard Campbell, Jean-Paul Boodhoo, and others. Be there or be square.

    There will also be lots of goodies as a couple of the sponsors have some givaways and baggies of stuff so be sure to show up to get yours (because what better way to spend a Saturday in Cowtown than to get free schwag and listen to geeks like us for the whole day?)

    After the camp the files for the presentation will be online on the site with code and slides for you to download.

  • SharePoint Forums Roadmap

    Things are rolling along with the SharePoint Forums Web Part and I’m just mowing through the current various work items. These are either features that I’ve had planned, bugs identified by users, or suggestions from the forums.

    The next release is scheduled for June 19 after I get back from TechEd. You can view the release roadmap for the next version here on CodePlex which will show the current work items assigned to this release. Currently there are 5 closed items (RSS feeds added, a couple of bugs fixed) and 2 being worked on (search and multi-language support). I’ll probably keep this pace of new releases every month until all the features get added that everyone wants.

    Serious work started on the 2007 version of the Forums for MOSS 2007. This will be delivered as a Feature that you’ll be able to make available to a site/farm/server/whatever. There are some nice things in 2007 that will help ease maintenence on the forums like better integration with security.

    Keep things coming by participating in the forums on CodePlex, tracking down bugs, and making suggestions for future improvement.

  • SharePoint Forums, the Domain Model

    Here's the Domain Model for the SharePoint Forums Code.


    This was built in VS2005, but there are some difficulties with the class diagram. All the collections are strongly typed, yet if you try to connect say a property called Messages (from the Topic class) to the MessagesCollection, the designer complains that it's a weakly typed collection. So in some cases it's an assocation, in others it's an association shown as a collection (when the designer decided that it was okay).

    The RepositoryRegistry is a class that handles access to all the Repository classes. The various domain entities (Forum, Topic, Category, Message) are shown with their associations. The Repository classes are access points for the Web Part class (not shown) to access the list data (through a data access service that lives in the Common assembly). The Mapper classes translate domain objects to list structures (and vice-versa). The ListBuilder (and various builders) along with the ListDirector implement the Builder pattern that create the lists (if needed) on startup.

    There are no SharePoint objects here (except a reference to the SPUser class in the ForumUser class through a property called UserDetails, which lets me not have to duplicate things like email addresses and display names) and everything SharePoint is either in the Web Part class or the Data Access Layer.

    There are a few base abstract classes or interfaces that could be added here (now that I look at the design from this viewpoint) like creating a base Mapper, Dao, and Repository class or interface.

    I haven't uploaded the code yet as I'm trying to figure out how to do this with Team Explorer. Team Explorer lives inside Visual Studio 2005. Unfortunately the forums are still a 1.1 project and I really don't want to create a fork just to upload the files to the server so trying to figure out the command line tools to check the code in to CodePlex.

    Feel free to comment on or ask questions about choices I made in the domain. It's pretty clean overall and well positioned for testing (there are about 80 unit tests in the system) as well as being loosely coupled and easy to add new features.

  • Delete and SharePoint Forums

    So I'm sitting with a quandry and figured I would solicit feedback.

    A long time ago, in an IDE far, far, away I added a ranking system to the SharePoint Forums Web Part. This is the typical ranking system you see on forums. New user joins forum, gets rank of "Newbie" and after some # of posts, becomes a "Member" (or "Journeyman" or "Apprentice" or [insert witty title here]). All is good in the world.

    Currently the Web Part tracks all the posts a user makes. It doesn't track where they make that post, just that they did. Hence if the ranking system was in place, after # number of posts you graduate from one title to the next. Titles are all configurable by the admin. Okay, so the ranking system isn't in the current version (it was pulled late in the game to simplify hunting down any problems the first release would have) but deleting posts affects it and that's where you come in.

    When you delete say a forum from the system (and all topics and a posts in each topic) you skew the numbers. Now the counts are thrown off. Say a user posts 100 messages in a single forum and the admin decides to blow that forum away. Now the user has 100 posts in his profile, but there are only 50 messages in the entire system (and nothing from that user because all his posts were in one forum which is now gone).

    So, is it worth the time/effort/bother to go through and update each users post count as each post is deleted (which can be time consuming) or does it matter that Jimmy has a post count that isn't indicitive of how many posts are in the system (i.e. some users might have higher post counts than the number of messages in the system).

    Like I said, looking for some feedback to determine how important delete is in the system. Feel free to leave comments here, post a message on the forums (I've started a thread here), or email me.


  • SharePoint Forums growing like wildfire

    Hey there. I just wanted to thank EVERYONE for the amazing support, feedback, and collaboration on the SharePoint Forums Web Part. I’m hoping it’s installed for everyone and working for you. I think it meets a need and I’ve got other projects in the oven that will do the same.

    There are a few emails here and there with problems, but mostly it’s people not following all the instructions completely. Again, I do apologize for not putting together a big dummies installer so people are getting a little lost with editing files they’ve never touched before. Feel free to berate me at TechEd (now sold out) later next month.

    As for popularity and growth, the project went onto CodePlex a week ago and has gone from zero to hero. It’s now #2 in activity (just behind the CodePlex project which everyone goes to for talking about the site, so I don’t expect to surpass that) and it’s #3 in popularity (just inches behind the Atlas toolkit, and already leaving MSBee and NUnitLite in the dust). How those numbers are calculated I don’t know but something must be happening (because I can only reload the page so many times a day).

    13,000 hits and 400 downloads. With 3,154,273 trillion (yeah, it’s a big number) installed SharePoint customers out there I suppose I have a way to go to get market share but hey, Rome wasn’t burned in a day you know.

    Keep on contributing and reporting. There’s plenty of docs online now for installing so next step is to start writing user type stuff. I may not be able to react with weekly iterations like the P&P guys, but I will keep the releases fresh with new features and bug fixes. There’s been some awesome feedback in the forums already and the next release is planned for June (probably going to move to after TechEd since I’ll be gone all that week being a Microsquishy monkey).

    There’s an RSS feed here from CodePlex that will give you updates to all changes on the site (wiki, releases, forum postings, etc.) so it’s a little chatty. Also I’ve created a new tag for posts here that will be aggregated to the News Feed tab on the CodePlex project. This is only for posts that concern the web part so if you’re subscribed to my regular feed, you’ll get it anyways.

    From here, it can only get better (and I’m just looking at the changes needed  now for the 2007 version which will be ready when MOSS 2007 ships later this year).

  • Feedburner

    Hi guys,

    If you’re subscribed to this blog (using the default RSS feed) can you please update your feeds to read from feedburner instead ( I can actually do better formatting, trimming, etc. as a provider of the feed to you and in the case this blog moves, you’ll always have the latest. Also if you’re consuming this feed on a mobile device, the feed coming from FeedBurner is much better formatted for that layout.


  • Keeping up with SharePoint development online

    This is way cool (and hot off the presses, thanks L!). As a developer for the new Microsoft Office SharePoint Server 2007 (and Windows SharePoint Services v3) it's good to have a place to go. Now you do.

    Check out the following links that will keep you on top of development for all things related to SharePoint:

    Awesome stuff!

  • Thanks to everyone at!

    Just wanted to thank everyone involved in the upgrade of to Community Server. It seemed to have gone seamlessly and all my posts (with code snippets) survived. Earlier testing of the CS upgrade found that they were stripping embedded HTML out of posts. I use a plugin for Visual Studio called HtmlAsSource that lets me load up some code, select it, copy it to the clipboard, and paste it into a blog post just as you would see it in Visual Studio. I was involved in testing the upgrade a few weeks ago and these posts became gobbly-goop (technical term) so I'm glad to see that fixed.

    The other great thing are the new features. Search is great now so just search on my blog for Forums and you get all the posts about my SharePoint forums web part. Search for TechEd and you'll get all the TechEd posts. Yes, even the snozzberries taste like snozzberries.

    Other nice features are the highlighted tags (where size does matter and shows how many posts are filed under a particular tag), the option to email a post to someone, a single link to post an entry to digg, and subscription features for those that don't want to subscribe to an RSS or Atom feed.

    Anyways, thanks guys. Job well done!

  • It's beta 2 time!

    Hey kids, what time is it? It's beta 2 time!

    The public beta of Office 2007 is now online and available to anyone. The link is here for you to download the files. This includes all of the Office 2007 client (Word, Excel, Powerpoint, etc.) and servers which includes Microsoft Office SharePoint Server (MOSS) 2007.

    With the release of the public beta there are a couple of things to note. You'll have to register and go through a few pages of entering your name, address, blood type, first girlfriends bra size, and other sundry information. After you fill all that in, you'll be whisked away to the download page where your Internet connection will grind away for hours. Note that if you have installation keys for a previous version, you'll still need to go through the registration to get a new set. The old installation keys will not work with this version.


  • Windows SharePoint Services SDK v3

    Seems that the SDK for Microsoft Office SharePoint Services v3 is now available on Microsoft downloads. You can grab it here. This is to compliment the SharePoint Server 2007 SDK that’s available here.

    Get your beta 2 engines started up!

  • Blog is back

    Everything looks good now. Have it reconfigured so it's not that much different (why mess with a good thing). There are some new features like the ability to email or digg one of my posts (yeah, like that will ever happen) and the tags at the side are sized based on the number of posts with those tags.


    Now I just have to figure out how to get BlogJet to support connecting to it (there's no option in BlogJet to post to a CS server) and I'm rockin.

  • Offline for an upgrade, Plumbers @ Work, and Calgary Code Camp

    Just wanted to let you know that my blog (and RSS feed) will be unavailable between 4pm EDT (-5GMT) and Midnight this evening. This is to facilitate an upgrade on the site from .Text to Community Server. The long awaited upgrade will provide a few extras for you as a visitor here so we’ll get those configured once the upgrade happens.

    Our latest episode of Plumbers at Work went online a few days ago (forgot to report it) so check it out here. Plumbers at Work runs off the latest version of Community Server so you can kind of see what to expect this blog to transmogrify into.

    Also next week is the Calgary Code Camp where I’ll be presenting two sessions, one on .NET tools and one on building ASP.NET 2.0 Web Sites with Master Pages, Web Parts, and cool stuff. Be sure to register as it’s free and we’re giving away stuff.

  • What is this CodePlex all about?

    So CodePlex is out in the wild and there are a few showcase projects setup, but what’s it all about? is a simple but highly functional online collaboration venue for distributed, community-collaborative software development. For the last year, a team in Microsoft has been putting together this tool which is the first Visual Studio Team Foundation Server (VSTFS) over the Internet. For Microsoft, their primary objective with CodePlex is to enable Windows and .NET developers to write, share, and consume source code and applications. It’s that simple (and free).

    Korby Parnell and his team designed CodePlex as a replacement for GotDotNet Workspaces, and if you’re like me, it kicks the llama’s ass. CodePlex is written from the ground up in C# utilizing .NET 2.0 technologies and built on VSTFS. CodePlex enables geographically-distributed teams to enjoy the benefits of VSTFS over the Internet which is pretty cool if you’re familiar with the capabilities of VSTS. If not, then you should check it out.

    Much like the multitude of Googles projects, the site is marked as beta but unlike Google, this won’t stay that way for long as this is their final release before production. Between now and the end of May they are on boarding a small number of high quality “Showcase” projects. There’s some cool stuff there like NUnitLite, the Commerce Starter Kit, Atlas Control Toolkit, a meta generator for the BDC, IronPython (a Python implementation on .NET), and of course my SharePoint Forums Web Part (#2 on the activity chart!). The plan is to go public sometime in June where any project can join up and be hosted there.

    The first thing everyone will do is compare this to the highly populated SourceForge. I’ve been a member on SourceForge since 1999 so yes, I think they have a lot to offer. The services have grown with things like the new support for Subversion (which blows CVS out of the water so go get it if you’re on CVS now). Side by side, both CodePlex and SourceForge offer project hosting with similar features (file releases, source code, issue tracker, documentation). The Web Interface for CodePlex seems nicer but it’s the Team System integration where it really shines.

    Once a project has been created for you on CodePlex and you’re ready to upload source files and binaries, you must download and install one of the following Team Foundation clients. Whereas the Web site is designed as the primary interface for project administration (manage members, write documentation, delete off-topic discussion threads, etc.) and project evaluation (download and install SharePoint Forums, engage in discussions, read documentation, submit bugs, etc), all version control and many work item tracking functions must be performed using one of the following VSTFS clients:

    • Visual Studio .NET 2005 Team System
    • Visual Studio .NET Team Explorer, stand-alone GUI client
    • TF.exe, a stand-alone command line interface

    The Visual Studio Team Explorer client comes with Visual Studio Team Foundation Server and is also available for download from the Microsoft Download Center as a CD image file (you can rename this to ISO which is the same thing).

    SourceForge has changed over the years. In writing this blog I wanted to post the stats to the site, which used to be on the front page. This listed the number of projects and users (which was pretty astronomical) but is now missing since the last layout change to the site. SF seems cleaner these days, but cleaner doesn’t mean better. CodePlex is simple and intuitive to view and navigate but can stand some improvement (as demonstrated by the various suggestions we’ve already made in the discussion forums there). Besides all that, hopefully CodePlex won’t become the ad-ridden marketing tool that SourceForge has become where it’s just pimping it’s Enterprise version (in this case, VSTFS).

    Unfortunately, for us with WSS sitting on top of VSTFS now there’s no CodePlex for you to host behind your firewall. Microsoft does not have any plans to release the source code and, according to Jim Newkirk “The software is designed to run in the Microsoft data center, so it isn't something that could realistically be hosted in another environment.” Bummer. I’m sure some people will cry foul because they can’t get the source code but free is good so we’ll take anything at this point. It does show you that such a beast can be built and TFS can be used, like SharePoint, as an application delivery platform (if of course you have a year and a lot of smart softie brains). 

    Microsoft expects CodePlex to emerge as one of the most popular, if not the de facto collaboration venue for community software development projects that target or extend Microsoft products and platforms. CodePlex is and will remain a free, Internet-based edition of Visual Studio Team Foundation for the use of Microsoft valued developer and IT Pro customers.

    Will CodePlex turn into just another SourceForge, with thousands of abandoned or empty projects? To prevent project spamming and to ensure that CodePlex remains a bastion of the highest quality open and shared source projects rather than empty test projects and code-free wonders, the CodePlex team is reviewing and approving/denying all new project requests (with the help of a few CodePlex community members) through the end of the calendar year. 

    Time will tell.

  • Installing and Configuring the SharePoint Forums Web Part

    I’ve detailed and completed the instructions for installing and configuring the Forums Web Part for your systems. There’s been a lot of people who have either never editing web.config to add SafeControl entries, or never created a custom security policy file and are a little lost in step 3 or 4.

    You can find the complete instructions here on the CodePlex Wiki. Each step contains a link to a more detailed page outining what has to be done (with examples). Hopefully these instructions are complete enough for everyone.

    Yeah, the system really needs an installer.

  • Test Driven Development guidelines done right

    Remember all the bruhaha a while ago when Microsoft published a document about their concept of Test Driven Development guidelines. We were all up in arms as they tried to define the process to match Visual Studios auto-test-generation and all that and well… it just blew.

    So they’ve republished the paper here with all the right stuff. I checked it out and was going over everything in my head, hoping it wouldn’t be another series of blogs telling MS they screwed up again.

    Red, green, refactor. Cool.

    Write the minimal amount of code to pass. Awesome.

    Refactor to design. Superb.

    Of course the author is a TDD leader in his own right, so it doesn’t surprise me it’s a mucho-better document than before and now something you can point your kids at. Thanks J!


  • Cool CodePlex Feature

    Yeah, I'm groking CodePlex and loving it. There's a great feature that I just did for the first time. A user posted a message in a forum (the first forum post! And there was much rejoicing!) about clicking on categories which would cause nothing to happen. This is due to a change in the way forums were being retrieved and something I had to fix. You select the forum post and click on "Convert to Work Item". This does two things.

    First it creates a Work Item where you can track the feature/bug/whatever. The second thing it does is post a message to the thread saying it's been converted to a Work Item and telling people to track it there.

    This is the way cool technique to implement features and fix bugs. There's no loss of tracking a suggestion (if you choose to create a Work Item) and really ties things like requirements to work done.

    Nice stuff.

  • Documenting the SharePoint Forums Web Part

    I've started putting together the documentation for the SharePoint Forums Web Part (SFWP anyone?) on the CodePlex site so let me know if there's anything you're looking for specifically (and feel free to jump into the discussion forums there to get some open discussion around features, bugs, etc. started). I've also started a FAQ here that you can use for a quick reference on things if you're not into reading lots of text (like most of us are).

    Also note that I've removed the download link that used to be on and all downloads of the Web Part need to be done through the CodePlex download link here (this will require you to agree to the license agreement). The Web Part is released under the Creative Commons Attribution-ShareAlike 2.5 License. This basically means that:

    • Commercial use of the Web Part is allowed
    • Modifications (including derivative works) of the Web Part are allowed as long as they are released under the same license as this one

    Please respect this when using, modifying, and sharing the Forums Web Part.

  • SharePoint Forums on CodePlex

    CodePlex kicks ass. There. I said it.

    And my SharePoint Forums Web Part project has a new home. On CodePlex. Cool.

    CodePlex is the brainchild of Microsoft and is basically a public facing Visual Studio Team Foundation workspace (the first one that I know of) for hosting and sharing of community projects. If you’re familiar with sites like SourceForge and GotDotNet, it’s very similar. SourceForge is closer to what CodePlex offers (or the other way around if you prefer) in that you have discussion forums, file releases, news, source code, a Wiki, etc. except that rather than hosted on Linux and using CVS/Subversion it’s all ASP.NET 2.0 baby and Team Foundation Server.

    Although (and feel free to quote me on this) GDN just plain blows monkey chunks. When I go there, navigation is a nightmare and half the time I end up looking at the main page when I thought I was in a project. Also (just today for instance) I joined a new project, was approved and all that then tried to download the project files and was asked to join. I gave up after signing in a dozen ways to Sunday (oh and how I just love Passport). Nuff said.

    I really love SourceForge and it’s served me well (and the other 60,000 projects hosted on it). Will CodePlex be the next SourceForge? I don’t know but I do know I’m going to enjoy working with CodePlex that much more. Complete Visual Studio integration, wikis, work items, tracking, forums, etc. That just works for me.

    Okay, some people will gripe and say SourceForge (or the much improved GForge) is much easier to use and doesn’t require a $15,000 client to access it. Fear not as you can use the “tf” command line tool to use even if you don’t have Team Suite (which means you can still use say the free Express edition for development but still access your project on CodePlex). That’s the beauty of TFS, it’s open ended and I’m sure the command line client won’t be the last one you see (hint: hey TortoiseCVS and TortoiseSVN guys, it would be great if someone could put together a cool TortoiseTS project).

    The main thing that I’m digging is the Wiki support so I’m just going to fill the site with documentation on the Web Part so I don’t have to keep posting tidbits on my blog or through emails. The collaboration features of CodePlex are going to be quite cool too since I could (eventually) have a team around the world working on the Web Part, all checking stuff in etc. in a nice interface without having to leave the comfort of Visual Studio.

    Yeah, I know. You’re all saying Bil has just become a Microsoft brainwashed addict and has gone off his rocker spouting gobs of Team Server propaganda. Like we care since so many other sites have done far more for far less so what’s the big deal. I’m sure people will continue to say sites like SourceForge (and others) far surpass what CodePlex could ever be. Guys, don’t review the movie just from the trailer. Sure, CodePlex isn’t something that we haven’t seen before but it’s a damn better step forward than what GDN offers and (IMHO) can only get bigger and better. Time will tell.

    I’ve just got the Forum project site setup and will be adding documentation, releases, and source code to it over the next week or so. There are some forums there, so feel free to sign up on CodePlex (it’s free of course) to ask questions, share experiences (good, bad, or ugly), suggest features, and all that jazz. Feel free to visit the site for updates as well and collaboration on the project (and I’ll be posting updates here but most of them will redirect to pages on CodePlex) and let’s make it the most popular one on the system (at least until something better comes along).

    Oh yeah, while this is my first project on CodePlex (and from what I was told, the first non-MS project hosted there) this certainly won’t be my last project on CodePlex.

    You can check out my SharePoint Forums CodePlex site here. I’ve also posted the file as a release now so please use this link to grab it (this includes a license agreement page you need to agree to in order to download the file) as I’ll be removing the old one. SharePoint Forums is released under the Creative Commons Attribution-ShareAlike 2.5 License.

    P.S. sorry for the over abundant use of the word “cool” in this blog. It’s been a good (and long) caffeine enriched day.

  • SharePoint 2003 and .NET 2.0

    Personally I’m seeing more and more people asking questions and being generally confused about building Web Parts with Visual Studio 2005 and .NET 2.0 for the current version of SharePoint. This is of course compounded by the fact that ASP.NET 2.0 has a class called WebPart, can do Web Parts but they’re completely different from the SharePoint 2003 ones.

    My advice to you, weary traveller, is to simply don't bother with VS2005, ASP.NET 2.0 and SharePoint 2003 (WSS or otherwise) today. Yes, there are bloggers and MVPs out there that have instructions/sessions/presentations on how to do it however you can make it happen only under certain circumstances, and if you sacrifice the correct number of chickens (or virgins if you prefer) in the correct order on the correct night of the full moon. It's really just a big bother for very little gain IMHO.

    Wait until later this year when you can just build stuff right out of the box. Trust me, VS2005 and SharePoint 2007 works like a dream.

    Click, code, create.

    No mess. No fuss.

  • More SharePoint Forums Web Part Fun

    Just a minor glitch and a quick update. Some people are experiencing problems with security and installation of the web part. Primarily this is usually caused by the AppPool id for the SharePoint site to be running as NETWORK_SERVICE (which generally doesn’t have any privileges). If you use a local or domain account, this problem should go away (and is a recommended setup anyways).

    Also on the point of hosting the Web Part. I built it so it can live anywhere (a portal area, a WSS site, a document library) however for Web Part Pages in Document Libraries, the forums are having a little trouble figuring out it’s own home. After posting a message or editing something in the Admin panel, you might find it “kicks” you out to the Document Library or the main site. I’ll see about fixing this in a drop later this week or early next (don’t want to do a release just for one bug) so if you can either host it on a WSS site (on the main page) or a Portal area, you’ll be laughing. Otherwise you might think things are behaving weirdly.


    Is that a word? Sounds like a member of the episode of the Flintstones where they had the creepy family.

    Weirdly Gruesome.


  • Forum irregularities

    First off, sorry if this week is going to be filled with posts about the forum web part. It's popular and I just want to make sure everyone gets it, gets it installed, and gets it working in their environment.

    There's some irregularity with adding the web part to a portal vs. a WSS site. The web part is designed for both but for some odd reason it behaves weirdly (yes, that's a technical term) when deployed to a portal (probably due to the fact that the user lists are different).

    In any case, you might get an error loading the web part, but just refresh the page (by visiting the link again) where you deployed it and it should appear normally.

    If you're an admin on a portal area and don't see the Admin option, email me and I'll send you info on how to access the list directly (if you haven't already figured it out) and you can edit yourself to be an admin (you still need update rights in that area to do this so it's not open).

    Again, most of the issues are due to the fact that all actions in the web part (creating lists, adding/editing entries across multiple lists) are always done by the AppPool user and not the user in the system (although the Web Part keeps track of who you are and distinguishes between you and the AppPool user). This was done just because I didn't want you, the user, to have to maintain security on 5 different lists.

    I think I made the right decision, but there's some fancy footwork that needs to be cleaned up here which will come in time.

  • SharePoint Forums Updates

    I haven’t got the site for submitting bugs, discussions, etc. for my SharePoint Forums Web Part but that should be along shortly. Some of you might be wondering where some of the features of the Web Part are (like RSS feeds). These are coming but due to time as I got into building it, I went for quality over quantity.

    Here’s a list of the features that are being worked on and those that are planned (my wishlist).

    Currently Being Worked On For Future Release

    • Import tool to read in and convert existing discussion list messages (not sure how the mapping to categories will go here)
    • Ability to sync a forum up to an external NNTP server and newsgroup(s)
    • Language support for more than just U.S. English
    • Topic/message search

    Wish List
    These are items that have been requested, were planned, but have yet to be scheduled or decided on.

    • RSS feeds (web part, forum, topic)
    • Email notifications from topics, replies, etc.
    • Locking of topics (so nobody but admin can add posts)
    • Password protect forum (not sure if this is needed)
    • Sticky topics/announcement type posts
    • Active topics list (return a list of all topics with replies)
    • Inactive topics
    • New topics (show topics since your last visit)
    • Print topics
    • Supports smileys/emoticons
    • Todays topics
    • Jump to forum feature (a small drop down box on the page to quickly navigate around)
    • Mark all unread messages read (messages don’t have a read/unread state now so this will be a large change)
    • Paged navigation of topics

    Some of these features will come automatically (like RSS and Email) with version 2.0 which will ship with SharePoint 2007 (and is being actively worked on so you’ll have a release as soon as the product is ready later this year). If you have any more feel free to send them my way.

    Expect a new release every 3–6 weeks (depending on my schedule). Once the new site is up, you’ll be able to add your own items, download the source code, etc.

  • SharePoint Forums... go get 'em

    I’m very happy to say that the SharePoint Forums Web Part is ready for you to install. I cleaned a few things up from the last week with the testers but most people reported no problems and only suggestions (which is always a good thing). There were a couple of problems with permissions however if you follow the installation instructions below you should be golden.

    I do apologize for not putting together an MSI or something. I did go down that path using WPPackager, however two problems. One is I couldn’t get the permission setup correct and the second thing is that the Forums uses a common library that I’m giving out which needs to go into the GAC but the Forum Web Part assemblies can go into the bin directory. I couldn’t find a way to split this up and then couldn’t get WPPackager to just package a regular file so it either meant doing it by hand (which is what I did) or building a two installers using two different tool sets.

    In any case, installation does require a bit of configuration but it’s painless. If some adventurous soul out there wants to put together an installer I’ll throw you a cool SharePoint prize.

    You can download version of the Web Part from here. For those that have previous versions installed, please remove them and delete your forums. If you really want to retain the old forums I can tell you how to do this but email me privately as it involves some extra steps.

    Here are the web part installation instructions. These instructions are also in the zip in a text file called DRINKME.TXT.

    Step 1
    Install “BilSimser.SharePoint.Common.dll” to the GAC

    Step 2
    Copy "BilSimser.SharePoint.WebParts.Forums.dll" and "BilSimser.SharePoint.WebParts.Forums.Core.dll" to your SharePoint web site bin directory (if it's the default, it's c:\inetpub\wwwroot).

    Step 3
    Add the following SafeControl entries to your web.config file:
    <SafeControl Assembly="BilSimser.SharePoint.WebParts.Forums, Version=, Culture=neutral, PublicKeyToken=e516dadc23877c32" Namespace="BilSimser.SharePoint.WebParts.Forums.Controls" TypeName="*" />
    <SafeControl Assembly="BilSimser.SharePoint.WebParts.Forums, Version=, Culture=neutral, PublicKeyToken=e516dadc23877c32" Namespace="BilSimser.SharePoint.WebParts.Forums" TypeName="*" />
    <SafeControl Assembly="BilSimser.SharePoint.WebParts.Forums, Version=, Culture=neutral, PublicKeyToken=e516dadc23877c32" Namespace="BilSimser.SharePoint.WebParts.Forums.Controls.Common" TypeName="*" />
    <SafeControl Assembly="BilSimser.SharePoint.WebParts.Forums, Version=, Culture=neutral, PublicKeyToken=e516dadc23877c32" Namespace="BilSimser.SharePoint.WebParts.Forums.Controls.Base" TypeName="*" />

    Step 4
    Add the following to a custom policy file (PublicKeyBlob split for clarity but needs to be one line):

    This entry needs to go AFTER the FirstMatchCodeGroup and BEFORE the ASP.NET UnionCodeGroup!

    Step 5
    iisreset (or recycle your AppPool)

    Step 6
    Import SharePointForums.dwp onto a WSS site or SPS area page where you are an Administrator.

    Step 7
    Configure, and have fun!

    I’ll post a quick set of docs (somewhere) on doing basic stuff but watch for blog entries on various tricks you can do. Email me at if you have problems, questions, suggestions, small marsupials, concealed logging chains, etc.

  • Meet the "new" SharePoint Community

    SharePoint is all about community. Whether it’s forums or newsgroups or blogs, everyone is always trying to find information. This was difficult before and required ninja Google skills to find what you needed. Microsoft stepped up to the bat to rectify this problem with initiatives like Microsites and Communities. Unfortunately, the SharePoint community wasn’t that great and offered a few links that really didn’t help much.

    Now that’s changed with the launch of the new SharePoint Products and Technology Community.

    Here’s what the old community site looked like:


    And here’s a new one:


    A vast improvement.

    The new community has a set of small components that offer dynamic content. This content is pulled from various places so for example you can see the most active discussions from the SharePoint newsgroups (with links to that topic in the web based newsreader), the latest blogs, and links to all the SharePoint MVP profiles.

    Consider this your starting place to find SharePoint information in the future and check it out here.

  • SharePoint Forums and Common code

    Just a quick note that testing is going well by everyone and there are a few small things I’m fixing along the way. I’ll be doing the public release for next Monday (May 15) which gives me time to fixup any last minute problems and put things together in a nice installer for you guys and some much needed documentation. They’ll be a site setup just for the forums web part that will provide online documentation, a wiki, a place for you guys to submit bugs, etc. but this isn’t ready yet (but you’re going to love it when you see it).

    Also with the release of the forum web part is the release of a library that I’ve been building for awhile. It’s a common library with a set of classes, routines, etc. that you can use in your own web parts or SharePoint projects. It gets installed to the GAC with the forums and will be used in other projects I have coming soon. I’m hoping that the common library grows and provides some useful things for your projects. API documentation will be provided with this along with source code when the forums source code is released.

  • Looking for ChalkTalk ideas at TechEd 2006

    Hey guys, I’m going to be at the Office DevTrack area for most of TechEd 2006 next month (June) hanging out, talking, and generally telling you whatever you want to hear about SharePoint 2007. While we’re there, there are sometimes scheduled Chalk Talks. Chalk Talks are short sessions (no more than 20 minutes) with you, me, a few of your friends, and a whiteboard (or flipchart). We can discuss architecture, implementation, development, whatever. Just something short and focused and fun.

    I’m looking for some ideas on hosting a Chalk Talk or two while I’m there so if you’re interested in getting into something, email me (or leave a comment here) on something you’re interested in and I’ll see if I can schedule it in. I can’t promise we’ll get it slotted as there are only so many spots available, but if something interests you about Microsoft Office SharePoint 2007 (or 2003 for that matter, but we would prefer to talk about 2007) then now’s your chance to ring in.

    I’m also hosting a BOF session so that will cover talking about what to prepare for as a developer, but I’m open to anything in the Chalk Talk area (as long as it’s Office/SharePoint related). Also note that we haven’t confirmed the schedule of when we (the Office track guys, myself and AC and a couple of others) will be in the lounge but once it’s confirmed we’ll let you know when to avoid the area.



  • Lost another camera

    I have the worst luck with cameras. On my trip to PDC last year, I lost my digital camera somewhere between the airport and my hotel going in. On Sunday I lost the replacement camera I bought down in L.A. (a Olympus C60, 6MP nice camera) on the way from the Vancouver airport to home.

    Oh well, guess it's off to buy another one. Any suggestions? I'm very happy with Olympus but willing to take a look at something else.

  • SharePoint Forums off to testing

    Whew. Finally. The forums have been sent off to the testers. I’ll be doing a few final changes this week while they have it for the public release later this week. Source code will be available in the near future, but watch for a special announcement about that (yes, the source will still be available). Here are some shots of the finished product that you’ll be getting soon.

    Multiple forums with categorization (setup to mimic some of the ASP.NET forums)


    Admin screen for managing forums, categories, and permissions


  • Removing static calls in your Repositories

    I was putting together some code this morning for a demo and saw that my Repositories started to look a little wonky. I wasn't happy with the fact that I had static methods on all of them because this would make for testing difficult. After posting the question to the DDD mailing list, a couple of good ideas came up that I implemented in my solution.

    A Repository is a class that represents all objects of a certain type. It's basically a collection (sometimes an in-memory version of a database) but with querying capabilities. The machinery behind how it stores or retrieves them from whatever persistance layer is hidden from the client as it only deals with domain types.

    So in our client we would access the repository like so:

       48 public class MyClient

       49 {

       50     public void LoadCustomerList()

       51     {

       52         CustomerCollection coll = CustomerRepository.GetAll();

       53         DataGrid grid = new DataGrid();

       54         grid.DataSource = coll;

       55         grid.DataBind();

       56     }

       57 }

    Our client (say a web app but could be anything) needs to display a list of all the customers. It talks to the repository to retrieve that information (in the form of a CustomerCollection object, derived from CollectionBase). This removes the implementation of how a repository retrieves the data request from and we can work with domain objects.

    If you're going across multiple tiers, you might return a CustomerCollectionDto, an ArrayList, an Array of Dtos, or whatever you need but for the purpose of this example we're getting a collection of domain objects.

    As I started out, my repository looked like this:

       59 public class CustomerRepository

       60 {

       61     public static Customer GetById(int id)

       62     {

       63         CustomerDao dao = new CustomerDao();

       64         Customer obj = dao.FindById(id);

       65         return obj;

       66     }

       67 }

    This was typical and would provide me with a way to access whatever persistance layer I implemented in order to reconstitute my domain objects (in this case, as Customer). I started to add more methods but things started to smell.

       31 public class CustomerRepository

       32 {

       33     public static CustomerCollection GetAll()

       34     {

       35         CustomerDao dao = new CustomerDao();

       36         CustomerCollection coll = dao.GetAll();

       37         return coll;

       38     }


       40     public static Customer GetById(int id)

       41     {

       42         CustomerDao dao = new CustomerDao();

       43         Customer obj = dao.FindById(id);

       44         return obj;

       45     }

       46 }

    Now I've got duplication of my calls to my DAO as well as these static methods that are looking a little ugly. I could remove the code duplication by declaring the DAO in the class, but the methods are static so it would have to be static too. Also this is just plain difficult to test because I don't necessarily want to implement a full blown DAL just to test my repository.

    Enter the Registry pattern to the rescue. This is a class that acts as a gateway or controller class to all of your repositories (or whatever object you need to talk to). You create static accessors to the inner repositories, but the nice thing is we can use an interface to our repository which allows us to build any kind of registry so we can create some mock test objects without having to drag along extra infrastructure.

    Okay, we'll get our registry class started with some .NET plumbing:

       69 public class RepositoryRegistry

       70 {

       71     private static readonly RepositoryRegistry instance = new RepositoryRegistry();


       73     static RepositoryRegistry()

       74     {

       75     }


       77     protected RepositoryRegistry()

       78     {

       79     }


       81     private static RepositoryRegistry GetInstance()

       82     {

       83         return instance;

       84     }

       85 }

    Now we've got the beginning of our registry. The static instance variable is how we'll access it (as a singleton) and is set to readonly so it can only be created at startup. A private GetInstance() method allows us to access this as well as a static constructure to keep .NET happy.

    With the repository created, now we can add our CustomerRepository. This is done by a) creating a public property to access it and b) creating a protected method to instantiate it.

       69 public class RepositoryRegistry

       70 {

       71     protected CustomerRepository GetCustomerRepository()

       72     {

       73         return new CustomerRepository();

       74     }


       76     public static CustomerRepository CustomerRepository

       77     {

       78         get { return GetInstance().GetCustomerRepository(); }

       79     }

       80 }

    So the property is exposed publically and static (so we can call it from our client) but the implementation of the creation is done in the GetCustomerRepository method. This method is marked as protected so we can subclass the RepositoryRegistry and create say a MockRepositoryRegistry. Then we only have to implement (override) the GetCustomerRepository method and return whatever a CustomerRepository whatever way we want.

    Now we have two changes to make this work. First, we have to remove the static calls on our CustomerRepository because we don't need them anymore. Second we have to change our client call to get the collection of customers. Since we're removing the static calls in our Repository, we can remove the duplicate code to the DAL now and clean things up a little. Here's the updated CustomerRepository:

       31 public class CustomerRepository

       32 {

       33     private CustomerDao dao = new CustomerDao();


       35     public CustomerRepository()

       36     {

       37     }


       39     public CustomerCollection GetAll()

       40     {

       41         CustomerCollection coll = dao.GetAll();

       42         return coll;

       43     }


       45     public Customer GetById(int id)

       46     {

       47         Customer obj = dao.FindById(id);

       48         return obj;

       49     }

       50 }

    And now we can talk to the Registry class via our Client. Note that we're calling a static property on the class (CustomerRepository) but it's being created internally by the Registry class. So our new client code looks like this (only the call to get the collection has changed):

       86 public class MyClient

       87 {

       88     public void LoadCustomerList()

       89     {

       90         CustomerCollection coll = RepositoryRegistry.CustomerRepository.GetAll();

       91         DataGrid grid = new DataGrid();

       92         grid.DataSource = coll;

       93         grid.DataBind();

       94     }

       95 }

    Nice. So we still have a single call in our client (which is nice and readable) but we're getting rich objects returned from our domain and we don't need to know how the Registry is getting us the objects (or how the underlying Repository is either). This is a good way to remove statics from your repositories and keep your domain clean from persistence. It also gives you the flexibility to build any kind of implementation for testing.

    Other things you can do here is to build a repository interface and have it returned rather than the concrete class and maybe do something better through calling your persistance layer, but you get the idea.

    Many thanks to Ramon Leon, Greg Young, Stephen Molitor, Roger Stasko, and Steve Eichert for contributing to this as they really did the heavy lifting. I just did the grunt work to show you what it would look like in .NET.


    EDIT: Greg Young summed things up very nicely on his blog post recently that I missed (thanks Greg!):

    "The starting point to using repositories effectively in a domain is the creation of abstract contracts for the repositories. These abstract contracts should be the only publicly visible forms of our repositories. Internally we only use the abstract contracts to refer to our repositories and in many cases we also allow such things as dependency injection of repositories into our domain, we will generally use either a service locator or a static accessor to an instance. We also at this point create our first unit tests to test the abstract contract of a repository; we can at a later point use these unit tests as integration tests with a repository that is hooked to a real database."

  • Off for the weekend

    It’s 2:15 AM and there’s something not right.

    So I have to delay the test release to the small group out there until I get back from a brief getaway in Vancouver this weekend. I’m bringing my laptop with me, but not sure how much time I’ll have to get at it, if at all (hey, it is a vacation after all). In any case, I’ll get it fixed (I think I know what I screwed up, assuming I haven’t lost all my brain cells in the last few hours of the night) and get it ready for Monday when I get back.

    Have a great weekend and don’t run over any chipmunks, they’re just so damn cute.

  • Blame Scott Hanselman

    If there’s on person on this dilapidated planet that will cause my ADD to kick into high gear, it’s Scott Hanselman. He always comes up with the coolest links, toys, and little things about .NET that make you go Hmmmm...

    He and I share a love affair with a tool (yeah, that’s pretty silly when you read it, so take it in and have a drink or two). He hooked me onto it with this podcast on his Hanselminutes show about it, and I’ve been awe-struck ever since my head blew off (about 10 minutes into the podcast, during which time I downloaded the “toy” shell and gave it a whirl with the commands he was piping out).

    Anyways, for your Monad fans (I flat out refuse to call it PowerShell, what a stupid name. Sounds like some weekend project on Tucows or something) Scott brings a great tip (and .INF file) for adding the “PowerShell Prompt Here” command to your right-click menu in Explorer. Check out the tip and grab the file from here.

    Now if I can just get it to work with FAR Manager (another tool I’m in love with now, after ditching Midnight Commander, again... courtesy of Scott and this blog).

  • Stupid SharePoint Tricks #32,174 - Alt+S to save forms

    Do you get annoyed by entering a form (maybe a long one) in SharePoint and have to scroll back up to the top to find that crazy “Save and Close” icon? Okay, in SharePoint 2007 it’s improved as they’ve now put the “Save and Close” icon at the both the top and bottom of the form (which is an improvement) but it’s still a PITA. Here’s a shortcut you can use.

    Fill out your form. When you’re ready to save, hit Alt+S then Enter. Voila. Saved. Magic.

    This is all courtesy of, your friend and mine, ACCESSKEY. ACCESSKEY is an HTML attribute you can add to tags (like forms) to provide keyboard access. This was mainly added to the HTML 4.01 specification for accessibility, but comes in handy for those of us that are hotkey junkies. A good description of ACCESSKEY and its use can be found here.

    This tip brought to you by the letters “W” and “C” and the number “3”.

  • Deleting Windows OneCare Backup Files

    I gave it a shot. I tried it out. I thought, hey, it’s Microsoft so it’s gotta be good right?

    Windows OneCare is a comprehensive PC Care service that helps protect and maintain your computer with antivirus, firewall, antispyware, PC performance tuneups, and file backup and restore functionality. It’s aimed at the home user to provide a service (like Windows/Microsoft Update) that’s always on, always up to date, and always avaialble. Not a bad idea.

    So I gave it a whirl, but after balloon messages appearing every 15 minutes telling me my system was safe, and processes launching in the middle of important stuff I was doing (no, not just surfing for pr0n) I just gave up. I’m much happier with a copy of Trend Micro PC-illin, manual scans, and me controlling my system. OneCare isn’t bad, but it’s not for me. Maybe it’s good for grandma who keeps asking you why she should click on Start to shutdown her computer. For the rest of us, I’m going to have to say passola.

    However in the course of using it, I had done a backup to one of my external drives. After removing the OneCare infection from my system, I found that I couldn’t delete any of the backup files. WTF?

    I’m administrator. I’m root. I have absolute power.

    Apparently not.

    It seems OneCare backups will change the security on the folder so that only SYSTEM has write access. Everyone else, even administrators, only have read access. So quick fix. Right click on the folder, choose Security, and give yourself full control.

    Then hit delete.

    Simple, but really bugged the crap out of me. Almost as much as the product itself.

  • Thanks for the help!

    Thanks to everyone who responded to my testers for the SharePoint Forums Web Part. I have 10 lucky stiffs… errr, people now and will be getting them a copy for final testing. Sorry about the delays but it’s been an uphill battle sometimes. Of course SharePoint security didn’t co-operate with me the way I planned so that had to be scrapped and redone at the last minute. Never can plan for these things.

    As for schedule now, the testers will get a copy (sans documentation) in their hot little hands shortly. I’ll be doing some small fixes but mostly I’m away all weekend in Vancouver taking in the sun. On Monday I’ll sift through what the testers come up with and, if all goes well, put together a proper release for you the beginning of next week. Again, apologies for the delays but it’ll be worth the wait.

    Of course once that’s out the door, I still have SharePoint Builder to finish and get out to everyone (the projects never seem to end) and still will be getting the SharePointForge site up and running full steam, along with the other dozen or so little projects tucked away on my hard drive. Nothing like being the busiest guy on the planet.

  • A few good men (or women for that matter)

    No, the forum web part hasn’t been released yet. I need to do a quick test (aka within days) from a small set of willing volunteers. As I was working on multiple users and caching and crazy stuff like this appeared:

    Cache testing for SharePoint Forums Web Part

    It really wasn’t what I was after. I mean, there were 3 registered users on the forum and only 2 of them were online (me and me) so 15 was definitely out of the question. All has been well with things so far, but all of a sudden big, bad SharePoint came along and wrote into the ASP.NET cache object.

    How dare SharePoint!

    How dare they fill my cache with crazy stuff like search box IDs and page output cache. Didn’t they see me putting my user names in there? Why didn’t they just leave me alone?

    So I fixed this problem without too much effort but wanted to do a sanity check before millions of SharePoint installations out there tried things out for real.

    In any case, I want to run the web part through some quick tests with people who have a setup with a bunch of users to pound on it (a guy can only do so much in a single virtual machine with two browsers). What I need is a quick test where you’ll install the web part in whatever environment you want and throw as few or as many people as you want at it, and let me know what the results are.

    Rules of engagement for this test:

    • You can put the web part on as many sites, areas, etc. as you like (it will create it’s own internal lists as needed and hide them) but please don’t use this for “production” or “real” data
    • Please do no provide “feature” feedback right now as I’m already swamped as it is. If you do want to jot ideas down and send me a note later I’ll add it to the wish list for future changes.
    • There is no support on this test but I will listen to any feedback you have and what you have to say. Again, it’s crunch time and I’m interested in getting a good first release out but can’t spend weeks distracted with one-on-one support.
    • The software will be provided as a “raw” install (i.e. no installer). Copy the dll into your bin directory, add an entry to your SafeControls section in web.config and upload the .dwp file. You’ll be responsible for removing things after the test (including lists and data).
    • You may not place this on a SharePoint site that is externally facing to the general public.
    • If you can’t commit to testing it in the short period available (e.g. you won’t get to it until next week because of other commitments) then please don’t ask for a copy. I only want people that can dedicate the time now so we can do a public release asap.
    • There are no guarantees that this is going to work in your environment. I’ve tested it out in various “known” configurations, but you might have some crazy setup that I’ve never seen before. If it doesn’t work, we’ll see about how to get it going and what makes your environment unique, but it may take a few days to get to you.

    NOTE: there are several “features” that will be turned off (like NNTP synchronization) that I’m either still working on or deferring to a later release. This test is going to be a bare bones release and not meant to be used past the test period.

    So if you’re up to the challenge, please email me with your name and I’ll send you off a copy. I’m limiting this to 10 people because I don’t want to try to get into following up with dozens of nameless faces out there. Testing will start when I get the 10 and end about 2–3 days later (if that).

    First come, first served.


  • TechEdConnect Updated

    Leverage Software, the guys that put together the TechEdConnect application, have updated the site with some new, must needed features. The display of groups you’re in is much improved and shows the members of the group (well, duh) which I thought should have been there in the first place. Couldn’t tell who was in the group, even if you managed it. They also improved some search capabilties but I can’t tell what’s changed there (although you can search for a person by name, which I don’t think was there before).

    Again, if you’re heading to TechEd you should get hooked up on TechEdConnect and doing that collaboration thing with people with similar interests. The MVP group (for all you MVPs going) is up to a whopping 9 members and I know there are more of us. At least with only 9 people it’ll be easy to find a place for dinner.

    So check it out the updated TechEdConnect, get connected, and look me up while you’re at it.

  • Calgary Code Camp this month

    If you're a hard core developer in the Calgary area and are looking for a free lunch I have one.

    It’s called the Calgary Code Camp and takes place on Saturday, May 27 at the 5 Calgary Hotel Downtown Suites (yeah, it's an odd name). This is an all day workshop by developers for developers and we’ll be covering various .NET aspects (2.0) and .NET tools. All code, no static presentations or marketing fluff. It’s free and takes place on a Saturday so won’t cut into your business schedule but will cut into any family/social stuff (hence the hard core aspect, or those that want to kill a day hanging out with nerds).

    If you’re interested, check out the site at and you can register for the event. Sessions haven’t been firmed up yet but will be in the next couple of weeks. If you have any developer friends that might be interested, please feel free to pass the info along to them as well.