<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-9138509940389651166</id><updated>2009-11-09T12:14:34.405+01:00</updated><title type='text'>selfelected</title><subtitle type='html'>Experience about programming and architecture&lt;br&gt;
Musings about delivering and quality&lt;br&gt;
Findings about projects and people&lt;br&gt;
 
&lt;a href="http://stopsoftwarepatents.eu/961001041927/"&gt;&lt;img src="http://stopsoftwarepatents.eu/banner/961001041927/ssp-732-121.gif" alt="stopsoftwarepatents.eu petition banner"&gt;&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default?start-index=26&amp;max-results=25'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>130</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3714453278311241515</id><published>2009-11-04T21:15:00.003+01:00</published><updated>2009-11-04T21:36:47.707+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Traverse Corporate Firewalls</title><content type='html'>&lt;p&gt;Sometimes a solution is so secure it becomes insecure.  The primary example of this is requirements for passwords that are so complex that people write them on a note and stick them under their keyboard.&lt;/p&gt;&lt;p&gt;I have several times been locked into a corporate network where the possibility to cooperate with the outside has made my work more complex and expensive.&lt;br /&gt;Limited email storage and chat protocols that don't make it through the router are things that might hinder my work all the way to effectively stopping it.  A limit of 100 megs of email storage makes it impossible to send large emails without risking filling the mail box of a colleague.  Without chat my communication with competence piers is severed.&lt;/p&gt;&lt;p&gt;A slow internet connection makes every search take longer time or give less thorough result.&lt;/p&gt;&lt;p&gt;Then there are hinderances like forbidden FTP, an email washer that stops binaries and source code, or the stopping of youtube in the firewall.&lt;/p&gt;&lt;p&gt;I live in a world, a community, and we communicate.  A big part of my work is to gather information and spread it to interested parties.  Too many times the rules of a corporation network limits this.  Hence workarounds that don't always play well with security but makes my customer happy.  And that is what it is all about, helping your Customer.&lt;/p&gt;&lt;p&gt;Wired has an article &lt;a href="http://howto.wired.com/wiki/Traverse_Corporate_Firewalls"&gt;http://howto.wired.com/wiki/Traverse_Corporate_Firewalls&lt;/a&gt; that explains some workarounds from the dead simple to way more complex.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-3714453278311241515?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/3714453278311241515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=3714453278311241515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3714453278311241515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3714453278311241515'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/11/traverse-corporate-firewalls.html' title='Traverse Corporate Firewalls'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2769579064781682203</id><published>2009-10-18T21:50:00.002+01:00</published><updated>2009-10-18T21:54:47.188+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Unable to open the physical file Operating system error 5: "5(failed to retrieve text for this error. Reason: 15105)". (Microsoft SQL Server, Error: 5</title><content type='html'>&lt;p&gt;Try to attach a database with Management Studio when using Windows 7 and SQLServer 2008 developer edition and one might get an error message similar to the title of the article.&lt;/p&gt;&lt;p&gt;Whether this is a bug or not is beyond my knowledge but the solution/workaround is to connect as SA and not as windows authentication.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2769579064781682203?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2769579064781682203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2769579064781682203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2769579064781682203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2769579064781682203'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/10/unable-to-open-physical-file-operating.html' title='Unable to open the physical file Operating system error 5: &quot;5(failed to retrieve text for this error. Reason: 15105)&quot;. (Microsoft SQL Server, Error: 5'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8816764163731865192</id><published>2009-10-18T21:16:00.010+01:00</published><updated>2009-10-18T21:49:44.490+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Login failed for user 'IIS APPPOOL\DefaultAppPool'.</title><content type='html'>If one uses trusted connection to a sqlserver database under Windows 7 and II7 one might get the error message "Login failed for user 'IIS APPPOOL\DefaultAppPool'." when trying to run a web application.  There are several articles for this but all points to a different GUI than mine (earlier versions of Windows7/IIS7?).&lt;p&gt;Fire up Internet Information Services Manager.  (window-iis-return)&lt;/p&gt;&lt;p&gt;Find the Application Pools item in the Connections toolbar.  One can reuse the default application pool or create a new one.  Go for the latter since it is slightly more complicated and hence more fun.&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 262px; height: 230px;" src="http://lh3.ggpht.com/_uvTAyWQ3FwE/Stt5BV7eGsI/AAAAAAAAAHg/fbEynDG1Wos/IISAddApplicationPool.png" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 239px; height: 215px;" src="http://lh4.ggpht.com/_uvTAyWQ3FwE/Stt5Bra-oVI/AAAAAAAAAHk/ingba3hwx_k/IISAddApplicationPoolDialogue.png" border="0" alt="" /&gt;&lt;/p&gt;&lt;p&gt;I don't know what the settings above do but they seem to work.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Select your newly created application pool and the advanced settings.  Change the Process model to LocalSystem.&lt;br /&gt;(I had planned to create a "better" account with the proper limited rights but ran out of time.  Someone else...?)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 274px; height: 387px;" src="http://lh6.ggpht.com/_uvTAyWQ3FwE/Stt5CPQWSvI/AAAAAAAAAHw/K7mXZWQuM3s/IISApplicationPoolsAdvancedSettingsMenu.png" border="0" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 450px; height: 550px;" src="http://lh6.ggpht.com/_uvTAyWQ3FwE/Stt5B9J_hmI/AAAAAAAAAHs/uhgcneO2FAw/IISApplicationPoolsAdvancedSettingsDialogue.png" border="0" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 446px; height: 257px;" src="http://lh6.ggpht.com/_uvTAyWQ3FwE/Stt5Bu1QC2I/AAAAAAAAAHo/E61yAYmm8Qk/IISApplicationPoolIdentityDialogue.png" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 430px; height: 173px;" src="http://lh6.ggpht.com/_uvTAyWQ3FwE/Stt5K8Y_IDI/AAAAAAAAAH0/znzE-T_fllQ/IISApplicationPoolsListing.png" border="0" alt="" /&gt;&lt;/p&gt;&lt;p&gt;As one can see in the listing above the new application pool runs as different identity than the default ones.&lt;/p&gt;&lt;p&gt;Now change your web application to use this application pool.  This could be made simpler by moving the menu for this to the same place as the other menus.  To make the story short - select your site and look to the right of the IIS manager.&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 161px; height: 295px;" src="http://lh6.ggpht.com/_uvTAyWQ3FwE/Stt5LEaaXTI/AAAAAAAAAH4/Agou1ohzRvE/IISBasicSettings.png" border="0" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 532px; height: 368px;" src="http://lh6.ggpht.com/_uvTAyWQ3FwE/Stt5LD6SdiI/AAAAAAAAAH8/p_zTKHrEwsw/IISEditApplication.png" border="0" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="cursor:pointer; cursor:hand;width: 338px; height: 234px;" src="http://lh4.ggpht.com/_uvTAyWQ3FwE/Stt5LQbHz5I/AAAAAAAAAIA/5CdJc5wD6CQ/IISSelectApplicationPool.png" border="0" alt="" /&gt;&lt;/p&gt;&lt;p&gt;That is all there is to it.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8816764163731865192?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8816764163731865192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8816764163731865192' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8816764163731865192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8816764163731865192'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/10/login-failed-for-user-iis.html' title='Login failed for user &apos;IIS APPPOOL\DefaultAppPool&apos;.'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7651428983770776513</id><published>2009-10-05T20:30:00.003+01:00</published><updated>2009-10-05T20:35:01.658+01:00</updated><title type='text'>Microsoft Virtual CD-ROM</title><content type='html'>&lt;p&gt;Microsoft has for a long time had a very simple application for mounting ISO images to look like a CD-ROM.  The application is called Microsoft Virtual CD-ROM Control Panel.&lt;/p&gt;&lt;p&gt;It is hard to locate though.  The very link is here:&lt;br /&gt;&lt;a href="http://download.microsoft.com/download/7/b/6/7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe"&gt;http://download.microsoft.com/download/7/b/6/7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe&lt;/a&gt;&lt;br /&gt;and can for instance be found through &lt;a href="http://support.microsoft.com/kb/916902"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It works for 2000?, XP, Vista, 2003, 2008? but not Windows7.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7651428983770776513?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7651428983770776513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7651428983770776513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7651428983770776513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7651428983770776513'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/10/microsoft-virtual-cd-rom.html' title='Microsoft Virtual CD-ROM'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5535151037221738290</id><published>2009-10-05T19:55:00.002+01:00</published><updated>2009-10-05T19:59:48.806+01:00</updated><title type='text'>How to install Visual Studio 2008 for TFS</title><content type='html'>&lt;p&gt;Installing Visual Studio 2008 is a breeze.  Installing it to work with TFS is not so.  It is not even enough to install the Visual Studio 2008 TFS update but one has to install Visual Studio 2008 SP1 as well.  In this written order.&lt;/p&gt;&lt;p&gt;And &lt;a href="http://www.bandgap.cs.rice.edu/classes/comp410/resources/Using%20TFS/Home.aspx"&gt;here&lt;/a&gt; is where I got this information.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5535151037221738290?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5535151037221738290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5535151037221738290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5535151037221738290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5535151037221738290'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/10/how-to-install-visual-studio-2008-for.html' title='How to install Visual Studio 2008 for TFS'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7647620968233650224</id><published>2009-07-28T21:41:00.023+01:00</published><updated>2009-10-05T19:55:49.190+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Tools I use</title><content type='html'>&lt;p&gt;Below are the tools, sites and stuff I use.  I plan to update it as it goes.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7-zip&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.7-zip.org/"&gt;http://www.7-zip.org/&lt;/a&gt;&lt;br /&gt;Even though I have a Winzip license I haven't bothered installing it for several years.  I guess Microsoft killed Winzip through having simple zip support out of the box and for all other needs there are 7-zip.&lt;br /&gt;Open source.&lt;br /&gt;Winzip deserves an extra mentioning though due to their license: your payment is also valid for all updates.  Many many other software companies have something to learn there.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Agent ransack&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.mythicsoft.com/agentransack/"&gt;http://www.mythicsoft.com/agentransack/&lt;/a&gt;&lt;br /&gt;The built in searching software in Windows XP and forward sucks big time.  To its defense I must say that it searches Microsoft office documents.  But since it doesn't search all folders it is rendered useless for a developer like me.  Agent ransack searches fast, very fast, and has a simple regex tool to refine searches.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Autohotkey&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.autohotkey.com/"&gt;http://www.autohotkey.com/&lt;/a&gt;&lt;br /&gt;This open source solution is handy for global shortcuts.  I use it to set the size of windows to cover half the left, right, top or bottom.  I also send my windows between my monitors with a similar keystroke.  It has a wierd scripting language and some bugs regarding how big monitors and windows are.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Blogger&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://blogger.com/"&gt;http://blogger.com/&lt;/a&gt;&lt;br /&gt;A blogging site.  Less-than-good user interface for writing.  And the UI hasn't been updated for ages. &lt;br /&gt;Gratis.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Connectionstrings.com&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://connectionstrings.com/"&gt;http://connectionstrings.com/&lt;/a&gt;&lt;br /&gt;In Windows one have to have a connection string to connect to a database.  These come in all colours and tastes.  This site has a comprehensive list.  Gratis.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Dpack&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.usysware.com/dpack/"&gt;http://www.usysware.com/dpack/&lt;/a&gt;&lt;br /&gt;It is an addin to Visual Studio.  Gratis.  A must-have if you develop in Visual studio.&lt;br /&gt;The most used shortcuts, for me, are alt-u to open files and alt-m to go to a method.  With this there is no more searching for files in the solution explorer or scrolling up and down looking for the right method.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Filezilla&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://filezilla-project.org/"&gt;http://filezilla-project.org/&lt;/a&gt;&lt;br /&gt;Filezilla is a free FTP server and client.  I only use the client.  I cannot say if it is the best of its crop or has some whiz-bang stuff that oushines the competition but it is free and fairly simple to use.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Keepass&lt;br /&gt;&lt;/strong&gt;&lt;a href="http://keepass.info/"&gt;http://keepass.info/&lt;/a&gt;&lt;br /&gt;I have lots of passwords and so do most of us.  Instead of having the same password for most places or a system of passwords, use unique ones; then you don't have to worry about people getting your hotmail because they got hold of the passwords for a small site somewhere and successfullly try it on hotmail too.&lt;br /&gt;I have the same database synchronized with my Windows mobile phone; this requires an older version of the software unfortunately, but I keep the passwords with me without the need of a computer.&lt;br /&gt;It is open source so you can inspect the source code at will.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Media-convert.com&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://media-convert.com/"&gt;http://media-convert.com/&lt;/a&gt;&lt;br /&gt;A gratis site for converting all sorts of formats, not only video and sound.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MyGeneration&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.mygenerationsoftware.com/"&gt;http://www.mygenerationsoftware.com/&lt;/a&gt;&lt;br /&gt;I am a sucker for not writing code I don't have to.  Automatic code generation is the way to go.&lt;br /&gt;Open source.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Notepad2&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.flos-freeware.ch/notepad2.html"&gt;http://www.flos-freeware.ch/notepad2.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.kliu.org/misc/notepad2/"&gt;http://code.kliu.org/misc/notepad2/&lt;/a&gt;&lt;br /&gt;I don't think Notepad2 is the best editor out there.  Not even close really.  But it makes it easy to exchange your Notepad.exe with the vastly superior and open source Notepad2.  Notetab does the same pre WinXP and possibly many other editors too but this is the only I have tried (post win2k) and I use it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NUnit&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://nunit.org/index.php"&gt;http://nunit.org/index.php&lt;/a&gt;&lt;br /&gt;Automatic testing is considered good.  I might be too much to test &lt;em&gt;everything&lt;/em&gt; but the important things and the difficult things are worth while to test automatically.&lt;br /&gt;Open source.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NUnitEx&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/nunitex/"&gt;http://code.google.com/p/nunitex/&lt;/a&gt;&lt;br /&gt;This open source extension lib to NUnit makes it more fluent to write assertions.  The best return of investment is when writing tests for exception throwing.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Opera&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.opera.com/"&gt;http://www.opera.com/&lt;/a&gt;&lt;br /&gt;This is my primary web browser and has been since before 2000.  For certain development things Firefox is better and one must have Internet explorer around for about one site a year but for the other 8759 hours Opera is to prefer.Web browsers are a pain to user with the keyboard.  Opera lets you navigate between the controls with shift-arrows; so much easier debugging when one doesn't have to grab for the mouse all the time.&lt;br /&gt;Gratis.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Opera mobile&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.opera.com/mobile/"&gt;http://www.opera.com/mobile/&lt;/a&gt;&lt;br /&gt;Arguably the best mobile browser for fat mobile phones.  It is gratis.&lt;br /&gt;For smaller phones I would use Opera mini that renders the web page in a farm and then sends just the result.  It doesn't work with javascript heavy sites though.&lt;br /&gt;There is an application, Skyfire, that I believe works like Opera mini.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pastebin.com&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/"&gt;http://pastebin.com/&lt;/a&gt;&lt;br /&gt;If you ever have tried sending a snippet over email or especially chat you know bad how the layout gets scrambled.  Enter Pastebin.&lt;br /&gt;Paste the code into Pastebin and send the unique URL.  It even has history so when chatting you can update the code and resend.&lt;br /&gt;Gratis.&lt;br /&gt;There are competitors but I havn't found any as good.&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PDFCreator&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/pdfcreator/"&gt;http://sourceforge.net/projects/pdfcreator/&lt;/a&gt;&lt;br /&gt;To create PDF documents I use an open source solution.  It installs itself as a printer so it is usable for everything from everywhere.  For reading I use OpenOffice instead of the &lt;a href="http://selfelected.blogspot.com/2007/07/bloatware-acrobat.html"&gt;competitor-for-the-worst-software-written-ever program&lt;/a&gt; from Adobe themselves.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PowerCommand for Visual Studio 2008&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://code.msdn.microsoft.com/PowerCommands"&gt;http://code.msdn.microsoft.com/PowerCommands&lt;/a&gt;&lt;br /&gt;Gratis.  Source code available but I don't know if there are any strings attached.&lt;br /&gt;It has Copy reference and Open folder and Open command prompt.  No more tedious searching for references or walking all over the hard drive to find the correct folder.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Spam gourmet&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.spamgourmet.com/"&gt;http://www.spamgourmet.com/&lt;/a&gt;&lt;br /&gt;An online solution for one time email addresses.  Good for avoiding spam.  It is gratis but it sometimes takes a while for the emails to pass through.Approximately the same result can be gained by having a spare email account for this but Spam gourmet comes with a number-of-possible-sendings solution that might be handy.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;VLC&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.videolan.org/vlc/"&gt;http://www.videolan.org/vlc/&lt;/a&gt;&lt;br /&gt;There are many media players.  VLC is one of them.  I use it since it takes most formats.&lt;br /&gt;It went version 1 in 2009.&lt;br /&gt;Open source.There is another well known application, Media player classic, that does approximately the same.  To be honest, I use both.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Winmerge&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://winmerge.org/"&gt;http://winmerge.org/&lt;/a&gt;&lt;br /&gt;This is an open source diff tool.  It has a nice keyboard navigation, something that the diff program that comes with Visual studio has totally messed up.  None of these two have any knowledge about classes and methods so if you swap two methods it is recognized as add and delete instead of the move it really is.&lt;br /&gt;Somewhere I found a program that can diff 3 files at once but the URL is since long forgotten.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7647620968233650224?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7647620968233650224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7647620968233650224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7647620968233650224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7647620968233650224'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/07/tools-i-use.html' title='Tools I use'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1003586544920656891</id><published>2009-07-22T20:42:00.008+01:00</published><updated>2009-07-22T21:05:26.909+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>NUnitEx</title><content type='html'>&lt;p&gt;&lt;a href="http://code.google.com/p/nunitex/"&gt;NUnitEx&lt;/a&gt; is an extension to &lt;a href="http://nunit.org/index.php"&gt;NUnit&lt;/a&gt;.  It makes the assertions more of a flow to write.&lt;/p&gt;&lt;p&gt;Instead of writing&lt;br /&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; myString = MyMethod();&lt;br /&gt;Assert.AreEqual( &lt;span class="str"&gt;"selfelected"&lt;/span&gt;, myString );&lt;/pre&gt;one writes&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; myString = MyMethod();&lt;br /&gt;myString.Should().Be.EqualTo( &lt;span class="str"&gt;"selfelected"&lt;/span&gt; );&lt;/pre&gt;A good thing with the former approach is that the coloured syntax makes it easier to distinquish method calls from assertions.&lt;p&gt;But when one tests exception throwing nunitex is the way to go.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Originally one had to write one method per call that threw an exception.  Even as a happy typist I think it was too much.  Nunitex easily handles exception throwing calls almost as ordinary calls.&lt;/p&gt;&lt;p&gt;See the example code at &lt;a href="http://code.google.com/p/nunitex/"&gt;http://code.google.com/p/nunitex/&lt;/a&gt; for yourself.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-1003586544920656891?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1003586544920656891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1003586544920656891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1003586544920656891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1003586544920656891'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/07/nunitex.html' title='NUnitEx'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-6983372347684977237</id><published>2009-07-13T19:04:00.002+01:00</published><updated>2009-07-13T19:08:58.102+01:00</updated><title type='text'>Go to definition VBNet to C#</title><content type='html'>&lt;p&gt;In visual studio a very handy context menu item is the Go to definition item.  Position you caret on a metod call, open the context menu and choose "Go to definition".  The caret is then positioned on the method.  Press ctrl-minus to go back again.&lt;/p&gt;&lt;p&gt;You cannot do this when a VBNet project calls a method i a C# dll.  The trick here is to instead choose Find all references and choose the correct result row.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-6983372347684977237?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/6983372347684977237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=6983372347684977237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6983372347684977237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6983372347684977237'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/07/go-to-definition-vbnet-to-c.html' title='Go to definition VBNet to C#'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7052540536736442454</id><published>2009-07-13T18:58:00.004+01:00</published><updated>2009-07-13T19:04:53.069+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Xml comment check</title><content type='html'>&lt;p&gt;In C#/VBNet there is a nifty thing called &lt;a href="http://selfelected.blogspot.com/2009/03/tip-for-writing-xml-comments-in-csharp.html"&gt;Xml comments&lt;/a&gt;.  I always use it to explain my methods and classes.  A good thing about Xml comments is that they pop up as intellisense.  Press ctrl-J at your method call and your comments are shown.  The comments survive project boundaries so your well crafted comments in the business layer pop up at the presentation method calls to aid the GUI programmers.&lt;/p&gt;&lt;p&gt;The comments don't travel C#-&gt;VBNet though.&lt;/p&gt;&lt;p&gt;In VBNet you get squiggly lines when the method call and the Xml comment don't match.  In C# you have to go through the Analyze-&gt;Run code analysis to get the differences.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7052540536736442454?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7052540536736442454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7052540536736442454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7052540536736442454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7052540536736442454'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/07/xml-comment-check.html' title='Xml comment check'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-6202249898937168626</id><published>2009-07-13T18:43:00.004+01:00</published><updated>2009-07-13T18:54:20.518+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Visual studio database edition - how to think to get started</title><content type='html'>&lt;p&gt;&lt;a href="http://blogs.msdn.com/gertd/archive/2007/11/21/visual-studio-team-system-2008-database-edition.aspx"&gt;Visual studio database edition&lt;/a&gt; is part of the "normal" Visual studio.  One cannot be totally sure of this since Microsofts licences are as comprehensible as scientology.&lt;/p&gt;&lt;p&gt;I made two tries at it before I got it to work.  Then it &lt;a href="http://selfelected.blogspot.com/2009/07/visual-studio-net-database-edition-does.html"&gt;failed&lt;/a&gt; me anyway, but that is another posting.&lt;/p&gt;&lt;p&gt;The way to think is to think about the database as &lt;strong&gt;source code&lt;/strong&gt;.  You make changes, compare them to the checked in/commited code and let the machine do its magic merge and check in the result.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-6202249898937168626?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/6202249898937168626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=6202249898937168626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6202249898937168626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6202249898937168626'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/07/visual-studio-database-edition-how-to.html' title='Visual studio database edition - how to think to get started'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3102114407093740689</id><published>2009-07-13T18:30:00.003+01:00</published><updated>2009-07-13T18:42:39.154+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Visual studio net database edition does not handle data</title><content type='html'>&lt;p&gt;The title is not totally correct; it does handle data.  But it cannot do version management on your database if you have data in it properly.&lt;/p&gt;&lt;p&gt;Like this:&lt;br /&gt;A year into the project you/the customer realize that a Customer can be split into InternalCustomer and ExternalCustomer and a decision is made to make Customer the base class and the other two children.  An &lt;a href="http://selfelected.blogspot.com/2007/10/right-solution-is-often-right.html"&gt;accordingly correct decision&lt;/a&gt; is made to create two new tables in the database and have them have their corresponding fields.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Technically, or database script wise, this means&lt;br /&gt;1) create two new tables&lt;br /&gt;2) select data from the Customer table into the two child tables &lt;em&gt;&lt;- oops&lt;/em&gt;&lt;br /&gt;3) drop some fields in the Customer table&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Visual studio database edition can handle 1) and 3) but there is no way to tell it to run a custom script in between.&lt;/p&gt;&lt;p&gt;This unfortunately makes the product useless for me.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-3102114407093740689?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/3102114407093740689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=3102114407093740689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3102114407093740689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3102114407093740689'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/07/visual-studio-net-database-edition-does.html' title='Visual studio net database edition does not handle data'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8171423404634159683</id><published>2009-06-05T11:22:00.005+01:00</published><updated>2009-06-05T11:42:16.935+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Slow sqlserver express</title><content type='html'>&lt;p&gt;I got informed of something somewhat strange the other day.  &lt;a href="http://www.microsoft.com/express/sql/default.aspx"&gt;Microsoft SQLServer Express&lt;/a&gt; runs (connects) faster if you have a query window to the database already.&lt;/p&gt;&lt;p&gt;Like this:&lt;/p&gt;&lt;p&gt;Have a freshly booted machine with only Visual studio running and your web application of choice.  The time for a refresh of you web page might take 5 seconds.&lt;/p&gt;&lt;p&gt;Now start &lt;a href="http://en.wikipedia.org/wiki/SQL_Server_Management_Studio"&gt;Management Studio&lt;/a&gt; and open a query window.  Let it stay open.&lt;br /&gt;Refresh your page and you are down to a second.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The figures might of course change but they are what I have on a dual core 2GHz 4MB machine for a project of size X and database of size Y.&lt;/p&gt;&lt;p&gt;----&lt;/p&gt;&lt;p&gt;I haven't checked if the same thing happens with another script editor like for instance &lt;a href="http://www.sqlmaestro.com/products/anysql/maestro/"&gt;AnySQLMaestro&lt;/a&gt; but guess it does.  I guess it has to do with connections - as long as there is a connection to SQLExpress, it doesn't close.  If so, it corresponds with the product's raison d'être, a database for applications.&lt;/p&gt;&lt;p&gt;----&lt;/p&gt;&lt;p&gt;I have noticed a correspondence between debug-start-delay and quality of code.  I say that every second wasted waiting on debug start makes the developer unwilling to test more thoroughly and leads to more bugs in the product.&lt;/p&gt;&lt;p&gt;----&lt;/p&gt;&lt;p&gt;Another trick to make web debug start faster &lt;a href="http://selfelected.blogspot.com/2009/04/in-earlier-article-i-mentioned-time.html"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8171423404634159683?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8171423404634159683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8171423404634159683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8171423404634159683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8171423404634159683'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/06/slow-sqlserver-express.html' title='Slow sqlserver express'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4263254310011937335</id><published>2009-04-17T20:47:00.007+01:00</published><updated>2009-04-19T12:47:20.604+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Timer and GUI</title><content type='html'>One cannot use the System.Timers.Timer to update the GUI, instead one gets a cross-thread exception.  The GUI can't be updated from another thread.&lt;br /&gt;&lt;br /&gt;A nice trick to solve this is to use a method that is sensitive for if the call comes from another thread than the GUI is running on.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetTextDelegate(Label label, &lt;span class="kwrd"&gt;string&lt;/span&gt; text);&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetText(Label label, &lt;span class="kwrd"&gt;string&lt;/span&gt; text)&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.InvokeRequired)&lt;br /&gt;       {&lt;br /&gt;           IAsyncResult res = BeginInvoke(&lt;span class="kwrd"&gt;new&lt;/span&gt; SetTextDelegate(SetText), label, text);&lt;br /&gt;           EndInvoke(res);&lt;br /&gt;       }&lt;br /&gt;       label.Text = text;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.claassen.net/geek/blog/2007/07/cross-thread-data-access.html"&gt;Honor those who should.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4263254310011937335?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4263254310011937335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4263254310011937335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4263254310011937335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4263254310011937335'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/04/timer-and-gui.html' title='Timer and GUI'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4078470648349077437</id><published>2009-04-11T11:31:00.013+01:00</published><updated>2009-05-17T20:21:35.750+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Attach to a process even faster</title><content type='html'>&lt;p&gt;In an &lt;a href="http://selfelected.blogspot.com/2009/04/macro-for-attaching-to-process.html"&gt;earlier article&lt;/a&gt; I mentioned a time saver for web projects where I recommended attaching to the process instead of restarting every time.&lt;/p&gt;&lt;p&gt;Today I invested time in creating a macro for attaching to the &lt;a href="http://nunit.org/"&gt;Nunit&lt;/a&gt; process.  It was easy.&lt;/p&gt;&lt;p&gt;- Instead of learning all commands just record a new macro (menu-&gt;tools-&gt;macro-&gt;record temporarymacro) and connect to the process of choice.&lt;/p&gt;&lt;p&gt;- Then open the macro explorer (menu-&gt;tools-&gt;menu-&gt;macro explorer) which opens a toolbox.  There is a (new) module called RecordingModule.  Open this.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A new IDE opens with something like:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;Sub&lt;/span&gt; AttachToNUnitProcess()&lt;br /&gt;      &lt;span class="rem"&gt;'   MsgBox("AttachToNUnitProcess.Start")&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;Dim&lt;/span&gt; dbg2 &lt;span class="kwrd"&gt;As&lt;/span&gt; EnvDTE80.Debugger2 = DTE.Debugger&lt;br /&gt;          &lt;span class="kwrd"&gt;Dim&lt;/span&gt; trans &lt;span class="kwrd"&gt;As&lt;/span&gt; EnvDTE80.Transport = dbg2.Transports.Item(&lt;span class="str"&gt;"Default"&lt;/span&gt;)&lt;br /&gt;          &lt;span class="kwrd"&gt;Dim&lt;/span&gt; dbgeng(1) &lt;span class="kwrd"&gt;As&lt;/span&gt; EnvDTE80.Engine&lt;br /&gt;          dbgeng(0) = trans.Engines.Item(&lt;span class="str"&gt;"Managed"&lt;/span&gt;) &lt;span class="rem"&gt;' Can be "Native".&lt;/span&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;Dim&lt;/span&gt; proc2 &lt;span class="kwrd"&gt;As&lt;/span&gt; EnvDTE80.Process2 = dbg2.GetProcesses(trans, &lt;span class="str"&gt;"MDG-VILTERSTEN"&lt;/span&gt;).Item(&lt;span class="str"&gt;"nunit.exe"&lt;/span&gt;)&lt;br /&gt;          proc2.Attach2(dbgeng)&lt;br /&gt;      &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; System.Exception&lt;br /&gt;          MsgBox(ex.Message)&lt;br /&gt;      &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;      &lt;span class="rem"&gt;'   MsgBox("AttachToNUnitProcess.Slut")&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;- Testrun your macro in Visualstudio just to make sure it runs properly.&lt;/p&gt;&lt;p&gt;- In the macro editor, create a new Module and copy the code you just created.  Rename module and method.  Save.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Back in Visualstudio, Macro explorer, your new module should be visible.  "Should" - one might have to restart Visualstudio or the toolbox or something.  It should be runnable directly from the Macro explorer toolbox.&lt;/p&gt;&lt;p&gt;- Create a new menu (menu-&gt;tools-&gt;customize ...) and attach your macro.  You find it under "Categories/Macros", just drag it to your new menu or the menu bar.&lt;/p&gt;&lt;p&gt;Now attaching to a process is just a click or keystroke away.&lt;/p&gt;&lt;p&gt;Some more info is found here: &lt;a href="http://msdn.microsoft.com/en-us/library/hdf2d1z8(VS.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/hdf2d1z8(VS.80).aspx&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Update: I debugged a web app for a while yesterday and Wow! - what a difference between 3 clicks and 1 click, or 3 keystrokes and 1 keystroke.  Besides being simpler it also connected faster when the GUI didn't have to render and didn't have to wait for me.  Why haven't I done this years ago?  What else is there I should have done years ago?&lt;/p&gt;&lt;p&gt;Update: I created a new menu and items for every macro I use.  So Fast to use!&lt;br /&gt;There is something that bothers me though.  Some menues dissappear after I restart VSNet, I don't know why.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The macros are easy to start also without having created a menu for them.  Just alt-F8 and then arrow keys to find the right macro and start it with return.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4078470648349077437?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4078470648349077437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4078470648349077437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4078470648349077437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4078470648349077437'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/04/in-earlier-article-i-mentioned-time.html' title='Attach to a process even faster'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-6011174874454734937</id><published>2009-04-11T11:21:00.003+01:00</published><updated>2009-04-11T11:30:52.650+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Macro for attaching to a process</title><content type='html'>&lt;p&gt;When debugging aspnet solutions a lot of time is wasted on restarting the debugged application.  A real time saver is to connect to the process to avoid restarting.&lt;/p&gt;&lt;p&gt;This is done like so:&lt;/p&gt;&lt;p&gt;- When a new bug is found don't stop the web browser, instead detach from the process (menu-&gt;detach-&gt;detach all).&lt;br /&gt;- Update the code to correct the bug.&lt;br /&gt;- Set a breakpoint.&lt;br /&gt;- Connect (menu-&gt;attach to process-&gt;[find the process, it is called something like iis or aspnet]-&gt;attach) to the process.&lt;br /&gt;- Reload the web browser.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are some caveats.  Like when using Webform the viewstate is tightly connected to the controls on the form so it is not always possible to connect.&lt;/p&gt;&lt;p&gt;But for the most times this is a great time saver.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-6011174874454734937?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/6011174874454734937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=6011174874454734937' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6011174874454734937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6011174874454734937'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/04/macro-for-attaching-to-process.html' title='Macro for attaching to a process'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3395810521568384930</id><published>2009-03-22T22:42:00.004+01:00</published><updated>2009-03-22T22:49:36.944+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>truefalse</title><content type='html'>&lt;p&gt;Personally I write &lt;a href="http://selfelected.blogspot.com/2009/03/tip-for-writing-xml-comments-in-csharp.html"&gt;xml comments&lt;/a&gt; on all my methods even though I am a fan of method names  enough describing that comments really are unnecessary.  By &lt;em&gt;descriptive method names&lt;/em&gt; I mean that &lt;em&gt;others also understand&lt;/em&gt; them.&lt;/p&gt;&lt;p&gt;In a project I stumbled upon this method:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;private void ShowHideControl( bool truefalse ){...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Since I had the source code it didn't take much effort to find out what it did.&lt;/p&gt;&lt;p&gt;But a question remains - how do I present the problem for the original programmer without being rude?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-3395810521568384930?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/3395810521568384930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=3395810521568384930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3395810521568384930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3395810521568384930'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/03/truefalse.html' title='truefalse'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4892892666376859871</id><published>2009-03-22T01:09:00.003+01:00</published><updated>2009-03-22T01:15:39.450+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Avoid code ownership</title><content type='html'>&lt;p&gt;I heard a thing the other day I haven't heard for a long time.  "That is not my code"&lt;/p&gt;&lt;p&gt;I believe no code and all code in your current project is Yours.  There is nothing like finding a bug and leaving it be.  If you can't correct it, flag it.  Either in a bug tracking system, to the person currently working with that part or to wherever your project stores possible riscs.&lt;/p&gt;&lt;p&gt;This my code-your code mentality mentioned above lead to the bug being forgotten.&lt;br /&gt;That is not considered good.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4892892666376859871?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4892892666376859871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4892892666376859871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4892892666376859871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4892892666376859871'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/03/avoid-code-ownership.html' title='Avoid code ownership'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3531022000599576818</id><published>2009-03-22T00:57:00.002+01:00</published><updated>2009-03-22T01:08:15.517+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><title type='text'>LINQ examples</title><content type='html'>&lt;p&gt;Linq is sooo good.&lt;/p&gt;&lt;p&gt;The next time you loop a list or array to find a value or two; consider spending 15 minutes to learn some Linq; it is well invested.  The syntax is somewhat like SQL but more straight forward.  For instance the keywords are written "the normal" way.  First what you have (from), then the filtering (where) and finally what you want (select).&lt;/p&gt;&lt;p&gt;var query =&lt;br /&gt;    from c in myCustomerList&lt;br /&gt;    where c.Age &lt; 42&lt;br /&gt;    select c;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If you are looping two lists and compare them to get a new list, you should really look into Linq.  It will save you lots of time.&lt;/p&gt;&lt;p&gt;I found an old site at MSDN with some good examples here: &lt;a href="http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx"&gt;http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-3531022000599576818?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/3531022000599576818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=3531022000599576818' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3531022000599576818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3531022000599576818'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/03/linq-examples.html' title='LINQ examples'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8716461648463474167</id><published>2009-03-20T12:37:00.005+01:00</published><updated>2009-03-20T12:50:01.909+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Time estimation and business objects, CRUDSLM</title><content type='html'>&lt;p&gt;A small rule I have while estimating time or looking into a system is to run &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt;SLM against all business objects and possibly all database tables.&lt;/p&gt;&lt;p&gt;I make sure that every business object has one tick in each C, R, U and D.  This is the normal case and by doing this I guard myself against forgetting something.  There are times when things aren't updated and even not deleted but then I know this and can argue for it.&lt;br /&gt;It is a fast exercise and I usually run it only once against every business object and once against every database table.&lt;/p&gt;&lt;p&gt;For time estimation I extend the CRUD with SLM where the letters are Search, List and Manipulate respectively.  Many times, especially with the main business objects, they are Listed and Searched.  Then for reports, imports and exports they have to be Manipulated too.&lt;/p&gt;&lt;p&gt;I have many times found out that Delete is missing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8716461648463474167?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8716461648463474167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8716461648463474167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8716461648463474167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8716461648463474167'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/03/time-estimation-and-business-objects.html' title='Time estimation and business objects, CRUDSLM'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-997753722187304322</id><published>2009-03-20T12:29:00.003+01:00</published><updated>2009-03-20T12:48:44.234+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>A tip for writing Xml comments in Csharp</title><content type='html'>There is something called xml comments in the dotnet world.&lt;br /&gt;&lt;br /&gt;It looks something like&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;///&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="name"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;public User FindUser( string name )&lt;br /&gt;{...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The trick here is to write the comments on the very first line.  Like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;/// &amp;lt;summary&amp;gt;This method finds and returns a User by its name.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="name"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;public User FindUser( string name )&lt;br /&gt;{...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When the code is folded it then looks like&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;/// &amp;lt;summary&amp;gt;This method finds and returns a User by its name. ...&lt;br /&gt;public User FindUser( string name )...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Visual Studio "suggests" writing the comments on line two, like&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// This method finds and returns a User by its name.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="name"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;public User FindUser( string name )&lt;br /&gt;{...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;but then after folding it looks like&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;/// &amp;lt;summary&amp;gt; ...&lt;br /&gt;public User FindUser( string name )...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(this is not a problem in vbnet)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-997753722187304322?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/997753722187304322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=997753722187304322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/997753722187304322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/997753722187304322'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/03/tip-for-writing-xml-comments-in-csharp.html' title='A tip for writing Xml comments in Csharp'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4720614141019095822</id><published>2009-03-01T20:26:00.007+01:00</published><updated>2009-11-04T21:57:14.153+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><title type='text'>Visual Studio suddenly refuses to show forms in the designer</title><content type='html'>&lt;p&gt;&lt;strong&gt;Short story:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Totally wierd.  One day VSNet of my colleague refused to open a form.&lt;/p&gt;&lt;p&gt;The solution was to run "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe" /ResetSkipPkgs&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Long story:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;VSNet 2008 suddenly refused to open a form in a VBNet project with the message&lt;/p&gt;&lt;p&gt;---------------------------&lt;br /&gt;Microsoft Visual Studio&lt;br /&gt;---------------------------&lt;br /&gt;There is no editor available for 'C:\Documents and Settings\myusername\Local Settings\Application Data\Temporary Projects\WindowsApplication1\Form1.vb'.&lt;br /&gt;Make sure the application for the file type (.vb) is installed.&lt;br /&gt;---------------------------&lt;br /&gt;OK   &lt;br /&gt;---------------------------&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(&lt;a href="http://selfelected.blogspot.com/2007/11/screen-dump-of-message-box.html"&gt;How to copy error message dialogues.&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;Googling didn't give much.&lt;/p&gt;&lt;p&gt;Repair did nothing.  It stopped after a "...has encountered a problem..." with Ok as only choice.&lt;br /&gt;Uninstallation din't work; the same error as above.&lt;br /&gt;Uninstalled through a tool found &lt;a href="http://connect.microsoft.com/VisualStudio/content/content.aspx?ContentID=7276"&gt;here&lt;/a&gt;.  Reinstalled VSNet2008 and Service Pack 1.  The "total uninstallation" was a fraud, the old projects still populated the MRU list :-(  And the problem remained.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;My colleague created a new winform project in C# where the problem was the same but the error message different.&lt;/p&gt;&lt;p&gt;---------------------------&lt;br /&gt;Microsoft Visual Studio&lt;br /&gt;---------------------------&lt;br /&gt;Project 'WindowsFormsApplication1' could not be opened because the Microsoft Visual C# 2008 compiler could not be created. QueryService for '{74946829-37A0-11D2-A273-00C04F8EF4FF}' failed.&lt;br /&gt;---------------------------&lt;br /&gt;OK   &lt;br /&gt;---------------------------&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This gave us more Google fodder to find more switches &lt;a href="http://msdn.microsoft.com/en-us/library/xee0c8y7.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;After running "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe" /ResetSkipPkgs the sky was sunny again.&lt;/p&gt;&lt;p&gt;This took the better part of a day.&lt;/p&gt;&lt;p&gt;Why didn't uninstall all remove everything.  Who do Microsoft think they are?  &lt;a href="http://selfelected.blogspot.com/2007/07/bloatware-acrobat.html"&gt;Adobe&lt;/a&gt;?&lt;/p&gt;&lt;p&gt;(the dialogue dumps above were easily copied with ctrl-c. read more &lt;a href="http://selfelected.blogspot.com/2007/11/screen-dump-of-message-box.html"&gt;here&lt;/a&gt;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4720614141019095822?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4720614141019095822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4720614141019095822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4720614141019095822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4720614141019095822'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/03/visual-studio-suddenly-refuses-to-show.html' title='Visual Studio suddenly refuses to show forms in the designer'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7918078419601157997</id><published>2009-02-28T14:17:00.005+01:00</published><updated>2009-02-28T14:30:32.796+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><title type='text'>Shanzhai</title><content type='html'>&lt;p&gt;In the west we are raised in a strong belief that everything can be owned; written text, images and even land(!)  With this belief as our Pen and money as our Sword we push this way of thinking on the rest of the world so as to keep our wealth.&lt;/p&gt;&lt;p&gt;Not everyone has this same belief and are happy to invent and reinvent former inventions and constructions instead of protecting the old.  One word for this is plagiarism, another is Shanzhai.  I am afraid a new word will be "economic terrorism".&lt;/p&gt;&lt;p&gt;If I claim that others follow my rules then I should be prepared to follow theirs; I am not automatically right because I have a bigger gun.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.bunniestudios.com/blog/?p=284"&gt;http://www.bunniestudios.com/blog/?p=284&lt;/a&gt;&lt;br /&gt;&lt;a href="http://online.wsj.com/article/SB123257138952903561.html"&gt;http://online.wsj.com/article/SB123257138952903561.html&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7918078419601157997?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7918078419601157997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7918078419601157997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7918078419601157997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7918078419601157997'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/02/shanzhai.html' title='Shanzhai'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-6501428135840509996</id><published>2009-02-20T21:27:00.001+01:00</published><updated>2009-02-20T21:29:47.199+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Which open source license to choose</title><content type='html'>There are like 78 open source licenses to choose from.  The original creator of the open source license idea has an argument that 3 or 4 should do.&lt;br /&gt;&lt;p&gt;So if you ever think of choosing a license for you work this is a good place to start.&lt;/p&gt;&lt;p&gt;&lt;a href="http://itmanagement.earthweb.com/osrc/article.php/3803101/Bruce-Perens-How-Many-Open-Source-Licenses-Do-You-Need.htm"&gt;http://itmanagement.earthweb.com/osrc/article.php/3803101/Bruce-Perens-How-Many-Open-Source-Licenses-Do-You-Need.htm&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-6501428135840509996?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/6501428135840509996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=6501428135840509996' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6501428135840509996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6501428135840509996'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/02/which-open-source-license-to-choose.html' title='Which open source license to choose'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3070271426168108583</id><published>2009-02-09T20:37:00.004+01:00</published><updated>2009-02-09T20:42:48.917+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Sortable IBindlinglist</title><content type='html'>&lt;p&gt;Datagridviews in dotnet work well with datasets.  They work less good with "normal" objects; for instance sorting is much more of a hassle to implement.&lt;/p&gt;&lt;p&gt;The sorting problem is solved nicely in this &lt;a href="http://groups.google.co.uk/group/microsoft.public.dotnet.languages.csharp/msg/2b7528c689f9ef84"&gt;http://groups.google.co.uk/group/microsoft.public.dotnet.languages.csharp/msg/2b7528c689f9ef84&lt;/a&gt; piece of code.  It is more or less just to copy the code and violà, a sortable object list.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-3070271426168108583?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/3070271426168108583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=3070271426168108583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3070271426168108583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3070271426168108583'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/02/sortable-ibindlinglist.html' title='Sortable IBindlinglist'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2775524956826972164</id><published>2009-02-04T23:49:00.003+01:00</published><updated>2009-02-04T23:53:54.375+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Annotate in TFS</title><content type='html'>&lt;p&gt;There is a somewhat hidden feature in Visual Studio TFS edition (or whatever it is called) for checking who changed a row.  It is called Annotate and can be reached through the context menu.  After some number crunching it gives you a semi graphic view of which row was edited by who.&lt;/p&gt;&lt;p&gt;Further Annotate can be done on other rows but not the same row again; I don't know why.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2775524956826972164?l=selfelected.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2775524956826972164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2775524956826972164' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2775524956826972164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2775524956826972164'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/02/annotate-in-tfs.html' title='Annotate in TFS'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07712001914250460579'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry></feed>