<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9138509940389651166</id><updated>2012-02-16T12:48:46.613+01:00</updated><category term='wishlist'/><category term='documentation'/><category term='not-yet-fully-invented'/><category term='innovation'/><category term='strong typing'/><category term='solid code'/><category term='code'/><category term='project'/><category term='architecture'/><category term='fail-at-once'/><category term='misc'/><category term='tip'/><category term='database'/><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?max-results=100'/><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=101&amp;max-results=100'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>148</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-9054496929928791577</id><published>2010-04-16T20:26:00.002+01:00</published><updated>2010-04-16T20:26:52.828+01:00</updated><title type='text'>Moved to www.selfelected.com</title><content type='html'>I have moved this blog to &lt;a href="http://www.selfelected.com/"&gt;http://www.selfelected.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy hacking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-9054496929928791577?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.selfelected.com' title='Moved to www.selfelected.com'/><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/9054496929928791577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=9054496929928791577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/9054496929928791577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/9054496929928791577'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/04/moved-to-wwwselfelectedcom.html' title='Moved to www.selfelected.com'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7462100421127477887</id><published>2010-04-12T20:58:00.003+01:00</published><updated>2010-04-12T21:30:45.447+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Visual Studio 2010 installation</title><content type='html'>&lt;span style="font-family:times new roman;"&gt;If you get&lt;/span&gt;&lt;br /&gt;  &lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;---------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;Microsoft Visual Studio 2010 Ultimate Setup&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;---------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;Some components must be installed in c:\Program Files\Microsoft Visual Studio 10.0\ directory. Check that you have write permissions and enough space in that directory.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;---------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;OK   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;---------------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div  style="font-family:times new roman;"&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-size:medium;" &gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;when you try to install Visual studio 2010; &lt;span style="font-family:times new roman;"&gt;don't despair.&lt;/span&gt;&lt;br /&gt;There is a big chance you try to install from a mounted virtual disc.&lt;br /&gt;&lt;br /&gt;The resolution is to copy the files in the mounted disk to real files and run it from there.  One could possibly also assign the mounted disk a letter but I haven't tried this.&lt;br /&gt;&lt;br /&gt;I have learned that there is also some problem when installing from a network share.  The symptom is something about a .cab file with a faulty digital signature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7462100421127477887?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7462100421127477887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7462100421127477887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7462100421127477887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7462100421127477887'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/04/visual-studio-2010-installation.html' title='Visual Studio 2010 installation'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-598527088276866796</id><published>2010-03-16T22:40:00.002+01:00</published><updated>2010-03-16T22:47:45.138+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Coderush and camelCase and select</title><content type='html'>I am a long time fan of &lt;a href="http://selfelected.blogspot.com/2009/07/tools-i-use.html"&gt;DPack&lt;/a&gt;.  Some time ago Coderush stepped up to a must-have.&lt;br /&gt;&lt;br /&gt;The other day I noticed that &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/"&gt;Coderush&lt;/a&gt; did camel case selection.  It is like this:&lt;br /&gt;Open the Vsnet editor with your favourite project and go to a camelCased or PascalCased word.  Select it with ctrl-shift-right/left.  This is old news.&lt;br /&gt;Now instead use alt-shift-right/left; only a part of the word is highlighted.  Perfect when copy-pasting variables like CustomerName and SerialNumber.&lt;br /&gt;&lt;br /&gt;Coderush comes both in gratis and pay versions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-598527088276866796?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/598527088276866796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=598527088276866796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/598527088276866796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/598527088276866796'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/03/coderush-and-camelcase-and-select.html' title='Coderush and camelCase and select'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1300774086869216300</id><published>2010-03-15T22:15:00.006+01:00</published><updated>2010-03-16T21:54:56.087+01:00</updated><title type='text'>Aspnet MVC 2 starter project compilation error</title><content type='html'>When starting your first Aspnet MVC2 project you might immediately run into compilation errors like these:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Error    1    The type or namespace name 'Controllers' does not exist in the namespace 'MvcApplication1' (are you missing an assembly reference?)    C:\myprojectpath\MvcApplication1.Tests\Controllers\HomeControllerTest.cs    8    23    MvcApplication1.Tests&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;Error    3    The type or namespace name 'Models' does not exist in the namespace 'MvcApplication1' (are you missing an assembly reference?)    C:\myprojectpath\MvcApplication1.Tests\Controllers\AccountControllerTest.cs    10    23    MvcApplication1.Tests&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Error    4    The type or namespace name 'AccountController' could not be found (are you missing a using directive or an assembly reference?)    C:\myprojectpath\MvcApplication1.Tests\Controllers\AccountControllerTest.cs    317    24    MvcApplication1.Tests&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The origin of the problem is that the test project doesn't reference the web project.  Just add the reference and you're good to go.&lt;br /&gt;&lt;br /&gt;I haven't found the solution on google yet so I write this here to someones possible future aid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-1300774086869216300?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1300774086869216300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1300774086869216300' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1300774086869216300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1300774086869216300'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/03/aspnet-mvc-2-starter-project.html' title='Aspnet MVC 2 starter project compilation error'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5262605140816729188</id><published>2010-03-04T23:06:00.004+01:00</published><updated>2010-03-04T23:27:42.305+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'>Checking events in VBNet</title><content type='html'>Due to some reason unknown to man the team behind VBNet decided that the developer should not be able to see if someone listened to your event or not.  It is good in most cases but very bad in another.&lt;br /&gt;&lt;br /&gt;In Csharp raising an event goes something like this:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    var ev = MyEvent;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;   if( null != ev ){ ev( this, args ); }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just look through the snippets (look in the context menu in the editor) and you will find the correct way to raise an event in Csharp.&lt;br /&gt;&lt;br /&gt;VBNet on the other hand hides the if statement and the temporary variable from the developer.  It is enough to write&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    RaiseEvent Me, args&lt;/span&gt;&lt;br /&gt;and the event will be raise if there is someone listening - no need to check for null.&lt;br /&gt;&lt;br /&gt;But what if you want to check if someone is listening.  In my case I needed to know if the custom control was properly wired into the scaffolding of the application; the user control sometimes whished for more information and I had to know if someone was listening.&lt;br /&gt;In Csharp this would have been easy with a check for null.  But VBNet...&lt;br /&gt;&lt;br /&gt;The solution is hidden.  Just check the variable "MyEvent&lt;span style="font-style: italic;"&gt;Event&lt;/span&gt;".  This means that your MyClick event has a hidden variable MyClickEvent that you can check for like this:&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;    If MyClickEvent IsNot Nothing Then&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't like to use hidden and unoffical solutions but this is the only way I know of.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bit.ly/bEyf7E"&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-5262605140816729188?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5262605140816729188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5262605140816729188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5262605140816729188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5262605140816729188'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/03/checking-events-in-vbnet.html' title='Checking events in VBNet'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2682204362303985214</id><published>2010-03-04T23:05:00.001+01:00</published><updated>2010-03-04T23:06:43.129+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Selfelected - ideas</title><content type='html'>I just started another blog which only presents ideas yet to be implemented.&lt;br /&gt;&lt;a href="http://selfelected.wordpress.com/"&gt;http://selfelected.wordpress.com/&lt;/a&gt;&lt;br /&gt;Feel free to implement anyone of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2682204362303985214?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2682204362303985214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2682204362303985214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2682204362303985214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2682204362303985214'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/03/selfelected-ideas.html' title='Selfelected - ideas'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-6050538484987446221</id><published>2010-02-04T21:27:00.005+01:00</published><updated>2010-02-04T21:37:27.873+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'>DesignMode in Visual Studio, inheritance, process name and a work around</title><content type='html'>The text and code below is only tested for Winform.  WPF might behave differently; hopefully behaves differently.&lt;br /&gt;&lt;br /&gt;I won't go into any details on why the ISite.DesignMode is good and sometimes even crucial to have.  It is much better done in the link at the bottom.&lt;br /&gt;&lt;br /&gt;First out there is unfortunately a caveat with DesignMode, it doesn't work with inherited forms and user controls.  This is a problem since I always inherit from the base form in my projects and tell others to do the same.  It also doesn't work inside the form's or the user control's constructor and then by any method that is called by the constructor.  Long call chains to might make this hard to track down.&lt;br /&gt;Secondly there is another way to check for design mode and that is to check for the LicenseManager.UsageMode but this in turn doesn't work in event handlers.&lt;br /&gt;Thirdly one can set a flag in the base Form and base UserControl.  But this doesn't solve the problem since we cannot be sure with what to set this value.&lt;br /&gt;Fourthly is a workaround where one can check for the name of the process itself which is Visual Studio's process name (devenv) in case of design mode.  This process name might change in future releases of Visual Studio and is also different for other IDEs.&lt;br /&gt;Fifthly is other process information like the name of the module and stuff.  Check into the Process and you'll see that the app is called MyApp.vshost.exe while being debugged.&lt;br /&gt;&lt;br /&gt;The fourth solution (processname=devenv) seems to be the most viable but I believe there is something useful in the fifth (other process information).  There must be a way to notice that the name of all your code doesn't match the name of the running environment;  namespace, assembly name, whatever.  I still haven't figured out how though.&lt;br /&gt;&lt;br /&gt;Below is some code to copy-paste.&lt;br /&gt;It is not 100% correct though since the DesignMode property isn't virtual.  This might end with some really tough-to-track-down bugs where one iterates the forms but don't get the overloaded DesignMode flag.  The code also doesn't promise to work forever since there is a magic string naming the name of the Visual Studio process.&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyAppForm : System.Windows.Forms.Form&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; DesignMode&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; HelperMethods.IsDesignMode(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyAppUserControl : UserControl&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; DesignMode&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; HelperMethods.IsDesignMode(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; HelperMethods&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsDesignMode(System.ComponentModel.Component x)&lt;br /&gt;{&lt;br /&gt;var site = x &lt;span class="kwrd"&gt;as&lt;/span&gt; System.ComponentModel.ISite;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;br /&gt;( &lt;span class="kwrd"&gt;null&lt;/span&gt; == site ? &lt;span class="kwrd"&gt;false&lt;/span&gt; : site.DesignMode ) ||&lt;br /&gt;System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime ||&lt;br /&gt;System.Diagnostics.Process.GetCurrentProcess().ProcessName == &lt;span class="str"&gt;"devenv"&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The code above is also in &lt;a href="http://selfelected.pastebin.com/f7a67c8c"&gt;pastebin&lt;/a&gt; for easier copy-paste.&lt;br /&gt;A good article is here: &lt;a href="http://dotnetfacts.blogspot.com/2009/01/identifying-run-time-and-design-mode.html"&gt;http://dotnetfacts.blogspot.com/2009/01/identifying-run-time-and-design-mode.html&lt;/a&gt;&lt;br /&gt;There is a description of how to debug this here: &lt;a href="http://brennan.offwhite.net/blog/2006/08/30/design-time-debugging-aspnet-20-in-visual-studio-2005/"&gt;http://brennan.offwhite.net/blog/2006/08/30/design-time-debugging-aspnet-20-in-visual-studio-2005/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-6050538484987446221?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/6050538484987446221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=6050538484987446221' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6050538484987446221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6050538484987446221'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/02/designmode-in-visual-studio-inheritance.html' title='DesignMode in Visual Studio, inheritance, process name and a work around'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2475349033337648025</id><published>2010-01-28T23:16:00.003+01:00</published><updated>2010-01-28T23:27:23.024+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Share a file in Visual Studio</title><content type='html'>&lt;p&gt;I didn't think it was possible but it has been for years; to share a file between projects in a solution.&lt;/p&gt;&lt;p&gt;Add a file the normal way but instead of pressing Open, use the little dropdown arrow next to.  Then you have the possibility to "link" instead of "add".&lt;/p&gt;&lt;p&gt;This makes it possible to have one and only one file for many places.  It can be a source code file or a readme or anything really.&lt;br /&gt;I have yet to try it with TFS and SVN to make sure it doesn't mess upp the version management.&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/savanness/archive/2003/07/22/10417.aspx"&gt;Honor those who should.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;On a side note: Sourcesafe has linking ability within itself.  I miss it in TFS.  Though: It is easy to lose the master file and keep copies wich makes strange icons.  It also doesn't play well with the VB6 editor when a file will be checked out and another not, but they should be, but the VB6 ide doesn't understand it and you have to do an explicit checkout and... never mind.  It was a long time ago.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2475349033337648025?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2475349033337648025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2475349033337648025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2475349033337648025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2475349033337648025'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/01/share-file-in-visual-studio.html' title='Share a file in Visual Studio'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4924550223872847767</id><published>2010-01-24T20:39:00.003+01:00</published><updated>2010-01-24T20:47:51.218+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Changed keyboard settings</title><content type='html'>&lt;p&gt;In Windows 7 (and possibly Vista) the keyboard layout is sometimes changed back to some sort of default.&lt;/p&gt;&lt;p&gt;The problem shows itself like this - I use the &lt;a href="http://selfelected.blogspot.com/2009/12/us-vs-french-vs-swedish-vs-1337.html"&gt;1337 keyboard layout&lt;/a&gt; in Visual Studio.  Then without warning the keyboard layout changes to US layout; a layout I don't even have installed.  The 1337 layout is based on US though so somehow it shines through.&lt;/p&gt;&lt;p&gt;To get back to 1337 I choose "Open the language bar" in the systray context menu.  The language bar then pops up in another place (top of screen for me) and I can then choose keyboard layout.&lt;/p&gt;&lt;p&gt;The problem will reappear more times until I reboot again.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4924550223872847767?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4924550223872847767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4924550223872847767' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4924550223872847767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4924550223872847767'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/01/changed-keyboard-settings.html' title='Changed keyboard settings'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-652232076012707141</id><published>2010-01-16T11:19:00.005+01:00</published><updated>2010-01-16T11:29:31.906+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Get calling method's name automatically in dotnet</title><content type='html'>Way too many times have I written&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; MyFunction( &lt;span class="kwrd"&gt;int&lt;/span&gt; aNumber)&lt;br /&gt;{&lt;br /&gt; MyHomemadeLogClass.Logg( &lt;span class="str"&gt;"MyFunction"&lt;/span&gt;, &lt;span class="str"&gt;"aNumber="&lt;/span&gt; + aNumber.ToString());&lt;br /&gt; ...&lt;br /&gt;}&lt;/pre&gt;to get logging functionality.&lt;br /&gt;&lt;br /&gt;It would be so nice to just write&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; MyFunction( &lt;span class="kwrd"&gt;int&lt;/span&gt; aNumber)&lt;br /&gt;{&lt;br /&gt; MyHomemadeLogClass.Logg();&lt;br /&gt; ...&lt;br /&gt;}&lt;/pre&gt;It is no hard to do.  Use reflection to get the call stack to get to the method and the parameters.  Convert all this to a readable string.&lt;br /&gt;Unfortunately it is not that easy to log the contents of the parameters, one has to get into some sort of debugger area to do that.&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ReflectionUtility&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; System.Reflection.MethodBase GetCallingMethod()&lt;br /&gt;     {&lt;br /&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Diagnostics.StackTrace().GetFrame(2).GetMethod();&lt;br /&gt;     }&lt;br /&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetCallingMethodFullNameReturnParametertypes()&lt;br /&gt;     {&lt;br /&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; MethodFullNameReturnParametertypes(GetCallingMethod());&lt;br /&gt;     }&lt;br /&gt;     &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; MethodFullNameReturnParametertypes(System.Reflection.MethodBase method)&lt;br /&gt;     {&lt;br /&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0} {1}.{2} ({3})"&lt;/span&gt;,&lt;br /&gt;             ((System.Reflection.MethodInfo)method).ReturnType,    &lt;span class="rem"&gt;// System.Void, System.Int32 etc.&lt;/span&gt;&lt;br /&gt;             method.DeclaringType.FullName,   &lt;span class="rem"&gt;// MyNamespace.MyClass.&lt;/span&gt;&lt;br /&gt;             method.Name,   &lt;span class="rem"&gt;// MyMethod.&lt;/span&gt;&lt;br /&gt;             &lt;span class="kwrd"&gt;string&lt;/span&gt;.Join(&lt;span class="str"&gt;","&lt;/span&gt;, method.GetParameters().Select(p =&amp;gt; p.ParameterType.ToString() + &lt;span class="str"&gt;" "&lt;/span&gt; + p.Name).ToArray())   &lt;span class="rem"&gt;// () or (int) or (int,string) etc.&lt;/span&gt;&lt;br /&gt;             );&lt;br /&gt;     }&lt;br /&gt; }&lt;/pre&gt;To use this in a Logging class one must implement a GetCallingCallingMethod or even worse, but it would make this example hard to read.&lt;br /&gt;&lt;p&gt;One can use the Conditional attribute to avoid the call when not debugging.&lt;/p&gt;&lt;p&gt;I also put the code on &lt;a href="http://selfelected.pastebin.com/f76abacc9"&gt;pastebin&lt;/a&gt; to make the copy-paste easier. (I have yet to find a good way to present code.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-652232076012707141?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/652232076012707141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=652232076012707141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/652232076012707141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/652232076012707141'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/01/log-calling-methods-name-automatically.html' title='Get calling method&apos;s name automatically in dotnet'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2996048627442062818</id><published>2010-01-09T21:47:00.003+01:00</published><updated>2010-01-09T22:05:18.130+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'></title><content type='html'>&lt;p&gt;This is my visual setup of Visual Studio.&lt;/p&gt;&lt;p&gt;Notice how the real estate is used for tools I use and not for buttons that just happens to be there by default.&lt;/p&gt;&lt;p&gt;shift-alt-return maximises the window so not even the caption bar is visible.  I know which program I am working in so I don't need to waste the whole top for this.&lt;/p&gt;&lt;p&gt;I have removed all toolbars.  The buttons I need I have put to the right of the menu.&lt;/p&gt;&lt;p&gt;There are also two macros in the menu bar, one for &lt;a href="http://selfelected.blogspot.com/2009/04/in-earlier-article-i-mentioned-time.html"&gt;connecting the bugger&lt;/a&gt; to nunit and ditto to IIS.&lt;/p&gt;&lt;p&gt;I have set all toolbars to auto hide.  When I debug, the call stack and autos (unfortunately hard to find among the menus with C# projects - open a VBNet project and see what it looks like), toolbox are visible.&lt;/p&gt;&lt;p&gt;I have also moved all toolbars to the right.  When one is working heavily with the forms designer it is good to have the Toolbox toolbar constantly open on the left but only then, and for the 2% of the project I handle the forms I can move it there manually.  The rest of the time I hack code and need nothing but code and debug tools.&lt;/p&gt;&lt;p&gt;I know shortcuts to almost all toolbars.  Those I don't know I don't use that often anyway.  I don't know why some banjo player at Microsoft decided that underlines and shortcut tips should be invisible as default.  Fix it through Tools-&gt;Customize.&lt;/p&gt;&lt;p&gt;This way I use all of the precious display area for stuff I have use of.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uvTAyWQ3FwE/S0jvZWknriI/AAAAAAAAAKM/X4Nmfvywt1c/s1600-h/vs.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="http://3.bp.blogspot.com/_uvTAyWQ3FwE/S0jvZWknriI/AAAAAAAAAKM/X4Nmfvywt1c/s400/vs.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5424848970002705954" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2996048627442062818?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2996048627442062818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2996048627442062818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2996048627442062818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2996048627442062818'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/01/this-is-my-visual-setup-of-visual.html' title=''/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uvTAyWQ3FwE/S0jvZWknriI/AAAAAAAAAKM/X4Nmfvywt1c/s72-c/vs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7828323721621142575</id><published>2010-01-06T23:03:00.015+01:00</published><updated>2010-01-25T21:53:36.394+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strong typing'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><category scheme='http://www.blogger.com/atom/ns#' term='fail-at-once'/><title type='text'>Catch property, field and method name changes compile time in dotnet</title><content type='html'>When you want to populate a dropdown listbox with customers&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Customer&lt;br /&gt;{&lt;br /&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id;&lt;br /&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name;&lt;br /&gt; ...&lt;br /&gt;}&lt;/pre&gt;and have to write&lt;pre class="csharpcode"&gt;&lt;br /&gt;myDropdownListbox.DisplayMember = &lt;span class="str"&gt;"Name"&lt;/span&gt;;&lt;br /&gt;myDropdownListbox.DataMember = &lt;span class="str"&gt;"Id"&lt;/span&gt;;&lt;/pre&gt;or&lt;pre class="csharpcode"&gt;&lt;br /&gt;myGridColumnCustomerName.DatatMeber = &lt;span class="str"&gt;"Name"&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;you really get a sour taste in your mouth.&lt;br /&gt;&lt;br /&gt;Having magic strings like above spread in your code is really bad since it always compiles but might fail runtime.  This means more manual tests.  Which in turns means a certain friction against renaming properties while refactoring.&lt;br /&gt;I have been in way too many projects where one table has a field ItemNumber when it should have been ItemCount and where some fields are called Nr while another Number and these names are spread up in the layers to reach the presentation layer where they surface as magic strings like the examples above.&lt;br /&gt;&lt;br /&gt;Luckily there is a solution in Dotnet 3 with LINQ.  It isn't the prettiest but it fails compile time when it should and that is considered a good thing.&lt;br /&gt;&lt;br /&gt;( I won't bother with explanation - just read the code. )&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"&gt;// The Code.&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; ReflectionUtility&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetPropertyName&amp;lt;T,TReturn&amp;gt;(Expression&amp;lt;Func&amp;lt;T,TReturn&amp;gt;&amp;gt; expression)&lt;br /&gt;{&lt;br /&gt;MemberExpression body = (MemberExpression)expression.Body;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; body.Member.Name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetMethodName&amp;lt;T,TReturn&amp;gt;(Expression&amp;lt;Func&amp;lt;T,TReturn&amp;gt;&amp;gt; expression)&lt;br /&gt;{&lt;br /&gt;var body = expression.Body &lt;span class="kwrd"&gt;as&lt;/span&gt; UnaryExpression;&lt;br /&gt;var operand = body.Operand &lt;span class="kwrd"&gt;as&lt;/span&gt; MethodCallExpression;&lt;br /&gt;var argument = operand.Arguments[2] &lt;span class="kwrd"&gt;as&lt;/span&gt; ConstantExpression;&lt;br /&gt;var methodInfo = argument.Value &lt;span class="kwrd"&gt;as&lt;/span&gt; System.Reflection.MethodInfo;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; methodInfo.Name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;// The test code.&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; MyClass&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MyField;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MyPublicProperty { get; set; }&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt;  &lt;span class="kwrd"&gt;string&lt;/span&gt; MyReadonlyProperty { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty; } }&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MyMethod() { &lt;span class="kwrd"&gt;return&lt;/span&gt; 0; }&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; MyClass() { }   &lt;span class="rem"&gt;// To make sure the class doesn't need a default constructor.&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; fieldName = ReflectionUtility.GetPropertyName((MyClass x) =&amp;gt; x.MyField);&lt;br /&gt;Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"MyClass.MyField:{0}"&lt;/span&gt;, fieldName));&lt;br /&gt;Debug.Assert(&lt;span class="str"&gt;"MyField"&lt;/span&gt; == fieldName);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName = ReflectionUtility.GetPropertyName((MyClass x) =&amp;gt; x.MyPublicProperty);&lt;br /&gt;Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"MyClass.MyPublicProperty:{0}"&lt;/span&gt;, propertyName));&lt;br /&gt;Debug.Assert(&lt;span class="str"&gt;"MyPublicProperty"&lt;/span&gt; == propertyName);&lt;br /&gt;&lt;br /&gt;propertyName = ReflectionUtility.GetPropertyName((MyClass x) =&amp;gt; x.MyReadonlyProperty);&lt;br /&gt;Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"MyClass.MyReadonlyProperty :{0}"&lt;/span&gt;, propertyName));&lt;br /&gt;Debug.Assert(&lt;span class="str"&gt;"MyReadonlyProperty"&lt;/span&gt; == propertyName);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; methodName = ReflectionUtility.GetMethodName&amp;lt;MyClass, Func&amp;lt;int&amp;gt;&amp;gt;((MyClass x) =&amp;gt; x.MyMethod);&lt;br /&gt;Console.Write(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"MyClass.MyMethod:{0}"&lt;/span&gt;, methodName));&lt;br /&gt;Debug.Assert( &lt;span class="str"&gt;"MyMethod"&lt;/span&gt; == methodName);&lt;br /&gt;&lt;br /&gt;Console.Write(Environment.NewLine +  &lt;span class="str"&gt;"Press any key."&lt;/span&gt;);&lt;br /&gt;Console.ReadKey();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;a href="http://handcraftsman.wordpress.com/2008/11/11/how-to-get-c-property-names-without-magic-strings/"&gt;Honor those who should.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Update: When copy-pasting through manoli.net some angle brackets got dropped.  This is, hopefully, fixed now.  Otherwise - get the source here: &lt;a href="http://selfelected.pastebin.com/f77563a02"&gt;http://selfelected.pastebin.com/f77563a02&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7828323721621142575?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7828323721621142575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7828323721621142575' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7828323721621142575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7828323721621142575'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2010/01/catch-property-field-and-method-name.html' title='Catch property, field and method name changes compile time in dotnet'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-23256477264453565</id><published>2009-12-29T23:47:00.005+01:00</published><updated>2010-01-24T20:49:31.599+01:00</updated><title type='text'>US vs French vs Swedish vs 1337 keyboard layout aka 1773 keyboard</title><content type='html'>&lt;p&gt;Most programming languages I have tried work better with a US keyboard layout than a Swedish.  For instance my current language, C#, is riddled with {s and [s and these are a pain to use.  One has to press the right Alt-button (labeled alt-gr) and then 7 or 8 respectively.  Try this, it really twists your hand.&lt;/p&gt;&lt;p&gt;The US keyboard has {, [, ], } to the right of P and it works much better than the Swedish keyboard.&lt;/p&gt;&lt;p&gt;But then we have (, ), =, &amp;amp; and the rest above the number keys.  Most languages use plenty of parenthesises and even though you don't have to twist your hand it is still awkward to use two keys (and hands with a "proper" finger setting) to write these common characters.  The French keyboard has solved this by flipping the number keys/shift setting.  Press the key to get an ! and shift-key to get 1.  If one write lots of number there is always the proper number keyboard to the right.&lt;/p&gt;&lt;p&gt;So the French keyboard is better for some other characters.&lt;/p&gt;&lt;p&gt;Then we have the Swedish characters å,ä and ö.  Even though I usually hack in English I write text, outputs and user information in Swedish so these cannot be left out.&lt;/p&gt;&lt;p&gt;Thinking that there was no reason to have a second rate keyboard layout I fired up &lt;a href="http://msdn.microsoft.com/sv-se/goglobal/bb964665(en-us).aspx"&gt;MSKLC&lt;/a&gt; from Microsoft and hacked together the &lt;a href="http://code.google.com/p/keyboard1337/wiki/PageName"&gt;1337 keyboard layout&lt;/a&gt;.  I have used it for a couple of years now in WinXP, Vista and Win7.&lt;/p&gt;&lt;p&gt;For almost all use other than programming I keep the Swedish layout so I have set leftshift-leftalt for a fast keyboard layout toggle.&lt;/p&gt;&lt;p&gt;Lastly: I do use touch typing and I recommend learning this for all serious software developers.  I also have noticed that I have very little problem with switching keyboard layout, the fingers need a second to adjust and are then hitting the right key.&lt;/p&gt;&lt;p&gt;(For problems 1337 reverting to US see &lt;a href="http://selfelected.blogspot.com/2010/01/changed-keyboard-settings.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-23256477264453565?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/23256477264453565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=23256477264453565' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/23256477264453565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/23256477264453565'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/12/us-vs-french-vs-swedish-vs-1337.html' title='US vs French vs Swedish vs 1337 keyboard layout aka 1773 keyboard'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-430577618491585227</id><published>2009-12-14T19:01:00.002+01:00</published><updated>2009-12-14T19:08:07.544+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>String.IsNullOrEmpty</title><content type='html'>&lt;p&gt;Instead of&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;    if( null == myString || string.Empty == myString ){...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;one can use&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;    if( string.IsNullOrEmpty( myString ) ){...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;There is nothing magic about it, just a more readable, and hence less error prone, syntax.&lt;/p&gt;&lt;p&gt;It would be nice of someone could solve the&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;    if( null == myCustomer.Address || null == myCustomer.Address.City || null == myCustomer.Address.City.Name ){...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;-problem.&lt;/p&gt;&lt;p&gt;In Dotnet4 there will be a method similar to IsNullOrEmpty which also checks for whitespace.  It should come in handy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-430577618491585227?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/430577618491585227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=430577618491585227' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/430577618491585227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/430577618491585227'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/12/stringisnullorempty.html' title='String.IsNullOrEmpty'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5394925886163962508</id><published>2009-12-08T21:39:00.008+01:00</published><updated>2009-12-08T22:22:53.911+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Database versioning</title><content type='html'>&lt;p&gt;Since I have abandoned Visual studio database edition because of it not being able to &lt;a href="http://selfelected.blogspot.com/2009/07/visual-studio-net-database-edition-does.html"&gt;handle tables with data&lt;/a&gt; I have returned to my old, proven, way; checking in/committing the update scripts and storing a database version number in a Setting table.&lt;/p&gt;&lt;p&gt;In Microsoft SQL Server Management Studio (or whatever it was called earlier) there is a setting to always create update scripts whenever a change is saved.&lt;/p&gt;&lt;p&gt;Then whenever a change is done, store the update scripts with consecutive version numbers.  These versions are not the same as the release versions but one version number per commit.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;013_01_S_Customer_Added the CompanyColour field.sql&lt;br /&gt;013_02_D_Customer_Set the CompanyColour to red except blue for McCarthysen.sql&lt;br /&gt;013_03_S_Customer_Set CompanyColour to notnull and no default value.sql&lt;br /&gt;013_99_D_Setting_Updated database version.sq&lt;/span&gt;&lt;/span&gt;l&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;013&lt;/span&gt;&lt;/span&gt; is the version number.  Next commit is 014 etc.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;01, 02, 03&lt;/span&gt; are consecutive numbers.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;99&lt;/span&gt;&lt;/span&gt; is the final number for this commit.  It always contains an update in the Setting (or whatever you call it) table and sets the version number record to 13.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;S&lt;/span&gt;&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;D&lt;/span&gt;&lt;/span&gt; are Schema and Data respectively.  I have learned that it is good to see this already in the script's filename.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Customer&lt;/span&gt;&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Setting&lt;/span&gt;&lt;/span&gt; are the names of the main manipulated tables.&lt;br /&gt;The rest is free text that explains what the script does.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It is now very easy to see how far a database is in the development flow.  Select the the row from the Setting table and notice its number.  Then run all scripts with higher version numbers in the right order.  The scripts are easy to order by their names directly in the version manager or in the file explorer after a checkout/getlatest.&lt;/p&gt;&lt;p&gt;This technique works well with several developers.  Store the scripts locally until they you are ready to commit the code.  Update the version number if someone already used the version number.  Commit.&lt;/p&gt;&lt;p&gt;A tool like &lt;a href="http://www.red-gate.com/products/SQL_Compare/index_v2.htm"&gt;SQL compare&lt;/a&gt; does approximately the same job.  If you have only a few updates with a few databases it is way faster to just create a diff-script and run it.  Contrary to VSDatabase edition SQLcompare handles tables with data.  It costs money but 1) there is a trial version and 2) it is way cheaper than hacking the code yourself.&lt;br /&gt;There are other tools as well and I have used one but I cannot remember the name of it.  It was not as easy to use as SQLcompare if I recall correctly.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If you have to handle several versions while developing the procedure I have described here is good since it is so easy to check the version of the database.&lt;/p&gt;&lt;p&gt;(I just stumbled upon a situation where saving a view and only updating the output fields from lower to upper case (customername -&gt; CustomerName) did not result in a script file.  In this case there was no problem in scripting a drop/create script through the Object explorer tool box though.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5394925886163962508?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5394925886163962508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5394925886163962508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5394925886163962508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5394925886163962508'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/12/database-versioning.html' title='Database versioning'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2530980876389429757</id><published>2009-12-01T19:44:00.019+01:00</published><updated>2009-12-01T21:01:38.847+01:00</updated><title type='text'>Virtual PC under Windows7</title><content type='html'>&lt;p&gt;If one wants to run a virtual machine on Windows 7 &lt;a href="http://www.microsoft.com/windows/virtual-pc/download.aspx"&gt;Windows Virtual PC&lt;/a&gt; is the official way to go.&lt;br /&gt;It requires hardware supported virtualization though, which means not everyone's machine can do it.  On my &lt;a href="http://forums13.itrc.hp.com/service/forums/bizsupport/questionanswer.do?admit=109447627+1259693293154+28353475&amp;amp;threadId=1177300"&gt;HP 8510w it meant a cold reboot&lt;/a&gt; - just restarting and changing the BIOS was not enough.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The older &lt;a href="http://www.microsoft.com/windows/virtual-pc/support/virtual-pc-2007.aspx"&gt;VirtualPC2007&lt;/a&gt; doesn't need any hardware virtualization stuff and a small text about how to install it is found here: &lt;a href="http://blogs.msdn.com/virtual_pc_guy/archive/2009/08/19/running-virtual-pc-2007-on-windows-7.aspx"&gt;http://blogs.msdn.com/virtual_pc_guy/archive/2009/08/19/running-virtual-pc-2007-on-windows-7.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It looks like Microsoft wants everyone who installs Windows Virtual PC to also install Windows XP Mode by some reason unknown to me.  I am a developer and I am hesistant to installing apps that might tweek the OS.&lt;br /&gt;The whole page at &lt;a href="http://www.microsoft.com/windows/virtual-pc/download.aspx"&gt;http://www.microsoft.com/windows/virtual-pc/download.aspx&lt;/a&gt; pushes you into installing Windows XP Mode but if one selects a system at step 3 two buttons pop up and one of them says "Windows Virtual PC".&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uvTAyWQ3FwE/SxVq2o6-yEI/AAAAAAAAAJM/N1gS4pJkg6A/s1600/WVPCstep3and4.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 102px;" src="http://4.bp.blogspot.com/_uvTAyWQ3FwE/SxVq2o6-yEI/AAAAAAAAAJM/N1gS4pJkg6A/s320/WVPCstep3and4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5410348014285801538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Download and install.  But instead of the usual application GUI one gets a view of a folder under &lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;C:\Users\username\Virtual Machines&lt;/span&gt;&lt;/span&gt; prepared for virtual machines.  This might be good for people who backup what is under their personal account but as a developer I don't want to tie my data to an account and instead prefer something like &lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;C:\DATA\VMACHINE\&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;Come to think of it - is it good for anyone?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It also took me a while to find out how to create a new virtual machine.  Instead of having an app with a button or menu as is de facto standard someone has decided to hide the button in the toolbar or extra menu system ( I have never figured that out. )&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uvTAyWQ3FwE/SxVs8ZCzwdI/AAAAAAAAAJY/LwyseZDqIy8/s1600/CreateVirtualMachineMenuSortof.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 52px;" src="http://4.bp.blogspot.com/_uvTAyWQ3FwE/SxVs8ZCzwdI/AAAAAAAAAJY/LwyseZDqIy8/s400/CreateVirtualMachineMenuSortof.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5410350312126136786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Don't bother to cut and paste the .vmcx file to some other place.  It will be copied but not removed so you end up with the original .vmcx file in the original place and a not functioning copy of it in your target directory.&lt;br /&gt;The .vmc file can be run though.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Mount an ISO with your preferred OS on the virtual D: drive.  The virtual machines chews through your NICs and DHCP.  I had my WLAN card turned of in the host OS, but the virtual machine seemed to first look for my WLAN card and then my regular one.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The rest looks just like ususal.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2530980876389429757?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2530980876389429757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2530980876389429757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2530980876389429757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2530980876389429757'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/12/virtual-pc-under-windows7.html' title='Virtual PC under Windows7'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_uvTAyWQ3FwE/SxVq2o6-yEI/AAAAAAAAAJM/N1gS4pJkg6A/s72-c/WVPCstep3and4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-429520414753934519</id><published>2009-11-29T01:24:00.004+01:00</published><updated>2009-11-29T01:32:07.982+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>IsNot in vbnet - a more readable way to check for Nothing</title><content type='html'>&lt;p&gt;When I have written Vbnet and checked for Nothing I have chosen between &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    If Not( o Is Nothing ) Then&lt;br /&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;and&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    If False = o Is Nothing Then&lt;br /&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;and&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    If o Is Nothing Then&lt;br /&gt;        '    NOP.&lt;br /&gt;    Else&lt;br /&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;all ugly and/or hard to read but in their own way.&lt;/p&gt;&lt;p&gt;Some days ago I stumbled upon &lt;strong&gt;IsNot&lt;/strong&gt; and since then my code looks nicer like so:&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    If o IsNot Nothing Then&lt;br /&gt;        ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I have been writing Vbnet for years without finding IsNot so I thought there are more out there with the same problem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-429520414753934519?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/429520414753934519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=429520414753934519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/429520414753934519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/429520414753934519'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/11/isnot-in-vbnet-more-readable-way-to.html' title='IsNot in vbnet - a more readable way to check for Nothing'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4845240672008775230</id><published>2009-11-28T23:23:00.005+01:00</published><updated>2009-11-28T23:32:06.708+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><title type='text'>Edit project file in VSNet</title><content type='html'>&lt;p&gt;There are mainly 3 ways to get to your Vsnet project file to edit it.  (disclaimer: I am running Vsnet2008 and haven't tried earlier nor later versions)&lt;/p&gt;&lt;p&gt;1) Open windows explorer and navigate to your project folder.  Open the project file (.csproj/.vbproj/...) in your favourite xml editor.&lt;/p&gt;&lt;p&gt;2) Install a tool that gives you an "Open folder in windows explorer" context menu item in the Solution explorer.  If I recall correctly the tool I am referring to is Microsoft's Team foundation server power tools.  Please correct me if I am wrong.&lt;/p&gt;&lt;p&gt;3) Unload the project.  Use the context menu in Solution explorer to edit the project file.  Load the project again.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4845240672008775230?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4845240672008775230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4845240672008775230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4845240672008775230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4845240672008775230'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/11/edit-project-file-in-vsnet.html' title='Edit project file in VSNet'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3714453278311241515</id><published>2009-11-04T21:15:00.004+01:00</published><updated>2009-11-23T22:34:20.433+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 peers 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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2769579064781682203</id><published>2009-10-18T21:50:00.003+01:00</published><updated>2009-12-08T22:11:06.455+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8816764163731865192' title='11 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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_uvTAyWQ3FwE/Stt5BV7eGsI/AAAAAAAAAHg/fbEynDG1Wos/s72-c/IISAddApplicationPool.png' height='72' width='72'/><thr:total>11</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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-6202249898937168626</id><published>2009-07-13T18:43:00.005+01:00</published><updated>2009-12-08T22:11:29.454+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3102114407093740689</id><published>2009-07-13T18:30:00.004+01:00</published><updated>2009-12-08T22:11:55.331+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8171423404634159683</id><published>2009-06-05T11:22:00.006+01:00</published><updated>2009-12-08T22:12:10.728+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>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' alt='' /&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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7011242428194607608</id><published>2009-01-05T23:11:00.007+01:00</published><updated>2009-01-05T23:23:07.514+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strong typing'/><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><title type='text'>List Find Delegate</title><content type='html'>&lt;p&gt;Here is a short example of how to use the Find method together with an anonymous delegate in C#.&lt;br /&gt;(there are plenty of examples on the web but most forget to use an external variable)&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;var myExternalVariable = "Cool";&lt;br /&gt;List&lt;string&gt; list = new List&lt;string&gt;(new string[]    {"Cows","Are","Cool"});&lt;br /&gt;var possibleWord =&lt;br /&gt;    list.Find(delegate(string s)&lt;br /&gt;        { return s == myExternalVariable; });&lt;/span&gt;&lt;p&gt;if you want to be even &lt;a href="http://selfelected.blogspot.com/2008/12/code-that-is-easy-to-read.html"&gt;hairier&lt;/a&gt;, translate to lambda&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;var possibleWord = list.Find(s =&gt; s == myVariable);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://selfelected.blogspot.com/2007/07/simple-sort-in-c.html"&gt;Sort.&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-7011242428194607608?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7011242428194607608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7011242428194607608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7011242428194607608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7011242428194607608'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/01/list-find-delegate.html' title='List Find Delegate'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2658695543213705005</id><published>2009-01-05T19:54:00.004+01:00</published><updated>2009-01-05T20:11:41.231+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>People do two things</title><content type='html'>&lt;p&gt;People tend to do two things.  What they think is fun and what they are measured on.&lt;/p&gt;&lt;p&gt;Measuring is a two-edged sword and should be used with prejudice.&lt;br /&gt;Giving people fun things to work with is more like icecream with a strawberry on top.&lt;/p&gt;&lt;p&gt;Like this:&lt;/p&gt;&lt;p&gt;People do things they are measured on.  Since one cannot measure brilliancy and why-you-rise-in-the-morning, measuring tends to give focus to other things like klocs or amount of green unit test lights.&lt;/p&gt;&lt;p&gt;I worked with a guy who was fast as lightning with the drawback that everything was finished the first day; often even before the code was written.  So instead of harrassing him about estimates and CRUD I let him hack away and just finished what he started.  His focus was code code code and my became customer satisfaction.  Both of us where satisfied.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2658695543213705005?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2658695543213705005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2658695543213705005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2658695543213705005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2658695543213705005'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2009/01/people-do-two-things.html' title='People do two things'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1077616804532029414</id><published>2008-12-30T20:18:00.005+01:00</published><updated>2008-12-30T20:28:18.084+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'>Code that is easy to read</title><content type='html'>&lt;p&gt;An important code regarding programming is to write code that is easy to read.&lt;/p&gt;&lt;p&gt;I have many times written code, polished it and then rewritten it to the original text since it was easier to read.  This is considered mature and a good thing.&lt;/p&gt;&lt;p&gt;A month ago I wrote code like this:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    return AllControlsRecursively((Control)form&lt;br /&gt;        ).FindAll( control =&gt; (null == control as IDirty) ? false : true&lt;br /&gt;    ).ConvertAll( control =&gt; (IDirty)control );&lt;/span&gt;&lt;/p&gt;&lt;p&gt;I thought about it for several days and then decided to leave the code as it was.&lt;/p&gt;&lt;p&gt;My reasoning behind this is that once upon a time I had problem understanding Fn in BASIC.  Later * and &amp;amp; in C.  Then I had to learn inheritance, virtual methods and abstract.  Today it is lambda methods, WCF and WPF.&lt;/p&gt;&lt;p&gt;One day one has to decide to get the fingers dirty.  That day is every day.&lt;br /&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-1077616804532029414?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1077616804532029414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1077616804532029414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1077616804532029414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1077616804532029414'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/12/code-that-is-easy-to-read.html' title='Code that is easy to read'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-702729512863244837</id><published>2008-12-29T18:46:00.004+01:00</published><updated>2008-12-29T18:56:54.237+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><title type='text'>Huawei 220E and Vista</title><content type='html'>&lt;p&gt;Look into upgrading the 3G dongle software if your Huawei220e doesn't work with Vista.&lt;/p&gt;&lt;p&gt;My Huawei 3G dongle worked nicely with my WinXP and even better with my Asus Eee.&lt;/p&gt;&lt;p&gt;When I changed to Vista it refused to work properly.  The driver and UI installed correctly but failed to neither work nor give me a usable error message.  I looked at the internet for several days without finding a solution, not even on 3's pages.  Later I by chance talked to a colleague and he told med to update it at the store for free.  The first clerk didn't have a clue what I was talking about but the next exchanged the dongle for a piece of paper and told me to wait for two days.&lt;/p&gt;&lt;p&gt;After two days I got the dongle back and now it works so so with Vista and not yet with my Eee.&lt;/p&gt;&lt;p&gt;On a note all software is not removed from the computer when uninstalled.  Even though I uninstalled the software it still remembered my pin code.&lt;/p&gt;&lt;p&gt;The UI is also not navigable with the keyboard, a mouse is needed.&lt;/p&gt;&lt;p&gt;Huawei being one of the bigger, probably biggest, manufacturer of 3G dongles for laptops should really have better software.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-702729512863244837?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/702729512863244837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=702729512863244837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/702729512863244837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/702729512863244837'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/12/huawei-220e-and-vista.html' title='Huawei 220E and Vista'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7527856286830563691</id><published>2008-12-29T18:39:00.002+01:00</published><updated>2008-12-29T18:45:51.187+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Combo box vs. Drop down list box</title><content type='html'>&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Drop-down_list"&gt;Drop down list box&lt;/a&gt; is often, incorrectly, called a &lt;a href="http://en.wikipedia.org/wiki/Combo_box"&gt;Combo box&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It does not sound like a big issue but user interface wise it is.  A Drop down listbox only takes existing values as a Combo box allows entering of new, unknown, values.  When talking about Combo boxes don't forget to clarify what should happen if the user enters a value that doesn't exist in the list.&lt;/p&gt;&lt;p&gt;Like this:&lt;br /&gt;"We would like to select the Customer from a Combo box."&lt;br /&gt;"What should happen if the user enters the name of a Customer that doesn't exist?"&lt;br /&gt;"The Customer should be created."&lt;br /&gt;"Where from?"&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-7527856286830563691?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7527856286830563691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7527856286830563691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7527856286830563691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7527856286830563691'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/12/combo-box-vs-drop-down-list-box.html' title='Combo box vs. Drop down list box'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1502508126859732162</id><published>2008-12-27T19:16:00.005+01:00</published><updated>2008-12-29T18:39:28.358+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><title type='text'>3, 3G and Flash 10</title><content type='html'>&lt;p&gt;A just received a message from &lt;a href="http://www.tre.se/"&gt;3&lt;/a&gt; that my 3G connection is not &lt;a href="http://www.tre.se/templates/FullSizePageEmma.aspx?id=33418&amp;amp;csref=vik_med"&gt;compatible with Flash10&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;My question is -how can a user interface thingamajig destroy a network connection?  What made someone come up with the bright idea that a network connection should only be useable through a graphical interface?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-1502508126859732162?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1502508126859732162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1502508126859732162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1502508126859732162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1502508126859732162'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/12/3-flash-10.html' title='3, 3G and Flash 10'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2865206626617313983</id><published>2008-12-11T23:34:00.002+01:00</published><updated>2008-12-11T23:38:49.332+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Change control name in Visual Studio</title><content type='html'>&lt;p&gt;VSNet remembers which attribute use used lastly so just start typing, there is no need to click.&lt;/p&gt;&lt;p&gt;Like so:&lt;br /&gt;You layout a WinForm in Visual Studio.  Either when you are finished or as you layout the controls you name them.  There is no need to click and mark the Name attribute in the Atribute panel; VSNet remembers which attribute you typed last.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Example: Drop a label on the form.  Click the Name attribute.  Write the name.  Drop another label on the form.  Just start typing the new name without clicking anywhere.  What you type goes right into the right property.&lt;/p&gt;&lt;p&gt;Might save some time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2865206626617313983?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2865206626617313983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2865206626617313983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2865206626617313983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2865206626617313983'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/12/change-control-name-in-visual-studio.html' title='Change control name in Visual Studio'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7961800659739470276</id><published>2008-11-17T21:25:00.004+01:00</published><updated>2008-11-17T21:35:05.478+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Change window in Visual Studio</title><content type='html'>&lt;p&gt;Change window in Visual Studio 2008 through the shortcut &lt;em&gt;ctrl-tab&lt;/em&gt;.  It goes through the windows in recent order so you get back to where you where.&lt;/p&gt;&lt;p&gt;If you want to get back to where you where in the same window use &lt;em&gt;ctrl-minus&lt;/em&gt;.  Go forward again with &lt;em&gt;ctrl-plus&lt;/em&gt;.&lt;br /&gt;Note: for older versions of Visual Studio you have to have the US keyboard layout, the swedish does not work with ctrl-minus.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To show the open windows either use the Window menu (&lt;em&gt;alt-w-w&lt;/em&gt;) or the "small window menu" dropdown &lt;em&gt;ctrl-alt-down&lt;/em&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7961800659739470276?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7961800659739470276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7961800659739470276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7961800659739470276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7961800659739470276'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/11/change-window-in-visual-studio.html' title='Change window in Visual Studio'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5696443837606341956</id><published>2008-11-02T22:49:00.002+01:00</published><updated>2008-11-02T22:54:57.926+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Exception and how to classify</title><content type='html'>&lt;p&gt;One way to classify the custom exceptions thrown by an application is by how fatal they are.  An Eric Lippert has a &lt;a href="http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx"&gt;good idea&lt;/a&gt; which somewhat rhymes with my own thoughts of &lt;a href="http://selfelected.blogspot.com/2007/07/which-prioo.html"&gt;3 levels of importance&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-5696443837606341956?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5696443837606341956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5696443837606341956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5696443837606341956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5696443837606341956'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/11/exception-and-how-to-classify.html' title='Exception and how to classify'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3296586993783214723</id><published>2008-11-01T22:53:00.003+01:00</published><updated>2008-11-01T22:59:25.501+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Open source - which licens to choose</title><content type='html'>&lt;p&gt;When you have decided that open sourcing your code would be a good idea the next question follows; which license?&lt;/p&gt;&lt;p&gt;Claes Mogren wrote a short and good description about some licenses and the thoughts behind them: &lt;a href="http://informationhunger.blogspot.com/2008/10/open-source-license-primer.html"&gt;http://informationhunger.blogspot.com/2008/10/open-source-license-primer.html&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-3296586993783214723?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/3296586993783214723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=3296586993783214723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3296586993783214723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3296586993783214723'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/11/open-source-which-licens-to-choose.html' title='Open source - which licens to choose'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7823515837205387367</id><published>2008-11-01T00:55:00.003+01:00</published><updated>2008-11-01T01:07:35.491+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>WPF and shortcuts</title><content type='html'>&lt;p&gt;Forcing the user to sprout a third arm to use a mouse is considered bad programming.&lt;/p&gt;&lt;p&gt;All menus should have shortcuts.  To be frank almost all controls should have shortcuts.  To use a few seconds to add shortcuts to the controls as they are made is considered good.&lt;/p&gt;&lt;p&gt;Shortcuts in WPF is done by prefixing with underscore, like E_xit and _Open. (WinForm is done by prefixing with ampersand, like E&amp;amp;xit.  Web applications should have this too and there it is called Accesskey.&lt;/p&gt;&lt;p&gt;Then to add the nice "Ctrl-O" text beside Open and "Ctrl-S" beside Save is trickier in WPF.  By no special order these are the pages I had to read to understand CommandBinding and RoutedUICommand:&lt;br /&gt;&lt;a href="http://anuraj.wordpress.com/2008/06/23/shortcuts-keys-in-wpf-menu/"&gt;http://anuraj.wordpress.com/2008/06/23/shortcuts-keys-in-wpf-menu/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.csharp-online.net/WPF_Concepts—Built-In_Commands"&gt;http://en.csharp-online.net/WPF_Concepts—Built-In_Commands&lt;/a&gt;&lt;br /&gt;&lt;a href="http://colbycavin.spaces.live.com/blog/cns!5FFDF795EBC7BEDF!129.entry"&gt;http://colbycavin.spaces.live.com/blog/cns!5FFDF795EBC7BEDF!129.entry&lt;/a&gt;&lt;br /&gt;&lt;br /&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-7823515837205387367?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7823515837205387367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7823515837205387367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7823515837205387367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7823515837205387367'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/11/wpf-and-shortcuts.html' title='WPF and shortcuts'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2917088411839101769</id><published>2008-10-14T11:15:00.012+01:00</published><updated>2009-02-09T20:35:29.238+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><title type='text'>Pros and cons with HTC Touch Pro</title><content type='html'>I hve jotted down the pros and cons with a HTC Touch Pro mobile phone here.  Typically personal experiences and not the stuff you can read about in reviews and ads.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;- Slow.  It is possible speed it up a little downloading an app and following the instructions.  The app I used is called Advanced Config and can be found at &lt;a href="http://www.xda-developers.com/"&gt;xda-developers.com&lt;/a&gt;.  But the unit is till Slow.&lt;/p&gt;&lt;p&gt;- Bad battery time.  Especially when you use ActiveSync to talk bluetooth or anything else but the phone functionality.  One can argue that too much communication (Bluetooth, WLAN, 3G...) is to blame the the fact remains: I bought the phone to use this stuff and when I do I have to charge it before the day is over.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ The TouchFlo3D user interface is nicer than what Microsoft presents.  When the TouchFlo3D doesn't work any more the GUI falls back to Microsoft's implementation.  A graceful degradation sort of.  Or like using a terminal window when KDE doesn't make it.&lt;/p&gt;&lt;p&gt;- The TouchFlo3D still behaves like version 1 and sometimes mistakes a slide for a click or refuses to recognize my gestures at all.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Crashes.  All my WindowsCE machines since 1999 have crashed unexpectedly.  Sometimes due to no reason at all.  If not being freshly booted and put in the charger counts as a valid reason to crash (it was also connected to my WLAN at the time).&lt;/p&gt;&lt;p&gt;+ Easy to develop for.  As long as you use dotnet and have the right development environment.  Unlike developing for iPod or Xbox it is free to develop (these to others are free to develop for as long as you pay the respective companies a fee for deploying)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- WindowsMobile6.1 and Dotnet CompactFramework 3.5 does still not support WPF.&lt;/p&gt;&lt;p&gt;- The API for TouchFlo is not made public.&lt;/p&gt;&lt;p&gt;- It is Slow.  Did I mention that?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- As a phone for making phone calls it is not very good.  There are cheaper and better alternatives.  I use my mobile phone for much more than calling so to me everything is a compromise; but if the phoning capabilities are very important - look for another solution.  I can defend it being slow due to it being bogged down by applications and bad architecture, but I cannot defend it's bad sound.&lt;/p&gt;&lt;p&gt;- ActiveSync.  It uses ActiveSync for synchronization which is not very good on the phone and possibly the worst software written ever on the client.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ GPS and bundled with Google maps.  It should run Microsoft's competitor too but I havn't tried.  The GPS feels slow.&lt;/p&gt;&lt;p&gt;+ Radio.  But it requires the headset as aerial.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ Charged through a USB port.&lt;/p&gt;&lt;p&gt;- Bad battery time.&lt;/p&gt;&lt;p&gt;- It is not a standard USB port.  Normal USB works so it is not much of a problem.&lt;/p&gt;&lt;p&gt;- Uses the proprietary USB  variant for headset.  There is no 2,5mm plug for listening.&lt;/p&gt;&lt;p&gt;+ Supports 3G.&lt;/p&gt;&lt;p&gt;- Only comes in the installed language.  Microsoft's Hej Knekt!-licenses forbids HTC to change language.  This means that on a swedish phone you might get the totally unusable swedish error messages.  They are better translated today but are still totally ungoogleable.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ Has a gravity sensor.  I have still to find a use for it but I think it is cool.&lt;/p&gt;&lt;p&gt;+ The camera seems quite good but is slow.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- The phone and the camera are slow.&lt;/p&gt;&lt;p&gt;+ Hardware accelerated 3D graphics.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- So slow that the caller often hangs up before I manage to answer.&lt;/p&gt;&lt;p&gt;+ The case looks good.&lt;/p&gt;&lt;p&gt;- The usability of the case is not thought through.  I requires two hands for pushing the phone out of the sleeve and it is way too easy to happen to press the on/off button while doing this.  The phone also manages to change it's volume even though it is in it's protective case and the phone is locked.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- The home page looks cool but one has to choose between either a good time indicator and bad calendar or a bad time indicator and a less bad calendar.  The home/front page calendar doesn't always manage to show all events for the day.&lt;/p&gt;&lt;p&gt;+ Easy to read the time on the home page.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ The keyboard is quite good.&lt;/p&gt;&lt;p&gt;- The swedish onscreen keyboard lacks functionality.  So did the Qtek9100.  The 9100 was updated after a while but after way too long.  The thinking by HTC seemed to be like "we cannot support functionality X with åäö so the swedish users shouldn't be supported without them either"&lt;/p&gt;&lt;p&gt;- It uses ActiveSync.  Probably the worst software written ever.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ Has no key for taking voice notes.&lt;/p&gt;&lt;p&gt;- Shifts volume even though locked and in its cover.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ Has dual touch sensitivity below the screen.&lt;/p&gt;&lt;p&gt;+ A screen cover comes with the phone.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Not reliable.  Can crash unexpectadly in the middle of the night and leave you without wake up chime in the morning.+ A better way of killing running applications than Windows Mobile 5.  What were Microsoft thinking when they wrote in the guidelines that it should _not_ be possible to stop applications? At the same time they removed the cancel button - very wise on a gadget like a PDA or phone.  Not!&lt;/p&gt;&lt;p&gt;+ When putting it in its case it can mimic the sounds of a sword being put in its scabbard from a Holly Wood movie.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Slow.  In case I forgot to mention.&lt;/p&gt;&lt;p&gt;+ Shows the last you called and it is easy to choose one and change to another number of the same contact.  Like: call to a friend's home, isn't there, call mobile instead.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ The web browser Opera that is bundled is nice.  Unfortunately it is crippled.&lt;/p&gt;&lt;p&gt;+ The cross/back button works quite good.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ After one gets a hang of how to change application through TouchFlo and have moved the right applications to the Program choose; it is quite easy to open apps of your own choice.&lt;/p&gt;&lt;p&gt;+ If you have Visual Studio it is easy to develop for.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ Finally there is a built-in method for closing all applications quickly.&lt;/p&gt;&lt;p&gt;- The case doesn't stand the wear and tear of jeans and suitcases.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- It sometimes makes prank calls and answers calls from my pocket.  &lt;/p&gt;+ It does less prank calls and answers phone calls from my pocket than my earlier EricssonP910i and QTek9100.&lt;p&gt;- Almost impossible to use as a phone with headset while in your pocket.  Even inside its case in a loose jacket pocket it tends to turn the microphone off.&lt;/p&gt;&lt;p&gt;- For locking the phone it is easiest to hold the hang-up button.  This also works when using the phone, just hold the button down and the phone locks.  Well... every other time.  The other times it hangs up.&lt;/p&gt;&lt;p&gt;- The head set that is bundled is ok.  But it still gets a minus because the headset for the 9100 was superb.  Lock behind the neck made it balanced so you could have it hanging without getting slowly drawn off.  Fabric around the wire made it very tangle resistant.  The good designs with the old head set where thrown away and back to square -1 for this.&lt;/p&gt;&lt;p&gt;- Slow.  In case I forgot to write.&lt;/p&gt;&lt;p&gt;+ USB charger, I use the same cable for charging, communicating and other gadgets; less to carry.&lt;/p&gt;&lt;p&gt;- Spontanous crashes during night.  I wrote this before but this month it crashed several nights leaving me without alarm clock in the morning.&lt;/p&gt;&lt;p&gt;- The HTC GUI sometimes fails.  But it doesn't fail to let the Microsoft GUI through, only to show a big black screen with words like tap if you wan to restart the htc gui".  Tapping makes the HTC GUI start and crash and show a big black screen with words like tap if you want to restart the htc gui".  Repeat until you get tired and reboot.&lt;/p&gt;&lt;p&gt;+ Multi touch under the screen.  A semi secret.&lt;/p&gt;&lt;p&gt;- Up and down on the main button are ok but left and right are so so.&lt;/p&gt;&lt;p&gt;+ Direction sensitive so it knows if you hold it vertically or horizontally.&lt;/p&gt;&lt;p&gt;+ A new UI for messages that bundles SMSes.&lt;/p&gt;&lt;p&gt;- A new UI for messages that is in other ways harder to use.&lt;/p&gt;&lt;p&gt;- It doesn't make it as a phone.  You can get both much cheaper and at the same time much better phones.&lt;/p&gt;&lt;p&gt;+ Has a lot of horse power (that it unfortunately abuses)&lt;/p&gt;&lt;p&gt;- Slow.&lt;/p&gt;&lt;p&gt;- The button on the headset, is it really a button?  It is possible to doubleclick it to recall.  But it is not possible to hang up.  It may be possbible to answer calls but I havn't tried since if I have the plugs in my ears I go deaf when they ring.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2917088411839101769?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2917088411839101769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2917088411839101769' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2917088411839101769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2917088411839101769'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/10/pros-and-cons-with-htc-touch-pro.html' title='Pros and cons with HTC Touch Pro'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5837096930515926010</id><published>2008-10-06T20:13:00.008+01:00</published><updated>2008-10-06T21:08:42.828+01:00</updated><title type='text'>Operation cannot be performed on a shared row</title><content type='html'>&lt;p&gt;On &lt;a href="http://msdn.microsoft.com/en-us/library/ha5xt0d9.aspx"&gt;http://msdn.microsoft.com/en-us/library/ha5xt0d9.aspx&lt;/a&gt; one finds some good advises on how to use Dotnet's DataGridView with large data.  Amongst others one is told to care about  &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewrowcollection.sharedrow.aspx"&gt;Shared Row&lt;/a&gt; for data reuse.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A solution of mine was to populate the grid with objects of my own creation and then call &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewrow.setvalues.aspx"&gt;SetValues&lt;/a&gt;; but when I refactored my solution and put the calls in the "right place" I got an InvalidOperationException exception with the message "Operation cannot be performed on a shared row." &lt;/p&gt;&lt;p&gt;The SetValues call was made from a class that inherited DataGridViewRow.  The solution was to move the call out of the class (to my class that inherited the UserControl).&lt;/p&gt;&lt;p&gt;This article might hopefully help someone in the future with the same problem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5837096930515926010?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5837096930515926010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5837096930515926010' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5837096930515926010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5837096930515926010'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/10/operation-cannot-be-performed-on-shared.html' title='Operation cannot be performed on a shared row'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2214466434075792680</id><published>2008-09-15T18:17:00.006+01:00</published><updated>2009-12-08T22:12:31.968+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Select distinct is considered bad</title><content type='html'>Correction; Considered a warning.&lt;br /&gt;&lt;br /&gt;Here is a good rule-of-thumb: If you have to write an SQL with Select Distinct, do adjust your chair, get a cup of coffee, walk around the office but above all talk to someone else because &lt;span style="font-family:courier new;"&gt;Select Distinct&lt;/span&gt; is a symptom of something being wrong, either in the database or in your solution.&lt;br /&gt;&lt;br /&gt;/* &lt;span style="font-family:courier new;"&gt;Select Distinct&lt;/span&gt; is normally not needed when your database is &lt;a href="http://en.wikipedia.org/wiki/Lagom"&gt;lagom&lt;/a&gt; normalized.  But if you do need a &lt;span style="font-family:courier new;"&gt;Select Distinct&lt;/span&gt; then this is a very good example of a situation that needs to be documented.*/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2214466434075792680?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2214466434075792680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2214466434075792680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2214466434075792680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2214466434075792680'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/09/select-distinct-is-considered-bad.html' title='Select distinct is considered bad'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1062021973669960492</id><published>2008-07-18T22:08:00.005+01:00</published><updated>2008-07-18T22:15:47.662+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Retrieve the plain text from the RTF control in WPF</title><content type='html'>The rich text control in &lt;a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation"&gt;WPF&lt;/a&gt; is way more versatile than the Win32 one.&lt;br /&gt;Versatility often means more complex and more complex means that the simpler things are sometimes lost.  Like for instance retrieving the plain text from a RTF control.&lt;br /&gt;&lt;p&gt;It is not hard to do but I didn't find any good example through google so here is an example of how to retrieve the plain text from a WPF rich text control:&lt;br /&gt;              &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    TextRange textrange = new TextRange(&lt;br/&gt;        rtfControl.Document.ContentStart, rtfControl.Document.ContentEnd);&lt;br/&gt;                  string plainText = textrange.Text;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;HTH&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-1062021973669960492?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1062021973669960492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1062021973669960492' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1062021973669960492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1062021973669960492'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/07/retrieve-plain-text-from-rtf-control-in.html' title='Retrieve the plain text from the RTF control in WPF'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5060708890280153478</id><published>2008-07-07T11:22:00.003+01:00</published><updated>2008-07-07T11:29:09.470+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Writing code or conducting it</title><content type='html'>&lt;p&gt;A &lt;a href="manaya.blogspot.com"&gt;friend&lt;/a&gt; of mine said something wise.  A programmer's job could be to conduct the code instead of writing it.  Think of it like components that all handle their part very well and plays well together.  The conductor is there to facilitate and point in the right direction.  I believe he is on to something.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5060708890280153478?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5060708890280153478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5060708890280153478' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5060708890280153478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5060708890280153478'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/07/writing-code-or-conducting-it.html' title='Writing code or conducting it'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5751919970180462954</id><published>2008-07-03T11:54:00.004+01:00</published><updated>2008-07-03T11:58:27.075+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><category scheme='http://www.blogger.com/atom/ns#' term='fail-at-once'/><title type='text'>Defensive programming and Fail at once</title><content type='html'>There is something called defensive programming &lt;a href="http://en.wikipedia.org/wiki/Defensive_programming"&gt;http://en.wikipedia.org/wiki/Defensive_programming&lt;/a&gt; that is supposedly something good.  I believe so too but it might have a way of hiding bugs.&lt;br /&gt;&lt;br /&gt;In defensive programming you recieve data and inspect it for flaws.  When it is possible you manipulate the data so it is correct and usable again.  This is good so as much your code works.&lt;br /&gt;&lt;br /&gt;But when you are in a project where your code is just a cog in a bigger machinery this approach is not necessarily the best; by recieving and hiding flawed data a bug somewhere else is hidden.&lt;br /&gt;&lt;br /&gt;In the example in Wikipedia a string limited to 1000 characters is manipulated.  The suggested solution is to truncate the string and keep rowing as if there wasn't a leak in the first place.  Depending on the circumstances the bug might be at the caller and by removing the very bug instead of the symptoms the very problem disappears.&lt;br /&gt;&lt;br /&gt;According to Fail at once an error should surface as soon and close to the source as possible.  The chances for data resulting of the bug to propagate, is then smaller and the bug tracking is probably faster.&lt;br /&gt;&lt;br /&gt;In the example it would have been better to throw an exception than to just keep on with data, now faulty in another way than to start with.&lt;br /&gt;&lt;br /&gt;Or like this: if a user writes an essay of 2000 characters he probably wants to know that it cannot be saved the very moment ctrl-S is pressed instead of 2 days later when proof reading, when the last 1000 characters are gone both from mind and binary space.  Or an operator of a tube bending machine prefers to know if his machine is faulty when he is working at it instead of two weeks later when the tubes are buried inside a wall somewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5751919970180462954?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5751919970180462954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5751919970180462954' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5751919970180462954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5751919970180462954'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/07/defensive-programming-and-fail-at-once.html' title='Defensive programming and Fail at once'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7095595154903988156</id><published>2008-06-29T09:05:00.004+01:00</published><updated>2008-06-29T09:14:53.358+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><category scheme='http://www.blogger.com/atom/ns#' term='fail-at-once'/><title type='text'>Fail at once – an explanation</title><content type='html'>I have written 2 articles tagged as Fail at once without explaining what the filosophy behind the name is.  Shame on me.&lt;p&gt;&lt;/p&gt;It is an old truth that the earlier a bug is found the cheaper it is to fix.&lt;br /&gt;Automated tests tests things that can go wrong; but what if those things couldn't even go wrong in the first place?&lt;b&gt;&lt;br /&gt;Code that won't compile won't make it into production.  Ever.&lt;/b&gt;&lt;br /&gt;It is cheapest to not write any errors at all.&lt;br /&gt;&lt;p&gt;Today Fail at once does two things: It stops compiling when it notices something is wrong and at all other times it tries to help the programmer do the right thing.&lt;br /&gt;Typical example of the first is to always use type safe variables and the latter to name things in such a way that there is one very natural way to write the code.  By using this explicitly and intelligently you get a leverage for writing better code faster.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7095595154903988156?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7095595154903988156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7095595154903988156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7095595154903988156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7095595154903988156'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/06/fail-at-once-explanation.html' title='Fail at once – an explanation'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-607578893879684526</id><published>2008-06-18T12:31:00.001+01:00</published><updated>2008-06-18T12:33:52.276+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><category scheme='http://www.blogger.com/atom/ns#' term='fail-at-once'/><title type='text'>Make sure your objects are fully populated – Fail At Once</title><content type='html'>The default constructor&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;    public Customer()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;is seldom needed while working with business objects.  Honestly – how do you need an object that is not?  Do you have a Customer or do you not?  A few situations comes to mind where an almost-Customer is needed but they all smell of refactoring, i.e. base class, sub class and two constructors.&lt;br /&gt;&lt;br /&gt;To make sure I don't have an object that is not fully populated I make sure the default constructor is not reachable.  Either through creating other constructors or by making it private the times it is needed internally.  Instead I create a constructor that takes all necessary parameters to fully populate itself.  If there are variants I create more constructors.  I am not afraid of writing code but I strongly dislike putting bugs into production.  Hence Fail At Once.&lt;br /&gt;&lt;br /&gt;Sometimes it is handy to have a void method taking all parameters and calling it from the constructor but this is just a variant of the pattern above that objects that are not correctly populated are very seldom useful.&lt;br /&gt;&lt;br /&gt;Another advantage with this routine is when adding (or removing) another mandatory field.  Then there is one and only one place to update to make the compiler give you all places to update.&lt;br /&gt;&lt;br /&gt;I have noticed that it is hard to make handy lists without having a default constructor but this, I presume, is just the exception that confirms the rule.&lt;br /&gt;&lt;br /&gt;Bugs that can't compile will not go into production.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-607578893879684526?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/607578893879684526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=607578893879684526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/607578893879684526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/607578893879684526'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/06/make-sure-your-objects-are-fully.html' title='Make sure your objects are fully populated – Fail At Once'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5949930113921291088</id><published>2008-06-16T12:46:00.002+01:00</published><updated>2008-06-16T12:48:54.217+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail-at-once'/><title type='text'>Do not type cast – Fail At Once</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Avoid casting types.&lt;/span&gt;     &lt;style type="text/css"&gt;&lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0cm;"&gt;Why do I write about this? What has it do do with quality and projects and architecture?  Well... each thing that cannot break doesn't have to be tested and... cannot break.  Less testing, less coding, less bugs.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;When working with class libraries that are dependant on the generic type one cannot avoid type casting fully.  The solution then is to encapsulate and wrap the cast through inheritance or composition.&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;If you wrap your type cast you have 1 test case instead of a test case per call.&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;What about datagrids and combo boxes that have an internal Rows or Items collection or Tag attribute?  How can they become type safe without having to rewrite the whole control?  Unfortunately I don't have a perfect solution but as I have seen the evil in type casts I avoid them and instead of writing test cases and tests I spend some time looking for a type safe alternative.  These are typically called row.OrderTag or combobox.CustomerItems.  Overriding the method or attribute is not possible since one cannot change type; but one can override and set the [Obsolete] attribute to at least get a warning.  Pepper this with a Debug.Fail( ”Please use the OrderTag property instead.” ) and things will stop in any test case that runs it.  Many  times one can even set the compiler to fail with [Obsolete(true)] to be totally sure the call is never made.&lt;/p&gt;   &lt;p style="margin-bottom: 0cm;"&gt;Another problem then is when two different types really are returned.  Well... write two methods then.  Even overload them; as long as the compiler understands your goal.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Final thought: How should one get this type of thinking into the spine of a project?  It is not something that can be ordered but has to be understood and taken to heart by the involved.  If someone has an idea please drop me a line; but until then being a good example is a good beginning.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&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-5949930113921291088?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5949930113921291088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5949930113921291088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5949930113921291088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5949930113921291088'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/06/do-not-type-cast-fail-at-once.html' title='Do not type cast – Fail At Once'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1171923272490782267</id><published>2008-06-10T20:47:00.000+01:00</published><updated>2008-06-10T20:48:10.932+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail-at-once'/><title type='text'>Fail At Once</title><content type='html'>What if you didn't have to test your application?&lt;br /&gt;&lt;br /&gt;What if you worked together with tools to make sure some bugs never even left the compiler?  That would be less to test; faster development cycle and more stable code.&lt;br /&gt;&lt;br /&gt;In search of better name I call this Fail At Once.&lt;br /&gt;&lt;br /&gt;I will get back on the subject.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-1171923272490782267?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1171923272490782267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1171923272490782267' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1171923272490782267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1171923272490782267'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/06/fail-at-once.html' title='Fail At Once'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2614078871879359218</id><published>2008-06-08T22:22:00.004+01:00</published><updated>2008-12-09T10:22:10.674+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>XamlParseException in WPF</title><content type='html'>When hacking WPF one sometimes get&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span&gt;&lt;span&gt;System.Windows.Markup.XamlParseException was unhandled&lt;br /&gt;Message="Cannot create instance of 'FormMain' defined in assembly 'Kopain2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Exception has been thrown by the target of an invocation.  Error in markup file 'Forms/FormMain.xaml' Line 1 Position 9.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;which does not give much of a clue.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uvTAyWQ3FwE/SExOmQmrIbI/AAAAAAAAAD4/m5Qev_Yu1_4/s1600-h/XamlParseException.PNG"&gt;&lt;img src="http://3.bp.blogspot.com/_uvTAyWQ3FwE/SExOmQmrIbI/AAAAAAAAAD4/m5Qev_Yu1_4/s320/XamlParseException.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5209625288159994290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So copy exception details to your favourite editor (Copy exception detail to the clipboard...) and scroll down.  Typically at the second last row you can read something like&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;at Kopain2.FormMain..ctor() in C:\Data\Projects\Kopain2\Kopain2\Forms\FormMain.xaml.cs:line 101&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;which is a magnitude more helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2614078871879359218?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2614078871879359218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2614078871879359218' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2614078871879359218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2614078871879359218'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/06/xamlparseexception-in-wpf.html' title='XamlParseException in WPF'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_uvTAyWQ3FwE/SExOmQmrIbI/AAAAAAAAAD4/m5Qev_Yu1_4/s72-c/XamlParseException.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8739888712337579201</id><published>2008-05-19T21:55:00.005+01:00</published><updated>2008-05-19T22:08:14.297+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><category scheme='http://www.blogger.com/atom/ns#' term='wishlist'/><title type='text'>How come all digital calendars suck?</title><content type='html'>This can also be written: why haven't I written one of my own?&lt;br /&gt;&lt;br /&gt;The digital calendars try to mimic their paper cousins the same way as Phillipinean food takes after ditto from USA.  They have kept all the bad stuff and thrown away the good parts.&lt;br /&gt;&lt;br /&gt;Number 1 bad thing with all the digital calendars I have run into is their  obsession with hours.  There is no way to enter "after job" or "in the afternoon" or "time will be decided later".&lt;br /&gt;Number 2 bad thing with all the digital calendars I have run into is that there is no way to enter thing by week.  I normally have vacation between week X and week Y (or dates X' and Y' if you prefer) and this is marked with a line in the margin.  In my paper calendar that is.  I cannot enter full day meetings because then my whole vacation is one big blob of "meeting" where I cannot find other stuff like sailing competition, midsommar or the dog's birtday.&lt;br /&gt;Number 3 is the overview.  For the ones living their life like Gantt the solution might be perfect.  But for all us others...&lt;br /&gt;&lt;br /&gt;Some 100 years ago I had an &lt;a href="http://en.wikipedia.org/wiki/Apple_Newton"&gt;Apple Newton&lt;/a&gt; and for this one I bought a calendar that did what everyone using the paper calendar metaphor should do; throw it in the recycling bin.  The solution was to just list things in chronological order with a line for week changes and bold for new day (or something like that)  In reality I know that the meeting at the divers' club is at thursday evening and hence things above it is earlier and below it later on.  This way of presenting my calendar turned out to be just the thing.&lt;br /&gt;&lt;br /&gt;Last: if someone knows of a calendar program - please tell me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8739888712337579201?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8739888712337579201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8739888712337579201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8739888712337579201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8739888712337579201'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/05/how-come-all-digital-calendars-suck.html' title='How come all digital calendars suck?'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5078017427297336449</id><published>2008-05-17T12:53:00.000+01:00</published><updated>2008-05-14T12:07:02.570+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wishlist'/><title type='text'>Folding everywhere in the editor</title><content type='html'>I think I want an editor that can fold every branch in the source code; every if, every switch...&lt;br /&gt;&lt;br /&gt;Then I think I want some sort of colour or font coded differentiation of regular code and error handling.  This way it should be easy to see the difference between business logic and plumbing.&lt;br /&gt;How to do this without taking up valueable source code lines I do not know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5078017427297336449?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5078017427297336449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5078017427297336449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5078017427297336449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5078017427297336449'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/02/folding-everywhere-in-editor.html' title='Folding everywhere in the editor'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4659152831990426983</id><published>2008-05-13T20:15:00.003+01:00</published><updated>2008-05-14T12:02:09.234+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'>Unit testing - can be too much</title><content type='html'>I like unit tests, I really do.  But I have also come to realize that many tests don't have to be done.&lt;br /&gt;&lt;br /&gt;One can for instance code according to &lt;a href="http://selfelected.blogspot.com/2007/11/fail-at-once.html"&gt;Fail At Once&lt;/a&gt; to make the compiler do the tests.&lt;br /&gt;Or one can autogenerate code and hence only have to unit test a fraction of the resulting code.&lt;br /&gt;Or one can du integration tests and take for granted that if the integration works the unit tests work too.&lt;br /&gt;&lt;br /&gt;I have tried all three and believe in laziness - to get more done while working less.  So I say that a thought out mix of all three above supposedly is the right way.&lt;br /&gt;&lt;br /&gt;Patrik Löwendahl thinks approximately the &lt;a href="http://www.lowendahl.net/showShout.aspx?id=204"&gt;same&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4659152831990426983?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4659152831990426983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4659152831990426983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4659152831990426983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4659152831990426983'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/05/unit-testing-can-be-too-much.html' title='Unit testing - can be too much'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7153939277733397888</id><published>2008-05-04T16:38:00.001+01:00</published><updated>2009-07-06T22:17:00.023+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>WPF and how to move between graphics and XAML</title><content type='html'>When designing windows/controls in a WPF form there are two panes.  One (upper) with the graphics and one (lower) with the XAML code.  How do one navigate between these two through the keyboard?  The answer is shift-F7.&lt;br /&gt;&lt;br /&gt;F7 moves from designer to code.&lt;br /&gt;&lt;br /&gt;Shift-F7 is the reverse and moves from code to designer and in the designer toggles between the graphics pane and the XAML pane.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Update: Now I can only switch from XAML to code behind but not back and not between the xaml/designer panes.  New machine, new OS, new service pack, new addons.  I don't know what to blame.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7153939277733397888?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7153939277733397888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7153939277733397888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7153939277733397888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7153939277733397888'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/05/wpf-and-how-to-move-between-graphics.html' title='WPF and how to move between graphics and XAML'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4913982321830413674</id><published>2008-05-03T21:50:00.001+01:00</published><updated>2008-05-03T21:54:45.495+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Everything is a change</title><content type='html'>There are no bugs and issues.  There are no features and bugs.  There are no priority changes and work items.  There are no new use cases and lack of backup and ugly login page and bad performance.&lt;br /&gt;&lt;br /&gt;There is only change.&lt;br /&gt;&lt;br /&gt;Do not sigh when the customer comes with a new all important requirement.  Put it in the list of changes.&lt;br /&gt;&lt;br /&gt;It is only a change.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4913982321830413674?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4913982321830413674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4913982321830413674' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4913982321830413674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4913982321830413674'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/05/everything-is-change.html' title='Everything is a change'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5817974314030679374</id><published>2008-03-25T22:08:00.001+01:00</published><updated>2008-03-25T22:11:10.929+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><title type='text'>Outlook Express address book error</title><content type='html'>Outlook Express has a problem wich cost me an hour of my life.  I document it here to the aid of others.  (I did search in the knowledgebase on MSDN or support att Microsoft to enter my newfound intel but there was no good place.  MSDN which some years ago was a good place to find information has IMHO deteriorated.)&lt;br /&gt;&lt;br /&gt;Problem: Outlook Express refused to open the emails.  The error information was something like "An error has occurred." but in swedish so it was useless for googling.&lt;br /&gt;Opening the Address book there was a better error message "The Address book cannot be opened." but likewise in swedish.  Slightly narrower error message which helped me a lot.&lt;br /&gt;&lt;br /&gt;I fixed the Wab (address book) file by copying the automatic backup (myusername.wa~).&lt;br /&gt;But OE still complained about a corrupt WAB file.&lt;br /&gt;&lt;br /&gt;Googling did little to help so I rebooted "just because".  And it worked.&lt;br /&gt;&lt;br /&gt;To make OE read the address book again one has to reboot the computer.  (Technically it might be enough to zap exactly the right process or do some registry hack but I don't know which.)&lt;br /&gt;&lt;br /&gt;Lessons learned:&lt;br /&gt;1) When localizing a product - make each error message searchable.  Either by a unique ID to search for or by letting the user see the international (english) text besides the local.&lt;br /&gt;2) Give the user a sporting chance to track the error.  If it is not possible to give a proper error message - describe where to find it, like in a log file or something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5817974314030679374?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5817974314030679374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5817974314030679374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5817974314030679374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5817974314030679374'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/03/outlook-express-address-book-error.html' title='Outlook Express address book error'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2286743108933845111</id><published>2008-03-07T13:04:00.008+01:00</published><updated>2008-03-07T13:12:50.801+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Prioritization is about Removing</title><content type='html'>Prioritization is about removing things  from a list - not putting them in.&lt;br /&gt;&lt;br /&gt;The above is very easy to approve of until one is faced with the actual task of removing something.&lt;br /&gt;&lt;br /&gt;I have a trick that seems simple enough to work.  I have used it with a customer and gotten to know things  he didn't know himself.  I use it on myself and get wiser every time.&lt;br /&gt;&lt;br /&gt;Take this list with "all things" and separate it to &lt;a href="http://selfelected.blogspot.com/2007/07/which-prioo.html"&gt;three piles of equal size&lt;/a&gt;.  Prio 1, 2 and 3.  If three piles is too hard, try 9; but do keep them of equal in size.&lt;br /&gt;&lt;br /&gt;This is hard to do and the result is not the final prioritization but it gets blood to the brain and forces the synapses to fire in new patterns.  To remove things.&lt;br /&gt;&lt;br /&gt;I do not tell the customer but know myself that the lowest third in the list will never be done due to money, time or -best of all- the very &lt;a href="http://selfelected.blogspot.com/2008/02/postpone-decisions.html"&gt;requirement disappears&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2286743108933845111?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2286743108933845111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2286743108933845111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2286743108933845111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2286743108933845111'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/03/prioritization-is-about-removing.html' title='Prioritization is about Removing'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7298938791142024360</id><published>2008-02-27T22:51:00.006+01:00</published><updated>2008-02-27T23:07:36.227+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Search IMDB through Opera</title><content type='html'>To let opera easily search IMDB for you, enter&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;    http://imdb.com/find?s=all&amp;amp;q=%s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;in the dialogue described &lt;a href="http://selfelected.blogspot.com/2007/10/search-wikipedia-through-opera.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Or use&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   &lt;span&gt;&lt;span&gt;http://sv.wikipedia.org/wiki/%s&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;to search swedish wikipedia.&lt;br /&gt;&lt;br /&gt;If you get too many hits it is very easy to navigate in Opera without having to grab the mouse - just shift-arrow around.&lt;br /&gt;&lt;br /&gt;I use&lt;br /&gt;   &lt;span style="font-family:courier new;"&gt; &lt;span&gt;&lt;span&gt;http://selfelected.blogspot.com/search?q=%s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;to search my own blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7298938791142024360?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7298938791142024360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7298938791142024360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7298938791142024360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7298938791142024360'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/02/search-imdb-through-google.html' title='Search IMDB through Opera'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-247842669817948469</id><published>2008-02-27T12:45:00.000+01:00</published><updated>2008-02-27T12:46:41.642+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Postpone decisions</title><content type='html'>Delay the decisions until they solve themselves or disappear.  Sometimes postponing is futile and a decision has to be made.  Then make it, but not before.&lt;br /&gt;&lt;br /&gt;Sometimes one need more balls to not decide than to decide.&lt;br /&gt;&lt;br /&gt;( And or course... not making a decision is also a decision... )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-247842669817948469?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/247842669817948469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=247842669817948469' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/247842669817948469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/247842669817948469'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/02/postpone-decisions.html' title='Postpone decisions'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-467421930948454120</id><published>2008-02-18T21:01:00.002+01:00</published><updated>2008-02-18T21:06:15.611+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Bad menus</title><content type='html'>Since my first application with menus à la Mac/Win I have wondered over the semi standard menus.&lt;br /&gt;&lt;br /&gt;So first we have &lt;strong&gt;File&lt;/strong&gt;, a noun.  There is supposed to be things to manipulate Files there.&lt;br /&gt;Then comes &lt;strong&gt;Edit&lt;/strong&gt;, a verb.  Is this where you look for ways to edit things?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;View&lt;/strong&gt; which often follows is both a noun and a verb which is good because then you can have lots of stuff in it.  Which is bad because you can have lots of stuff in it.&lt;br /&gt;After this there is usually a group of menus that are application specific so I have no opinion of them.&lt;br /&gt;Ending the group of application specific menus is the menu &lt;strong&gt;Tools&lt;/strong&gt; that really is a misspelled acronym for Things Out Of The Standard; or possibly Things That Go Nowhere Else.&lt;br /&gt;The finale is &lt;strong&gt;Help&lt;/strong&gt; that contains ways to get help.  And the version number of the application.&lt;br /&gt;&lt;br /&gt;Am I the only one who feels this as a bit illogical?&lt;br /&gt;Shouldn't all top menus be nouns or am I missing something?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-467421930948454120?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/467421930948454120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=467421930948454120' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/467421930948454120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/467421930948454120'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/02/bad-menus.html' title='Bad menus'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1680489682582170967</id><published>2008-01-25T12:56:00.000+01:00</published><updated>2008-01-25T12:58:13.190+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Coloured layers</title><content type='html'>In a multi layered application one is bound to travel up and down and up again through the layers.  It is usually not hard to keep track of where one is; just read the contents of the methods or check the namespace in suitable textbox.&lt;br /&gt;&lt;br /&gt;But wouldn't it be nice to have an extra signal?  I am thinking of changing the colour of the background or frames or something.  Not from red to green but something more subtle.  Ridiculous thought?  That is what I thought too when I first encountered coloured source code.  "colouritis" whas my response.  Today I cannot live without it and wouldn't mind using different fonts the same way.&lt;br /&gt;&lt;br /&gt;Ok, ok.  "cannot live without" was an aggravation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-1680489682582170967?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1680489682582170967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1680489682582170967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1680489682582170967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1680489682582170967'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/01/coloured-layers.html' title='Coloured layers'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2110198207374963811</id><published>2008-01-24T13:38:00.001+01:00</published><updated>2008-02-27T23:06:17.196+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><title type='text'>How to raise an event</title><content type='html'>It is very simple to raise events in dotnet/C#.&lt;br /&gt;But there is a caveat one should be aware of; especially since it probably will show itself intermittently and be hard to track down.  It is when someone finishes his listening for the event between the does-someone-listen-for-the-event and the very firing.&lt;br /&gt;The good news is that it is easily solved by a temporary variable like so:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span&gt;&lt;span&gt;internal event NavigateDelegate OnNavigate;&lt;br /&gt;&lt;br /&gt;      internal delegate void NavigateDelegate( NavigateTypes navigateType );&lt;br /&gt;     &lt;br /&gt;private void Raise_OnNavigate(NavigateTypes navigateType)&lt;br /&gt;      {&lt;br /&gt;              NavigateDelegate tempEvent = OnNavigate;&lt;br /&gt;              if (null != tempEvent)&lt;br /&gt;              {&lt;br /&gt;                      OnNavigate(navigateType);&lt;br /&gt;              }&lt;br /&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;If the above is hard to remember there is a snippet&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    invoke&lt;/span&gt;&lt;br /&gt;to use.  Just write it at a line and press Tab.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2110198207374963811?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2110198207374963811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2110198207374963811' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2110198207374963811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2110198207374963811'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/01/how-to-raise-event.html' title='How to raise an event'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7611228245908573753</id><published>2008-01-22T12:36:00.000+01:00</published><updated>2008-01-22T12:41:54.140+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><title type='text'>The simplest possible solution, but not simpler than that</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;När man inom Agile pratar om den enklaste metoden menar man inte den lösning man först kommer på eller den som går snabbast att implementera.&lt;br /&gt;Med enklast innebär den lösning som löser uppgiften med minst extra information och avsteg från befintligt mönster.&lt;br /&gt;&lt;br /&gt;Detta kan tarva en förklaring.&lt;br /&gt;Med minst extra information menas möten, dokumentation och implicit och explicit kunnande.  Om lösningen följer gängse mönster behövs antagligen ingen dokumentation, varken som explicita dokument eller inline-kommentarer.   &lt;strong&gt;Om lösningen är "rätt" krävs mindre möten, diskussioner, dokumentation, rådfrågningar och redogörelser.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Enklast är inte nödvändigtvis den lösning som kräver minst tankearbete eller minst jobb.&lt;br /&gt;&lt;br /&gt;För att vara ärlig talar jag inte för hela den agila rörelsen.  Texten ovan är min tolkning av begreppen, metoden, livet, universum och allting.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When the agile development movement talks about the simplest solution; they do not mean the first solution that pops up in the head or is fastest to implement.&lt;br /&gt;&lt;strong&gt;Simplest means the solution that solves the problem with least extra information and sidesteps from the chosen/optimal path.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This might demand an explanation.&lt;br /&gt;With least extra information  means meetings, documenation, implicit and explicit knowledge.  If the solution follows the chosen path, colour and rythm of other well written parts of the solution; it probably doesn't need documentation, neither as explicit documents nor as inline comments.  The "right" solution requires less meetings, discussions, documentations, questions and answers.&lt;br /&gt;&lt;br /&gt;The simplest solution it not neccessarily the solution that requires the least amount of thoughts or work.&lt;br /&gt;&lt;br /&gt;To be honest I cannot say I speak for the whole agile movement.  The text above is my view of the terms, the method, life, universe and everything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7611228245908573753?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7611228245908573753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7611228245908573753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7611228245908573753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7611228245908573753'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/01/simplest-possible-solution-but-not.html' title='The simplest possible solution, but not simpler than that'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5700245352631900516</id><published>2008-01-18T12:57:00.000+01:00</published><updated>2008-01-18T13:03:19.973+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wishlist'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Everything is a bug</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Allting är en bug.  Eller snarare: allting är ett ärende.&lt;br /&gt;Oavsett om ärendet skapar en krasch, är fel storlek på loggan eller innebär installation av en UPS är det något som skall tilldelas människa och tid.&lt;br /&gt;&lt;br /&gt;Min åsikt är att lägga allting i samma hög.  Och med allting menar jag allting.  Sedan prioriterar man ärendena och plockar från toppen.  Om detta liknar valfri agil metod är det inte för att  &lt;a href="http://blog.crisp.se/henrikkniberg/"&gt;Henrik Kniberg&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Kent_Beck"&gt;Kent Beck&lt;/a&gt; och jag har kommunicerat utan för att det är ett bra tillvägagångssätt.&lt;br /&gt;&lt;br /&gt;Varje ärende måste ha ett unikt ID.  Ett ID som inte hänger ihop med ärenderubriken.  Detta unika ID måste gå att säga och skriva; jag föreslår konsekutiv numrering, 1, 2, 3...&lt;br /&gt;För icke-databasssystem använder jag dagens datum följt av 01, 02, ..99 (20080118.01) för att jag brukar kunna hålla antalet ärenden idag i huvudet och har ännu inte råkat ut för fler än 99 på en dag.&lt;br /&gt;&lt;br /&gt;Det här med en och samma ärendetyp har &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718934.aspx"&gt;Microsoft Team Foundation&lt;/a&gt; missat.  När man skapar ett ärende i det kan man välja mellan olika ärendetyper och när man har valt kan man inte ändra.  TFS är konfigurerbart så man kan säkert välja bort alla ärendetyper utom en, men att det överhuvudtaget finns känns konstigt för mig.&lt;br /&gt;&lt;br /&gt;Jag önskar mig ett ärendehanteringssystem där man får en översikt av sina ärenden mer än som bara listor med rubriker.  Jag önskar mig en sorts bollar med snören emellan där man smidigt kan se vad som hänger ihop och hur mycket som påverkas om man drar i en av bollarna.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Everything is a bug.  Correction: everything is an issue.&lt;br /&gt;Disregarding the issue creates a crash, is the wrong image size or installation and configuration and testing of a UPS it is somethign that shall be given a human and time.&lt;br /&gt;&lt;br /&gt;My opinion is that everything should be in the same pile.  With everything I mean everything.  Then the issures are prioritized and picked off of the top.  I you, dear reader, now recognizes and starts looking at your books about agile project methods this is not a coincidence.  I am not saying that &lt;a href="http://blog.crisp.se/henrikkniberg/"&gt;Henrik Kniberg&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Kent_Beck"&gt;Kent Beck&lt;/a&gt; and I have communicated but that it is a good method.&lt;br /&gt;&lt;br /&gt;Further must every issue have a unique ID separated from the title of the issue.  It must also be short enough to say and write - I suggest just numbering them from 1 and on as they are created.  In spreadsheets and other non-database systems where I cannot track the unique key I usually use the format yyyymmdd-nn because one can probably store the number of issues that day temporarily in the head and I have never written more than 99 issues in one day.&lt;br /&gt;&lt;br /&gt;Looking at &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718934.aspx"&gt;Microsoft Team Foundation&lt;/a&gt; I say that they have stumbled regarding the everything-is-an-issue thing since there are several issue types and once you have chosen one there is no going back.  To their defense I have to mention that TFS is configurable and one can choose to use just one of the types.  But the very existence of non-changeable issue types is strange.&lt;br /&gt;&lt;br /&gt;On my wish list is an issue manager where the browsing and handling of issues are outstanding.  I wish of something like balls interconnected with strings and when you juggle one ball you se whatever it pulls/affects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5700245352631900516?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5700245352631900516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5700245352631900516' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5700245352631900516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5700245352631900516'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/01/everything-is-bug.html' title='Everything is a bug'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1582408256117632285</id><published>2008-01-17T19:51:00.000+01:00</published><updated>2008-01-17T20:10:17.128+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Replace Notepad with something better</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Notepad.exe är en editor knappt värd namnet.  Den väger in på 68k vilket inte är så mycket för en windows-app.&lt;br /&gt;Men så innehåller den två kända buggar också.  En som plockar bort text om du använder notepad mycket / har stora filer och en som inte klarar av vissa teckenkombinationer i början.&lt;br /&gt;&lt;br /&gt;Tidigare använde jag &lt;a href="http://www.notetab.com/ntl.php"&gt;NoteTab&lt;/a&gt; som är en alldeles utmärkt editor som är gjord för att ersätta Notepad.  Den både hade ".log -i-början-av-filen"-funktionaliteten och i installationen ingick det en fråga om man ville byta ut Notepad.  Det ville man.&lt;br /&gt;&lt;br /&gt;Men sedan WinXP har inte det gått.  Testa att byt namn på Notepad.exe i %windir%\System32 och den poppar rätt tilbaka igen.  Så om du undrar var din hårddisk tagit vägen så ligger det uppenbarligen 2 st operativsystem på den.&lt;br /&gt;&lt;br /&gt;Men räddning finns:  &lt;a href="http://blogs.msdn.com/omars/archive/2004/04/30/124093.aspx"&gt;http://blogs.msdn.com/omars/archive/2004/04/30/124093.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notepad.exe is an editor hardly worth mentioning.  It lacks functionality but has still managed to cramp in 2 bugs into 68k.&lt;br /&gt;&lt;br /&gt;I used to use &lt;a href="http://www.notetab.com/ntl.php"&gt;NoteTab&lt;/a&gt; earlier which was built as a Notepad replacement.  It even had the ".log -in-the-beginning-of-the-file"-functionality and the installtion procedure contained a question whether to replace Notepad.  That was the obvious choice.&lt;br /&gt;&lt;br /&gt;But since WinXP this has not been possible.  Locate Notepad.exe in %windir%\System32 and change its name.  A new Notepad.exe will pop up from nowhere.  So if you wonder where all your hard disc space is gone you now know - there are two installations of Windows on it.&lt;br /&gt;&lt;br /&gt;But Notepad can be replacede byt following&lt;a href="http://blogs.msdn.com/omars/archive/2004/04/30/124093.aspx"&gt; this link&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-1582408256117632285?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1582408256117632285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1582408256117632285' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1582408256117632285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1582408256117632285'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/01/replace-notepad-with-something-better.html' title='Replace Notepad with something better'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-7572422780074868932</id><published>2008-01-17T12:36:00.000+01:00</published><updated>2008-01-17T12:39:19.682+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><title type='text'>Build list classes</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;(dotnet-kod)&lt;br /&gt;Gör listklasser av dina klasser.&lt;br /&gt;D.v.s. gör en egen klass&lt;br /&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    class UserList : List&lt;user&gt;&lt;br /&gt;     {&lt;br /&gt;          ...&lt;br /&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;För då blir anropen&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    UserList userList = new UserList( "whatever parameters" );&lt;br /&gt;     User user = userList.FindByName( userName );&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;istället för&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    List&lt;user&gt; userList = GetUsersByWhatever( "whatever parameters" );&lt;br /&gt;     User user = FindUserByName( userList );&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Lika många rader kod och ungefär lika lättläst men bättre "information hiding" i de senare exemplet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(dotnet code)&lt;br /&gt;Make list classes of you classes.&lt;br /&gt;Make it like&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    class UserList : List&lt;user&gt;&lt;br /&gt;     {&lt;br /&gt;          ...&lt;br /&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Then you can have calls like&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    UserList userList = new UserList( "whatever parameters" );&lt;br /&gt;     User user = userList.FindByName( userName );&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;instead of&lt;br /&gt; &lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    List&lt;user&gt; userList = GetUsersByWhatever( "whatever parameters" );&lt;br /&gt;     User user = FindUserByName( userList );&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;About as many rows of code and about as readable but better information hding in the latter example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-7572422780074868932?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/7572422780074868932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=7572422780074868932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7572422780074868932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/7572422780074868932'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/01/build-list-classes.html' title='Build list classes'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2533567109419602657</id><published>2008-01-17T12:08:00.000+01:00</published><updated>2008-01-17T12:21:24.799+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Dogfood and Kopain</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;"Eat you own dog food" är ett uttryck för att använda det man själv tillverkat.  I mitt fall bestämde jag mig för att använda &lt;a href="http://code.google.com/p/kopain/"&gt;Kopain&lt;/a&gt; från den förste i år.&lt;br /&gt;Det är en enkel editor med RTF-möjlighet och framför allt en hierarkisk meny på sidan.  Helt enkelt en rip-off av &lt;a href="http://www.tranglos.com/free/keynote.html"&gt;KeyNote&lt;/a&gt; som jag använt i flera år.&lt;br /&gt;&lt;br /&gt;När jag började använda &lt;a href="http://code.google.com/p/kopain/"&gt;Kopain&lt;/a&gt; hade den 2 kända buggar.  När jag använt applikationen en dag hade jag hittat fem till.  Plus att ett par av sakerna på feature-listan (någon som vet en översättning av "feature"?) hade eskalerat till buggar i och med att de störde användningen för mycket.&lt;br /&gt;&lt;br /&gt;Varför bygger jag en ersättare till &lt;a href="http://www.tranglos.com/free/keynote.html"&gt;KeyNote&lt;/a&gt;?  (i den mån den kan kallas ersättare då den inte kan en bråkdel så mycket)&lt;br /&gt;&lt;span&gt;&lt;strong&gt;För att jag vill.  Och för att jag kan.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Men framför allt att den sparar på ett format jag inte gillar.  &lt;span&gt;&lt;strong&gt;Det sparade formatet måste vara lätt att läsa och läsbart med något annat än ursprungsapplikationen.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Är det någon som vet en editor/ordblandare jag kan integrera som sparar annat än RTF?  Jag vill ha något som är mer lättläst och generellt typ HTML då RTFstandarden verkar vara ungefär "det som WordPad lämnar från sig".&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jag är nu inne på den 17e användningsdagen av &lt;a href="http://code.google.com/p/kopain/"&gt;Kopain&lt;/a&gt; och jag har fortfarande två kända återskapningsbara buggar.  Jag har kraschat applikationen en handfull gånger och den har en gång zappat 2 dagars noteringar.  Jag är nöjd.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"Eat you own dog food" is an expression for using what you have created.  In my case I started using Kopain from the first day this year.&lt;br /&gt;It is a simple editor with RTF possibility and above all an hierarchical menu to sort the notes.  Simply put a rip off of &lt;a href="http://www.tranglos.com/free/keynote.html"&gt;KeyNote&lt;/a&gt; which I have been using for several years.&lt;br /&gt;&lt;br /&gt;When I started using &lt;a href="http://code.google.com/p/kopain/"&gt;Kopain&lt;/a&gt; it had 2 known bugs.  When I had used the application for a day five more had surfaced.  Plus two things on my feature list had escalated to Bug status since they had to big an impact on the usability.&lt;br /&gt;&lt;br /&gt;Then why did I build a replacement to &lt;a href="http://www.tranglos.com/free/keynote.html"&gt;KeyNote&lt;/a&gt;?  (if it can be called a replacement at all since it contains a fraction of the functionality)&lt;br /&gt;&lt;span&gt;&lt;strong&gt;Because I want.  And because I can.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;But above all that is saves in a format more easily read.  &lt;span&gt;&lt;strong&gt;The saved format must require the original application to read.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Is there someone who knows of an editor with formatting capabilities I can integrate instead of the RTF thing I have today?  I must be able to save in a more open and easily read format like HTML since the specification for RTF seems to be "whatever WordPad spits out".&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I am now on my 17th day of eating.  I still have 2 recreatable bugs.  I have crasched a handfull of times.  I have lost 2 days of work.  All summed I am satisfied.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2533567109419602657?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2533567109419602657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2533567109419602657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2533567109419602657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2533567109419602657'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/01/dogfood-and-kopain.html' title='Dogfood and Kopain'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3467383196463859662</id><published>2008-01-04T12:46:00.000+01:00</published><updated>2008-01-04T12:47:44.719+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Central objects in the domain model</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Bli inte förvånad att det centrala på en fabrik inte är det centrala när domänen modelleras.&lt;br /&gt;I kvalitetssäkringen av en rörfabrik är inte nödvändigtvis rören som är centrala utan istället alla mätvärden; och inte ens dem utan den lilla biten som säger om mätningen är godkänd eller inte.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Do not get surprised when the central object in a factory is not the central object in the domain model.&lt;br /&gt;When creating a system for quality assurance in a tube factory it is not neccessarily the tubes that are central in the domain model but the measurements; and not even them but the small bit that tells if the measrumenent is approved or not.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-3467383196463859662?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/3467383196463859662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=3467383196463859662' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3467383196463859662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3467383196463859662'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2008/01/central-objects-in-domain-model.html' title='Central objects in the domain model'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8606080295167630629</id><published>2007-12-30T14:19:00.000+01:00</published><updated>2007-12-30T14:20:14.819+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>How long will it take</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Om det tar 8 månader att bygga ett system så tar det 8 månader att bygga systemet, hur aggresivt man än lägger tidplanen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If it takes 8 months to build a system then it will take 8 months to build the system, however aggressive we try to plan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8606080295167630629?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8606080295167630629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8606080295167630629' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8606080295167630629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8606080295167630629'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/12/how-long-will-it-take.html' title='How long will it take'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2261104074932159954</id><published>2007-12-16T22:45:00.001+01:00</published><updated>2007-12-16T22:46:12.615+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>To the point of no surprise</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Hur länge skall man speca, planera, undersöka?&lt;br /&gt;Ett enkelt svar är: "Tills man inte råkar ut för överraskningar."&lt;br /&gt;Eller: "Tills de positiva överraskningarna är lika många som de negativa."&lt;br /&gt;Eller: "Av de oväntade sakerna som dyker upp finns ingen jag kan förutspå."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;How long should one plan, do specification or experiment?&lt;br /&gt;One simple answer is: "Until you don't get any more surprises."&lt;br /&gt;Another is: "Until the positive suprises are as many as the negative."&lt;br /&gt;Or: "Among all surprises that will surface there is none I can predict."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2261104074932159954?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2261104074932159954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2261104074932159954' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2261104074932159954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2261104074932159954'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/12/to-point-of-no-surprise.html' title='To the point of no surprise'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8488238072351082525</id><published>2007-12-12T12:18:00.000+01:00</published><updated>2007-12-12T12:25:14.516+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Different countries separate roles differently</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Vi verkar inte separera roller på samma sätt i Sverige som i USA.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://selfelected.blogspot.com/2007/06/programming-is-designing-is.html"&gt;Jag anser&lt;/a&gt; programmering hänga tätt ihop med design som hänger tätt ihop med arkitektur.&lt;br /&gt;Samma människa gör ofta alla saker, bara med olika hattar på.  Ibland har man samma hatt i hela projektet och ibland byter man varje minut.&lt;br /&gt;&lt;br /&gt;Se på Microsofts licenser där VSNet för arkitekter inte innehåller funktionalitet för att testa.  Och utvecklaren har inga kraftfulla databasverktyg.&lt;br /&gt;Lösningen är att köpa deras alltihopa-licens men den är gördyr.&lt;br /&gt;&lt;br /&gt;Bortser vi från pengarna kan det ändå vara ett problem.  Om Microsoft tror att olika människor är fasta i sina olika roller smittar det av sig på produkterna.  Och då kommer det vara svårare att hantera projekt på "vårt" sätt med deras produkter.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It seems like we do not separate roles the same way in Sweden and USA.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://selfelected.blogspot.com/2007/06/programming-is-designing-is.html"&gt;I say&lt;/a&gt; programming is tightly connected with design is tightly connected with architecture.&lt;br /&gt;The same person often does all things, just wearing different hats.  Sometimes the hat is worn throughout the whole project and sometimes changed every minute.&lt;br /&gt;&lt;br /&gt;Look att Microsoft's licenses for VSNet where architects do not have testing functionality.  And the developers do not have any powerful database tools.  The solution is to buy their all-in-one-box licens but it is Expensive.&lt;br /&gt;&lt;br /&gt;Money aside it can still be a problem.  If Microsoft believes different people are stuck in different roles it will colour the products too.  And then it will be more difficult to use Microsofts products to handle projects "our" way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8488238072351082525?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8488238072351082525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8488238072351082525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8488238072351082525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8488238072351082525'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/12/different-countries-separate-roles.html' title='Different countries separate roles differently'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5051885308951605048</id><published>2007-12-11T21:31:00.000+01:00</published><updated>2008-01-06T20:08:05.029+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strong typing'/><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><title type='text'>Volta and Script# - type safe javascript</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Så länge jag har känt mig själv har jag klagat på den svaga typningen i Javascript.&lt;br /&gt;Jag kan förstå att implementationen är olika mellan olika webbläsare och nästan, men bara nästan, förstå Microsofts egocentriska volt med IE att göra en egen händelsemodell.  Men jag kan inte förstå det strategiska beslutet av Netscape att göra ett svagt typat språk.&lt;br /&gt;&lt;br /&gt;För några år sedan ramlade jag över en lösning, &lt;a href="http://projects.nikhilk.net/Projects/ScriptSharp.aspx"&gt;Script#&lt;/a&gt;, som kunde omvandla typsäker C#-kod till Javascript.  Den var ett experiment så jag vågade aldrig ta in den i produktion och hade inte tid att leka med den.  Vad jag inte visste förrän nyligen var att Microsoft har tyckt som jag.&lt;br /&gt;&lt;br /&gt;Så nu har de lanserat &lt;a href="http://labs.live.com/volta/"&gt;Volta&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As long as I have known myself I have been irritated on the weak type model of Javascript.&lt;br /&gt;I can understand that the implementation of Javascript differs between the web browsers.  And I can almost understand Microsofts egocentric trick with Javascript in the earlier IE versions.  But I have never understood Netscape's reasoning behind making a language weakly typed.&lt;br /&gt;&lt;br /&gt;Some years ago I stumbled over a solution, &lt;a href="http://projects.nikhilk.net/Projects/ScriptSharp.aspx"&gt;Script#&lt;/a&gt;, to convert type save C# code to Javascript.  It was an experiment so I never dared to bring it into production even though I wanted to.  What I didn't know was that obviously someone at Microsoft thought like I.&lt;br /&gt;&lt;br /&gt;So now they have launched &lt;a href="http://labs.live.com/volta/"&gt;Volta&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[Update: Bytte mjuk mot svag.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5051885308951605048?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5051885308951605048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5051885308951605048' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5051885308951605048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5051885308951605048'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/12/volta-type-safe-javascript.html' title='Volta and Script# - type safe javascript'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4668518310296181477</id><published>2007-12-11T12:13:00.000+01:00</published><updated>2007-12-11T12:14:02.643+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Do not start on A</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;När jag listar kontakter i min nalle börjar den alltid längst upp, på A.  Varför inte börja i mitten?&lt;br /&gt;&lt;br /&gt;Dessutom är det mer troligt är att jag vill fortsätta där jag var senast, men det är en annan femma.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When I open Contacts in my phone it starts at A.  Why not start in the middle?&lt;br /&gt;&lt;br /&gt;Then... I probably want to continue where I let off the last time.  But that is the source of another posting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4668518310296181477?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4668518310296181477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4668518310296181477' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4668518310296181477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4668518310296181477'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/12/do-not-start-on.html' title='Do not start on A'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-5866842020243378563</id><published>2007-12-11T12:06:00.000+01:00</published><updated>2007-12-11T12:08:01.999+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Work with good people</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Jag har haft turen att jobba med bra folk.  Testa det.&lt;br /&gt;Bra beslut som ifrågasätt av bra människor ger ett ännu bättre resultat.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have hade the luxury of working with good people.  Try it.&lt;br /&gt;Good decisions that are questioned by good people gives an even better result.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-5866842020243378563?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/5866842020243378563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=5866842020243378563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5866842020243378563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/5866842020243378563'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/12/work-with-good-people.html' title='Work with good people'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-290964946053321289</id><published>2007-12-10T22:11:00.000+01:00</published><updated>2007-12-10T22:13:11.340+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><title type='text'>No cancel button</title><content type='html'>This message will be repeated in english&lt;br /&gt;&lt;br /&gt;Någon gång i slutet av 1900-talet bestämde sig Microsoft för att slopa Avbryt-knappen på sitt nya operativsystem PocketPC.&lt;br /&gt;&lt;br /&gt;I operativsystemet innan, WindowsCE PPC, fanns en Avbryt-knapp så om man råkade nudda kalendern kunde man alltid Avbryta sig ur att skapa en ny post.  I PocketPC 5.0 som jag använder nu är det svårare att skapa en ny post men lika lätt att flytta den.  På en nuddning har man flyttat ett möte i tiden och det finns inget sätt att ångra.  Detta på en apparat som är gjord att användas.&lt;br /&gt;&lt;br /&gt;Detta är lika korkat som när Apple tog bort den andra knappen på musen de hade under ett kort tag.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sometime in the end of the 20th century Microsoft updated their WindowsCE PPC to PocketPC.  At the same time they removed the Cancel button.&lt;br /&gt;&lt;br /&gt;I refused to buy a new gadget when you were just one tap away from moving your appointment without having any way to cancel you erroneous tap.  I mean, it was built to be used in other places than a steady desk, right?  What where they thinking of?&lt;br /&gt;&lt;br /&gt;And with PocketPC6.0 the Cancel button is still missing.  This is as stupid as when Apple removed the second mouse button they finally got in place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-290964946053321289?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/290964946053321289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=290964946053321289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/290964946053321289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/290964946053321289'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/12/no-cancel-button.html' title='No cancel button'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2298489761216252616</id><published>2007-11-20T19:23:00.000+01:00</published><updated>2007-11-20T19:27:21.106+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>What a solution is to be used for</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;När man jobbar med use case är en av parametrarna de olika typerna av användare.  Med dem håller man reda på att man bygger rätt sak för rätt roll.&lt;br /&gt;&lt;br /&gt;Härom dagen snubblade jag över ett ärendehanteringssystem, ni vet ett sådant som helpdesk/supporten använder.  Där kunde man sätta prioritet på ett ärende men vi skulle nogsamt undvika prio 1; för med prio 1 gick det ebrev till en hel hög med folk, bl.a. högsta chefen.&lt;br /&gt;&lt;br /&gt;Jag skulle vilja höra den felrapporten.&lt;br /&gt;"Hallå, är det helpdesk? Jag skulle vilja rapportera ett ärende."&lt;br /&gt;"Ja.  Vad är det om?"&lt;br /&gt;"Fabriken brinner."&lt;br /&gt;"Ok.  Noterat.  Hur bråttom är det?"&lt;br /&gt;"Görsketabråttom, så det är nog bäst du sätter den på prio 1.  Chefen vill nog veta."&lt;br /&gt;&lt;br /&gt;Hur mycket jag än tänker kan jag inte komma på ett supportärende som kräver att chefen behöver veta men inte är allvarligt nog att jag kan ringa honom.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One of the parameters when working with use cases is the different types of uses.  They are used as guidance for building the right thing for the right role.&lt;br /&gt;&lt;br /&gt;The other day I stumbled over a issue system,  you know the kind helpdesk/support uses.  One of the values to set was priority but we were asked not to use priority 1 because then an email was sent to more or less everyone including the top boss.&lt;br /&gt;&lt;br /&gt;I would like to hear that report.&lt;br /&gt;"Hello.  Is it help desk?  I would like to file a report."&lt;br /&gt;"Yes hello.  What is it about?"&lt;br /&gt;"The factory is on fire."&lt;br /&gt;"Ok.  It is noted.  How urgent is it?"&lt;br /&gt;"Very urgent I believe.  So please give it a priority 1.  The boss probably wants to know."&lt;br /&gt;&lt;br /&gt;I have been thinking about it but have still to come up with an issue that is important enough to the boss to know but not serious enough to just call him on the phone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2298489761216252616?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2298489761216252616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2298489761216252616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2298489761216252616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2298489761216252616'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/11/what-solution-is-to-be-used-for.html' title='What a solution is to be used for'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8503965878073500051</id><published>2007-11-19T19:09:00.000+01:00</published><updated>2007-11-20T08:19:15.902+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Screen dump of a message box</title><content type='html'>This message will be repeated in english&lt;br /&gt;&lt;br /&gt;Sedan många år - och många år innan jag lärde mig det - har man kunnat dumpa texten i en messagebox med ctrl-c.&lt;br /&gt;&lt;br /&gt;Säg att man får en exception i ett program och en dialog med felmeddelande dyker upp.  Istället för att skärmdumpa och bifoga bildfilen kan man ctrl-c och skicka med texten.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since many years - many years before I noticed it - has it been possible to dump the text of a message box with ctrl-c.&lt;br /&gt;&lt;br /&gt;Example: an application throws an exception and a dialogue with an error message pops up.  Instead of dumping the screen and attaching the picture file just copy the text with ctrl-c and past it in you email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8503965878073500051?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8503965878073500051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8503965878073500051' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8503965878073500051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8503965878073500051'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/11/screen-dump-of-message-box.html' title='Screen dump of a message box'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2792805839313053253</id><published>2007-11-16T12:26:00.000+01:00</published><updated>2007-11-16T12:31:27.111+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Cut features - not customer values</title><content type='html'>This message will be repeated in english&lt;br /&gt;&lt;br /&gt;Ibland händer det att ett projekt går över tiden eller blir fördyrat av annan orsak.  Då måste man göra något.&lt;br /&gt;(Efter man har skurit bort dokumentationen och ner på testningen) letar man efter funktionalitet att ta bort; men vilken?&lt;br /&gt;&lt;br /&gt;Jag vill dela med mig av tanken&lt;strong&gt; "Ta bort funktionalitet men inte värde."&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Exempel: Kunden vill kunna välja på flera roller för varje användare som kan logga in.  Värdet behålls om man kan be kunden logga in som olika användare istället  (username_adm, username_op, username_reader).&lt;br /&gt;&lt;br /&gt;Detta är inte alltid tillämpbart eftersom vi försöker ta bort funktionalitet som inte tillför något värde.  Men tanken finns där.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sometimes a project goes over budget.  Then you have to do something.&lt;br /&gt;(After cutting away documentation and down on testing) one looks for functionality to remove; but which?&lt;br /&gt;&lt;br /&gt;I want to share the thought &lt;strong&gt;"Remove functionality but not value."&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Example: The customer wants to be able to log in with one user but then to choose from several roles.  Functionality is cut but value is kept if the customer is persuaded to logging in with several users (username_adm, username_operations, username_reader).&lt;br /&gt;&lt;br /&gt;This is not alwasy doable since we have gotten quite good at removing functionality that is not needed.  But the though is still there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2792805839313053253?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2792805839313053253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2792805839313053253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2792805839313053253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2792805839313053253'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/11/cut-features-not-customer-values.html' title='Cut features - not customer values'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-3933663710934079068</id><published>2007-11-15T17:45:00.000+01:00</published><updated>2007-11-15T18:06:45.553+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>"Does it solve the problem?"</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Ibland får jag buggar i produktion som tar tid att fixa.  Då försöker jag hitta en omväg som gör att produktionen kan fortsätta.&lt;br /&gt;Omvägen får vara i stort sett hur konstig som helst - bara produktionen fortsätter och data hålls konsistent.&lt;br /&gt;&lt;br /&gt;Min fråga till användaren/kunden blir då alltid &lt;span&gt;&lt;strong&gt;"Löser det problemet?"&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Första gången det händer måste jag förklara med ett &lt;strong&gt;"Kan produktionen fortsätta?"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Säg att listningen av produkter kraschar.  Jag kan printa ut en lista från databasen där ProductID syns och kan lära kunden manipulera URLen till att visa rätt produkt.&lt;br /&gt;"Om jag ger dig en lista där du ser produkterna i bokstavsordning och har en kolumn med en siffra; så kan du mata in den siffran sist i URLen.  Det är jobbigt men Löser det problemet?  Kan produktionen fortsätta?"&lt;br /&gt;&lt;br /&gt;När produktionen kan fortsätta kan jag och kunden koncentrera oss på rätt lösning.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sometimes, in production, I get bugs that take some time to fix.  My first mission is to find a work around to get the production up and running again.&lt;br /&gt;The workaround can be almost anything - as long as production keeps going and data is kept consistent.&lt;br /&gt;&lt;br /&gt;My first question to the user/customer is &lt;strong&gt;"Does it solve the problem?"&lt;/strong&gt;&lt;br /&gt;The first time this happens I have to explain with a following &lt;strong&gt;"Can the production continue?"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;An example: The listing of products crashes.  A work around can be to print a list of products and primary keys and to learn the user how to manipulate a URL.&lt;br /&gt;"If I give you a list with the products.  Can you then enter the number in this column in the URL at this place?  It is tedious, I know, but does it solve the problem?  Is production able to continue?"&lt;br /&gt;&lt;br /&gt;When the production is up and running we then have a possibility to make the right solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-3933663710934079068?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/3933663710934079068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=3933663710934079068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3933663710934079068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/3933663710934079068'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/11/does-it-solve-problem.html' title='&quot;Does it solve the problem?&quot;'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8209494767368919469</id><published>2007-11-09T14:23:00.000+01:00</published><updated>2007-11-09T14:28:03.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>The wikified project</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;&amp;lt;floskelvarning/&amp;gt;&lt;br /&gt;&lt;br /&gt;Jag jobbade för några år sedan på ett företag där ledningen hade läst en bok och nu skulle "platta till organisationen".  Det startades ett förändringsarbete och efter ett knappt år var vi nere i 2,5 lager istället för de 3 vi hade tidigare.&lt;br /&gt;&lt;br /&gt;Vi var tydligen platta nog.&lt;br /&gt;&lt;br /&gt;Men... koncernchefen var inte koncernchef för att han var full av dåliga idéer.  Han kanske såg mer då än jag.  Något jag förstår först nu.  Som ingen av oss förstod då.&lt;br /&gt;&lt;br /&gt;Gör en wiki-analogi där allting ligger på samma nivå men man länkar fram och tillbaka beroende på behov.&lt;br /&gt;Jag har hittat en artikel som lättfattligt beskriver detta.  Artikeln har dessutom den fördelen att den har bra rubriker och lättläst text så den är lätt att skumma.&lt;br /&gt;&lt;br /&gt;Om du tänker mer i "projekt" än "organization" byt ut orden.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eu.socialtext.net/wikinomics/index.cgi?the_wikified_organization"&gt;http://www.eu.socialtext.net/wikinomics/index.cgi?the_wikified_organization&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;buzz word warning&amp;gt;&lt;br /&gt;&lt;br /&gt;I worked some years ago at a company where the management had read a book.  So we were to "flatten the organisation".  The wagon was set rolling and after less than a year we were down to 2,5 layers instead of the 3 we had earlier.&lt;br /&gt;&lt;br /&gt;We were obviously flat enough.&lt;br /&gt;&lt;br /&gt;But... the top dog was probably not top dog because he was full of stupid ideas.  He probably saw more than I.  Something I understand now.  Something none of us understood then.&lt;br /&gt;&lt;br /&gt;Make a wiki analogy where  everything is on the same level but the links back and forth create the patterns.&lt;br /&gt;I have found an article about this.  Besides begin easy to read it has good headlines so it is skimmable.&lt;br /&gt;&lt;br /&gt;If you think more of "project" than "organization" just exchange the words.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eu.socialtext.net/wikinomics/index.cgi?the_wikified_organization"&gt;http://www.eu.socialtext.net/wikinomics/index.cgi?the_wikified_organization&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8209494767368919469?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8209494767368919469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8209494767368919469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8209494767368919469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8209494767368919469'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/11/wikified-project.html' title='The wikified project'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-2108936675337926283</id><published>2007-11-08T15:15:00.000+01:00</published><updated>2007-11-08T15:16:49.402+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Virtual reality - Secondlife vs Facebook</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Är Second life är coolare för det är 3D?&lt;br /&gt;&lt;br /&gt;Behöver vi 3D?  Varför låta rummet handikappa oss i cybervärlden bara för att den gör det IRL?&lt;br /&gt;&lt;br /&gt;Vi kanske bara skall släppa drömmen om en 3D cybervärld och koncentrera oss på hyperlänkning istället.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Is Second life cooler because it is 3D?&lt;br /&gt;&lt;br /&gt;Do we even need 3D?  Just because we are handicapped by the room IRL, I see no reason to bring it to the cyber world.&lt;br /&gt;&lt;br /&gt;Maybe we should just forget the visions of a 3D cyber world and concentrate on hyper linking instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-2108936675337926283?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/2108936675337926283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=2108936675337926283' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2108936675337926283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/2108936675337926283'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/11/virtual-reality-secondlife-vs-facebook.html' title='Virtual reality - Secondlife vs Facebook'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-8921861611118064751</id><published>2007-11-08T15:02:00.000+01:00</published><updated>2007-11-08T15:06:31.995+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solid code'/><title type='text'>Fail At Once</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Hur får man rättningar och funktionalitet så fort som möjligt genom dörren?&lt;br /&gt;Hur får man så få buggar som möjligt i produktion?&lt;br /&gt;&lt;br /&gt;Jag fick en gång kommentaren från en vän "Men du levererar väl aldrig otestad kod?".  Det var en komplimang och en kommentar till att jag just då satt i ett projekt som skulle leverera den högsta kvaliteten jag levererat hittills, dessutom rakt ut i fabrik&lt;br /&gt;Mitt svar förvånade honom "Jag testar inte."  Jag lät honom hämta andan.  "Rättning: jag testar så lite som möjligt och mycket kod går rakt ut i produktion otestad."&lt;br /&gt;&lt;br /&gt;Sedan följde en förklaring.  En förklaring jag har dragit för alla i projektet:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"Använd kompilatorn för att fånga fel."&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Vanligtvis när man talar om system med hög kvalitet pratar man om testning.  Massor med manuella tester med speciella konsulter man hyr in som är specialiserade på test.  Dyrt.  Men det blir dyrt med hög kvalitet.&lt;br /&gt;Bullshit.&lt;br /&gt;&lt;br /&gt;Manuella tester är dyrt och tar lång tid.&lt;br /&gt;&lt;br /&gt;Modernare utveckling innehåller enhetstester.&lt;br /&gt;&lt;br /&gt;Jag förespråkar Fail At Once för att slippa många enhetstester och manuella dito.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Det är viktigt att fånga fel så fort som möjligt.  De allra bästa är att inte skriva dem alls.&lt;/i&gt;&lt;br /&gt;Där är jag inte ännu.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;How do you ship patches and functionality as fast as possible?&lt;br /&gt;How do you get as few bugs as possible in production?&lt;br /&gt;&lt;br /&gt;I once got a comment from a friend "But you never deliver untested code?"  It was meant as a compliment and comment to my job then; I was working in a project that was delivering the highest quality I have ever delivered; right onto factory floor.&lt;br /&gt;My answer surprised him "I don't test."  I let him catch his breath.  "Correction: I test as little as possible and as much code as possible goes into production untested."&lt;br /&gt;&lt;br /&gt;I had to explain, the same explanation everyone in the project had heard.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"Use the compiler to catch errors."&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Normally when one talks about high quality system one also mentions testing.  Lots of manual tests with consultants specialised on testing.  Expensive.  But high quality is expensive.&lt;br /&gt;Bullshit.&lt;br /&gt;&lt;br /&gt;Manual tests are expensive and take lots of time.&lt;br /&gt;&lt;br /&gt;The more modern unit testing is cheaper.&lt;br /&gt;&lt;br /&gt;I recommend Fail At Once to get rid of many unit tests and manual ditto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;It is important to catch errors as fast as possible.  The best is to not write them at all.&lt;/i&gt;&lt;br /&gt;I am not there yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-8921861611118064751?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/8921861611118064751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=8921861611118064751' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8921861611118064751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/8921861611118064751'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/11/fail-at-once.html' title='Fail At Once'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-1830068021077610524</id><published>2007-11-02T22:48:00.000+01:00</published><updated>2007-11-02T22:51:01.756+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>You have always wondered how...</title><content type='html'>Sorry, I can't tell you more without spoiling the story.&lt;br /&gt;&lt;a href="http://www.365tomorrows.com/05/26/now-we-know/"&gt;http://www.365tomorrows.com/05/26/now-we-know/&lt;/a&gt;&lt;br /&gt;But now you know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-1830068021077610524?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/1830068021077610524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=1830068021077610524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1830068021077610524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/1830068021077610524'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/11/you-have-always-wondered-how.html' title='You have always wondered how...'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-4285581058896334052</id><published>2007-10-31T13:42:00.000+01:00</published><updated>2007-10-31T13:56:44.863+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='not-yet-fully-invented'/><title type='text'>Daemontools has a rude behaviour</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;Jag behövde läsa en ISO-fil och kunde just då inte använda &lt;a href="http://msdn2.microsoft.com/en-us/subscriptions/aa948864.aspx"&gt;MS&lt;/a&gt;s &lt;a href="http://download.microsoft.com/download/7/b/6/7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe"&gt;Virtual&lt;/a&gt; CD.  Det är en liten, enkel, icke påträngande lösning.&lt;br /&gt;På rekommendation installerade jag &lt;a href="http://www.daemon-tools.cc/"&gt;DaemonTools&lt;/a&gt; och den uppförde sig ofint.&lt;br /&gt;&lt;br /&gt;Jag installerade och den bad mig boota om.  Det är ok, den gör säkert lite krångliga saker som kräver omstart.&lt;br /&gt;När jag hade installerat DaemonTools så fanns där ingenting.  Jag skulle tydligen installera en gång till.  Det är ok, installation är krångligt men jag hade gärna fått en dialog som berättar detta.  Så jag installerade för andra gången.&lt;br /&gt;När jag hade installerat DaemonTools för andra gången så fanns där ingen applikation i start-menyn där de brukar vara, utan jag skulle ta tag i musen och klicka på en ny ikon i sys-tray.&lt;br /&gt;&lt;br /&gt;Vad sjutton är det som är så magiskt att DaemonTools måste starta samtidigt som min dator varje gång?  Men det är ok - bara för att jag inte vill starta en CD-emulator vid varje uppstart så finns det säkert de som vill eller måste.&lt;br /&gt;&lt;br /&gt;Men... nästa gång jag startade Internet Explorer var min startsida utbytt!&lt;br /&gt;Installationen frågade mig aldrig om den fick lov att byta ut min startsida och även om den hade gjort det - Det finns Ingen I Världen som vill byta ut sin startsida i IE mot &lt;a href="http://google.daemonsearch.com/se/ý"&gt;http://google.daemonsearch.com/se/ý&lt;/a&gt; eller &lt;a href="http://search.daemonsearch.com/search/"&gt;http://search.daemonsearch.com/search/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Detta ofina beteende gör att jag misstror resten av DaemonTools också.  Om de anser de kan byta ut startsidan i en av mina applikationer - vad anser de då de kan göra mer med min maskin?&lt;br /&gt;&lt;br /&gt;Självklart har jag avinstallerat applikationen.  Men vem vet vad som har avinstallerats.  Kanske ligger där kvar ett rootkit à la &lt;a href="http://en.wikipedia.org/wiki/2005_Sony_BMG_CD_copy_protection_scandal"&gt;Sony-BMG&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The other day I needed to read an ISO file and couldn't use &lt;a href="http://msdn2.microsoft.com/en-us/subscriptions/aa948864.aspx"&gt;MS&lt;/a&gt;s &lt;a href="http://download.microsoft.com/download/7/b/6/7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe"&gt;Virtual CD&lt;/a&gt; as I usually do.  On recommendation  I installed &lt;a href="http://www.daemon-tools.cc"&gt;DaemonTools&lt;/a&gt; and it misbehaved.&lt;br /&gt;&lt;br /&gt;I installed and it asked me to reboot.  It is ok, there are probably lots of difficult things to do to create a virtual CD.  When the rebooting was finished nothing new had happened.  Something probably had, but what?&lt;br /&gt;I am not angry about rebooting, sometimes a man has got to do what a man has got to do.  But it would be nice with some information that I had to install again.&lt;br /&gt;So I installed again and it looked fine.  Except for there being nothing in the start meny as there usually is.  I had to grab the mouse and click an icon in the systray.&lt;br /&gt;&lt;br /&gt;What is so magic about DaemonTools that it has to autostart every time I log on?  IMHO it would be better if one started it when needed.  But what do I know? - it might do a lot of fancy stuff that requires it to be autostarted.&lt;br /&gt;&lt;br /&gt;But... the next time I started Internet Explorer my start page was changed!  I don't use IE unless I have to but what made someone decide that their choice of start page is more important than mine?&lt;br /&gt;Honestly - there is No One In The World who wants to exchange their start page to &lt;a href="http://google.daemonsearch.com/se/ý"&gt;http://google.daemonsearch.com/se/ý&lt;/a&gt; or &lt;a href="http://search.daemonsearch.com/search/"&gt;http://search.daemonsearch.com/search/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This rude behaviour, overwriting my choice of start page in one of my applications, makes me wonder what more the application has done to my machine.  Someone obviously has decided he knows more about my surfing needs than I.  What has he decided he knows more? whether a keylogger should be good? whether I need an automatic update for yet another application?&lt;br /&gt;&lt;br /&gt;Needless to say I uninstalled the application.  But who knows what the uninstaller did...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-4285581058896334052?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/4285581058896334052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=4285581058896334052' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4285581058896334052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/4285581058896334052'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/10/daemontools-has-rude-behaviour.html' title='Daemontools has a rude behaviour'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9138509940389651166.post-6538071410285955320</id><published>2007-10-30T12:46:00.000+01:00</published><updated>2007-10-30T12:49:44.514+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Do not use the web solution of VSNet2005</title><content type='html'>This message will be repeated in english.&lt;br /&gt;&lt;br /&gt;När VSNet2005 kom skrevs det mycket om att man kunde kompilera applikationerna innan man skickar dem till webservern.  Jag förstod ingenting, kompilera applikationerna hade jag gjort sedan Aspnet1.0.&lt;br /&gt;&lt;br /&gt;När jag installerade VSNet2005 och kickade igång mitt första Aspnet-projekt förstod jag efter ett tag vad som menades.  Med VSNet2005 kom en ny projektmodell utan projektfil.  D.v.s. det var svårt att skilja det som låg i projektkatalogen av administrativa skäl från de som skulle till produktion.  Detta för att man skulle kunna skicka källkod till servern.&lt;br /&gt;De ansvariga för det tänkte säkert på något men jag vill inte veta vad.&lt;br /&gt;&lt;br /&gt;Lösningen var att ladda ner en addon som numera ingår genom SP1 för VSNet - "ASP.NET Web Application" och få VSNet2003s projekttyp.  Den som uppför sig som projekttyper skall.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When VSNet2005 was fresh one could find lots of text about the possibility to compile the project before sending it to the web server.  I didn't understand.  I had compiled my applications before deploying them since Aspnet1.0.&lt;br /&gt;&lt;br /&gt;When I got the chance to install VSNet2005 and try my first Aspnet-project I understood the meaning of it all.  With VSNet2005 there was a new project model without project file.  This makes it hard to separate the files that are in the project for administrative reasons from the ones that should go into production.&lt;br /&gt;Somewhere someone had decided it was a good thing to send source code to the web server.  They were probably thinking of something but I sure do not want to know what.&lt;br /&gt;&lt;br /&gt;The solution was to download an addon from Microsoft.  This addon is part of the SP1 for VSNet2005 so just use the "ASP.NET Web Application" to get earlier, better, project type.  It behaves like it should.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9138509940389651166-6538071410285955320?l=selfelected.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://selfelected.blogspot.com/feeds/6538071410285955320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9138509940389651166&amp;postID=6538071410285955320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6538071410285955320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9138509940389651166/posts/default/6538071410285955320'/><link rel='alternate' type='text/html' href='http://selfelected.blogspot.com/2007/10/do-not-use-web-solution-of-vsnet2005.html' title='Do not use the web solution of VSNet2005'/><author><name>LosManos</name><uri>http://www.blogger.com/profile/08166031267431172778</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
