<?xml version="1.0" encoding="ISO-8859-1"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en-US">
	<title>timjroberts.com</title>
	<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php" />
	<modified>2010-03-10T13:22:20Z</modified>
	<author>
		<name>Tim J. Roberts</name>
	</author>
	<copyright>Copyright 2010, Tim J. Roberts</copyright>
	<generator url="http://www.sourceforge.net/projects/sphpblog" version="0.4.8">SPHPBLOG</generator>
	<entry>
		<title>Windows Azure Open Space Coding Day</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry100227-213843" />
		<content type="text/html" mode="escaped"><![CDATA[<i>Wow, has it really been another year since my last blog post?</i><br /><br />I travelled up to <a href="http://www.bsp-a.com/" target="_blank" >Birmingham Science Park</a> today and attended my first Open Space Coding Day, with the focus of the day being on <a href="http://msdn.microsoft.com/en-gb/ee514245.aspx" target="_blank" >Windows Azure</a>. The format of the day was a new experience and completely different to what I have typically found at user-group sessions or a training course. The aim of the day is for everyone to learn <i>from each other</i>, rather than sitting through a rehearsed presentation of slides and demo code. Essentially, once the attendees have suggested, voted and scheduled a collection of topics for the day, they split up into groups who then collectively research that topic, or undertake a hands-on coding exercise together.<br /><br />In all, there were around 40 attendees, and I think that with exception to a few, most of us were all Azure newbies. Microsoft was well represented, and in particular <a href="http://geekswithblogs.net/iupdateable/Default.aspx" target="_blank" >Eric Nelson</a> and <a href="http://blogs.msdn.com/david_gristwood/" target="_blank" >David Gristwood</a> were available throughout the day to help out with the groups, and for answering everyone’s questions.<br /><br />SQL Azure appeared to be the most popular topic, but for my part I wanted to remain more focused on the compute aspects of Azure. After deploying my first WebRole into the cloud (via the free service instances that were arranged for the attendees by Microsoft), I started developing a Distributed Grep solution made up of Worker Roles, WCF services and Queues. Obviously I hadn’t completed this by the end of the day  – after all, I was there to learn, but I am planning on finishing this little pet-project, and I’ll hopefully contribute the code to the <a href="http://code.google.com/p/openspacecode/" target="_blank" >OpenSpaceCode Repository</a> as soon as I can. In the meantime I’ll be frequently checking out the <a href="http://ukazure.ning.com/" target="_blank" >UK Azure Platform online-community</a> (available on Ning) for future events, and to keep up to date with what others are learning and discovering and what they are building on the Azure platform.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry100227-213843</id>
		<issued>2010-02-27T00:00:00Z</issued>
		<modified>2010-02-27T00:00:00Z</modified>
	</entry>
	<entry>
		<title>45+ new jQuery techniques for good user-experience</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry090119-195854" />
		<content type="text/html" mode="escaped"><![CDATA[If you’re using <a href="http://jquery.com" target="_blank" >jQuery</a> and want to improve the user-experience on your website, then take some time over a coffee and read <a href="http://www.smashingmagazine.com/2009/01/15/45-new-jquery-techniques-for-a-good-user-experience" target="_blank" >this article</a>.<br /><br />It outlines more than 45 jQuery based solutions to improving website user-experience, including iPod style drilldown menus, Facebook like dynamic input, context menus, pagination, and light-box techniques.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry090119-195854</id>
		<issued>2009-01-19T00:00:00Z</issued>
		<modified>2009-01-19T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Sustaining capacity in maturing Agile teams</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry080825-115924" />
		<content type="text/html" mode="escaped"><![CDATA[<a href="http://blog.scottbellware.com/" target="_blank" >Scott Bellware</a> has written some recent posts on how agile teams sustain capacity as they mature their process.<br /><br />The posts can be found on his blog (<i>permalinks and content abstracts below</i>):<br /><br /><a href="http://blog.scottbellware.com/2008/07/sustaining-capacity-in-maturing-agile.html" target="_blank" > Sustaining Capacity in Maturing Agile Software Teams – Part 1: Nothing Fails Like Success</a><br /><br />We all know that following an Agile process as it is prescribed will only take us so far, eventually we’ll have to make changes. When we do begin to make changes we need to understand why. The principal reason for changing elements of the process should be to remove <i>constraints</i> that limit the team’s performance. As the teams’s performance increases new constraints will appear that are proportionate to that performance. Without reaction to these appearing constraints, obstructions will occur causing the team to lose its ability to perform at the new levels of expectations. Scott refers to this as <i>entropy</i>.<br /><br /><a href="http://blog.scottbellware.com/2008/07/sustaining-capacity-in-maturing-agile_10.html" target="_blank" > Sustaining Capacity in Maturing Agile Software Teams – Part 2: Entropy</a><br /><br />Talks about some of the natural constraints that come out of software development. For example, design rigidity, which is where a design hasn’t been optimized to easily support change.<br /><br /><a href="http://blog.scottbellware.com/2008/07/sustaining-capacity-in-maturing-agile_11.html" target="_blank" > Sustaining Capacity in Maturing Agile Software Teams – Part 3: Recognizing Entropy </a><br /><br />How to identify entropy and when to act upon it. Acting too early might mean that the team hasn’t enough context to understand the source of the constraints. Quite often constraints appear in code, which is a core means of communication for an agile team.<br /><br /><a href="http://blog.scottbellware.com/2008/07/sustaining-capacity-in-maturing-agile_14.html" target="_blank" > Sustaining Capacity in Maturing Agile Software Teams – Part 4: Counter Measures </a><br /><br />Identifies some of Scott’s <i>counter measures</i> in dealing with constraints. In short, the environment in which Developers work should foster a learning culture that directly supports continuous improvement. With this in place the team will learn to identify constraints, and then how to counter act them. There are also a few suggested technical practices such as writing Soluble Code, Test-Driven Development and Design Improvement.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry080825-115924</id>
		<issued>2008-08-25T00:00:00Z</issued>
		<modified>2008-08-25T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Mock-you... this is how I mock!</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry080821-215611" />
		<content type="text/html" mode="escaped"><![CDATA[Mocking Frameworks are becoming more prominent in our development activities as unit testing, and hopefully test driven development, become much more mainstream. Like most technical topics, the choice of Mocking Framework can lead to long  debates. I’ve been involved in these debates myself, and a fairly recent <a href="http://haacked.com" target="_blank" >Phil Haack</a> post that <a href="http://haacked.com/archive/2008/03/23/comparing-moq-to-rhino-mocks.aspx" target="_blank" >compares Rhino Mocks to Moq</a> sums up these typical discussions.<br /><br />Like Phil (and I would suspect most other Developers), I too have only recently discovered <a href="http://code.google.com/p/moq" target="_blank" >Moq</a> (pronounced “mock-you”), and I’ve started to favour it over <a href="http://www.ayende.com/projects/rhino-mocks.aspx" target="_blank" >Rhino Mocks</a>. Expectations are much more easily set up, and playback is more implicit. This simply suits my style and I also like the use of lambda’s in setting up the expectations. Perhaps my style makes me a <a href="http://martinfowler.com/articles/mocksArentStubs.html#SoShouldIBeAClassicistOrAMockist" target="_blank" >mockist</a>.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry080821-215611</id>
		<issued>2008-08-21T00:00:00Z</issued>
		<modified>2008-08-21T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Explicit or implicit interface implementation</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry080806-205516" />
		<content type="text/html" mode="escaped"><![CDATA[I accidentally came across this <a href="http://halfdans.net/index.py/102" target="_blank" >blog post</a> yesterday that discusses the use of explicit and implicit interface implementations in C#. I have to admit, although I’ve known about these two approaches of interface implementation, I’ve never really given them any serious thought. I normally implement interfaces <i>implicitly</i>:<br />
<PRE><SPAN style="COLOR: blue">public</SPAN> <SPAN style="COLOR: blue">interface</SPAN> IFoo
{
   <SPAN style="COLOR: blue">void</SPAN> Bar();
}

<SPAN style="COLOR: blue">public</SPAN> <SPAN style="COLOR: blue">class</SPAN> Foo : IFoo
{
   <SPAN style="COLOR: blue">public</SPAN> <SPAN style="COLOR: blue">void</SPAN> Bar()
   {
      <SPAN style="COLOR: green">// implementation</SPAN>
   }
}</PRE>
<br />The <i>explicit</i> version basically requires that you qualify the method in the implementing type (<code>IFoo.Bar()</code>), and remove the access modifier (since it must be <code>public</code> as in the interface itself). So far the only changes are in the syntax, therefore the differences must manifest themselves during compilation:<br /><br />Given the explicit implementation of <code>IFoo</code>:<br />
<PRE><SPAN style="COLOR: blue">public</SPAN> <SPAN style="COLOR: blue">class</SPAN> Foo : IFoo
{
   <SPAN style="COLOR: blue">void</SPAN> IFoo.Bar()
   {
      <SPAN style="COLOR: green">// implementation</SPAN>
   }
}</PRE>
<br />you cannot directly invoke <code>Bar()</code> on a <code>Foo</code> object without first casting it to <code>IFoo</code>:<br />
<PRE>Foo f = <SPAN style="COLOR: blue">new</SPAN> Foo();
f.Bar(); <SPAN style="COLOR: green">// causes a compilation error</SPAN>

Foo f = <SPAN style="COLOR: blue">new</SPAN> Foo();
((IFoo)f).Bar(); <SPAN style="COLOR: green">// works fine</SPAN></PRE>
<br />In my opinion (coming from a C++ background), this is counter-intuitive. Since the <code>Bar()</code> method  is public I would like it to be callable without a cast. After all, there is nothing stopping me from performing the cast in order to call the method, so why does the compiler force you through the hoops?<br /><br /><a href="http://blogs.msdn.com/brada/archive/2003/11/15/50721.aspx" target="_blank" >Brad Adams</a> has some interesting thoughts on explicit interface implementations and where they should be used. In brief, he recommends their usage for hiding implementation details (i.e., the interface is typically only used internally), therefore approximating a private interface implementation. As I already mentioned, you can still directly call the methods through a cast, but the methods are effectively hidden from public view. Given this, I would generally think of explicit interface implementation as an <a href="http://www.timjroberts.com/index.php?entry=entry070530-195620" >implementation pattern</a>, and I feel safe continuing to implement interfaces implicitly.<br /><br />One final thought: if you use explicit interface implementation on a value type (i.e., on a <code>struct</code>), there will be a boxing performance penalty when you call any of the implemented methods.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry080806-205516</id>
		<issued>2008-08-06T00:00:00Z</issued>
		<modified>2008-08-06T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Design for Test</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry080805-082140" />
		<content type="text/html" mode="escaped"><![CDATA[As Developers we have quickly learnt how important unit testing is. Moreover we have also learnt, sometimes through hard lessons, that to implement unit tests we need to design and build our code so that it is actually testable. In my mind, this is a benefit, since it forces us to think about the code we’re writing, and more often than not, a better design emerges from our efforts.<br /><br />We all know that one of the biggest advantages of unit testing is that it affords us confidence when making future changes. We know we’re going to make them, so let’s help ourselves when we do. Unit testing is also an important ally when refactoring code (especially if you also practice continuous refactoring – like all good Developers should). A good example of what I mean by “design for test” came about with the release of ASP.NET MVC Preview 3.<br /><br />Although based on a pattern which itself leads to increased testability (Model-View-Controller), prior to Preview 3 there were still some fiddly points that made testing controllers and their actions awkward. Actions were <code>void</code> which meant it was difficult to observe and test expectations about what the action did. With Preview 3 actions can now optionally return an <code>ActionResult</code> object, which is then executed later on in the rendering process by the MVC Framework. This refactoring increases the ability to unit test controllers and actions, and more importantly, it makes writing those tests easier since there is less of a requirement to mock. This is a good example of “design for test”.<br />]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry080805-082140</id>
		<issued>2008-08-05T00:00:00Z</issued>
		<modified>2008-08-05T00:00:00Z</modified>
	</entry>
	<entry>
		<title>“var”: a contentious little keyword</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry080724-140907" />
		<content type="text/html" mode="escaped"><![CDATA[It’s old news but most of us will know that C# 3.0 introduced a new keyword: var. This tiny keyword brings with it a great deal of power behind the scenes, most of which was intended for use with another C# 3.0 language feature, namely LINQ. Simply put, what var does is tell the compiler to <i>infer</i> the type being used rather than having it specified explicitly. <br /><br />You can appreciate this benefit when working with LINQ, since the type being returned from a query may not be known in advance. Consider anonymous types for example, and their use with LINQ projection where you cannot explicitly determine the result type. With this scenario you have to utilize the var keyword:<br />
<PRE><SPAN style="COLOR: blue">string</SPAN>[] words = {<SPAN style="COLOR: maroon">"AA"</SPAN>,<SPAN style="COLOR: maroon">"BB"</SPAN>, <SPAN style="COLOR: maroon">"Hello"</SPAN>, <SPAN style="COLOR: maroon">"World"</SPAN>, <SPAN style="COLOR: maroon">"CCC"</SPAN>, <SPAN style="COLOR: maroon">"DDDD"</SPAN>};

var result = 
  from s <SPAN style="COLOR: blue">in</SPAN> words 
  where s.Length >= <SPAN style="COLOR: maroon">5</SPAN>
  select <SPAN style="COLOR: blue">new</SPAN> { Word = s, Length = s.Length };</PRE>
<br />So, in the above example we’re returning instances of an anonymous type from a query that will contain two properties: Word, and Length. We have two options, either explicitly create a new type that defines those two properties, or use var. If we use a var declaration then we understand that those anonymously typed object instances can only be used locally. I have no problem at all with this use of var (since it is really what var was designed for). The same goes for anonymous types – they should only be used in the context of LINQ (unless they’re used for very localized purposes).<br /><br />What about the following query instead?<br />
<PRE><SPAN style="COLOR: blue">string</SPAN>[] words = {<SPAN style="COLOR: maroon">"AA"</SPAN>,<SPAN style="COLOR: maroon">"BB"</SPAN>, <SPAN style="COLOR: maroon">"Hello"</SPAN>, <SPAN style="COLOR: maroon">"World"</SPAN>, <SPAN style="COLOR: maroon">"CCC"</SPAN>, <SPAN style="COLOR: maroon">"DDDD"</SPAN>};

var result = 
  from s <SPAN style="COLOR: blue">in</SPAN> words 
  where s.Length >= <SPAN style="COLOR: maroon">5</SPAN>
  select s;
</PRE>
<br />To some this is acceptable, but to me it’s problematic. If we look at the line of code defining the query, we have no way of determining the type of the result variable other than to scan the lines of code above it (maybe you could call this <i>human inference</i>). Why would this be acceptable? Why would you want to have to <i>scan</i> code in order to determine a variable’s type?<br /><br />Instead, I would use the following query and be explicit about the type (after all, it’s not anonymous):<br />
<PRE>IEnumerable<<SPAN style="COLOR: blue">string</SPAN>> result = 
  from s <SPAN style="COLOR: blue">in</SPAN> words 
  where s.Length >= <SPAN style="COLOR: maroon">5</SPAN>
  select s;</PRE>
<br />Now it’s easy to see what the query is projecting (a collection of strings). It might be a few more characters to type, but it is much more readable by myself and my fellow Developers.<br /><br />In short, I think that the over use of var can easily lead to unreadable code, and that as Developers, we owe it to ourselves to keep our code readable. One use of var outside the context of LINQ that I really like is shown below:<br /><br /><code>var hashtable = new Hashtable&lt;int, List&lt;MyClass&gt;&gt;();</code><br /><br />You can still easily determine the type of the hashtable variable from the same line of code, and you’ve saved yourself from typing the type-name twice. <br /><br />Another example of var laziness is shown below:<br />
<PRE><SPAN style="COLOR: blue">foreach</SPAN> (var word <SPAN style="COLOR: blue">in</SPAN> words)
{
  word.??
}
</PRE>
<br />Reliance on Intellisence is simply not an answer. <br />]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry080724-140907</id>
		<issued>2008-07-24T00:00:00Z</issued>
		<modified>2008-07-24T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Six months later...</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry080715-193223" />
		<content type="text/html" mode="escaped"><![CDATA[Well it&#039;s been six months since I last posted an entry, so let me begin by reassuring my readership (<i>all two of them</i>), that I have not been hit by a bus or anything like that. Things have been really busy since I started in my current role, and I just haven&#039;t found the time to post any new entries. It&#039;s a shame too since my unique visitor count was growing steadily as I posted, but obviously those figures have now since dropped off. The lesson to learn from this is that if you plan to setup a blog - post to it!<br /><br />So what has taken up all my time? Well, those who are connected via LinkedIn can see that I started a new role at <a href="http://www.confused.com" target="_blank" >Confused.com</a> back in January. This has been a fantastic (but busy), opportunity from a development and technology perspective since I&#039;m being exposed to the very latest Microsoft technologies, including the .NET 3.0/3.5 stack (including WCF and WF), and ASP.NET MVC (we&#039;re onto Preview 3 already). The most interesting aspect of my current role however, is my involvement with the adoption of Team System and Team Foundation Server.<br /><br />Confused.com is adopting <a href="http://www.scrumalliance.org" target="_blank" >Scrum</a> as an agile methodology, and we&#039;ve all been involved in slowly <a href="http://www.timjroberts.com/index.php?entry=entry071210-153526" target="_blank" >introducing agile</a> to the business. To support Scrum in Team System, I have developed an appropriate Process Template from the ground up. This was easily achieved using the Process Template Editor that is part of the Team System Power Toys. The principal reason for developing a custom Process Template, rather than using one of many free versions (such as <a href="http://www.scrumforteamsystem.com/en/default.aspx" target="_blank" >Conchango&#039;s Scrum for Team System</a>), is that we see integration opportunities with other processes and tools already being used within the organization. A custom Process Template will support these integration opportunities much more easily than trying to shoe-horn a third-party template.<br /><br />Included in the custom Process Template is a set of reports relating to the Sprint burn down and work remaining data. These were fairly easy to develop, however, I have accepted that I have a long way to go in learning SQL Server Reporting Services before I can consider myself an expert.<br /><br />More recently I have become responsible for the Configuration/Release Manager roles, and taken more responsibility for the project builds. Team Build is much better in TFS 2008 than it was in 2005. We have two dedicated Team Build agents running both our continuous integration and nightly builds. The nightly builds are automatically packaged into installers using <a href="http://wix.sourceforge.net/" target="_blank" >WiX</a>, and are then ready for deployment into our Development environment.<br /><br />A code-promotion branching strategy has been favored with three general branches: Production, Main and Development. Main is always stable and a clean build can always be produced ready for deployment into a QA environment. Production represents a copy of our current live environment and supports &quot;hot-fix&quot; (or quick-fix engineering) scenarios. Merges between Main and Production are typically always forward (unless a &quot;hot-fix&quot; has to be brought into the Main codeline from Production). Day-to-day work is committed into the Development branch (and we have branches off that to support individual teams). Merges between Development and Main are forward or reverse depending on what is being done. Team Leaders for example, can forward-integrate to bring their branch up-to-date with code committed into the Development branch by other teams.<br /><br />Generally my experience of using Team System and Team Foundation Server is positive. There are some quirky issues that I&#039;ve had to learn workarounds for and I&#039;ll try and discuss those in upcoming posts.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry080715-193223</id>
		<issued>2008-07-15T00:00:00Z</issued>
		<modified>2008-07-15T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Abstract Thinking in UML: the Russian Doll</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry080206-222003" />
		<content type="text/html" mode="escaped"><![CDATA[Within my current role, I am helping the client interview candidates for both Senior .NET Developer and Architect positions. As part of the interview process I ask the candidate a few quick-fire questions regarding .NET (dependent on the position that they have applied for), and then I ask them to model a Russian Doll using a UML class-diagram. <br /><br />For those who don’t know, a <a href="http://en.wikipedia.org/wiki/Matryoshka_doll" target="_blank" >Russian Doll</a> (or a Matryoshka Doll), is made up of many pieces that nest inside one another. The idea behind this simple modelling exercise is to allow the candidate to demonstrate both abstract thinking (by applying some form of object-oriented analysis), and their agile modelling capabilities. This is obviously a very important aspect if the candidate is to fit in an Agile team.<br /><br />Once the description of a Russian Doll is agreed upon, the candidate simply needs to begin modelling on the whiteboard. It is surprising how many candidates fail to apply an <i>analysis</i> process to the problem, or simply ask questions. I wouldn’t consider it a weakness if a candidate asks me to get the model started for them. Many have simply given up immediately.<br /><br />By far the simplest approach would be to analyse the nouns in the agreed description (i.e., a “doll” made up of many “pieces”). That gives us two candidate classes. Then we need to think about how the pieces nest inside one another, and also how we can represent the fact that a piece is the last piece in the set making up the doll.<br /><br />I am sure that there are several ways in which this exercise can be modelled, but my model answer is shown below:<br /><br /><img src="images/RussianDollUML.PNG" width="326" height="172" border="0" alt="" /><br /><br />All design is subjective, but my model answer has two qualities (which hopefully would also be represented in the candidate’s design).  First, it distinguishes between two distinct piece types (one hollow and one solid), and secondly, how these pieces can be arranged using the <a href="http://en.wikipedia.org/wiki/Composite_pattern" target="_blank" >Composite</a> design-pattern to form a doll that is made up of several hollow pieces, with a solid piece being the terminating condition for the overall structure. The use of the Composite design-pattern also prevents us from having a structure that has a solid piece that is the container for other pieces, since clearly it is collaborating in the <i>leaf</i> role.<br /><br />So far, one or two candidates have actually questioned the validity of the association between <code>HollowPiece</code> and <code>Piece</code> (its base). I am hoping however, that this is down to inexperience with UML, since I feel that Composite is one of the most commonly used design-patterns (regardless of whether a candidate knows they are using it in their code or not).<br /><br />I would be interested to hear any thoughts on this modelling exercise, especially as part of an interview process. I would also welcome any comments on my model answer too.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry080206-222003</id>
		<issued>2008-02-06T00:00:00Z</issued>
		<modified>2008-02-06T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Setting up Team Foundation User Permissions</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry080119-124630" />
		<content type="text/html" mode="escaped"><![CDATA[So you&#039;ve installed Team Foundation Server and now you need to setup your permissions. There&#039;s quite a lot to follow in the TFS Installation Guide, so if you&#039;re using Active Directory, here&#039;s a digest of how I&#039;ve recently defined permissions on a single-server deployment (<i>this should work with both 2005 and 2008</i>):<br /><br />First, we have to remember that there are three areas where permissions have to be managed. TFS itself, SharePoint Services, and SQL Server Reporting Services. As far as I can tell, SQL Server Reporting Services appear to be the least secure of the three. When a user is assigned a Role Assignment it is <i>not</i> in relation to any particular Team Project.<br /><br />There are also four distinct role types that we have to consider when thinking about permissions (summarized below): <br /><br />
<ul>
<li>TFS administrators are those users who create Team Projects</li>
<li>TFS project administrators are those users who manage Team Projects</li>
<li>Everyone else is either a Contributor or a Reader</li>
</ul>
 The approach that I have taken (obviously working in conjunction with an Active Directory Administrator), is to define two Active Directory domain groups called TFSAdministrators and TFSProjectAdministrators. TFSAdministrators is added to the SharePoint Administration Group (or the Farm Administration Group in SharePoint 2007). It is also added as a System Administrator for the site-wide security settings in SQL Server Reporting Services. Basically any user added to this group will then have the appropriate permissions to create Team Project Portals and Reports in both SharePoint and SQL Server Reporting Services.<br /><br />The second group (TFSProjectAdministrators), gives Team Project Administrators the Content Manager Role Assignment within SQL Server Reporting Services. Finally, to support the Contributor and the Reader roles, we define a new Browser Role Assignment within SQL Sever Reporting Services for the Domain Users group (i.e., the group to which everyone on the Domain in a member).<br /><br />The combination of these two Active Directory groups and their permissions within SharePoint and SQL Server Reporting Services, effectively means that there is no longer a need to manually add users to the appropriate Role Assignment in SQL Server Reporting Services. Instead, a user can be added to their appropriate Active Directory group. Since permissions in SQL Server Reporting Services are not relative to a Team Project, this makes things much more intuitive going forward. In fact, it is now possible to forget about SQL Server Reporting Services altogether, and instead focus on adding users to the Team Foundation Server groups (i.e., Team Foundation Administrators or [<i>project_name</i>]\Project Administrators), and then adding the user to an appropriate group in the Team Project Portal.<br /><br />I think that this provides a sensible and intuitive approach in managing user permissions within TFS. One change that I might consider is not adding the Domain Users group to the Browser Role Assignment in SQL Server Reporting Services, since this effectively gives every user in the Domain the ability to view <i>all</i> reports.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry080119-124630</id>
		<issued>2008-01-19T00:00:00Z</issued>
		<modified>2008-01-19T00:00:00Z</modified>
	</entry>
	<entry>
		<title>The Agile misconception as witnessed by Dilbert</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry071210-153526" />
		<content type="text/html" mode="escaped"><![CDATA[A common &quot;agile&quot; misconception reflected in a way that only <a href="http://dilbertblog.typepad.com" target="_blank" >Scott Adams</a> can:<br /><br /><img src="images/AgileDilbert.jpg" width="500" height="176" border="0" alt="" /><br /><br />(<i>isn&#039;t this all too familiar</i>?)]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry071210-153526</id>
		<issued>2007-12-10T00:00:00Z</issued>
		<modified>2007-12-10T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Introducing Partial Methods (that&amp;#039;s right... methods)</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry071123-162236" />
		<content type="text/html" mode="escaped"><![CDATA[Since the early betas, and now with the final RTM release of Visual Studio 2008, developers have the opportunity to begin exploring some new language features. Perhaps the most talked about language feature is LINQ (Language INtegrated Query), that provides a ubiquitous way in which to query data sources right from within the language itself, whether it be memory resident objects, XML, or relational data. There is however, one new language feature that has not been publicized that much: Partial Methods.<br /><br />By now, most developers will have encountered partial classes and seen their benefits. They provide a means by which code-generation can be easily implemented and managed. Authored code and generated code can exist side-by-side in separate files, and the compiler will perform the task of stitching everything together during compilation. The Form designer provides a good example of this separation in action. Thinking beyond the Form designer however, it is safe to assume that many of the motivations for partial classes was driven by Microsoft&#039;s Software Factory thinking. Code that is generated by a DSL for example, can be easily interwoven with code provided by the developer using the DSL. There is no longer the need to mark areas of a source-file as <i>protected</i> from the code-generator, as was often the case in the past. The value gained from partial classes is clear, but not immediately obvious for partial methods.<br /><br />Partial methods are made up of a method-declaration using the <code>partial</code> keyword, and an <i>optional</i> method-body. The method can accept parameters, including parameters modified with the <code>ref</code>, <code>this</code>, or <code>params</code> keyword. Methods must also be private and must return <code>void</code>, and more significantly, they can only be declared within a partial class. The following example demonstrates a partial method declaration (in bold).<br /><br /><code><br />public partial class Foo<br />{<br />   private int m_value;<br />	<br />   public static void Main()<br />   {<br />      m_value = 5;<br />		<br />      UpdateValue(SquareValue(m_value));<br />		<br />      Console.WriteLine(m_value);<br />   }<br />	<br />   <b>private partial void UpdateValue(int x);</b><br />	<br />   private static int SquareValue(int value)<br />   {<br />      return value * value;<br />   }<br />}<br /></code><br />If the partial method has no body, then the compiler will not emit any MSIL for the associated calls to that method (including any evaluation of the call parameters). In the above example <code>UpdateValue()</code> has no body, so the second statement in <code>Main()</code> will be removed (including the call to <code>SquareValue()</code>). The output for the above example  will be &quot;5&quot;. If we extend the partial class with the following code, and provide an implementation for the <code>UpdateValue()</code> method:<br /><code><br />public partial class Foo<br />{<br />   private partial void UpdateValue(int x)<br />   {<br />      m_value = x;<br />   }<br />}<br /></code><br />then all the code associated with calls to <code>UpdateValue()</code> will now be emitted. Since our implementation of <code>UpdateValue()</code> simply stores its input in the <code>m_value</code> field, the output will now be &quot;25&quot;, since the emitted code will also include the call to <code>SquareValue()</code>.<br /><br />I will be the first to admit that the above example is very convoluted. It does however, demonstrate how the compiler deals with partial method declarations and implementations. In short, if a partial method has no implementation then all reference to its existence is removed, including any evaluation of the parameters used to call it. Even though I now have an understanding of how to write partial methods, I still have difficulty in seeing where I would want to use them. I can only assume that since partial methods can only be declared within partial classes, they only offer value in code generation scenarios.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry071123-162236</id>
		<issued>2007-11-23T00:00:00Z</issued>
		<modified>2007-11-23T00:00:00Z</modified>
	</entry>
	<entry>
		<title>T4 Template Editor for Visual Studio 2005/8</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry071121-141942" />
		<content type="text/html" mode="escaped"><![CDATA[<a href="http://www.clariusconsulting.net" target="_blank" >Clarius</a> have released a new <a href="http://www.t4editor.net" target="_blank" >T4 Templating Transformation Toolkit</a> that provides a better experience when working with T4 templates. Although T4 templates are predominately used for Guidance Automation and DSL work, with the T4 components being included out of the box in Visual Studio 2008, it is likely that more and more developers will begin using them for their own code-generation work. Well worth taking a look.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry071121-141942</id>
		<issued>2007-11-21T00:00:00Z</issued>
		<modified>2007-11-21T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Had a think... time to re-think the adventure</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry071115-165117" />
		<content type="text/html" mode="escaped"><![CDATA[To all those who have subscribed to, or regularly read my blog (there&#039;s not many I know but one can hope):<br /> <br /><b>I have decided to abandon my attempt in building a Software Factory for 3-tier Enterprise solutions</b>. I have decided to do this because of two principal reasons: The adventure was always supposed to be about getting exposure to the tools used in building Software Factories. I have realized that the sheer size and scope of 3-tier Enterprise applications will most likely interfere with that focus. I had intended to try and <i>conceptualize</i> the underlying Enterprise Framework, but this will be very difficult to do, plus it would detract from the product-line paradigm.<br /> <br />One day I may also want to begin talking about and presenting material on what I have learnt during the adventure. This will typically be with my own clients, but as the topic becomes more prominent, I may also look into public speaking. Again, the size and scope of 3-tier Enterprise applications would make this much more difficult.<br /> <br />Despite this, <b>I am not abandoning my adventure with Software Factories</b>. Instead I am going to select a domain that is much smaller and self-contained, and continue the adventure with that. I already have a few ideas and I&#039;ll post more over the next few days. I hope that you will agree that by adopting a smaller domain, the focus will remain on the tools themselves, and more importantly, the value that they may bring to the process.<br /> <br />While pondering my decision, I came across the <a href="http://www.codeplex.com/nmvpfactory" target="_blank" >NMVP Enterprise Factory</a> that has been started on CodePlex. I will take a look at this project soon and possibly even try and contribute to it (if the project owner is willing). I will post more on that if it happens too.<br /><br /><i>Please note: I have removed some of the posts in the Software Factories category because they are no longer relevant.</i> I will continue to add information about my adventures with Software Factories to the same <a href="http://www.timjroberts.com/wiki/doku.php?id=softwarefactory:home" target="_blank" >area on the wiki</a>. I really hope you continue following my adventure, albeit a slighty new one.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry071115-165117</id>
		<issued>2007-11-15T00:00:00Z</issued>
		<modified>2007-11-15T00:00:00Z</modified>
	</entry>
	<entry>
		<title>How to add Guidance Automation recipes to arbitrary Visual Studio menus</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry071105-143220" />
		<content type="text/html" mode="escaped"><![CDATA[If you want to place a Guidance Automation recipe virtually anywhere within Visual Studio&#039;s menu structure, then here&#039;s a great tip for <a href="http://www.clariusconsulting.net/blogs/kzu/archive/2006/06/01/GATMenus.aspx" target="_blank" >finding those menu Guids and Id&#039;s</a>.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry071105-143220</id>
		<issued>2007-11-05T00:00:00Z</issued>
		<modified>2007-11-05T00:00:00Z</modified>
	</entry>
	<entry>
		<title>Articles on building and packaging Software Factories</title>
		<link rel="alternate" type="text/html" href="http://www.timjroberts.com/index.php?entry=entry071030-122922" />
		<content type="text/html" mode="escaped"><![CDATA[Jezz Santos has announced a mini-series of articles that will discuss the <a href="http://blogs.msdn.com/jezzsa/archive/2007/10/29/packaging-building-software-factories-series.aspx" target="_blank" > packaging and building</a> of Software Factories. The first <a href="http://msdn2.microsoft.com/en-us/library/bb880038.aspx" target="_blank" >article</a> discusses how the various assets of a Software Factory, such as the DSL&#039;s and Guidance Automation Packages, can be combined into a single MSI installer.]]></content>
		<id>http://www.timjroberts.com/index.php?entry=entry071030-122922</id>
		<issued>2007-10-30T00:00:00Z</issued>
		<modified>2007-10-30T00:00:00Z</modified>
	</entry>
</feed>

