<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-7690561670933886246</atom:id><lastBuildDate>Mon, 01 Aug 2011 23:54:13 +0000</lastBuildDate><category>images</category><category>ASP.NET-MVC</category><category>dependency injection</category><category>kata</category><category>Subversion</category><category>c# parameter-passing</category><category>branch</category><category>Membership</category><category>Meditation</category><category>target</category><category>MSBuild</category><category>export</category><category>build server</category><category>array</category><category>ca1024</category><category>multiple-implementations testing nunit</category><category>C#</category><category>WindowsXP Windows7</category><category>ASP.NET Ajax</category><category>source control</category><category>bugtracker</category><category>code</category><category>learning</category><category>LinqToSql C#</category><category>estimation</category><category>merge</category><category>scheduling</category><title>Programming on the bus</title><description>Software, reading, and surfing on the big bus</description><link>http://olelynge.blogspot.com/</link><managingEditor>noreply@blogger.com (Ole Lynge Sørensen)</managingEditor><generator>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/olelynge" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="olelynge" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-4569517614076438487</guid><pubDate>Sat, 02 Jul 2011 11:03:00 +0000</pubDate><atom:updated>2011-07-02T13:09:19.512+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ca1024</category><title>CA1024: Use properties where appropriate</title><description>For a long time I had no understanding of the code analysis rule &lt;a href="http://msdn.microsoft.com/en-us/library/ms182181.aspx"&gt;CA1024&lt;/a&gt;: "Use properties where appropriate."&lt;br /&gt;&lt;br /&gt;I have often violated this rules with methods named Get*, without parameters, that returns a list of items, like&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public interface IBlogRepository&lt;br /&gt;{&lt;br /&gt;  IEnumerable&lt;BlogPost&gt; GetBlogPosts();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I have now realized that this is probably an error, since there should always be some kind of paging (see also &lt;a href="http://ayende.com/blog/4733/answer-this-code-should-never-hit-production"&gt;Ayendes comments on this&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So the correct solution is something like&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public interface IBlogRepository&lt;br /&gt;{&lt;br /&gt;  IEnumerable&lt;BlogPost&gt; GetBlogPosts(int pageSize, int pageNumber);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-4569517614076438487?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2011/07/ca1024-use-properties-where-appropriate.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-1203528095173628892</guid><pubDate>Sat, 02 Jul 2011 09:22:00 +0000</pubDate><atom:updated>2011-07-02T11:25:22.485+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">code</category><title>Simian</title><description>I started using &lt;a href="http://www.harukizaemon.com/simian"&gt;Simian&lt;/a&gt; to find duplicated code - very nice!&lt;br /&gt;&lt;br /&gt;I created a simple cmd file to output the analysis to a text file.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;[PathToSimian]\simian-2.3.32.exe &lt;br /&gt;  -includes=**/*.cs &lt;br /&gt;  -excludes=**\obj\**\*.cs &lt;br /&gt;  -excludes=**\Reference.cs &lt;br /&gt;  -excludes=**\*.feature.cs &lt;br /&gt;  -excludes=**\*.Designer.cs &gt; simian.txt&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-1203528095173628892?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2011/07/simian.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-2193908437650479788</guid><pubDate>Sat, 23 Oct 2010 17:12:00 +0000</pubDate><atom:updated>2010-10-23T19:15:09.806+02:00</atom:updated><title>Code contracts</title><description>Interesting &lt;a href="http://www.infoq.com/articles/code-contracts-csharp"&gt;article by Jon Skeet about code contracts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-2193908437650479788?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/10/code-contracts.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-906206637241724205</guid><pubDate>Fri, 01 Oct 2010 22:05:00 +0000</pubDate><atom:updated>2010-10-02T11:53:02.499+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Subversion</category><category domain="http://www.blogger.com/atom/ns#">export</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Export changes from Subversion with SharpSvn</title><description>&lt;pre&gt;private static void ExportRevisionRange(&lt;br /&gt;    Uri repositoryUrl, &lt;br /&gt;    long fromRevision, &lt;br /&gt;    long toRevision, &lt;br /&gt;    string exportFolder)&lt;br /&gt;{&lt;br /&gt;    var client = new SvnClient();&lt;br /&gt;    var from =&lt;br /&gt;        new SvnUriTarget(repositoryUrl, fromRevision);&lt;br /&gt;    var to =&lt;br /&gt;        new SvnUriTarget(repositoryUrl, toRevision);&lt;br /&gt;    Collection&amp;lt;SvnDiffSummaryEventArgs&gt; list;&lt;br /&gt;    client.GetDiffSummary(from, to, out list);&lt;br /&gt;&lt;br /&gt;    foreach (SvnDiffSummaryEventArgs item in list)&lt;br /&gt;    {&lt;br /&gt;        if (item.DiffKind == SvnDiffKind.Deleted ||&lt;br /&gt;            item.NodeKind != SvnNodeKind.File)&lt;br /&gt;            continue;&lt;br /&gt;        var target = new SvnUriTarget(item.ToUri);&lt;br /&gt;        string exportPath =&lt;br /&gt;            Path.Combine(&lt;br /&gt;            exportFolder,&lt;br /&gt;            item.Path.Replace("/", "\\"));&lt;br /&gt;        var fi = new FileInfo(exportPath);&lt;br /&gt;        if (!fi.Directory.Exists)&lt;br /&gt;            fi.Directory.Create();&lt;br /&gt;        client.Export(&lt;br /&gt;            target,&lt;br /&gt;            exportPath,&lt;br /&gt;            new SvnExportArgs { Revision = toRevision });&lt;br /&gt;    }}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-906206637241724205?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/10/export-changes-from-subversion-with.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-6081581541936615061</guid><pubDate>Fri, 17 Sep 2010 17:50:00 +0000</pubDate><atom:updated>2010-09-17T20:01:24.234+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WindowsXP Windows7</category><title>Windows XP-programmer i Windows 7</title><description>Denne artikel er en dansk version af denne artikel: &lt;a href="http://olelynge.blogspot.com/2010/09/running-windows-xp-only-apps-on-windows.html"&gt;Running Windows XP-only apps on Windows 7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hvordan man i Windows 7 kan køre programmer der ellers kun kan køre på Windows XP (trin som er specifikke for Windows 7 Home er beskrevet her).&lt;br /&gt;&lt;br /&gt;Scott Hanselman beskriver her hvordan man kan køre Windows XP-programmer i Windows 7:&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/Windows7SeamlessAppsInWindowsVirtualPCVirtualXPAndApplicationCompatibility.aspx"&gt;Windows 7 - Seamless Apps in Windows Virtual PC (Virtual XP) and Application Compatibility&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Men Hanselman beskriver ikke hvad man skal gøre hvis man ikke har adgang til at downloade Windows XP Mode, som fx når man har Windows 7 Home.&lt;br /&gt;&lt;br /&gt;Denne artikel beskriver hvordan man kan installere Windows Virtual PC, installere en ny virtuel maskine med Windows XP, installe et program der ellers kun kører på Windows XP, og køre dette program fra Windows 7:&lt;br /&gt;&lt;br /&gt;1) Download og installér Windows Virtual PC:&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=2b6d5c18-1441-47ea-8309-2545b08e11dd&amp;displaylang=en"&gt;Windows Virtual PC&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) Hvis du kører en maskine uden "hardware virtualization", Windows Virtual PC vil ikke køre, så installér dette fix fra Microsoft, enten:&lt;br /&gt;a) på 32 bit systemer: &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=837f12aa-1d37-464e-ae59-20c9ecbebaf6&amp;displaylang=en"&gt;32 bit fix&lt;/a&gt;&lt;br /&gt;b) på 64 bit systemer: &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e70dd043-e262-43c0-a002-446567f1e2b4&amp;displaylang=en"&gt;64 bit fix&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3) Kør Windows Virtual PC og opret en ny virtuel maskine.&lt;br /&gt;&lt;br /&gt;4) Installér og start Windows XP på den virtuelle maskine.&lt;br /&gt;&lt;br /&gt;5) Installér "Integration Functions" via den indbyggede disk.&lt;br /&gt;&lt;br /&gt;6) På den virtuelle maskine: installér Windows XP-programmet.&lt;br /&gt;&lt;br /&gt;7) Luk den virtuelle maskine ved at klikke på krydset (X), hvilket vil sætte maskinen i dvale.&lt;br /&gt;&lt;br /&gt;8) I Windows 7 Start menuen kan du finde navnet for programmet og klikke på det. Den virtuelle Windows XP maskine vil starte i baggrunden og starte dit program op som om det kørte i Windows 7.&lt;br /&gt;&lt;br /&gt;For flere detaljer bag nogle af trinnene, se Hanselmans artikel:&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/Windows7SeamlessAppsInWindowsVirtualPCVirtualXPAndApplicationCompatibility.aspx"&gt;Windows 7 - Seamless Apps in Windows Virtual PC (Virtual XP) and Application Compatibility&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-6081581541936615061?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/09/windows-xp-programmer-i-windows-7.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-8561354417158940113</guid><pubDate>Fri, 17 Sep 2010 17:35:00 +0000</pubDate><atom:updated>2010-09-17T20:01:04.885+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WindowsXP Windows7</category><title>Running Windows XP-only apps on Windows 7</title><description>How to run Windows XP-only applications on Windows 7 (particular steps necessary for Windows 7 Home are described here):&lt;br /&gt;&lt;br /&gt;Scott Hanselman describes how to run Windows XP apps nicely in Windows 7:&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/Windows7SeamlessAppsInWindowsVirtualPCVirtualXPAndApplicationCompatibility.aspx"&gt;Windows 7 - Seamless Apps in Windows Virtual PC (Virtual XP) and Application Compatibility&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However, Hanselman does not cover when you have no access to the Windows XP Mode download.&lt;br /&gt;&lt;br /&gt;This article describes how to install Windows Virtual PC, install a new virtual machine with Windows XP, install your Windows XP-only application, and run it from Windows 7:&lt;br /&gt;&lt;br /&gt;1) Download and install Windows Virtual PC:&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=2b6d5c18-1441-47ea-8309-2545b08e11dd&amp;displaylang=en"&gt;Windows Virtual PC&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) If you are running a machine without hardware virtualization, Windows Virtual PC will not run, so install this fix from Microsoft, either:&lt;br /&gt;a) on 32 bit systems: &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=837f12aa-1d37-464e-ae59-20c9ecbebaf6&amp;displaylang=en"&gt;32 bit fix&lt;/a&gt;&lt;br /&gt;b) on 64 bit systems: &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e70dd043-e262-43c0-a002-446567f1e2b4&amp;displaylang=en"&gt;64 bit fix&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3) Run Windows Virtual PC and create a new virtual machine.&lt;br /&gt;&lt;br /&gt;4) Install and start Windows XP on the virtual machine.&lt;br /&gt;&lt;br /&gt;5) Install Integration Functions via the built-in disk.&lt;br /&gt;&lt;br /&gt;6) Install the Windows XP application that you want to run on Windows 7.&lt;br /&gt;&lt;br /&gt;7) Close the virtual machine by clicking the X, which will make the machine hibernate.&lt;br /&gt;&lt;br /&gt;8) In Windows 7 Start menu you can find the name of your application and click it. The Windows XP virtual machine will start in the background and bring your application up as if it was running on Windows 7.&lt;br /&gt;&lt;br /&gt;For more details behind some of the steps, see Hanselman's article:&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/Windows7SeamlessAppsInWindowsVirtualPCVirtualXPAndApplicationCompatibility.aspx"&gt;Windows 7 - Seamless Apps in Windows Virtual PC (Virtual XP) and Application Compatibility&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-8561354417158940113?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/09/running-windows-xp-only-apps-on-windows.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-7596740353234872920</guid><pubDate>Mon, 16 Aug 2010 17:45:00 +0000</pubDate><atom:updated>2010-08-16T19:49:48.954+02:00</atom:updated><title>Browsing Subversion with SharpSvn</title><description>Using &lt;a href="http://sharpsvn.open.collab.net/"&gt;SharpSvn&lt;/a&gt; to browse a Subversion repository:&lt;br /&gt;&lt;div&gt;&lt;pre&gt;using System.Collections.Generic;&lt;br /&gt;using System.Collections.ObjectModel;&lt;br /&gt;using System.Linq;&lt;br /&gt;using SharpSvn;&lt;br /&gt;&lt;br /&gt;public IEnumerable&amp;lt;string&gt; GetSubBranches(string baseUrl)&lt;br /&gt;{&lt;br /&gt;    SvnClient client = new SvnClient();&lt;br /&gt;    SvnTarget target = new SvnUriTarget(baseUrl);&lt;br /&gt;    var list = new Collection&lt;SvnListEventArgs&gt;();&lt;br /&gt;    client.GetList(target, out list);&lt;br /&gt;    return list.&lt;br /&gt;        Where(l =&gt; !string.IsNullOrEmpty(l.Path)).&lt;br /&gt;        Select(l =&gt; l.Path);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-7596740353234872920?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/08/browsing-subversion-with-sharpsvn.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-1786225432601067411</guid><pubDate>Sun, 15 Aug 2010 17:45:00 +0000</pubDate><atom:updated>2010-08-15T19:50:38.598+02:00</atom:updated><title>Personal wiki</title><description>Last month I read &lt;a href="http://pragprog.com/titles/ahptl/pragmatic-thinking-and-learning"&gt;Pragmatic Thinking and Learning&lt;/a&gt;, and have since picked up the suggestion that I should keep a personal wiki of ideas, notes, research, and whatever other things I usually scribble down or drop in a text file. I use it daily now and I find it makes more sense now to keep all the notes, when it's easier to search and navigate between the notes.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the technical side, I use &lt;a href="http://www.tiddlywiki.com/"&gt;TiddlyWiki&lt;/a&gt;, which is a single html file with a lot of javascript to make things smooth.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-1786225432601067411?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/08/personal-wiki.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-3032887597212191976</guid><pubDate>Wed, 21 Jul 2010 21:39:00 +0000</pubDate><atom:updated>2010-07-22T14:48:04.505+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Meditation</category><title>A meditation plan</title><description>Monday&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Focus on object&lt;/li&gt;&lt;li&gt;Visualize travel&lt;/li&gt;&lt;/ul&gt;Tuesday&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Investigate thoughts&lt;/li&gt;&lt;li&gt;Visualize flowers in four corners&lt;/li&gt;&lt;/ul&gt;Wednesday&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Focus on breathing&lt;/li&gt;&lt;li&gt;Visualize achievement&lt;/li&gt;&lt;/ul&gt;Thursday&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Visualize healing&lt;/li&gt;&lt;li&gt;Inner guide&lt;/li&gt;&lt;/ul&gt;Friday&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Unify with upper self&lt;/li&gt;&lt;li&gt;Compassion&lt;/li&gt;&lt;/ul&gt;Saturday&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Unity with God&lt;/li&gt;&lt;li&gt;Focus on inner body&lt;/li&gt;&lt;/ul&gt;Sunday&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Focus on senses&lt;/li&gt;&lt;li&gt;Visualize a golden warmth&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-3032887597212191976?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/07/meditation-plan.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-5109889641337310133</guid><pubDate>Wed, 14 Jul 2010 13:18:00 +0000</pubDate><atom:updated>2010-07-14T15:42:12.603+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET-MVC</category><category domain="http://www.blogger.com/atom/ns#">Membership</category><category domain="http://www.blogger.com/atom/ns#">kata</category><title>Kata: SimpleMembership</title><description>I did &lt;a href="https://code.google.com/p/kata-simplemembership"&gt;a coding exercise&lt;/a&gt; with ASP.NET Membership, with focus on managing users and roles in ASP.NET MVC 2: &lt;br /&gt;&lt;br /&gt;Features include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add users with user name, email address, and password&lt;/li&gt;&lt;li&gt;List of users&lt;/li&gt;&lt;li&gt;Add roles&lt;/li&gt;&lt;li&gt;List of users in roles&lt;/li&gt;&lt;li&gt;Add users to roles&lt;/li&gt;&lt;li&gt;Update user's email address, approved status, and password&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;New learnings for me and possibly interesting things to draw from this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The use of MultiSelectList in view models and views&lt;/li&gt;&lt;li&gt;The flexibiliy of the built-in Membership&lt;/li&gt;&lt;li&gt;How easy it really is to add these administration pages...&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The project is added to Google code: &lt;a href="https://code.google.com/p/kata-simplemembership"&gt;kata-simplemembership&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The source can be obtained or browsed here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://code.google.com/p/kata-simplemembership/source/checkout"&gt;checkout&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kata-simplemembership.googlecode.com/svn/trunk"&gt;raw html view&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/kata-simplemembership/source/browse#svn/trunk"&gt;google code view&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-5109889641337310133?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/07/kata-simplemembership.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-2165402913160620345</guid><pubDate>Mon, 28 Jun 2010 18:18:00 +0000</pubDate><atom:updated>2010-06-28T20:25:45.165+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">merge</category><category domain="http://www.blogger.com/atom/ns#">Subversion</category><category domain="http://www.blogger.com/atom/ns#">branch</category><title>Merge between branches more than one level apart</title><description>Task: merge between trunk and branches that are more than one level away.&lt;br /&gt;&lt;br /&gt;Setup:&lt;br /&gt;&lt;pre&gt;trunk&lt;br /&gt;|&lt;br /&gt;|- branch1&lt;br /&gt;   |&lt;br /&gt;   |- branch2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Solution: When branch1 has been merged to trunk and the same changes have been merged from branch1 to branch2, and all revisions from trunk have been (nominally) merged to branch1 and branch2, it is possible to reintegrate branch2 in trunk without conflicts.&lt;br /&gt;&lt;br /&gt;Example of procedure to reproduce this:&lt;br /&gt;&lt;br /&gt; 1) trunk with file readme.txt&lt;br /&gt; 2) trunk |branch&gt; branch1&lt;br /&gt; 3) branch1: edit readme.txt&lt;br /&gt; 4) branch1 |branch&gt; branch2&lt;br /&gt; 5) branch2: edit readme.txt&lt;br /&gt; 6) branch1: edit readme.txt&lt;br /&gt; 7) branch1 |merge reintegrate&gt; trunk&lt;br /&gt; 8) branch1 |merge range of revisions&gt; branch2&lt;br /&gt; 9) trunk |merge range of revisions&gt; branch1&lt;br /&gt;10) trunk |merge range of revisions&gt; branch2&lt;br /&gt;11) branch2 |merge reintegrate&gt; trunk&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-2165402913160620345?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/06/merge-between-branches-more-than-one.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-1086464735443766232</guid><pubDate>Sun, 30 May 2010 19:44:00 +0000</pubDate><atom:updated>2010-05-30T21:47:27.823+02:00</atom:updated><title>Exception formatting</title><description>&lt;code&gt;public StackFrame ExtractPrimaryFrame(&lt;br /&gt;&amp;nbsp;&amp;nbsp;Exception exception)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (exception.InnerException != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ExtractPrimaryFrame(exception.InnerException);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return ExtractPrimaryFrame(new StackTrace(exception, true));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public StackFrame ExtractPrimaryFrame(&lt;br /&gt;&amp;nbsp;&amp;nbsp;StackTrace stackTrace)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (stackTrace == null ||&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stackTrace.GetFrames() == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;foreach (var frame in stackTrace.GetFrames())&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (frame.GetFileName() != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return frame;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public string FormatException(Exception exception)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;StackFrame primaryFrame = ExtractPrimaryFrame(exception);&lt;br /&gt;&amp;nbsp;&amp;nbsp;return string.Format("{0} || {1}",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatFrame(primaryFrame),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exception);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public string FormatFrame(StackFrame frame)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (frame == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string.Empty;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return string.Format(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"FileName: {0}; Line: {1}; FilePath: {2}; Full info: {3}",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ExtractFileName(frame.GetFileName(), "src") ?? "(none)",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frame.GetFileLineNumber(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frame.GetFileName() ?? "(none)",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frame.ToString());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static string ExtractFileName(string filePath)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (string.IsNullOrEmpty(filePath))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;FileInfo fi = new FileInfo(filePath);&lt;br /&gt;&amp;nbsp;&amp;nbsp;return fi.Name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public string ExtractFileName(string filePath, string folderStart)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (string.IsNullOrEmpty(filePath))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;FileInfo fi = new FileInfo(filePath);&lt;br /&gt;&amp;nbsp;&amp;nbsp;DirectoryInfo dir = fi.Directory;&lt;br /&gt;&amp;nbsp;&amp;nbsp;while (true)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (dir.Parent == null || dir.Name == folderStart)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dir = dir.Parent;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (dir.Parent == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ExtractFileName(filePath);&lt;br /&gt;&amp;nbsp;&amp;nbsp;return fi.FullName.Replace(dir.FullName + "\\", "");&lt;br /&gt;}&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-1086464735443766232?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/05/exception-formatting.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-4660402132750257086</guid><pubDate>Sat, 20 Mar 2010 16:05:00 +0000</pubDate><atom:updated>2010-03-20T17:14:12.402+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">multiple-implementations testing nunit</category><title>Testing multiple implementations</title><description>Challenge: Run automated tests of multiple implementations of an interface, for example one repository for Sql Server and another for MySql.&lt;br /&gt;&lt;br /&gt;A solution: Have one test class for one of the implementations, and create a derived test class for the other implementation, which injects the proper implementation in the constructor of the first test class.&lt;br /&gt;&lt;br /&gt;Example with NUnit:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;[TestFixture]&lt;br /&gt;public class CustomerRepositoryTests&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private ICustomerRepository _repository;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public CustomerRepositoryTests() : &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this(new CustomerRepository())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public CustomerRepositoryTests(ICustomerRepository repository)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_repository = repository;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void Add_ValidCustomer_Ok()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Arrange:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var customer = new Customer();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Act:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_repository.Add(customer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[TestFixture]&lt;br /&gt;public class MySqlCustomerRepositoryTests : &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomerRepositoryTests&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public MySqlCustomerRepositoryTests() :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base(new MySqlCustomerRepository())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-4660402132750257086?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/03/testing-multiple-implementations.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-6682547280558858593</guid><pubDate>Wed, 17 Mar 2010 20:19:00 +0000</pubDate><atom:updated>2010-03-17T21:34:34.600+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">LinqToSql C#</category><title>Manual definition of dependent tables with LinqToSql</title><description>The following is a code example of how to declare dependent tables in C# and generate and populate them with LinqToSql [it will generate the tables Parent(Id, Name, ChildId) and Child(Id, Name)]:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;using System;&lt;br /&gt;using System.Data.Linq;&lt;br /&gt;using System.Data.Linq.Mapping;&lt;br /&gt;&lt;br /&gt;namespace ManualLinqToSql&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;class Program&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static void Main(string[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const string connectionString =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@"Server=.\SqlExpress;Database=LinqTest;Integrated Security=true;";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TestRepository repository =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new TestRepository(connectionString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repository.CreateDatabase();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repository.Add("A", "A1");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repository.Add("B", "B1");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("OK");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(ex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadKey();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public class TestRepository&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private readonly TestDataContext _dataContext;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public TestRepository(string connectionString)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_dataContext = new TestDataContext(connectionString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void Add(string parentName, string childName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var parent = new Parent(parentName, childName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_dataContext.ParentTable.InsertOnSubmit(parent);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_dataContext.SubmitChanges();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void CreateDatabase()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_dataContext.DeleteDatabase();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_dataContext.CreateDatabase();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public class TestDataContext : DataContext&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public TestDataContext(string connectionString)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: base(connectionString)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Table&amp;lt;Parent&gt; ParentTable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { return GetTable&amp;lt;Parent&gt;(); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Table&amp;lt;Child&gt; ChildTable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { return GetTable&amp;lt;Child&gt;(); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Table]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public class Parent&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private EntityRef&amp;lt;Child&gt; _child;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Parent()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Parent(string name, string childName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name = name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Singleton = new Child { Name = childName };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Column(IsPrimaryKey = true, IsDbGenerated = true)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int Id { get; set; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Column(CanBeNull = false)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string Name { get; set; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Association(Storage = "_child", ThisKey = "ChildId", IsForeignKey = true)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Child Singleton&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return _child.Entity;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_child.Entity = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ChildId = value.Id;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Column(UpdateCheck = UpdateCheck.Never)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private int ChildId { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Table]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public class Child&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Column(IsPrimaryKey = true, IsDbGenerated = true)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int Id { get; set; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Column(CanBeNull = false)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string Name { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void Detach()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_child = default(EntityRef&amp;lt;Child&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-6682547280558858593?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/03/manual-definition-of-dependent-tables.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-8233396577379536369</guid><pubDate>Sun, 07 Mar 2010 18:17:00 +0000</pubDate><atom:updated>2010-03-07T20:42:54.461+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">array</category><category domain="http://www.blogger.com/atom/ns#">MSBuild</category><category domain="http://www.blogger.com/atom/ns#">target</category><title>MSBuild: Passing arrays between targets</title><description>In MSBuild, if you have a target that operates on a list of items of a specific type, and you want to call that operation several times with different lists, here is a way to do that using the DependsOnTargets attribute:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;Target Name="UserInterface"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;MSBuild Projects="$(MSBuildProjectFile)" Targets="Service"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties="ServiceDependsOn=PersonRepository-1" /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;MSBuild Projects="$(MSBuildProjectFile)" Targets="Service"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties="ServiceDependsOn=PersonRepository-2" /&gt;&lt;br /&gt;&amp;lt;/Target&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Target Name="Service" DependsOnTargets="$(ServiceDependsOn)"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Message Text="Persons: @(Persons-&gt;'%(Name) (%(Identity))')" /&gt;&lt;br /&gt;&amp;lt;/Target&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Target Name="PersonRepository-1"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;ItemGroup&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Persons Include="Al"&gt;&amp;lt;Name&gt;Al Omaha&amp;lt;/Name&gt;&amp;lt;/Persons&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Persons Include="Ben"&gt;&amp;lt;Name&gt;Ben Patterson&amp;lt;/Name&gt;&amp;lt;/Persons&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/ItemGroup&gt;&lt;br /&gt;&amp;lt;/Target&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Target Name="PersonRepository-2"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;ItemGroup&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Persons Include="Adrian"&gt;&amp;lt;Name&gt;Adrian Quist&amp;lt;/Name&gt;&amp;lt;/Persons&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Persons Include="Britta"&gt;&amp;lt;Name&gt;Britta Ruud&amp;lt;/Name&gt;&amp;lt;/Persons&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/ItemGroup&gt;&lt;br /&gt;&amp;lt;/Target&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and here is sample output:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Project "C:\Projects\MSBuildItems.xml" on node 0 (default targets).&lt;br /&gt;Project "C:\Projects\MSBuildItems.xml" (1) is building "C:\Projects\MSBuildItems.xml" (1:2) on node 0 (Service target(s)).&lt;br /&gt;&amp;nbsp;Persons: Al Omaha (Al);Ben Patterson (Ben)&lt;br /&gt;Done Building Project "C:\Projects\MSBuildItems.xml"&lt;br /&gt;(Service target(s)).&lt;br /&gt;&lt;br /&gt;Project "C:\Projects\MSBuildItems.xml" (1) is building "C:\Projects\MSBuildItems.xml" (1:3) on node 0 (Service target(s)).&lt;br /&gt;&amp;nbsp;Persons: Adrian Quist (Adrian);Britta Ruud (Britta)&lt;br /&gt;Done Building Project "C:\Projects\MSBuildItems.xml"&lt;br /&gt;(Service target(s)).&lt;br /&gt;&lt;br /&gt;Done Building Project "C:\Projects\MSBuildItems.xml" (default targets).&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-8233396577379536369?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/03/msbuild-passing-arrays-between-targets.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-4317291429125524424</guid><pubDate>Sun, 07 Mar 2010 00:34:00 +0000</pubDate><atom:updated>2010-03-07T02:06:04.661+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">dependency injection</category><category domain="http://www.blogger.com/atom/ns#">MSBuild</category><title>MSBuild with dependency injection</title><description>I am about to start refactoring a &lt;a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx"&gt;MSBuild&lt;/a&gt; file with around 1000 lines of xml, and I find that the targets are heavily dependent on each other.&lt;br /&gt;&lt;br /&gt;Maybe &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;dependency injection&lt;/a&gt; can help here?!&lt;br /&gt;&lt;br /&gt;In MSBuild this could look something like this:&lt;br /&gt;&lt;br /&gt;UserInterface.xml:&lt;br /&gt;&lt;code&gt;  &amp;lt;Import Project="ApplicationService.xml" /&gt;&lt;br /&gt; &amp;lt;Import Project="Repository.xml" /&gt;&lt;br /&gt;(or &amp;lt;Import Project="FakeRepository.xml" /&gt;)&lt;br /&gt; &amp;lt;Target Name="UserInterface-Action"&gt;&lt;br /&gt;&amp;nbsp;     &amp;lt;CallTarget Targets="ApplicationService-Action" /&gt;&lt;br /&gt; &amp;lt;/Target&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ApplicationService.xml:&lt;br /&gt;&lt;code&gt;  &amp;lt;Target Name="ApplicationService-Action"&gt;&lt;br /&gt;&amp;nbsp;     &amp;lt;CallTarget Targets="IRepository-Action" /&gt;&lt;br /&gt; &amp;lt;/Target&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Repository.xml:&lt;br /&gt;&lt;code&gt;  &amp;lt;Target Name="IRepository-Action"&gt;&lt;br /&gt;&amp;nbsp;     &amp;lt;Message Text="Repository action" /&gt;&lt;br /&gt; &amp;lt;/Target&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;FakeRepository.xml:&lt;br /&gt;&lt;code&gt;  &amp;lt;Target Name="IRepository-Action"&gt;&lt;br /&gt;&amp;nbsp;     &amp;lt;Message Text="Fake repository action" /&gt;&lt;br /&gt; &amp;lt;/Target&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For comparison, here is the corresponding structure in C#:&lt;br /&gt;&lt;code&gt;public class UserInterface&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;private readonly IRepository repository;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public UserInterface(IRepository repository)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.repository = repository;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void Action()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var service = new ApplicationService(this.repository);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;service.Action();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class ApplicationService&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;private readonly IRepository repository;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public ApplicationService(IRepository repository)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.repository = repository;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void Action()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.repository.Action();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public interface IRepository&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;void Action();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Repository : IRepository&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void Action()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine("Repository action"); &lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class FakeRepository : IRepository&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;public void Action()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine("Fake repository action");&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-4317291429125524424?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2010/03/msbuild-with-dependency-injection.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-8383309652819992356</guid><pubDate>Sun, 20 Sep 2009 19:38:00 +0000</pubDate><atom:updated>2009-09-20T22:02:56.021+02:00</atom:updated><title>Home Computer Setup</title><description>Recently entropy caught up with the Home Computer, and resulted in a reformatting and a replacement of the old 32 bit operating system with a new 64 bit operating system.&lt;br /&gt;The strategy has changed to use virtual machines for specific purposes instead of installing everything on the physical machine. &lt;br /&gt;So, now, this is the setup:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Physical machine: 64 bit laptop with 64 bit operating system, with:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;7-zip&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AVG Anti Virus&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Emacs&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Google Chrome&lt;/li&gt;&lt;br /&gt;&lt;li&gt;MiKTeX&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mozilla Thunderbird&lt;/li&gt;&lt;br /&gt;&lt;li&gt;TortoiseSVN&lt;/li&gt;&lt;br /&gt;&lt;li&gt;VisualSVN Server&lt;/li&gt;&lt;br /&gt;&lt;li&gt;WinDirStat&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Virtual machine for development, with:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;AnkhSVN&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Firefox&lt;/li&gt;&lt;br /&gt;&lt;li&gt;FxCop&lt;/li&gt;&lt;br /&gt;&lt;li&gt;NUnit&lt;/li&gt;&lt;br /&gt;&lt;li&gt;SqlServer&lt;/li&gt;&lt;br /&gt;&lt;li&gt;TortoiseSVN&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Visual Studio&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Virtual machine for tests and games.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Is it better? No. &lt;br /&gt;Is it smarter? No. &lt;br /&gt;Is it new? Yes, for me it is!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-8383309652819992356?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2009/09/home-computer-setup.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-4247426659884411725</guid><pubDate>Thu, 09 Jul 2009 13:59:00 +0000</pubDate><atom:updated>2009-07-09T16:32:49.440+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">estimation</category><category domain="http://www.blogger.com/atom/ns#">scheduling</category><title>History Based Estimation</title><description>Recently I started on a &lt;a href="http://hibes.sourceforge.net"&gt;new programming project&lt;/a&gt; in my spare time.  I call it &lt;a href="http://hibes.sourceforge.net/"&gt;History Based Estimation&lt;/a&gt;.  It features a website to handle recording the elapsed time for tasks and using that to estimate future completion dates.&lt;br /&gt;&lt;br /&gt;It is inspired by Joel Spolsky's &lt;a href="http://www.joelonsoftware.com/items/2007/10/26.html"&gt;Evidence Based Scheduling&lt;/a&gt;, which I've wanted to use since I read about it more than a year ago. &lt;br /&gt;&lt;br /&gt;On my job we started using BugTracker.NET half a year ago, but that doesn't fill my need for the scheduling/estimating part.  I started to write a web site in ASP.NET (web forms) three weeks ago, and open sourced it on &lt;a href="http://sourceforge.net/"&gt;SourceForge.net&lt;/a&gt; when I had something that looked like a start.&lt;br /&gt;&lt;br /&gt;Features of History Based Estimation are currently:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;Recording of projects, issues and tasks.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Prioritizing issues.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Recording estimates and time spent on tasks.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Chart with probability of completion dates.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Analysis of statistical average remaining time per issue.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Download of analysis in Word, Excel, and Latex formats.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Choice between English or Danish user interface.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Chart with historical task statistics (estimated time versus elapsed time).&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Tracking of 'days off' when the person will be on holiday etc.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I think it is lacking in, at least, the following: There is no notion of person in the system. I.e. although it is possible for more than one person to use it, there is no authentication required and thus the system does not know who does what, who estimates what, and who has spent the time recorded.&lt;br /&gt;&lt;br /&gt;Therefore, I hope to get more time to implement these features:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;More than one person: I.e. record who is working on what and extract estimates per person.&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Authentication linked to persons.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;A technical note:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;the web site is written in ASP.NET Web Forms&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;the business logic is written in C#&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;data is stored in a SQL Server database&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;As mentioned, the code is open source:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://hibes.svn.sourceforge.net/viewvc/hibes/trunk/"&gt;browse trunk&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="https://hibes.svn.sourceforge.net/svnroot/hibes/trunk"&gt;svn url&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;so if you would like to take a look at it, please follow the links. If you would like to give me feedback, or maybe even work on the code, please contact me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-4247426659884411725?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2009/07/history-based-estimation.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-1922945273196344656</guid><pubDate>Sat, 11 Apr 2009 11:17:00 +0000</pubDate><atom:updated>2009-04-11T13:20:05.390+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c# parameter-passing</category><title>Article about parameter passing in c#</title><description>I found this article about parameter passing:&lt;br /&gt;&lt;a href="http://www.yoda.arachsys.com/csharp/parameters.html"&gt;Parameter passing in C#&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-1922945273196344656?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2009/04/article-about-parameter-passing-in-c.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-1788864483006900459</guid><pubDate>Fri, 06 Mar 2009 15:24:00 +0000</pubDate><atom:updated>2009-03-06T16:43:14.729+01:00</atom:updated><title>Cafés / restaurants with vegetarian dishes in central Denmark</title><description>We visited Grenå (on the tip of the nose of &lt;a href="http://en.wikipedia.org/wiki/Denmark"&gt;Denmark&lt;/a&gt;) this week. We were pleasantly surprised to find a café there called &lt;a href="http://web.mac.com/masimba/LivingNice/Cafe.html"&gt;ØkoCafeen&lt;/a&gt; (ecological café) with a vegan burger on the menu card. &lt;br /&gt;&lt;br /&gt;How many places do you find &lt;i&gt;that&lt;/i&gt; in Denmark? (We know restaurant Pihlkjær in Århus with an ecological/vegetarian menu.)&lt;br /&gt;&lt;br /&gt;In ØkoCafeen they sell ecological food, do wellness, and also have a small catalog of music and movies from &lt;a href="http://dk.fonixmusik.com/"&gt;Fønix Musik&lt;/a&gt;. I noticed a movie called &lt;a href="http://www.imdb.com/title/tt0438315/"&gt;Peaceful Warrior&lt;/a&gt; with Nick Nolte, which &lt;a href="http://www.eckharttolle.com/eckharttolle"&gt;Eckhart Tolle&lt;/a&gt; recommends (according to the brochure).&lt;br /&gt;&lt;br /&gt;They call the concept Living Nice, and have a web site here with info about the café and also a blog: &lt;a href="http://web.mac.com/masimba/LivingNice/LivingNice.html"&gt;Living Nice&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-1788864483006900459?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2009/03/cafes-restaurants-with-vegetarian.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-153802971988636571</guid><pubDate>Sat, 10 Jan 2009 15:32:00 +0000</pubDate><atom:updated>2009-01-10T17:24:20.972+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bugtracker</category><category domain="http://www.blogger.com/atom/ns#">learning</category><category domain="http://www.blogger.com/atom/ns#">build server</category><category domain="http://www.blogger.com/atom/ns#">source control</category><title>Learning and Living</title><description>"To live is to learn." &lt;br /&gt;&lt;br /&gt;"To read is to live."&lt;br /&gt;&lt;br /&gt;Or maybe it is "Living is living" and "I am".&lt;br /&gt;&lt;br /&gt;The last three months have meant some changes to how I work:&lt;br /&gt;&lt;br /&gt;I now use source control for code related work: &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; with &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; in Windows Explorer and &lt;a href="http://ankhsvn.open.collab.net/"&gt;ankhsvn&lt;/a&gt; in Visual Studio. This has given me a feeling of greater security that my work is properly backed up, more speed in development since I don't have to manage (copy) revisions manually. Any new experiment I do can only destroy the changes I've made since the last time I committed changes to source control. Therefore I commit changes every time a piece of a task is completed. In addition to the code change itself, to each commit I add a short description of what has changed. This means that I get an overview of what has changed on a given project by reading the repository log.&lt;br /&gt;&lt;br /&gt;Joel Spolsky says, among &lt;a href="http://www.joelonsoftware.com"&gt;other things&lt;/a&gt;, that &lt;a href="http://www.joelonsoftware.com/articles/fog0000000023.html"&gt;Daily Builds Are Your Friend&lt;/a&gt;. By setting up a build server I now have a system that, for most of the projects, will compile the code and test it. By using &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/"&gt;CruiseControl.NET&lt;/a&gt; I automatically get feedback when commited code breaks a build.&lt;br /&gt;&lt;br /&gt;An extra benefit from the above is that I have learned how to write build scripts using &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt;. So now, after making some small code change, I can run a bat file and the solution will be compiled and the installers packaged for the consultants or for grabbing via ftp from a remote server.&lt;br /&gt;&lt;br /&gt;This week I set up &lt;a href="http://ifdefined.com/bugtrackernet.html"&gt;BugTracker.NET&lt;/a&gt; which seems to fulfil our requirements about a system that we can use internally for tracking bugs, issues, and requests from customers. I appreciate the work of &lt;a href="http://ifdefined.com"&gt;Corey Trager&lt;/a&gt; and other people who release their private work for public use.&lt;br /&gt;&lt;br /&gt;So now I'm about half-way through &lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;The Joel Test&lt;/a&gt;, and I don't know where this will end...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-153802971988636571?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2009/01/learning-and-living.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-5666294375077781835</guid><pubDate>Thu, 02 Oct 2008 06:45:00 +0000</pubDate><atom:updated>2008-10-05T07:56:08.103+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET Ajax</category><category domain="http://www.blogger.com/atom/ns#">images</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Image browser with ASP.NET Ajax</title><description>&lt;h2&gt;Introduction&lt;/h2&gt;I have written an image browser page with ASP.NET, using ASP.NET Ajax to retrieve information about images on the server. Images are displayed using a single aspx page and a folder with jpg files. The code-behind is written in C#. No database is involved.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Background&lt;/h2&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2QX4wY6qKhY/SORwQ2hgorI/AAAAAAAAAPw/ZJReoNJsYBM/s1600-h/ImageBrowserSample.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_2QX4wY6qKhY/SORwQ2hgorI/AAAAAAAAAPw/ZJReoNJsYBM/s320/ImageBrowserSample.jpg" alt="" id="BLOGGER_PHOTO_ID_5252446500237124274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;My goal was to show my family some photos on a web page and hopefully spending less than a few hours accomplishing that. So I wanted to do so without using a database, without titles, without descriptions, without tags, etc. However, I included the shooting date of the photo as part of the file name, since it provided a way to retain som information without using a database.&lt;br /&gt;&lt;br /&gt;You see the resulting web page on the right.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The code&lt;/h2&gt;&lt;h3&gt;Code-behind (C#)&lt;/h3&gt;I first created a aspx web form, and in the code-behind wrote a static web method to return information about the images on the server:&lt;blockquote&gt;[WebMethod]&lt;br /&gt;public static Image[] GetImages()&lt;br /&gt;{&lt;br /&gt;// The virtual path to the image folder:&lt;br /&gt;// (in this case a folder that contains some photos)&lt;br /&gt;string imageFolderVirtualPath = "~/Photos/";&lt;br /&gt;string imageFolderPath = HttpContext.Current.Server.MapPath(imageFolderVirtualPath);&lt;br /&gt;List&amp;lt;image&gt; images = new List&amp;lt;image&gt;();&lt;br /&gt;DirectoryInfo diImages = new DirectoryInfo(imageFolderPath);&lt;br /&gt;// Only *.jpg files are included in this case:&lt;br /&gt;foreach (FileInfo fiImage in diImages.GetFiles("*.jpg"))&lt;br /&gt;{&lt;br /&gt;string fileName = fiImage.Name;&lt;br /&gt;// If the file name starts with the DateTime pattern yyyy-MM-dd,&lt;br /&gt;// the date is parsed from that:&lt;br /&gt;string date = string.Empty;&lt;br /&gt;int year = 0;&lt;br /&gt;int month = 0;&lt;br /&gt;int day = 0;&lt;br /&gt;if (fileName.Length &gt; 9 &amp;amp;&amp;amp; Int32.TryParse(fileName.Substring(0, 4), out year)&lt;br /&gt;    &amp;amp;&amp;amp; Int32.TryParse(fileName.Substring(5, 2), out month)&lt;br /&gt;    &amp;amp;&amp;amp; Int32.TryParse(fileName.Substring(8, 2), out day))&lt;br /&gt;{&lt;br /&gt;    date = new DateTime(year, month, day).ToLongDateString();&lt;br /&gt;}&lt;br /&gt;images.Add(new Image&lt;br /&gt;{&lt;br /&gt;    Date = date,&lt;br /&gt;    VirtualPath = CombineVirtualPaths(imageFolderVirtualPath, fileName)&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;return images.ToArray();&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;A helper method combines the virtual paths:&lt;br /&gt;&lt;blockquote&gt;private static string CombineVirtualPaths(string virtualPath1, string virtualPath2)&lt;br /&gt;{&lt;br /&gt;return string.Format("{0}/{1}", virtualPath1.Trim('~', '/'), virtualPath2.Trim('/'));&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;A helper class contains information about an image:&lt;br /&gt;&lt;blockquote&gt;public class Image&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;summary&gt;&lt;br /&gt;/// The virtual path to the image file&lt;br /&gt;/// &amp;lt;/summary&gt;&lt;br /&gt;public string VirtualPath { get; set; }&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&gt;&lt;br /&gt;/// The date as a string&lt;br /&gt;/// &amp;lt;/summary&gt;&lt;br /&gt;public string Date { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;html/aspx markup&lt;/h3&gt;In the *.aspx file I have the following markup:&lt;br /&gt;&lt;blockquote&gt;&amp;lt;body onload="GetImages();"&gt;&lt;br /&gt;&amp;lt;form id="form1" runat="server"&gt;&lt;br /&gt;&amp;lt;asp:ScriptManager id="sm1" runat="server" EnablePageMethods="true" EnableScriptGlobalization="true"&gt;&lt;br /&gt;&amp;lt;/asp:ScriptManager&gt;&lt;br /&gt;&amp;lt;div&gt;&lt;br /&gt; &amp;lt;div id="divButtons" style="float: left;"&gt;&lt;br /&gt; &amp;lt;/div&gt;&lt;br /&gt; &amp;lt;div id="divImage" style="float: left;"&gt;&lt;br /&gt; &amp;lt;/div&gt;&lt;br /&gt;&amp;lt;/div&gt;&lt;br /&gt;&amp;lt;/form&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Javascript&lt;/h3&gt;On load fires a javascript method that retrieves info from the page method:&lt;br /&gt;&lt;blockquote&gt;  // Information about the Images:&lt;br /&gt; var images;&lt;br /&gt;&lt;br /&gt; // The index of the currently shown Image:&lt;br /&gt; var currentImageIndex = 0;&lt;br /&gt;&lt;br /&gt; // Calls the page method to obtain information about the Images:&lt;br /&gt; function GetImages() {&lt;br /&gt;     PageMethods.GetImages(GetImagesCompleted);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // The call-back where information about the images is returned:&lt;br /&gt; function GetImagesCompleted(result) {&lt;br /&gt;     images = result;&lt;br /&gt;     ShowImage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Shows the Image:&lt;br /&gt; function ShowImage() {&lt;br /&gt;     var currentImage = images[currentImageIndex];&lt;br /&gt;     var date = currentImage.Date;&lt;br /&gt;     var imgImage = "&amp;lt;img id='imgImage' alt='" + date +&lt;br /&gt;         "' title='" + date + "' src='" + currentImage.VirtualPath "' /&gt;";&lt;br /&gt;     var dp = document.getElementById("divImage");&lt;br /&gt;     dp.innerHTML = imgImage;&lt;br /&gt;     document.title = date;&lt;br /&gt;     ShowButtons();&lt;br /&gt; }&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;A separate javascript method displays navigation buttons as appropriate:&lt;br /&gt;&lt;blockquote&gt;  // Shows the buttons:&lt;br /&gt; function ShowButtons() {&lt;br /&gt;     // Gets localized texts (English or Danish) for the buttons.&lt;br /&gt;     // This only works with the following two settings:&lt;br /&gt;     //    - The ScriptManager on this page must have: EnableScriptGlobalization="true"&lt;br /&gt;     //    - web.config must have: &amp;lt;globalization culture="auto"&amp;gt; (in &amp;lt;system.web&amp;gt; section)&lt;br /&gt;     // The default English texts:&lt;br /&gt;     var first = "First";&lt;br /&gt;     var previous = "Previous";&lt;br /&gt;     var next = "Next";&lt;br /&gt;     var last = "Last";&lt;br /&gt;     if (Sys.CultureInfo.CurrentCulture.name.toLowerCase().startsWith("da")) {&lt;br /&gt;         // The Danish texts:&lt;br /&gt;         first = "Første";&lt;br /&gt;         previous = "Forrige";&lt;br /&gt;         next = "Næste";&lt;br /&gt;         last = "Sidste";&lt;br /&gt;     }&lt;br /&gt;     var button1 = "&amp;lt;div&gt;&amp;lt;input type='button' style='width: 75px;'";&lt;br /&gt;     var btnFirst = button1 + " value='" + first + "' onclick='ShowFirstImage();'";&lt;br /&gt;     var btnPrevious = button1 + " value='" + previous + "' onclick='ShowPreviousImage();'";&lt;br /&gt;     var btnNext = button1 + " value='" + next + "' onclick='ShowNextImage();'";&lt;br /&gt;     var btnLast = button1 + " value='" + last + "' onclick='ShowLastImage();'";&lt;br /&gt;     if (currentImageIndex == 0) {&lt;br /&gt;         btnFirst += " disabled='disabled'";&lt;br /&gt;         btnPrevious += " disabled='disabled'";&lt;br /&gt;     }&lt;br /&gt;     if (currentImageIndex == images.length - 1) {&lt;br /&gt;         btnNext += " disabled='disabled'";&lt;br /&gt;         btnLast += " disabled='disabled'";&lt;br /&gt;     }&lt;br /&gt;     var button2 = " /&gt;&amp;lt;/div&gt;";&lt;br /&gt;     btnFirst += button2;&lt;br /&gt;     btnPrevious += button2;&lt;br /&gt;     btnNext += button2;&lt;br /&gt;     btnLast += button2;&lt;br /&gt;     var db1 = document.getElementById("divButtons");&lt;br /&gt;     db1.innerHTML = btnFirst + btnPrevious + btnNext + btnLast;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Shows the first Image:&lt;br /&gt; function ShowFirstImage() {&lt;br /&gt;     currentImageIndex = 0;&lt;br /&gt;     ShowImage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Shows the previous Image:&lt;br /&gt; function ShowPreviousImage() {&lt;br /&gt;     if (currentImageIndex &gt; 0) {&lt;br /&gt;         currentImageIndex -= 1;&lt;br /&gt;         ShowImage();&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Shows the next Image:&lt;br /&gt; function ShowNextImage() {&lt;br /&gt;     if (currentImageIndex &lt; images.length - 1) {&lt;br /&gt;         currentImageIndex += 1;&lt;br /&gt;         ShowImage();&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Shows the last image:&lt;br /&gt; function ShowLastImage() {&lt;br /&gt;     currentImageIndex = images.length - 1;&lt;br /&gt;     ShowImage();&lt;br /&gt; }&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Points to notice&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;A useful application built in a single web form and a folder with images&lt;/li&gt;&lt;br /&gt; &lt;li&gt;The EnableScriptGlobalization feature on the ScriptManager and the ability to extract language information in javascript using Sys.CultureInfo.CurrentCulture.name.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;License&lt;/h2&gt;Copyright (c) 2008, Ole L. Sørensen&lt;br /&gt;All rights reserved.&lt;br /&gt;&lt;br /&gt;Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.&lt;/li&gt;&lt;li&gt;Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.&lt;/li&gt;&lt;li&gt;The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;&lt;br /&gt;(The above license is based on the BSD license here: &lt;a href="http://www.opensource.org/licenses/bsd-license.php"&gt;http://www.opensource.org/licenses/bsd-license.php&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-5666294375077781835?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2008/10/image-browser-with-aspnet-ajax.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_2QX4wY6qKhY/SORwQ2hgorI/AAAAAAAAAPw/ZJReoNJsYBM/s72-c/ImageBrowserSample.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7690561670933886246.post-7821628970908040072</guid><pubDate>Wed, 01 Oct 2008 11:50:00 +0000</pubDate><atom:updated>2008-10-01T14:37:21.293+02:00</atom:updated><title>Thinkpad X61S recovery</title><description>&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;The&lt;/span&gt; laptop &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;that&lt;/span&gt; I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;use&lt;/span&gt; at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;work&lt;/span&gt;, an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;IBM&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Lenovo&lt;/span&gt;&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Thinkpad&lt;/span&gt;&lt;/span&gt; X61S, has &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;suffered&lt;/span&gt; a case &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;of&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;brain&lt;/span&gt; loop &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;while&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;installing&lt;/span&gt; Service &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Pack&lt;/span&gt; 1 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;of&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Visual&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Studio&lt;/span&gt; 2008 / .NET 3.5. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;This&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;means&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;that&lt;/span&gt; I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;cannot&lt;/span&gt; start &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;the&lt;/span&gt; computer in Windows &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Vista.&lt;/span&gt; I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;am&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;now&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;doing&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;following&lt;/span&gt; to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;recover&lt;/span&gt; Windows Vista as well as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;recover&lt;/span&gt; data:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;During&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;boot&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;pressing&lt;/span&gt; F8 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;opened&lt;/span&gt; an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;overview&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;of&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;boot&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;methods&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;e.g.&lt;/span&gt; "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;safe&lt;/span&gt; mode".&lt;/li&gt;&lt;li&gt;I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;chose&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;first&lt;/span&gt; option: "Repair &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;Your&lt;/span&gt; Computer".&lt;/li&gt;&lt;li&gt;I logged in to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;Rescue&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;Recovery&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;with&lt;/span&gt; an administrator &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;account.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;opened&lt;/span&gt; a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;command&lt;/span&gt; prompt.&lt;/li&gt;&lt;li&gt;I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;connected&lt;/span&gt; a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;USB&lt;/span&gt;&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;hard&lt;/span&gt; disk.&lt;/li&gt;&lt;li&gt;I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;copied&lt;/span&gt; data from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;C-drive&lt;/span&gt; to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;USB&lt;/span&gt;&lt;/span&gt; drive.&lt;/li&gt;&lt;li&gt;I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_60"&gt;recovered&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_61"&gt;the&lt;/span&gt; system to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_62"&gt;its&lt;/span&gt; initial &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_63"&gt;state&lt;/span&gt; (as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_64"&gt;when&lt;/span&gt; it &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_65"&gt;was&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_66"&gt;delivered&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_67"&gt;After&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_68"&gt;that&lt;/span&gt; I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_69"&gt;am&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_70"&gt;going&lt;/span&gt; to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_71"&gt;install&lt;/span&gt; programs &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_72"&gt;etc.&lt;/span&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_73"&gt;e.g.&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_74"&gt;VS&lt;/span&gt;2008/.NET 3.5 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_75"&gt;SP&lt;/span&gt; 1 &lt;strong&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_76"&gt;before&lt;/span&gt;&lt;/strong&gt; I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_77"&gt;work&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_78"&gt;on&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_79"&gt;the&lt;/span&gt; computer!!!!).&lt;/li&gt;&lt;li&gt;Finally I &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_80"&gt;will&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_81"&gt;copy&lt;/span&gt; data from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_82"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_83"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;USB&lt;/span&gt;&lt;/span&gt; drive.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7690561670933886246-7821628970908040072?l=olelynge.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://olelynge.blogspot.com/2008/10/thinkpad-x61s-gendannelse.html</link><author>noreply@blogger.com (Ole Lynge Sørensen)</author><thr:total>0</thr:total></item></channel></rss>

