<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-5937202</id><updated>2008-09-18T10:08:47.153+01:00</updated><title type='text'>Damian's Blog</title><subtitle type='html'>It's exactly what it says on the can.</subtitle><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5937202.post-7820484880119028538</id><published>2008-09-18T10:08:00.001+01:00</published><updated>2008-09-18T10:08:47.240+01:00</updated><title type='text'>Typesafe Reverse Reflection</title><content type='html'>&lt;p&gt;No, reverse reflection isn't a hall of mirrors. I'm talking about those instances where you need to specify the name of a property of an object which will get used by some component later on to access your object via reflection. Specifically, passing a white-list of property names to ASP.NET MVC's UpdateModel controller method. &lt;/p&gt;  &lt;p&gt;Specifying property names in this way has always bugged me. If you decide to change a property name, the compiler can't catch if for you and your program will silently start to fail. What we need, is a way to allow the compiler to catch this situation for you. &lt;/p&gt;  &lt;p&gt;The code below shows how this can be achieved for methods and members (properties and fields). &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public static class ObjectUtils     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static string GetMemberName&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T, object&amp;gt;&amp;gt; action)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var lambda = (LambdaExpression)action;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var unary = (UnaryExpression)lambda.Body;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var operand = unary.Operand;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ExpressionType.MemberAccess == operand.NodeType)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var memberExpr = (MemberExpression)operand;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return memberExpr.Member.Name;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (ExpressionType.Call == operand.NodeType)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var methodExpr = (MethodCallExpression)operand;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return methodExpr.Method.Name;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidOperationException();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}      &lt;br /&gt;public class Program      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int SomeInt { get; set; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int getSomeInt() { return SomeInt; }      &lt;br /&gt;static void Main()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string propName = ObjectUtils.GetMemberName&amp;lt;Program&amp;gt;(p =&amp;gt; p.SomeInt);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string funcName = ObjectUtils.GetMemberName&amp;lt;Program&amp;gt;(p =&amp;gt; p.getSomeInt());      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This could be useful in an ASP.NET MVC controller that made a call such as the following: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public interface Product     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int Id {get; set; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string Name {get; set; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; decimal UnitPrice {get; set; }      &lt;br /&gt;}      &lt;br /&gt;public class ProductController : Controller      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [AcceptVerbs(&amp;quot;POST&amp;quot;)]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public ActionResult Edit(int id, FormCollection fc)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var entity = dataContext.Products.Single(e =&amp;gt; e.Id == id);      &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;b&gt;UpdateModel(       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entity,        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new[] { &amp;quot;Name&amp;quot;, &amp;quot;UnitPrice&amp;quot; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/b&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // ...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //...      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As you can see, in the UpdateModel(...) call we are specifying the 'Name' and 'UnitPrice' properties using a string. Now, if we use GetMemberName method, we can have something that the compiler can understand: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160; UpdateModel(     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entity,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new[] {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ObjectUtils.GetMemberName&amp;lt;Product&amp;gt;(p =&amp;gt; p.Name),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ObjectUtils.GetMemberName&amp;lt;Product&amp;gt;(p =&amp;gt; p.UnitPrice),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; );&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;My biggest problem with this is that it's very verbose. What I'd really like to do is this: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160; UpdateModel(     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entity,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new[] {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entity.GetMemberName(e =&amp;gt; e.Name),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entity.GetMemberName(e =&amp;gt; e.UnitPrice),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; );&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;where entity somehow supplies the &amp;lt;Product&amp;gt; type. If anybody has any better ideas, please feel to comment.&lt;/p&gt;  </content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2008/09/typesafe-reverse-reflection.html' title='Typesafe Reverse Reflection'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=7820484880119028538' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/7820484880119028538'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/7820484880119028538'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-1910775527628223946</id><published>2007-10-22T23:29:00.002+01:00</published><updated>2008-08-06T10:00:50.241+01:00</updated><title type='text'>A New Leaf</title><content type='html'>&lt;p&gt;I started this blog &lt;strong&gt;years&lt;/strong&gt; ago as you can see by the dates of the previous posts. At the time, I didn't really 'get' blogging and I initially tried to use this blog as a way of having my bookmarks available on the web. If only I'd been a bit more pro-active, I might have beaten &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; at their own game! C'est la vie.&lt;/p&gt;  &lt;p&gt;I've decided to turn over a new leaf. I now use &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; for &lt;a href="http://del.icio.us/emq/"&gt;my online bookmarks&lt;/a&gt; so I can resurrect this blog as an actual blog. I don't intend to be prolific though; I want to keep the subject matter fairly constrained so it will mostly be technical with perhaps a few 'lifestyle' posts here and there. Hope you enjoy it.&lt;/p&gt; </content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2007/10/new-leaf_22.html' title='A New Leaf'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=1910775527628223946' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/1910775527628223946'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/1910775527628223946'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-4318037932982226252</id><published>2003-12-04T10:43:00.001Z</published><updated>2008-08-06T10:00:50.242+01:00</updated><title type='text'>Tiny Skin for Windows Media Player</title><content type='html'>&lt;a href="http://www.skinz.org/profile.phtml?userid=1726"&gt;tBar&lt;/a&gt; is a tiny little skin for Windows Media Player that is small enough to sit in the title bar of an app without getting in the way.</content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/12/tiny-skin-for-windows-media-player.html' title='Tiny Skin for Windows Media Player'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=4318037932982226252' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/4318037932982226252'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/4318037932982226252'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-977728285981106918</id><published>2003-11-14T18:03:00.001Z</published><updated>2008-08-06T10:00:50.242+01:00</updated><title type='text'>Hot to Create &amp; Apply Patches with GNU diff and patch Tools</title><content type='html'>"&lt;a href="http://www.fsf.org/software/diffutils/manual/html_mono/diff.html"&gt;Comparing and Merging Files&lt;/a&gt;" describes how to create and apply patches using the GNU diff and patch tools.</content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/11/hot-to-create-apply-patches-with-gnu.html' title='Hot to Create &amp;amp; Apply Patches with GNU diff and patch Tools'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=977728285981106918' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/977728285981106918'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/977728285981106918'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-322541163703322077</id><published>2003-11-13T14:00:00.001Z</published><updated>2008-08-06T10:00:50.242+01:00</updated><title type='text'>How to Disconnect a VC++ Project from Source Control</title><content type='html'>&lt;a href="http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q180/9/45.ASP&amp;amp;NoWebContent=1"&gt;180945 - HOWTO: Disconnect a [VC++] Project from Source Control&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/11/how-to-disconnect-vc-project-from.html' title='How to Disconnect a VC++ Project from Source Control'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=322541163703322077' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/322541163703322077'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/322541163703322077'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-6534007422575143517</id><published>2003-11-06T18:23:00.001Z</published><updated>2008-08-06T10:00:50.243+01:00</updated><title type='text'>21 Well Known Compiler Bugs Ignored by Microsoft?</title><content type='html'>&lt;p&gt;&lt;a href="http://groups.google.co.uk/groups?hl=en&amp;amp;q=21%20bugs%20%5BWas%3A%20Re%3A%20Well%20known%20compiler%20bugs%20ignored%20by%20Microsoft%3F%5D&amp;amp;oe=UTF-8&amp;amp;um=1&amp;amp;ie=UTF-8&amp;amp;sa=N&amp;amp;tab=wg"&gt;21 bugs [Was: Re: Well known compiler bugs ignored by Microsoft?]&lt;/a&gt;&lt;/p&gt; </content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/11/21-well-known-compiler-bugs-ignored-by.html' title='21 Well Known Compiler Bugs Ignored by Microsoft?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=6534007422575143517' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/6534007422575143517'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/6534007422575143517'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-4833927061937420266</id><published>2003-11-05T17:05:00.001Z</published><updated>2008-08-06T10:00:50.243+01:00</updated><title type='text'>The CVS Book</title><content type='html'>&lt;a href="http://cvsbook.red-bean.com/"&gt;The CVS Book&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/11/cvs-book_05.html' title='The CVS Book'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=4833927061937420266' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/4833927061937420266'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/4833927061937420266'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-8673961222812677826</id><published>2003-11-04T14:16:00.001Z</published><updated>2008-08-06T10:00:50.243+01:00</updated><title type='text'>Where to Download the WTL</title><content type='html'>&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;familyid=128e26ee-2112-4cf7-b28e-7727d9a1f288"&gt;Download details: Windows Template Library (WTL) 7.0&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/11/where-to-download-wtl.html' title='Where to Download the WTL'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=8673961222812677826' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/8673961222812677826'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/8673961222812677826'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-8484233675364891433</id><published>2003-10-23T17:04:00.001+01:00</published><updated>2008-08-06T10:00:50.243+01:00</updated><title type='text'>Is the Current Process a Service?</title><content type='html'>&lt;a href="http://www.mvps.org/win32/security/is_svc.txt"&gt;How to determine if the current process is running as a service (under NT)&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/10/is-current-process-service.html' title='Is the Current Process a Service?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=8484233675364891433' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/8484233675364891433'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/8484233675364891433'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-3412747745256278390</id><published>2003-10-13T22:00:00.001+01:00</published><updated>2008-08-06T10:00:50.243+01:00</updated><title type='text'>TortoiseCVS</title><content type='html'>&lt;a href="http://www.tortoisecvs.org"&gt;TortoiseCVS&lt;/a&gt; is a cool shell extension for Windows operating systems that seriously simplifies access to CVS repositories. It is an &lt;a href="http://sourceforge.net/projects/tortoisecvs"&gt;open source project&lt;/a&gt; at &lt;a href="http://sourceforge.net"&gt;SourceForge.net&lt;/a&gt; </content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/10/tortoisecvs.html' title='TortoiseCVS'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=3412747745256278390' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/3412747745256278390'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/3412747745256278390'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-5937202.post-8111378976616436954</id><published>2003-10-13T19:39:00.001+01:00</published><updated>2008-08-06T10:00:50.244+01:00</updated><title type='text'>The Code Project</title><content type='html'>&lt;a href="http://www.codeproject.com/"&gt;The Code Project - Free Source Code and Tutorials&lt;/a&gt; </content><link rel='alternate' type='text/html' href='http://www.shadow-angel.com/blog/2003/10/code-project.html' title='The Code Project'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5937202&amp;postID=8111378976616436954' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.shadow-angel.com/blog/feeds/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/8111378976616436954'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5937202/posts/default/8111378976616436954'/><author><name>Damian Powell</name><uri>http://www.blogger.com/profile/07939997705819796956</uri><email>noreply@blogger.com</email></author></entry></feed>