Friday, July 31, 2009
Software Estimation: Demystifying the Black Art
Tuesday, June 30, 2009
Completed SharePoint MCM Training Rotation 3
SharePoint MCM certification is the topmost technical certification in Microsoft Office SharePoint Server 2007. A little over a week ago I have completed the 3-week training in Redmond. I have yet to get my certification though as I have passed only some of the exams. Fortunately there are retakes available so my challenge is still on. The SharePoint MCM certification training course had 3 exams, each at the end of the corresponding week, plus there was a full-day qualification lab on the very last day.
Was the course useful? It was the most challenging training I have ever taken, it challenged my knowledge, time management skills and ability to keep up with 15 hour working days for 3 weeks. I was fortunate to meet with people who all were very solid SharePoint professionals already (we had 16 students in class), and learn from them. The course instructors were excellent, and also well-known names in SharePoint community. It was exciting to meet them in person with plenty of time for asking any level of depth of technical questions. Some of the course material was simply the best and hard to get anywhere else. Each student was provided with excellent hardware for doing labs. Most of us do not have that level of lab environment at work. And I definitely know much more about the product now, which by the way helps me being better prepared for working with its next version. Lastly, the exams were a challenge – I still have work to do there. So the experience was worth every dollar I’ve spent on it. I’d like to thank the organizers of the MCM training here, and especially James Petrosky who made this course a great experience for years to remember.
I would recommend my colleagues in SharePoint community to go to this course since even during the weak economy the best investment you can make is into your knowledge. You won’t go bankrupt because of this! Even, and especially if you are seasoned, you would be surprised by how much more there is to learn about the product.
Sunday, May 24, 2009
jQuery on my Home Page
For a while I thought of adding some animation to my home page and so finally I got to doing it with help of scrollable jQuery plugin from flowplayer.org. It is really easy compared with old reusable JavaScript components – standard indeed matters, plus great documentation on this particular plug-in made its integration very simple. Aside from some minor CSS work I had to add just a few lines of scripting code to make it all work:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script src="styles/jquery.scrollable-1.0.2.min.js"></script>
<script language="javascript" type="text/javascript">
$(document).ready(function()
{
$("div.scrollable").scrollable({ size: 3 });
});
function moveNext()
{
$("div.scrollable").scrollable().next();
}
function movePrev()
{
$("div.scrollable").scrollable().prev();
}
</script>
Thursday, April 30, 2009
Debugging SharePoint Timer Jobs
When working on a SharePoint project recently I was faced with complexities related to development of SharePoint timer jobs, or more precisely – ones related to ensuring their proper quality. Indeed the timer jobs are not trivial when it gets to their debugging. Below is my approach to dealing with the issue:
1. First things first – you need to install your timer job, likely using a custom feature receiver. I am quoting Andrew Connell again, he has an excellent post describing the details.
2. You want to be able to start your timer job explicitly during testing (SharePoint does not let you do this other than through the API). There are two obstacles here:
- firstly you need the harness code to invoke the API,
- secondly you need to impersonate the identity of the Timer Service when invoking the API.
I have chosen to “abuse” the Unit Testing infrastructure given to me by Visual Studio to host my harness logic. You can either do the same or write a console application for this purpose. My unit test thus looked as follows:
[TestClass]
public class TimerJobsTest
{
private Impersonator impersonator;
private SPSite site;
public TimerJobsTest()
{
impersonator = new Impersonator();
}
[TestInitialize]
public void Initialize()
{
using (SecureString securePassword = new SecureString())
{
// Omitted setting secure password and
// retrieval of other variables for brevity.
securePassword.MakeReadOnly();
impersonator.ImpersonateUser(
adminUserName,
adminDomain,
securePassword);
}
site = new SPSite(siteUrl);
}
[TestMethod]
public void TestJob()
{
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
{
if (job.Title.Equals(
"My Job Title",
StringComparison.OrdinalIgnoreCase))
{
job.Execute(site.ContentDatabase.Id);
break;
}
}
}
[TestCleanup]
public void CleanUp()
{
site.Dispose();
impersonator.StopImpersonating();
impersonator.Dispose();
}
}As you see I was using an Impersonator class, which allowed me to control the user identity when invoking my job. This is a custom class I wrote for this and similar situations. You can get its source code here. It is far from being a rocket science (and it shouldn’t be) as it is using the old common Win32 impersonation API. Yet one thing about it is interesting: using SecureString type, something I was referring to in my earlier post. If you examine the code of Impersonator.cs, you could see how the managed SecureString is marshaled to the unmanaged code when the Win32 API is called. By the way if you are ever using WPF PasswordBox control, it is capable of passing on a SecureString containing password as of .NET Framework 3.5 SP1; then my impersonator becomes really handy.True, you don’t need to be fancy when testing your own code. The Impersonator.cs is meant to be a reusable secure facility for impersonation so it adds some overhead. Feel free to change it if you do not intend to use it in production environment.
3. Once this is done, you set breakpoints, attach to the WSS Timer Service process and step through your job’s code as (I hope) you normally do.
Friday, April 17, 2009
Preparing for the SharePoint MCM Course
So I needed to measure the volume of preparation work. I've transferred the items to an Excel spreadsheet, added up video hours, and summed up all book pages together. As there is a lot of online content I printed it to PDF to estimate number of pages, and added them up as well. This was an approximation because there were lots of cross-links, but it nevertheless gave a good idea of the overall volume.
The resultant Excel table lists pages and applicable video hours for each item. Also it counts down remaining days before the course start and lets you adjust average number of hours you can spend on studying daily as well as your hourly reading rate. This way you can see whether you will make it with your reading on time, or if you need to free up more of your time. You can download the spreadsheet here.
Monday, March 16, 2009
I am Accepted to MCM SharePoint 2007 Course
Tuesday, February 3, 2009
Framework Design Guidelines
The book provides a comprehensive overview of best practices for design of reusable components, most of which should be familiar to a good developer working with .NET for some time. Even though the advice in the book is based on the experiences of .NET Framework implemnentation, which is targetting millions of people, it is perfectly well applicable for smaller frameworks. If you have enjoyed books like Code Complete by Steve McConnell or Jeffrey Richter's Applied .NET Framework, you will like this one too. Check this book out!