<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Yggdrasil : Home of Nidhogg</title><link>http://stup.org/blogs/nidhogg/</link><description>.NET coding at the roots of the Great Tree of Life</description><managingEditor>Nidhogg</managingEditor><dc:language>en-US</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Nidhogg</dc:creator><title>Solution-sudoku opens !</title><link>http://stup.org/blogs/nidhogg/archive/2006/01/18/1115.aspx</link><pubDate>Wed, 18 Jan 2006 08:31:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2006/01/18/1115.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/1115.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2006/01/18/1115.aspx#Feedback</comments><slash:comments>390</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/1115.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/1115.aspx</trackback:ping><description>&lt;p&gt;I've been working on &lt;a href="http://www.solution-sudoku.com"&gt;http://www.solution-sudoku.com&lt;/a&gt; in the past few days. The site is now functionnal and active. Its sole purpose is to give hints about or solve sudoku puzzles. Give it a try and tell me what you think about it&lt;/p&gt;
&lt;p&gt;I also created software for solving sudoku puzzles for MS smartphones and PocketPC, the Windows version should be online soon. They are available on the site for free.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>MCT now</title><link>http://stup.org/blogs/nidhogg/archive/2006/01/18/1114.aspx</link><pubDate>Wed, 18 Jan 2006 08:27:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2006/01/18/1114.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/1114.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2006/01/18/1114.aspx#Feedback</comments><slash:comments>129</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/1114.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/1114.aspx</trackback:ping><description>&lt;p&gt;Since my last post about a century ago, I moved into a new flat my wife and I bought. Then there was a 1 month Internet black-out until my ISP restored my connection to the world.&lt;/p&gt;
&lt;p&gt;In other news, I passed the MCT exam so I will be teaching .NET and related technologies from time to time, starting at the end of this month.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>MCSD.NET</title><link>http://stup.org/blogs/nidhogg/archive/2005/08/05/1056.aspx</link><pubDate>Fri, 05 Aug 2005 16:37:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2005/08/05/1056.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/1056.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2005/08/05/1056.aspx#Feedback</comments><slash:comments>70</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/1056.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/1056.aspx</trackback:ping><description>&lt;p&gt;I passed the 70-340 certification on .NET security a while ago which makes me a MCSD.NET. It took me some time but it is done, on to the MCT now.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Gauge, a CounterStrike : Source monitor application</title><link>http://stup.org/blogs/nidhogg/archive/2005/07/09/1044.aspx</link><pubDate>Sat, 09 Jul 2005 14:19:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2005/07/09/1044.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/1044.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2005/07/09/1044.aspx#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/1044.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/1044.aspx</trackback:ping><description>&lt;p&gt;As promised here is the first alpha version of Gauge, an application that monitors your computer, waits until you play CounterStrike: Source and when you do, publishes the server information (server ip, port, map name) to MSN 7, using the "What I'm listening to" feature.&lt;/p&gt;
&lt;p&gt;This is a test only version, so don't expect much.&lt;/p&gt;
&lt;p&gt;I'm open to suggestions, feel free to send feedback using the comments or email me at the address specified in the readme.txt file.&lt;/p&gt;
&lt;p&gt;&lt;A&gt;Download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PS: it connects to a webservice on stup.org, don't worry its just that Valve releases a new version of CSS every now and then, and I need to update certain variables to keep it working.&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;EDIT: it looks like the method I use to get the server from the memory is not reliable as the address is dependant on the machine on which the software runs. I'll try to look into it when I have some free time ... The download is now inactive.&lt;/b&gt;
&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>70-300. Done.</title><link>http://stup.org/blogs/nidhogg/archive/2005/05/06/547.aspx</link><pubDate>Fri, 06 May 2005 17:51:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2005/05/06/547.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/547.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2005/05/06/547.aspx#Feedback</comments><slash:comments>162</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/547.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/547.aspx</trackback:ping><description>&lt;p&gt;I just passed the 70-300 .NET Architecture exam. Another one down, only one left (70-340 on .NET security) and I'll be a MCSD.NET. After that I plan to go for the Microsoft Certified Trainer certification. This will enable me to teach official Microsoft courses on .NET. I really look forward to it, it should be a lot of fun.&lt;/p&gt;
&lt;p&gt;And I still get married next week :)&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>Back to blogging .. for a while anyway</title><link>http://stup.org/blogs/nidhogg/archive/2005/04/26/546.aspx</link><pubDate>Tue, 26 Apr 2005 18:06:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2005/04/26/546.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/546.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2005/04/26/546.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/546.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/546.aspx</trackback:ping><description>&lt;p&gt;I just realized it's been months since I last posted anything on this blog. So, here are the news :
&lt;ul&gt;
&lt;li&gt;I am now  a MCAD.NET, working on my MCSD.NET certification&lt;/li&gt;
&lt;li&gt;My work right now is on a ASP.NET v2.0 project which is about as cool as I could hope for&lt;/li&gt;
&lt;li&gt;I am getting married in 2 weeks which is obviously way cooler than all of the above :)&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;As an aside, I'm working on a little application that will monitor CounterStrike:Source. When a user is playing online it will publish the server IP and port so that fellow gamers can come and join the fun. I have a working prototype that publishes the information to the Friendly Name in Windows Messenger 4.7 (In the more recent versions the friendly name in the COM APIs has been made read-only which makes the whole publishing stuff a pain). I plan to support publishing to a FTP site, mIRC, MSN (if I find a way to do so), maybe other IM software. I'll build a simple plugin architecture to extend it if needed. I may even design it to support other games / apps.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Captcha Enabled</title><link>http://stup.org/blogs/nidhogg/archive/2005/01/31/514.aspx</link><pubDate>Mon, 31 Jan 2005 17:27:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2005/01/31/514.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/514.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2005/01/31/514.aspx#Feedback</comments><slash:comments>350</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/514.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/514.aspx</trackback:ping><description>Recently we started to get some comment spam on the stup.org blogs. Removing them manually was beginning to be a real bore so I implemented &lt;a href="http://blogs.clearscreen.com/migs/archive/2004/11/10/575.aspx"&gt;Miguel Jimenez's Captcha control for .Text&lt;/a&gt;. From now on, you'll have to enter the text displayed on the image to post a comment. It sucks but it's the most efficient way to stop this annoying spam.
</description></item><item><dc:creator>Nidhogg</dc:creator><title>Strongly Typed Config Generator v1.2</title><link>http://stup.org/blogs/nidhogg/archive/2005/01/30/460.aspx</link><pubDate>Sun, 30 Jan 2005 13:51:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2005/01/30/460.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/460.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2005/01/30/460.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/460.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/460.aspx</trackback:ping><description>&lt;p&gt;I updated the Strongly Typed Config Generator tool to fix a bug reported on this blog. I also fixed some project file problems (I apparently had a modelling addin installed that included some .tgs files in my project). Please note that some of the references still need to be manually changed to reflect the installation folders on your machine for both VS.NET and CodeSmith.
&lt;/p&gt;
&lt;p&gt;
Here are the files :
&lt;li&gt;&lt;a href="http://www.stup.org/files/ConfigGeneratorv1_2.zip"&gt;Binaries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stup.org/files/ConfigGeneratorv1_2_src.zip"&gt;Sources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;I tested it for about 5 minutes so if something is broken post a comment... I'll try to fix it.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>RangeValidator quirks</title><link>http://stup.org/blogs/nidhogg/archive/2004/12/15/410.aspx</link><pubDate>Wed, 15 Dec 2004 18:38:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/12/15/410.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/410.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/12/15/410.aspx#Feedback</comments><slash:comments>53</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/410.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/410.aspx</trackback:ping><description>&lt;p&gt;I've been busy for weeks, hence the lack of post on this weblog. Here's a little one on strange things I noticed about RangeValidator and Double.&lt;/p&gt;
&lt;p&gt;A few days ago I was trying to find the cause of an exception in an ASP.NET web application. It happened when I set a RangeValidator's Type to ValidationDataType.Double, then set the MaximumValue to Double.MaxValue.ToString(). I found two things :
&lt;ul&gt;
	&lt;li&gt;
		&lt;p&gt;Apparently, the real maximum value of a Double is 1.7976931348623157E+308. However, Double.MaxValue.ToString() produces 1.79769313486232E+308 which is not parsable with Double.Parse() because it is too big. The cause is that the default formatting for the Double type is 15 digits + exponent whereas the value itself has 17 fractional digits + exponent. When ToString() is called, it rounds the value and the result is a bigger number than the real value. Same goes for Double.Minimum value.&lt;/p&gt;
		&lt;p&gt;Therefore, when you want to transform a Double to a string so that String.Parse works, use ToString("r"). This formatting ensures that a roundtrip Double-&amp;gt;String-&amp;gt;Double always works.&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;p&gt;The RangeValidator uses a regular expression to validate the user input. You can see this with Reflector in the BaseCompareValidator.Convert method. The expression is :
		&lt;code&gt;@"^\s*([-\+])?(\d+)?(\" + decimalSeparator + @"(\d+))?\s*$";&lt;/code&gt;
		As you can see, it does not handle numbers formatted in scientific notation. Therefore, Double.MaxValue produces the exception I was getting : "The value '1.7976931348623157E+308' of the MaximumValue property of 'RangeValidator1' cannot be converted to type 'Double'."&lt;p&gt;
		&lt;p&gt;So the only Double values that can be used in a RangeValidator are the ones that can be written in string format without the scientific notation. I didn't check but I doubt you can write all Double numbers that way, there must be a limit to the number of digits in the string representation of a Double.
	&lt;/li&gt;
&lt;/ul&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>David Brin's Uplift saga</title><link>http://stup.org/blogs/nidhogg/archive/2004/10/13/381.aspx</link><pubDate>Wed, 13 Oct 2004 19:25:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/10/13/381.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/381.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/10/13/381.aspx#Feedback</comments><slash:comments>44</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/381.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/381.aspx</trackback:ping><description>&lt;p&gt;I've just finished &lt;a href="http://www.davidbrin.com"&gt;David Brin&lt;/a&gt;'s &lt;i&gt;&lt;a href="http://www.davidbrin.com/upliftbooks.html"&gt;Uplift&lt;/a&gt;&lt;/i&gt; scifi saga.  The basic theme is that Earth has found alien races in the galaxy and soon find that humanity's story is a bit atypical. In Brin's universe there is a galactic tradition of Uplift, that is the process of an alien sentient race bringing other non-spient races to sapiency usually using gene-meddling techniques. Each race has a patron race that uplifted them and they themselves have patrons all the way to the original sapient race. Earth doesn't fit in this scheme and found its way to sapiency in the purest Darwinist form, through evolution. In this context, a particular race gains power by uplifting other races and through the standing of their own patrons. There a lot more to it but this is the central concept.&lt;/p&gt;
&lt;p&gt;The series relates stories in this universe involving humans, uplifted dolphins and chimpazees going against some other alien races and helped by a few others.&lt;/p&gt;
&lt;p&gt;It has a kind of an old-school scifi ring to it, a bit like the anticipation novels of old. It features lots of classic sci fi themes like FTL (Faster Than Light) travel, anti-gravity fields, strange alien races and so on. One other good point I found was that there is no real "bad guys" to beat although there a friends, allies, and of course ennemies. But the plot is not about kicking the ass of some ugly monsters.&lt;/p&gt;
&lt;p&gt;I liked every bit of it and read the whole of it as fast as I could. The only gripe I have with this series is that there's a lot of loose ends. I would have liked a follow-up on this but it's been a great read anyway. The second book in the series got a Nebula, Hugo and Locus award, the third one got the Hugo and Locas, which usually means these are VERY good books.&lt;/P&gt;
&lt;p&gt;I'm now reading David Brin's &lt;i&gt;&lt;a href="http://www.davidbrin.com/othersfbooks.html"&gt;Kiln People&lt;/a&gt;&lt;/i&gt;, another popular novel by this author that explores an interesting concept. But I'll talk about that later.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Font for programmers (and users of text editors)</title><link>http://stup.org/blogs/nidhogg/archive/2004/10/13/380.aspx</link><pubDate>Wed, 13 Oct 2004 19:04:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/10/13/380.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/380.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/10/13/380.aspx#Feedback</comments><slash:comments>460</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/380.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/380.aspx</trackback:ping><description>&lt;p&gt;If you're a programmer or if you use text editors on a regular basis you might want to check out &lt;a href="http://www.tactile3d.com/tristan/"&gt;this font&lt;/a&gt;. It's a fixed-size font called &lt;a href="http://www.tactile3d.com/tristan/"&gt;Proggy&lt;/a&gt; and it's the best I've found. I've tried quite a few other fixed size font but none was as good as this one. There are multiple versions, choose the one you like best. I use the Proggy Clean version.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>this.Job = new Job();</title><link>http://stup.org/blogs/nidhogg/archive/2004/10/13/379.aspx</link><pubDate>Wed, 13 Oct 2004 17:41:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/10/13/379.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/379.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/10/13/379.aspx#Feedback</comments><slash:comments>68</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/379.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/379.aspx</trackback:ping><description>&lt;p&gt;It's been in preparation for months. I now work for a company that specializes in Microsoft technologies, mostly .NET. Among some of my new coworkers I now can count a handful of MVPs, a MSDN Regional Director, a lot of MCSD.NET and more broadly speaking some very interesting and knowledgeable people (Disclaimer: I'm not saying there weren't any in my previous job, it's just refreshing to talk to new ones). I've been at it for a week and so far it's been great. It looks like the projects I'll be working on will be a little more on the "up-to-date" side than before (think Agile methodologies, latest products from Microsoft, stuff like that).&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Identify AppSight for .NET</title><link>http://stup.org/blogs/nidhogg/archive/2004/10/06/375.aspx</link><pubDate>Wed, 06 Oct 2004 17:39:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/10/06/375.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/375.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/10/06/375.aspx#Feedback</comments><slash:comments>77</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/375.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/375.aspx</trackback:ping><description>&lt;p&gt;I found &lt;a href="http://www.identify.com/solutions/appsight-dotnet.html"&gt;this nice piece of software&lt;/a&gt; via the &lt;a href="http://www.sys-con.com/dotnet/"&gt;.NETDJ&lt;/a&gt; newsletter the other day. Basically it records everything that happens during your application's runtime and can replay it afterwards, exactly as it occured. It has other interesting features but this one is IMHO the most important.&lt;/p&gt;
&lt;p&gt;There are a lot of situations where that would be the ideal solution to track hard-to-find bugs&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Got my Orange SPV C500 !</title><link>http://stup.org/blogs/nidhogg/archive/2004/09/21/370.aspx</link><pubDate>Tue, 21 Sep 2004 17:06:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/09/21/370.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/370.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/09/21/370.aspx#Feedback</comments><slash:comments>112</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/370.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/370.aspx</trackback:ping><description>&lt;p&gt;I just got my brand new &lt;a href="http://www.orange.com/English/productsandservice/thespv3.asp?bhcp=1"&gt;SPV C500&lt;/a&gt; phone from &lt;a href="http://www.orange.com"&gt;Orange&lt;/a&gt;.  There's a &lt;a href="http://www.neowin.net/articles.php?action=more&amp;id=98"&gt;review&lt;/a&gt; on &lt;a href="http://www.neowin.net"&gt;Neowin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So far I find it great. I knew from reviews that the joystick was not so good but for normal use it works quite well.&lt;/p&gt;
&lt;p&gt;Now it's time to look at what the .NET Compact Framework offers on this platform.&lt;/p&gt;
&lt;img src="http://www.orange.com/images/14924.JPG" /&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>DMS Explorer menu editor 1.0</title><link>http://stup.org/blogs/nidhogg/archive/2004/09/12/365.aspx</link><pubDate>Sun, 12 Sep 2004 08:47:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/09/12/365.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/365.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/09/12/365.aspx#Feedback</comments><slash:comments>209</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/365.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/365.aspx</trackback:ping><description>&lt;p&gt;If you don't understand what this post is all about, you don't need this software =)&lt;/p&gt;
&lt;p&gt;I wrote this little application to be able to edit the DMS Explorer MENU.TXT file easily. Normally to install custom software on your PS2 with a DMS modchip you burn a CD with a INSTALL.CNF file and DMS explorer does the rest.&lt;/p&gt;
&lt;p&gt;Unfortunately some PS2 models can't read CD-RW very well so you need to burn quite a few CDs just to install some apps.&lt;/p&gt;
&lt;p&gt;I decided to install Execftp on my memory card and use a ftp client instead. Now the problem is that DMS Explorer uses the \BOOT\MENU.TXT file which is not a valid file because the PS2 uses "/" as the folder separator, not "\". So normal or even advanced FTP clients like FlashFXP could not get this file (ok maybe you can but I didn't find how). So I quickly wrote this application to bypass this problem.&lt;/p&gt;
&lt;p&gt;Download it here : &lt;a href="http://www.stup.org/files/DMSMenuEditor_v1.0.zip"&gt;DMSMenuEditor_v1.0.zip&lt;/a&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>MCP 70-316 passed</title><link>http://stup.org/blogs/nidhogg/archive/2004/09/08/363.aspx</link><pubDate>Wed, 08 Sep 2004 11:29:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/09/08/363.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/363.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/09/08/363.aspx#Feedback</comments><slash:comments>106</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/363.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/363.aspx</trackback:ping><description>&lt;p&gt;I just passed my second MCP exam (70-316 &lt;i&gt;Developing and Implementing Windows-based Applications with Microsoft Visual C# .NET and Microsoft Visual Studio .NET)&lt;/i&gt; with a nice score (980/1000). It's time for a little celebration and then I'm on my way to 70-320 (&lt;i&gt;Developing XML Web Services and Server Components with Microsoft Visual C# .NET and the Microsoft .NET Framework&lt;/i&gt;). It should a little harder for me since I have never worked with WebServices unlike ASP.NET and WinForms. I guess it's a good way to start learning.&lt;p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Active@ Partition Recovery</title><link>http://stup.org/blogs/nidhogg/archive/2004/09/06/361.aspx</link><pubDate>Mon, 06 Sep 2004 11:12:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/09/06/361.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/361.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/09/06/361.aspx#Feedback</comments><slash:comments>144</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/361.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/361.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://www.partition-recovery.com/"&gt;Active Partition Recovery&lt;/a&gt; saved my day. I deleted partitions on a backup drive I had removed from my PC to put it in my Playstation2 and moments after my RAID array decided to die. This piece of software recovered everything from the backup drive in seconds, flawlessly. Combined with a &lt;a href="http://www.symantec.com/sabu/ghost/ghost_personal/"&gt;Norton Ghost&lt;/a&gt; clone I got my system back up in a few hours.&lt;/P&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>The GAC, VS.NET references and debugging</title><link>http://stup.org/blogs/nidhogg/archive/2004/08/18/355.aspx</link><pubDate>Wed, 18 Aug 2004 13:55:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/08/18/355.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/355.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/08/18/355.aspx#Feedback</comments><slash:comments>254</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/355.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/355.aspx</trackback:ping><description>&lt;P&gt;In a VS.NET project , when you add a reference to a .NET component, you get a list of available components. This list contains a subset of the assemblies that are present in the machine's GAC. The contents of the list is controlled by registry keys (See subkeys of &lt;CODE&gt;HKLM\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders&lt;/CODE&gt; for everybody, &lt;CODE&gt;HKLM\SOFTWARE\Microsoft\VisualStudio\7.1\AssemblyFolders&lt;/CODE&gt; for VS.NET 2003 and &lt;CODE&gt;HKLM\SOFTWARE\Microsoft\VisualStudio\7.0\AssemblyFolders&lt;/CODE&gt; for VS.NET 2002). Basically if you want you component to appear in this list, you must place the assembly in the GAC, store a copy of the assembly somewhere on the disk outside of the GAC, optionally you can put symbols, xml docs etc on the disk and then add a registry subkey that points to the path on disk.&lt;/P&gt;
&lt;P&gt;When you add the reference, VS.NET will automatically use the .xml file the key points to so that you will have Intellisense. And you'll also notice that VS.NET only stores the path to the dll outside the GAC in its project files, and nothing says that the assembly is in the GAC. So the reference is not a reference to the assembly in the GAC but a reference to the version on disk. But at runtime, the .NET Framework will always load an assembly from the GAC before anything else. This ensures that the "real" assembly you wanted to reference is used at runtime.&lt;/P&gt;
&lt;P&gt;Now, you can't put symbols in the GAC since it only stores .NET assemblies. This is a problem when you're trying to debug an assembly that is placed in the GAC. The thing is : you can't. Your executable will always load assemblies from the GAC before anything else and in the GAC there are no symbols. (This is actually a generalization because of assembly versioning and the way .NET chooses which assembly to load but I'll leave that to you).&lt;/P&gt;
&lt;P&gt;Bottom line is : if you want to debug an assembly, don't put it in the GAC.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;&amp;lt;update&amp;gt;&lt;/B&gt;&lt;BR&gt;Actually there are 2 ways to place .pdb files alongside assemblies in the GAC. These 2 methods are based on the fact that the GAC is nothing more than a special view of the real files that are placed in the Windows\Assembly folder. We just need to override this view and copy our .pdb files where the assembly is.&lt;/P&gt;
&lt;P&gt;First method : use a DOS prompt, "cd" to the right folder under c:\windows\Assembly and then use the copy command.&lt;/P&gt;
&lt;P&gt;Second method : Open the registry editor and create a &lt;CODE&gt;HKLM\Software\Microsoft\Fusion\DisableCacheViewer&lt;/CODE&gt; DWORD entry with the value 1. Then you can use windows explorer and browse to c:\windows\assembly. The special view you normally get will be disabled and you'll be able to copy, delete, move files etc. With very little work you can create 2 .reg files to automate the task of enabling/disabling the GAC view.&lt;BR&gt;&lt;B&gt;&amp;lt;/update&amp;gt;&lt;/B&gt; &lt;/P&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>.NET flies !</title><link>http://stup.org/blogs/nidhogg/archive/2004/08/06/344.aspx</link><pubDate>Fri, 06 Aug 2004 17:49:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/08/06/344.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/344.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/08/06/344.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/344.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/344.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://www.cuuav.org/"&gt;Cornell&lt;/a&gt; students have built a small airplane capable of navigating by itself given a series of GPS coordinates. The plane runs Windows XP embedded and the software (both in the plane and on the ground control computers or PDAs) is written in C# for the .NET Framework. Check the &lt;a href="http://research.microsoft.com/displayArticle.aspx?id=685"&gt;report&lt;/a&gt; on the &lt;a href="http://research.microsoft.com/"&gt;Microsoft Research&lt;/a&gt; site.&lt;/p&gt;
&lt;p&gt;This is seriously cool, I wish I could have participated in that kind of project :)&lt;/p&gt;
&lt;p&gt;Now who said .NET was not fit for embedded apps ?&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>SoapFormatter and assembly versionning</title><link>http://stup.org/blogs/nidhogg/archive/2004/08/05/343.aspx</link><pubDate>Thu, 05 Aug 2004 14:49:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/08/05/343.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/343.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/08/05/343.aspx#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/343.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/343.aspx</trackback:ping><description>&lt;p&gt;Just a quick tip. Sometimes version numbers between two assemblies differ but serialized objects from this assembly that have been written to disk are still compatible and you would like to deserialize them with the new version of the assembly. If you left the default settings you won't be able to do that because .NET serializes the version of the assembly (complete with public key token) along with the object properties. The solution is to set the &lt;code&gt;AssemblyFormat&lt;/code&gt; property to &lt;code&gt;FormatterAssemblyStyle.Simple&lt;/code&gt;. .NET will not write the version information to disk and will be able to deserialize objects that have been serialized with a different version.&lt;/p&gt;

</description></item><item><dc:creator>Nidhogg</dc:creator><title>Ilium</title><link>http://stup.org/blogs/nidhogg/archive/2004/07/23/338.aspx</link><pubDate>Fri, 23 Jul 2004 06:57:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/07/23/338.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/338.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/07/23/338.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/338.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/338.aspx</trackback:ping><description>&lt;p&gt;I finished reading &lt;a href="http://www.dansimmons.com"&gt;Dan Simmons&lt;/a&gt;' &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0380978938/qid=1090568801/sr=8-1/ref=pd_ka_1/104-8845820-9316753?v=glance&amp;s=books&amp;n=507846"&gt;&lt;i&gt;Ilium&lt;/i&gt;&lt;/a&gt;. Definitely a great read. It feels a little confusing in the begining due to multiple plot lines and extensive references to greek mythology, Shakespeare and Proust. But it did not last long and I was soon totally absorbed in the story ... until I realized this was never going end in the few remaining pages...&lt;/p&gt;
&lt;p&gt;Dammit ! It's another of those great books that are part of a series that is not yet complete ! And now I'll have to wait ... yet again.&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>How to send a NET SEND message in C#/.NET</title><link>http://stup.org/blogs/nidhogg/archive/2004/07/13/336.aspx</link><pubDate>Tue, 13 Jul 2004 07:15:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/07/13/336.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/336.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/07/13/336.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/336.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/336.aspx</trackback:ping><description>&lt;p&gt;Someone asked this question on the microsoft.public.fr.dotnet newsgroups so I figured I'll post a little code snippet about that here. Basically NET SEND works over some really old crappy Windows interprocess communication channels called "mailslots". It has absolutely no security mecanism whatsoever, you can send message with forged sender and receiver names, can totally clog you network if you start broadcasting these messages but some people find it useful so here is how you send a NET SEND message.&lt;/p&gt;
&lt;p&gt;The main idea is to use the Win32 CreateFile function to create a special pseudo-file named like \\DESTINATION\mailslot\messngr where DESTINATION is the name of a computer on the network. With the Handle you get, use the .NET FileStream to send a message formatted like this : SENDER + "\0" + RECIPIENT + "\0" + MESSAGE + "\0\0". You can put whatever you wish in SENDER, RECIPIENT and MESSAGE (except \0 of course...). I think there is a limitation on the number of characters of each field but I can't remember the exact numbers.&lt;/p&gt;
&lt;p&gt;An interesting side note : if you try to use File.Create instead of the Win32 API Call to CreateFile you'll get this exception :&lt;br/&gt;&lt;br/&gt;
An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll&lt;br/&gt;
Additional information: FileStream was asked to open a device that was not a file. FileStream's constructors that take a String will only work with devices that are really files. If you need support for devices like "com1:" or "lpt1:", then call CreateFile yourself then use the FileStream constructors that take an OS handle as an IntPtr.&lt;br/&gt;&lt;br/&gt;
This is quite helpful and points you to the right direction. Congrats to Microsoft for a clear error message.&lt;/p&gt;
&lt;p&gt;And now, the code :&lt;/p&gt;

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;
.csharpcode
{
	font-size: 10pt;
	color: black;
	font-family: Courier New , Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0px; }
.rem { color: #008000; }
.kwrd { color: #0000ff; }
.str { color: #006080; }
.op { color: #0000c0; }
.preproc { color: #cc6633; }
.asp { background-color: #ffff00; }
.html { color: #800000; }
.attr { color: #ff0000; }
.alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0px;
}
.lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; GruikSoft.Net
{
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Contains utility methods to send messages like the NET SEND command does.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NetSend
    {
        [DllImport(&lt;span class="str"&gt;"kernel32.dll"&lt;/span&gt;)]
        &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; IntPtr CreateFile(&lt;span class="kwrd"&gt;string&lt;/span&gt; name, &lt;span class="kwrd"&gt;int&lt;/span&gt; desiredAccess, &lt;span class="kwrd"&gt;int&lt;/span&gt; shareMode, IntPtr securityAttributes,
            &lt;span class="kwrd"&gt;int&lt;/span&gt; creationDisposition, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwFlagsAndAttributes, IntPtr templateFile);
    
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Sends a NET SEND message.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name="destination"&amp;gt;Computer name to send the message to&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name="from"&amp;gt;Sender's name. Technically, you can put anything in here although it is better to put &lt;/span&gt;
        &lt;span class="rem"&gt;/// your name or nickname.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name="to"&amp;gt;Recipient's name. Same as for the sender, you can put whatever you want&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name="message"&amp;gt;Contents of the message.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SendMessage(&lt;span class="kwrd"&gt;string&lt;/span&gt; destination, &lt;span class="kwrd"&gt;string&lt;/span&gt; from, &lt;span class="kwrd"&gt;string&lt;/span&gt; to, &lt;span class="kwrd"&gt;string&lt;/span&gt; message)
        {
            IntPtr handle = CreateFile(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;@"\\{0}\mailslot\messngr"&lt;/span&gt;, destination),
                (&lt;span class="kwrd"&gt;int&lt;/span&gt;) FileAccess.Write, (&lt;span class="kwrd"&gt;int&lt;/span&gt;) FileShare.Read, IntPtr.Zero, (&lt;span class="kwrd"&gt;int&lt;/span&gt;) FileMode.Open, 0, IntPtr.Zero);
            FileStream fs = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileStream(handle, FileAccess.Write);
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;string&lt;/span&gt; s = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0}\0{1}\0{2}\0\0"&lt;/span&gt;, from, to, message);
                &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] msg = System.Text.Encoding.ASCII.GetBytes(s);
                fs.Write(msg, 0, msg.Length);
            }
            &lt;span class="kwrd"&gt;finally&lt;/span&gt;
            {
                fs.Close();    
            }
        }
    }
}&lt;/pre&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>An example of bad commercial practice</title><link>http://stup.org/blogs/nidhogg/archive/2004/06/25/330.aspx</link><pubDate>Fri, 25 Jun 2004 13:32:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/06/25/330.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/330.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/06/25/330.aspx#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/330.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/330.aspx</trackback:ping><description>&lt;p&gt;I've been a happy customer of my ISP, &lt;a href="http://www.free.fr"&gt;Free&lt;/a&gt; until now. They provide a service that is fast and cheap (30 euros/month for 5Mb down and 350Kb up). On top of that they have developped a custom adsl modem, called the &lt;a href="http://adsl.free.fr/"&gt;Freebox&lt;/a&gt;. It's a linux based adsl modem that also has TV services and VoIP services. This means you get TV and cheap phone calls (free between Freebox users). Plus it has Ethernet and USB ports. The latest version also has WiFi.&lt;/p&gt;
&lt;p&gt;The problem is that 2 years ago this Freebox was out of stock and I was given a normal adsl modem instead. Free kind of promised to upgrade its users to the Freebox "as soon as possible". Meanwhile all new customers were given a Freebox !&lt;p&gt;
&lt;p&gt;Now Free annouced that the upgrade costs 60Euros. But new customers are still getting the Freebox free of charge ! I can't believe it... I thought you usually &lt;b&gt;reward&lt;/b&gt; your oldest customers not try to extort money out of them. Actually it's cheaper to cancel the subscription and subscribe again than to upgrade... but you lose your Internet connection for a few days/weeks/months.&lt;/p&gt;
&lt;p&gt;Let's hope they get back to their senses because they are getting a much deserved trashing on french newsgroups and forums.&lt;/P&gt;

</description></item><item><dc:creator>Nidhogg</dc:creator><title>Catastrophic failure</title><link>http://stup.org/blogs/nidhogg/archive/2004/06/09/327.aspx</link><pubDate>Wed, 09 Jun 2004 09:01:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/06/09/327.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/327.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/06/09/327.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/327.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/327.aspx</trackback:ping><description>&lt;p&gt;Got a nice error from VS.NET 2003. I was trying to rebind a solution to another folder in VSS and got this :&lt;br/&gt;
&lt;img src="http://www.stup.org/blogs/Images/nidhogg/catastrophic_failure.PNG" border="0"&gt;&lt;/p&gt;
&lt;p&gt;I just love that kind of very informative message ;). Anyway, I just restarted VS.NET and managed to rebind my project just fine. But these kind of errors occur from time to time when dealing with VSS from VS.NET.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>.NET Threading tip</title><link>http://stup.org/blogs/nidhogg/archive/2004/06/04/322.aspx</link><pubDate>Fri, 04 Jun 2004 09:13:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/06/04/322.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/322.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/06/04/322.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/322.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/322.aspx</trackback:ping><description>&lt;p&gt;I just discovered that .NET threads have a IsBackground property. If this property is true, the thread does not prevent the process from terminating. The process simply aborts the thread. &lt;/p&gt;
&lt;p&gt;If you have ghost processes that are invisible except in the task manager when you quit your application chances are you have foreground threads that have not been terminated. If calling Abort on your thread doesn't break anything, set the IsBackground property to true, it will make it easier for you. Threads that monitor I/O (Serial port, TCP/IP...) are a good example.&lt;/p&gt;
&lt;p&gt;Obviously you can also use only foreground threads and terminate them manually.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>A modest clue for the majors ...</title><link>http://stup.org/blogs/nidhogg/archive/2004/06/02/321.aspx</link><pubDate>Wed, 02 Jun 2004 14:33:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/06/02/321.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/321.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/06/02/321.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/321.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/321.aspx</trackback:ping><description>&lt;p&gt;&amp;lt;rant&amp;gt;&lt;/p&gt;
&lt;p&gt;... believe in your customers and stop treating us like cashcows who should buy what you sell and shut up. Sell us unrestricted digital music, don't try to bullsh*t us with DRM that serves only you and your shareholders. Sell us unrestricted CDs with bonuses, don't try to sell us some coaster that can't be played in a car or on a computer. Sell us these things at a &lt;b&gt;reasonable&lt;/b&gt; price and &lt;b&gt;WE'LL BUY IT&lt;/b&gt;, we'll buy more than you can imagine, you'll be richer than you already are !&lt;/p&gt;
&lt;p&gt;On a side note, if you could sell &lt;b&gt;music&lt;/b&gt; and stop selling crap it would be a welcome addition...&lt;/p&gt;
&lt;p&gt;Every time I see a new "copy protection scheme" coming up I am amazed at how you can be sold useless stuff. It has been scientifically proved that things you can see or hear cannot be protected ! If you can hear it, you can copy it, if you can see it, you can copy it. It's as simple as that. You cannot do anything on the technical side of things. The only ones you're annoying are your most dedicated customers who simply want to use your products, not the pirates you're after who will only laugh at each of your feeble attempts to stop them. It costs you millions to buy a protection scheme. It takes only one guy with a little free time and bit of knowledge to create an unprotected version and distribute it on the web. You cannot win. So stop wasting time and money, start your marketing machines and create the product we are all waiting for : &lt;b&gt;cheap, unrestricted digital music and nice unrestricted cds with bonuses.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;You'll be happy, we'll be happy and the world will be a better place.&lt;/p&gt;
&lt;p&gt;&amp;lt;/rant&amp;gt;&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>Strongly Typed Config Generator v1.1</title><link>http://stup.org/blogs/nidhogg/archive/2004/06/01/319.aspx</link><pubDate>Tue, 01 Jun 2004 12:35:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/06/01/319.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/319.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/06/01/319.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/319.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/319.aspx</trackback:ping><description>&lt;p&gt;I meant to do this for a long time but  kind of forgot it while I was working on other things. A reader posted a &lt;a href="http://stup.org/blogs/nidhogg/archive/2003/06/25/153.aspx#318"&gt;comment&lt;/a&gt; that prompted this post.&lt;/p&gt;
&lt;p&gt;So here is an update to the Strongly Typed Config Generator addin. Among other things there is now a namespace for the configuration files which was necessary to get Intellisense in VS.NET for the .xfg files. I added a demo project to show how this works.To install, just run ConfigGenerator.exe in the binaries zip file. Then open the demo project in VS.NET and have a look at the code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.stup.org/files/ConfigGeneratorv1_1.zip"&gt;Binaries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stup.org/files/ConfigGeneratorv1_1_src.zip"&gt;Sources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stup.org/files/DemoStronglyTypedConfig_v1.1.zip"&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll try to update the &lt;a href="http://www.codeproject.com/csharp/config.asp"&gt;CodeProject article&lt;/a&gt; too in the next few days ...&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>SerializationException with NUnit and other irritating problems</title><link>http://stup.org/blogs/nidhogg/archive/2004/05/26/316.aspx</link><pubDate>Wed, 26 May 2004 11:30:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/05/26/316.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/316.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/05/26/316.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/316.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/316.aspx</trackback:ping><description>&lt;h2&gt;Cannot debug anymore ?&lt;/h2&gt;
&lt;p&gt;Ok, here's a couple of tricky problems. I was doing some unit testing on my latest for-work project with NUnit 2.1. Everything was fine until I started getting weird problems. The VS.NET debugger wouldn't break in my code, breakpoints had the dreaded "?" which started to remind me of the frigging disappearing "blue dots" in Borland products, but I digress... I tried lots of things like restarting VS.NET, deleting temp files, obj, dll, exe and so on, to no avail. NUnit tests ran but somehow VS.NET could not see that the assembly I was testing was loaded. It worked previously and I changed only code, not project or VS.NET settings. Time for a little spelunking.&lt;/p&gt;
&lt;p&gt;So I fired up the must-have tool &lt;a href="http://www.sysinternals.com/ntw2k/freeware/procexp.shtml"&gt;Process Explorer&lt;/a&gt; and ran my unit tests. An assembly in a subfolder of the %localsettings%\Application Data\assembly folder was loaded. I fired up another must have tool, &lt;a href="http://www.sysinternals.com/ntw2k/source/filemon.shtml"&gt;FileMon&lt;/a&gt; to confirm this. I closed VS.NET, moved this folder elsewhere (just in case, never delete unknown stuff move it...), rebuilt and ran. Everything was fine again. Weird. The problem happened a few more times and the same solution seemed to work. It might be a side effect of something else (remoting ?). I don't really know what's happening.&lt;/p&gt;
&lt;h2&gt;Serialization exceptions ?&lt;/h2&gt;
&lt;p&gt;Then I added a few unit tests for the next module, and got a SerializationException from NUnit saying that my custom exception was not Serializable. Easy enough I added the Serializable attribute. Now I got another SerializationException that said "Cannot find the assembly tested.dll", even though the tests were running so the assembly was obviously loaded ?!&lt;/p&gt;
&lt;p&gt;The stack trace only showed some remoting code. I have absolutely no experience of remoting whatsoever but I do know that remoting happens when 2 AppDomains communicate. I also know that NUnit runs the tests in a dedicated AppDomain it creates to isolate the running code and dynamically handle changes in the test and tested assemblies. I googled a bit and found &lt;a href="http://groups.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;safe=off&amp;threadm=OiMydJm4CHA.2424%40TK2MSFTNGP09.phx.gbl&amp;rnum=1&amp;prev=/groups%3Fq%3Dnunit%2Bcannot%2Bfind%2Bassembly%2Bexception%26hl%3Den%26lr%3D%26ie%3DUTF-8%26safe%3Doff%26selm%3DOiMydJm4CHA.2424%2540TK"&gt;this&lt;/a&gt;, which describes almost exactly the problem I was having.&lt;/p&gt;
&lt;p&gt;The bottom line is that if an unhandled exception happens in the test assembly and the exception is a custom one, the NUnit GUI AppDomain catches it (this particular point is still obscure to me since I don't know why the exception crosses the AppDomain border...) but the type is unknown since NUnit does not load the test assembly in its AppDomain but in a separate one. This only happens with &lt;i&gt;really&lt;/i&gt; unhandled exceptions. I mean if it is a call from a unit test method that generates the exception it works fine. The exception must happen in another thread in the tested code and not be caught for the problem to appear. It looks like the NUnit team is &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=919674&amp;group_id=10749&amp;atid=110749"&gt;aware of the problem&lt;/a&gt;, has assigned it a high priority and is working on it.&lt;/p&gt;
&lt;p&gt;I built a little test project to demonstrate the problem, you can download it &lt;a href="http://www.stup.org/files/NUnitCustomExceptionCrash.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description></item><item><dc:creator>Nidhogg</dc:creator><title>Stup.org domain moves to GANDI</title><link>http://stup.org/blogs/nidhogg/archive/2004/05/11/313.aspx</link><pubDate>Tue, 11 May 2004 16:49:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/05/11/313.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/313.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/05/11/313.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/313.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/313.aspx</trackback:ping><description>&lt;p&gt;I switched registrars from Network Solutions to GANDI. If the site is down in the next few days you'll know why ;)&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Upgraded to .Text 0.9.5</title><link>http://stup.org/blogs/nidhogg/archive/2004/05/11/312.aspx</link><pubDate>Tue, 11 May 2004 11:25:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/05/11/312.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/312.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/05/11/312.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/312.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/312.aspx</trackback:ping><description>&lt;p&gt;I finished upgrading to .Text 0.9.5. The upgrade went smoothly with little downtime except when I forgot to remove the leading comments in the web.config file...&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Nice article on large resulsets paging</title><link>http://stup.org/blogs/nidhogg/archive/2004/05/05/310.aspx</link><pubDate>Wed, 05 May 2004 06:30:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/05/05/310.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/310.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/05/05/310.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/310.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/310.aspx</trackback:ping><description>&lt;p&gt;I found &lt;a href="http://www.codeproject.com/useritems/PagingLarge.asp"&gt;this very nice article&lt;/a&gt; on &lt;a href="http://www.codeproject.com"&gt;codeproject&lt;/a&gt;. It introduces various methods used to implement paging when dealing with large result sets. It also provides some performance measurements which is a nice touch. This problem is very common and I'm glad someone summarized it like that. Note that although it is supposed to be a .NET article it actually is more generic than that.&lt;/p&gt;
&lt;p&gt;As usual you should perform your own measurements with real data (or as real as possible) before deciding.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Today's Dilbert</title><link>http://stup.org/blogs/nidhogg/archive/2004/05/04/309.aspx</link><pubDate>Tue, 04 May 2004 05:43:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/05/04/309.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/309.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/05/04/309.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/309.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/309.aspx</trackback:ping><description>Todays &lt;a href="http://www.unitedmedia.com/comics/dilbert/"&gt;Dilbert strip&lt;/a&gt; is good, &lt;a href="http://www.unitedmedia.com/comics/dilbert/archive/images/dilbert2073207040504.gif"&gt;check it out&lt;/a&gt;.</description></item><item><dc:creator>Nidhogg</dc:creator><title>Page 23</title><link>http://stup.org/blogs/nidhogg/archive/2004/05/03/308.aspx</link><pubDate>Mon, 03 May 2004 06:37:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/05/03/308.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/308.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/05/03/308.aspx#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/308.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/308.aspx</trackback:ping><description>&lt;p&gt;Looks like the last thing in town is to open the nearest book on page 23 and copy the fifth sentence in your weblog so here is mine :&lt;/p&gt;
&lt;pre&gt;"There was no other way."&lt;/pre&gt;
&lt;p&gt;From "&lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0812532619/qid=1083569597/sr=1-1/ref=sr_1_1/103-4560307-2473400?v=glance&amp;amp;s=books"&gt;The Call Of Earth&lt;/a&gt;&lt;/i&gt;", Volume 2 in the &lt;a href="http://www.amazon.com/exec/obidos/tg/stores/series/-/70/ref=pd_sr_ec_ser_b/103-4560307-2473400"&gt;Homecoming series&lt;/a&gt; by &lt;a href="http://www.hatrack.com/"&gt;Orson Scott Card&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've been reading &lt;a href="http://www.hatrack.com/"&gt;Orson Scott Card&lt;/a&gt;'s books one by one in the last 2 months, poring over &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0312876629/qid=1083569311/sr=2-3/ref=sr_2_3/103-4560307-2473400"&gt;Songmaster&lt;/a&gt;, the &lt;a href="http://www.amazon.com/exec/obidos/tg/stores/series/-/71/ref=pd_sr_ec_ser_b/103-4560307-2473400"&gt;Ender series&lt;/a&gt; and now the &lt;a href="http://www.amazon.com/exec/obidos/tg/stores/series/-/70/ref=pd_sr_ec_ser_b/103-4560307-2473400"&gt;Homecoming series&lt;/a&gt;. I'll finish by the &lt;a href="http://www.amazon.com/exec/obidos/tg/stores/series/-/76/ref=pd_sr_ec_ser_b/103-4560307-2473400"&gt;Alvin Maker series&lt;/a&gt; and then I'll have to start over my quest for good sci-fi or fantasy material.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Pinpin le lapin</title><link>http://stup.org/blogs/nidhogg/archive/2004/04/22/307.aspx</link><pubDate>Thu, 22 Apr 2004 12:12:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/04/22/307.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/307.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/04/22/307.aspx#Feedback</comments><slash:comments>84</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/307.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/307.aspx</trackback:ping><description>&lt;p&gt;A friend of mine sent me &lt;a href="http://urbanfrog.pinpinlelapin.com/"&gt;this link&lt;/a&gt; to a flash movie. If you have a little background in japanese animation you're guaranteed to have a good laugh. Available in French, English and Japanese. Click on "The movie" and select your language.&lt;/p&gt;
&lt;p&gt;These guys are good. I hope they'll release more of this.&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>VS.NET 2005 conference in Paris</title><link>http://stup.org/blogs/nidhogg/archive/2004/04/22/305.aspx</link><pubDate>Thu, 22 Apr 2004 08:50:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/04/22/305.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/305.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/04/22/305.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/305.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/305.aspx</trackback:ping><description>&lt;p&gt;Since I couldn't make it to the DevDays I'll be at the &lt;a href="http://www.microsoft.com/france/events/card/card.asp?EID=118746180"&gt;"Visual Studio 2005 dévoilé aux abonnés MSDN"&lt;/a&gt; conference in Paris. This is a free MSDN subscriber only show that will demonstrate VS.NET 2005, Yukon, ASP.NET 2.0 and so on. I like it that it starts at 17:00 PM so that I don't need to ask anybody to go there, I'll just go there after work.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Back from South Korea</title><link>http://stup.org/blogs/nidhogg/archive/2004/04/22/304.aspx</link><pubDate>Thu, 22 Apr 2004 08:41:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/04/22/304.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/304.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/04/22/304.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/304.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/304.aspx</trackback:ping><description>&lt;p&gt;I had a very busy time in South Korea with about 4 hours for tourism and 2 nights for clubbing in the few weeks I was there. I took some pictures in Seoul but there isn't much to visit in the first place and I needed rest more than tourism.&lt;/p&gt;
&lt;p&gt;Anyway the mission was a success and that's the most important point.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>In South Korea for a few weeks</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/31/297.aspx</link><pubDate>Wed, 31 Mar 2004 13:30:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/31/297.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/297.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/31/297.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/297.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/297.aspx</trackback:ping><description>I will be posting from Gumi, South Korea for a few weeks. I am currently working for a korean client on some .NET industrial software. Expect some delay in the answers as I have &lt;b&gt;very&lt;/b&gt; little free time. These people can work 14 hours a day and still find it quite normal :)</description></item><item><dc:creator>Nidhogg</dc:creator><title>Japanese for nerds</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/26/292.aspx</link><pubDate>Fri, 26 Mar 2004 14:00:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/26/292.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/292.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/26/292.aspx#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/292.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/292.aspx</trackback:ping><description>I don't know if it's reliable but &lt;a href="http://www.kuro5hin.org/story/2004/3/25/32218/1824"&gt;this&lt;/a&gt; looks like a killer way to learn basic Japanese real fast. Now where did i put these notes on languages and grammars :)</description></item><item><dc:creator>Nidhogg</dc:creator><title>Miguel de Icaza's open letter</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/26/291.aspx</link><pubDate>Fri, 26 Mar 2004 13:46:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/26/291.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/291.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/26/291.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/291.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/291.aspx</trackback:ping><description>&lt;p&gt;Miguel de Icaza says in this &lt;a href="http://primates.ximian.com/~miguel/archive/2004/Mar-21.html"&gt;open letter to the linux community&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;Writing code in Java is nice for writing code that is portable and uses to the lowest common denominator. But living in this bubble is not an option on Windows.&lt;/blockquote&gt;
&lt;p&gt;So true ... (on the desktop)&lt;/p&gt;
&lt;blockquote&gt; To survive in the desktop ISV market, Java will have to break with the write-once-run-anywhere mantra, and deeply integrate with Longhorn's WinFX.&lt;/blockquote&gt;
&lt;p&gt;True again... Except ... was there ever a desktop ISV market for java ? Just kidding ;)&lt;/p&gt;
&lt;blockquote&gt;In my opinion Java, Swing, Gtk+ nor Qt address effectively portability to all these systems. And by that, I mean that you always end up with an alien application: either the look, or the integration into the platform is substandard.&lt;/blockquote&gt;
&lt;p&gt;So much for Java portability on the desktop. Even the most hardcore Java fan boy has to admit that a desktop Java application feels weird compared to a native application. The bottom line is : there is no portability on the desktop. If you want apps that feel right on every platform you have to write UI and integration code for each platform.&lt;/p&gt;
&lt;blockquote&gt;The best bet today is to share as much as possible on your "engine" and redo the OS integration components for each OS you support.&lt;/blockquote&gt;
&lt;p&gt;Amen. Take a look at &lt;a href="http://www.mozilla.org/products/firefox/"&gt;Firefox&lt;/a&gt; on Windows : the integration is great, everything feels right. Now look at &lt;a href="http://gaim.sourceforge.net/"&gt;GAIM&lt;/a&gt; or &lt;a href="http://www.gimp.org/"&gt;The GIMP&lt;/a&gt; on Windows : the look is not right, the feeling is not right. This is not what I call a true cross-platform application. It's a un*x app that &lt;b&gt;can&lt;/b&gt; run on other platforms but will not adhere to the platform's standards.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Introduction to weblogs and RSS</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/25/290.aspx</link><pubDate>Thu, 25 Mar 2004 07:04:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/25/290.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/290.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/25/290.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/290.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/290.aspx</trackback:ping><description>&lt;p&gt;A few days ago I posted an &lt;a href="http://www.lesauna.net/articles-531"&gt;article&lt;/a&gt; on &lt;a href="http://www.lesauna.net/"&gt;LeSauna.Net&lt;/a&gt; about weblogs and RSS. It's in French so if you want to introduce these concepts to french speaking people it might be a starting point. I tried to avoid the technological aspects and concentrated on explaining the concepts and introducing related software.&lt;/p&gt;
&lt;p&gt;Coincidentally, &lt;a href="http://www.msdnmag.com"&gt;MSDN Magazine&lt;/a&gt; just published &lt;a href="http://www.skonnard.com"&gt;Aaron Skonnard&lt;/a&gt;'s &lt;a href="http://msdn.microsoft.com/msdnmag/issues/04/04/XMLFiles/"&gt;article on the same topic&lt;/a&gt; but oriented more towards developers.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>ASP.NET overtakes JSP / Servlets in latest Netcraft results</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/24/289.aspx</link><pubDate>Wed, 24 Mar 2004 14:49:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/24/289.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/289.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/24/289.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/289.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/289.aspx</trackback:ping><description>&lt;p&gt;The number of sites running ASP.NET is now more than those running JSP/Servlets. Whoohooo !&lt;/p&gt;&lt;p&gt;The method used by Netcraft may not be 100% accurate but still, the result is there. ASP.NET is growing fast. Very fast.&lt;/p&gt;
[via &lt;a href="http://www.netcraft.com/"&gt;Netcraft&lt;/a&gt;: &lt;a href="http://news.netcraft.com/archives/2004/03/23/aspnet_overtakes_jsp_and_java_servlets.html"&gt;article&lt;/a&gt;]</description></item><item><dc:creator>Nidhogg</dc:creator><title>Resign Patterns</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/15/285.aspx</link><pubDate>Mon, 15 Mar 2004 11:14:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/15/285.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/285.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/15/285.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/285.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/285.aspx</trackback:ping><description>&lt;p&gt;Very funny article on &lt;a href="http://www.agcs.com/supportv2/techpapers/patterns/papers/respat.htm"&gt;bad patterns&lt;/a&gt; that are too often found in the industry.&lt;/p&gt;
&lt;p&gt;My personal favorite : &lt;/p&gt;
&lt;p&gt;&lt;i&gt;2.3 Compromise&lt;br /&gt;
The Compromise Pattern is used to balance the forces of schedule vs. quality. The result is software of inferior quality that is still late.
&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;[Via &lt;a href="http://www.dotnet-fr.org/article.php3?sid=1074"&gt;Dotnet-fr.org&lt;/a&gt;]&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>ClearType tuner and LCD tips from MS's typography master</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/10/284.aspx</link><pubDate>Wed, 10 Mar 2004 14:28:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/10/284.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/284.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/10/284.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/284.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/284.aspx</trackback:ping><description>&lt;p&gt;Robert Scoble posted a summary of an interview he had with the resident typography master at Microsoft (Bill Hill) who gave the following tips :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1) Make sure your LCD is set to the native resolution. ClearType won't work if you don't have your resolution set properly.&lt;/p&gt;
&lt;p&gt;2) Use the &lt;a href="http://www.microsoft.com/typography/cleartype/tuner/1.htm?fname=%20&amp;amp;fsize="&gt;ClearType tuner&lt;/a&gt;. For many people this makes ClearType much better.&lt;/p&gt;
&lt;p&gt;3) Small fonts (the 8 pt style that's the rage on many weblogs now) are far less readable than, say, 11 pt fonts. He does say, though, that readability starts going down at sizes bigger than 11 or 12 pt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;i&gt;[Via &lt;a href="http://radio.weblogs.com/0001011/2004/03/09.html#a6925"&gt;Scobleizer: Microsoft Geek Blogger&lt;/a&gt;]&lt;/i&gt;

&lt;p&gt;The &lt;a href="http://www.microsoft.com/typography/cleartype/tuner/1.htm?fname=%20&amp;amp;fsize="&gt;ClearType tuner&lt;/a&gt; is great ! If you have a LCD monitor, check it out. It improves readability &lt;b&gt;a lot&lt;/b&gt;. Now I don't know if its relevant (this whole readability stuff looks quite complex) but would it be possible to configure ClearType separately for each monitor in a multi monitor setup ? I have 2 LCD screens with 2 very different LCD panels (an old one with not so great contrast/colors etc and a more recent one that has a great image quality) and I would like to fine tune both separately. Then again maybe the fine tuner adapts to the user's vision, not to the hardware, or maybe both.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>I am an ASP.NET/C# MCP !</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/10/283.aspx</link><pubDate>Wed, 10 Mar 2004 10:57:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/10/283.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/283.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/10/283.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/283.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/283.aspx</trackback:ping><description>&lt;p&gt;I just passed the &lt;a href="http://www.microsoft.com/learning/exams/70-315.asp"&gt;MCP exam number 70-315&lt;/a&gt; (Developing and Implementing Web Applications with Microsoft Visual C# .NET and Microsoft Visual Studio .NET). Got a score of 915 out of 1000 (which means about 4 wrong answers over 55 questions). I should have taken this exam long ago but always got the next thing to take care of. I've been to South Korea, Japan and Taiwan installing software and visiting customers so I didn't have much time. I still don't have much time since I'll be going to Korea next month but I took some time for this and I'm glad I did.&lt;/p&gt;
&lt;p&gt;Preparing for this kind of certification is &lt;b&gt;very&lt;/b&gt; beneficial. You need to go over &lt;b&gt;every&lt;/b&gt; aspect of the subject matter, not just what your projects require. This means you get to have a look at globalization, handling legacy code, packaging and deployment for example. You also need to delve a bit further than usual when looking up the documentation which often brings useful information.&lt;/p&gt;
&lt;p&gt;For those of you who are interested in taking this exam here are my recommandations :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Work with the product. You have to. Get some experience or it will be a) difficult b) useless. Use this opportunity to strengthen and broaden your skills.&lt;/li&gt;
&lt;li&gt;Buy &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0789728222/qid=1078922513//ref=pd_ka_1/103-4560307-2473400?v=glance&amp;amp;s=books&amp;amp;n=507846"&gt;Amit Kalani's book&lt;/a&gt;. It's good.&lt;/li&gt;
&lt;li&gt;Find a forum, newsgroup that you like and answer some questions (I do that on microsoft.public.fr.dotnet.aspnet). Take some time to do a bit of research each time, go deep into MSDN, build and run some sample apps, ask questions to experts.&lt;/li&gt;
&lt;li&gt;Take some short notes when you find something you didn't know and use those notes before taking the exam.&lt;/li&gt;
&lt;li&gt;Take whatever practice tests you find, &lt;b&gt;only when you feel ready&lt;/b&gt;. There a not a lot of them, it would a shame to waste them trying to take them unprepared. Microsoft's partners propose some &lt;a href="http://www.measureup.com/site/vendor.asp?vendor=Microsoft&amp;amp;crttrk=1"&gt;free&lt;/a&gt; &lt;a href="http://www.selftestsoftware.com/dept.asp?dept%5Fid=1000"&gt;ones&lt;/a&gt; online. There's one &lt;a href="http://certification.about.com/cs/sampletests/a/mcsd70315.htm"&gt;here&lt;/a&gt; also. You get another free one with Amit Kalani's book. Write down the questions you had trouble with, do a bit of research.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Anyway I'm glad I passed this. Let's get ready for &lt;a href="http://www.microsoft.com/learning/exams/70-306.asp"&gt;70-306&lt;/a&gt;. I guess I'll have to learn VB after all ... But only after I celebrate properly ! :)&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Secure, easy to use and standard data storage accessible from anywhere</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/03/282.aspx</link><pubDate>Wed, 03 Mar 2004 06:23:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/03/282.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/282.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/03/282.aspx#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/282.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/282.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://www.25hoursaday.com/weblog/"&gt;Dare Obasanjo&lt;/a&gt;, MS blogger and original author of my feed reader (&lt;a href="http://www.rssbandit.org"&gt;RssBandit&lt;/a&gt;) posted on his weblog, &lt;a href="http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=9744e6da-9216-415c-bad5-4a04d36563b5"&gt;asking users for comments about synchronizing feed status between multiple instances of &lt;a href="http://www.rssbandit.org"&gt;RssBandit &lt;/a&gt;&lt;/a&gt;on different machines (home &amp;amp; work mostly). It has built-in support for some methods and I use FTP. Still I think it's a bit clumsy for the average user. I mean not everybody knows what a ftp server is and how to connect to one.&lt;/p&gt;
&lt;p&gt;I guess this is a perfect example of what &lt;a href="http://www.microsoft.com/presspass/features/2001/mar01/03-19hailstorm.asp"&gt;Hailstorm&lt;/a&gt; (remember ?) could have been. It's dead on target : provide a shared space, accessible anywhere in the world from any type of device, where a user can store information securely and using a standard (whether a real commitee-approved standard or a defacto-Microsoft-old-style standard) means of communication. All protected by a single sign-in method. This application had a tremendous potential, the only problem is that I can't think of a company I would trust enough to host sensitive personal information (feed list status would be ok though). Maybe if they used an open secure protocol and crypto algorithm audited on a regular basis by various independant security firms. Maybe.&lt;/p&gt;


</description></item><item><dc:creator>Nidhogg</dc:creator><title>ASP.NET : Uploading large files</title><link>http://stup.org/blogs/nidhogg/archive/2004/03/02/281.aspx</link><pubDate>Tue, 02 Mar 2004 06:57:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/03/02/281.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/281.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/03/02/281.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/281.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/281.aspx</trackback:ping><description>&lt;p&gt;Just something I had trouble with some time ago. Uploads using the standard HTML file control in ASP.NET are limited to 4 MB by default. The thing is when you upload a larger file, you won't get any meaningful error, only some "The page cannot be displayed" or "Server Application is Unavailable". I had to sniff the packets from/to my webserver to get a clue on what was going on. Just remember to turn off IE's "friendly" error messages if you want to get ANY information at all.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;295626"&gt;Microsoft's KB article 295626&lt;/a&gt; gives a bit more details on that specific problem.&lt;/p&gt;
&lt;p&gt;In any case if you want to upload large files just set the &amp;lt;httpRuntime maxRequestLength=""&amp;gt; property (in KBytes) in your web.config and everything will be fine. Be careful to apply this setting only where it is strictly necessary as it will remove a layer of protection against DDoS attacks on your webserver. Also note that IIS loads the whole file in memory so avoid really big files or use one of the large file upload components available on the Net.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>How to legalize P2P while helping the music/movie industry and the artists make money</title><link>http://stup.org/blogs/nidhogg/archive/2004/02/25/280.aspx</link><pubDate>Wed, 25 Feb 2004 06:38:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/02/25/280.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/280.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/02/25/280.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/280.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/280.aspx</trackback:ping><description>&lt;p&gt;I just finished reading &lt;a href="http://www.champeau.info/ldc/"&gt;a proposal&lt;/a&gt; made by the editor of &lt;a href="http://www.ratiatum.com"&gt;Ratiatum.com&lt;/a&gt; on how to implement a legal and economic system around peer-to-peer. The article is in French so head over to &lt;a href="http://world.altavista.com/"&gt;the Fish&lt;/a&gt; for a more or less accurate translation.&lt;/p&gt;

&lt;p&gt;Basically the proposal says that everybody can (and is encouraged to) distribute music or movies on p2p networks or any other digital medium. Money would come from a tax that could for example be taken off equipment and media sales (PC, hard drives, blank CDs and DVDs, ISP connection ...). Other methods are also discussed but this one would be my choice although it is hardly perfect. Money is then distributed in the industry according to the popularity of each title (the proposal defines several ways of determining the popularity of a title). It then goes into some detail about how to actually implement this system in the french legal system. Note that right now the above tax is already in place in France on digital media. We pay it even if we are not doing anything illegal but we don't get ANYTHING in return except being treated like criminals.&lt;/p&gt;

&lt;p&gt;It looks solid and well documented. It's the first time I see a reasonable well thought-out solution to the so-called "p2p problem" so I'll be supporting it for the time being.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/images/nidhogg/logo.gif" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>PropertyGrid tricks : Derived classes collection editor</title><link>http://stup.org/blogs/nidhogg/archive/2004/02/18/279.aspx</link><pubDate>Wed, 18 Feb 2004 06:15:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/02/18/279.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/279.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/02/18/279.aspx#Feedback</comments><slash:comments>455</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/279.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/279.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://stup.org/blogs/files/nidhogg/GruikSoft.ComponentModel2_src.zip"&gt;Source Code for the article&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://stup.org/blogs/files/nidhogg/GruikSoft.ComponentModel2_demo.zip"&gt;Binaries for the demo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Abstract&lt;/h2&gt;
&lt;p&gt;In this article I explain how to create a CollectionEditor that will allow the user to add items of any subtype of a given type to an array of that given type.&lt;/p&gt;

&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Following up on the last post, I'll now try to find a generic solution to a slightly different problem. Say you have an array whose items are of an abstract type. If you try to use the default collection editor it will fail because it will try to instantiate an abstract class. We will now see how to create an Editor that will give the user the power to choose which of the subtypes to use for any item of the array.&lt;/p&gt;

&lt;h2&gt;Scenario&lt;/h2&gt;
&lt;p&gt;Company XYZ recently found a new way to sell their services and they are now selling multiple contracts per customer. Their developers are trying to find a way to keep up with the new situation. They tried to change the Contract property type to BaseContract[] instead of BaseContract. .Net automatically chose the CollectionEditor to edit the array but as the type of the items is BaseContract and that class is abstract it cannot create items for the array. So they get this error message.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/CollectionEditorError.png" border="0" /&gt;&lt;br /&gt;
Error message when using the default CollectionEditor&lt;/p&gt;

&lt;p&gt;The developers, and you also, have probably already seen this kind of screen in VS.NET : &lt;/p&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/DatagridColumnStyleCollectionEditor.png" border="0" /&gt;&lt;br /&gt;
Example of what we want&lt;/p&gt;

&lt;p&gt;In the editor for the column styles of a datagrid table, VS.NET offers a list of column types to the user. When you choose a type it creates a new instance of that type and puts it in a collection. We want to do that but in a more generic way and it must work on arrays too. (The default CollectionEditor cannot edit arrays, only collections).&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;p&gt;This can be done by subclassing the CollectionEditor class, as I will explain now. But first let's see what an editor is and what it does.&lt;/p&gt;

&lt;h2&gt;Editor overview&lt;/h2&gt;
&lt;p&gt;While TypeConverters are fairly generic and can be used outside of the property grid to convert an instance of a type into another type, the only purpose of an editor is to edit a particular property of an object in a PropertyGrid. The base class for all editors is System.Drawing.Design.UITypeEditor. There are a number of editors in the .NET framework for various types, like the ColorEditor, the FontEditor and so on. Editors come in three kinds, as defined by the UITypeEditorEditStyle enumeration : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;DropDown&lt;/b&gt; : the editor is shown as a dropdown when the user clicks on the arrow next to the property value in the property grid.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Modal&lt;/b&gt; : the editor displays an ellipsis (3 dots) button next to the property value. When you click on it, a window appears with whatever UI is required to edit the property.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;None&lt;/b&gt; : no drop down or ellipsis
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Let's go over the interesting overridable methods of the UITypeEditor class :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;public virtual UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
This one returns the style of the editor (DropDown, Modal or None).&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
This method does the hard work of editing the value. If it's a modal editor, it may for example open a window with a complex UI, let the user edit the property and when it is done it will return the edited value.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual bool GetPaintValueSupported(ITypeDescriptorContext context)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
If this method returns true, the editor will call its PaintValue method to draw the value in the property grid.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual void PaintValue(PaintValueEventArgs e)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
This method actually draws the value in the property grid if the GetPaintValueSupported returned true. This allows for a little fancier value display that just text.
&lt;/ul&gt;

&lt;p&gt;Now that we've seen the base class, we can move on to the CollectionEditor which is a generic editor for collections. I will only talk about the interesting methods, most of them are obvious and I encourage you to read the MSDN reference on the CollectionEditor class to get more information.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;protected virtual Type CreateCollectionItemType()&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
Returns the type of the items in the collection.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;protected virtual Type[] CreateNewItemTypes()&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
Returns a list of types from which the user will choose when adding an item to the collection.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;protected virtual object[] GetItems(object editValue)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
Returns an array containing all the objects in the collection&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;protected virtual object SetItems(object editValue, object[] value)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
After edition, this method will be called to update the collection. The value parameter contains the edited values and the method must return the edited collection.&lt;br /&gt;&lt;br /&gt;
&lt;/ul&gt;

&lt;p&gt;Now that we've been introduced to the classes we will use we can begin the implementation.&lt;/p&gt;

&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;In the previous post I explained how to get the subtypes of a type. Since we'll be using the same code we will refactor the existing code to avoid duplication. We will create a TypeHelper class and a static method to get all subtypes of a known type. Since we're refactoring, we'll also create a TypeCollection class to store the types. Ideally this should go in an another namespace in a library somewhere but this will do for now.&lt;/p&gt;
&lt;b&gt;Code :&lt;/b&gt;
&lt;pre&gt;
using System;
using System.Reflection;

namespace GruikSoft.ComponentModel
{
	/// &amp;lt;summary&amp;gt;
	/// Helper class for common type related functions
	/// &amp;lt;/summary&amp;gt;
	public class TypeHelper
	{
		public static TypeCollection GetDerivedClasses(Type baseType)
		{
			TypeCollection result = new TypeCollection();
			// Loop through each loaded assembly and each exported type
			// looking for non-abstract types that derive from our property's type
			foreach(Assembly a in AppDomain.CurrentDomain.GetAssemblies())
			{
				foreach(Type t in a.GetExportedTypes())
				{
					if(!t.IsAbstract &amp;amp;&amp;amp; t.IsSubclassOf(baseType))
					{
						// Make sure that the derived type has a default constructor
						if(t.GetConstructor(Type.EmptyTypes) != null)
						{
							// Add each subclass type to a hashtable
							result.Add(t);	
						}
					}
				}
			}

			return result;
		}
	}
}
&lt;/pre&gt;

&lt;p&gt;Now we get to the main class the DerivedClassesCollectionEditor class. Its constructor will get the item type, retrieve the list of its subtypes using the TypeHelper class and store it in an internal array. We also want to store the itemType because we'll need it later. Implementing the CreateNewItemTypes() and CreateCollectionItemType() method is simply a matter of returning the array or the item type.&lt;/p&gt;
&lt;p&gt;If you try the editor at this point you'll notice that you can add an item to the array but when you return to the propertygrid they won't show up. The propertyGrid will exhibit strange behaviour like displaying the first element of an array but not displaying the list of elements for example. What we need to do is to override the SetItems() method. It will create an array with the right type and fill it with the list of values given as parameter.&lt;/p&gt;
&lt;b&gt;Code :&lt;/b&gt;
&lt;pre&gt;// We need to override this because the CollectionEditor does not handle arrays
protected override object SetItems(object editValue, object[] value)
{
	// Simply return a strongly typed array using our item type
	Array result = Array.CreateInstance(itemType, value.Length);
	int i = 0;
	foreach(object di in value)
	{
		result.SetValue(di, i);
		i++;
	}
	return result;
}
&lt;/pre&gt;

&lt;p&gt;And this is pretty much it. Since we based our work on an existing editor most of the work was already done for us and ready for tweaking. The last thing we need to do is to apply the TypeConverter attribute to the BaseContract class, selecting the ExpandableObjectConverter for it. This way the PropertyGrid will show the properties of each item in the CollectionEditor instead of the type name only. Note that it does not cancel what we did inthe previous post because the TypeConverter attribute was on the Customer object, not the BaseContract class and .NET automatically chooses the most specific TypeConverter it can find.&lt;/p&gt;

&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/Demo2_1.png" border="0" /&gt;&lt;br /&gt;
The ellipsis&lt;/p&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/Demo2_2.png" border="0" /&gt;&lt;br /&gt;
Clicking on the arrow pops up the list of types&lt;/p&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/Demo2_3.png" border="0" /&gt;&lt;br /&gt;
Adding items and editing them&lt;/p&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/Demo2_4.png" border="0" /&gt;&lt;br /&gt;
The result&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;
I hope this article was useful to you, feel free to post you suggestions, flames etc. in the comments or email me at &lt;a href="mailto:nidhogg@spamfree.fr"&gt;nidhogg@spamfree.fr&lt;/a&gt; (remove "spam" from the address).</description></item><item><dc:creator>Nidhogg</dc:creator><title>PropertyGrid tricks : Derived classes type converter</title><link>http://stup.org/blogs/nidhogg/archive/2004/02/13/277.aspx</link><pubDate>Fri, 13 Feb 2004 12:05:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/02/13/277.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/277.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/02/13/277.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/277.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/277.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://stup.org/blogs/files/nidhogg/GruikSoft.ComponentModel_src.zip"&gt;Source Code for the article&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://stup.org/blogs/files/nidhogg/GruikSoft.ComponentModel_demo.zip"&gt;Binaries for the demo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Abstract&lt;/h2&gt;
&lt;p&gt;In this article I explain how to create a TypeConverter that will allow a user, in a property grid, to select a type from a list of types that derive from the property to edit. It will then create an instance of that type and display the instances properties.&lt;/p&gt;

&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The .NET PropertyGrid control is a very powerful component that I use regularly to build test applications or prototypes. With this control editing an instance of an object, changing property values dynamically is easy as pie. So yesterday I was working on a test application that is nothing worth mentioning but I had to do something tricky with TypeConverters that is worth a post.&lt;/p&gt;
&lt;p&gt;Let's imagine the following fictious situation.&lt;/p&gt;

&lt;h2&gt;Scenario&lt;/h2&gt;
&lt;p&gt;Company XYZ sells services to customers. Each customer can only apply for one service. Each service is covered by a contract. There is a limited number of contract types and a few parameters are customized for each customer (e.g.: contract length, whatever ... it's an example anyway). They want to design an application that among other things assigns a contract to a customer and allows the parameters of the contract to be modified.&lt;/p&gt;

&lt;p&gt;After some analysis the devs get this class diagram for their business classes :&lt;/p&gt;

&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/example.png" alt="Business classes" border="0" /&gt;&lt;br /&gt;
Business classes&lt;/p&gt;

&lt;p&gt;They also decided to use the PropertyGrid control for their prototyping and testing application. However, after creating a PropertyGrid, a new Customer and binding the PropertyGrid to the Customer  they realize that there is a problem for the Contract property of the Customer class. The propertyGrid does not know how to create an instance of one of the contract types because the Contract property is of type BaseContract which is abstract. What they would like to do would be to have a list of types that derive from the abstract BaseContract class. When the user selects a type, it should create an instance of that type, assign it to the Contract property and display its properties so that the user can modify them.&lt;/p&gt;

&lt;p&gt;This can be done by a TypeConverter as I will explain now. I won't go into details on this but let's begin by examining what a TypeConverter is and what it does in our context. &lt;/p&gt;

&lt;h2&gt;TypeConverter overview&lt;/h2&gt;
&lt;p&gt;TypeConverters are objects that can convert an instance of a type into an instance of another type. They are used by the PropertyGrid to convert a value you typed in (a string) into a value that will be assigned to the property you are editing. This is easy for base types like int, float, string, byte, char etc... However when you are dealing with complex types this becomes a little trickier. If you don't specify any type converter, the propertygrid simply displays the type of the property and this is read only. Neither useful nor pretty. The .NET Framework provides a "ExpandableObjectConverter" class that displays the sub-properties of an instance instead of displaying its type. Much better but it does not work on abstract types and it only works on an existing value, it cannot create a new one.&lt;/p&gt;

&lt;p&gt;Let's go over the interesting overridable methods of the TypeConverter class and see what they do.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;public virtual bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
This one is easy, it just returns true or false depending on the ability of the TypeConverter to convert the given sourceType into something else.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
Same for the ability to convert to a specified destinationType.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
This method actually does the work of converting an instance (value).&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
And this one converts the given instance (value) into the destinationType.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual bool GetCreateInstanceSupported(ITypeDescriptorContext context)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
This method returns the ability of the converter to re create an instance of an object given a list of name/value pairs. The pairs correspond to the properties of the instance and their value.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
This one does the job of recreating instances given the name/value pairs.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
Returns a list of values that will be proposed to the user as a list of default values.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual bool GetStandardValuesExclusive(ITypeDescriptorContext context)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
If this method returns true the user MUST select a value from the standard values and cannot enter a new one.&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;public virtual bool GetStandardValuesSupported(ITypeDescriptorContext context)&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;
Returns the ability of the TypeConverter to propose a list of default values.&lt;br /&gt;&lt;br /&gt;
&lt;/ul&gt;

&lt;p&gt;Since the ExpandableObjectConverter already does a part of what we want, we will inherit our TypeConverter from the ExpandableObjectConverter and add a way to create new instances from a list of types that derive from our property's type. In our example this would be the list "TopContract", "NiceContract" and "GreatContract". When a type is selected the converter must create a new instance, assign it to the property and display the subproperties of the specific instance.&lt;/p&gt;

&lt;h2&gt;Implementation&lt;/h2&gt;
&lt;p&gt;First we need to get a list of types that we want to propose to the user. We could simply use a static list in this example but we want to build a reusable class. So what we really want is the list of all known types that derive from the property's type. We can use reflection on the type but we need the type first because the converter doesn't have it when it is created. You'll notice that the overridable methods often have a context parameter. This parameter is passed (but not always) by the system and provides the information we need. We'll create a method that uses this context (if it is not null) and builds the list. This method will be called in every of the overrided methods that need the list so that the list is built before we need it.&lt;/p&gt;

&lt;p&gt;This method will use the Type and System.Reflection to look into all loaded assemblies (AppDomain.CurrentDomain.GetAssemblies()), and all types exported by the assemblies (myAssembly.GetExportedTypes()). If the type is a class, is not abstract and derives from the property's type we keep it. We also need to make sure that the class has a default constructor. This is important because the design time almost always requires a default constructor. This kind of search is expensive in terms of performance so we'll do it only once and store the results in a dictionnary collection. The key will be the name of the type and the value will by the type itself. It has a second advantage. We'll need later to get the type selected by the user and we'll only have the type name, not the type itself since it will come from the PropertyGrid. With the dictionnary we'll be able to do this instantly.&lt;/p&gt;

&lt;p&gt;If we want to allow null for our property we can add a new entry in the collection named "(null)" with a null value into the dictionnary. This is optional but I'll include it since it can be useful.&lt;/p&gt;

&lt;b&gt;Code :&lt;/b&gt;
&lt;pre&gt;private TypeDictionnary derivedTypes;
private Type propertyType;

private void EnsureTypesArePopulated(ITypeDescriptorContext context)
{
	if(derivedTypes == null)
	{
		propertyType = context.PropertyDescriptor.PropertyType;

		derivedTypes = new TypeDictionnary();
		derivedTypes.Add("(null)", null);

		// Loop through each loaded assembly and each exported type
		// looking for non-abstract types that derive from our property's type
		foreach(Assembly a in AppDomain.CurrentDomain.GetAssemblies())
		{
			foreach(Type t in a.GetExportedTypes())
			{
				if(!t.IsAbstract &amp;amp;&amp;amp; t.IsSubclassOf(context.PropertyDescriptor.PropertyType))
				{
					// Make sure that the derived type has a default constructor
					if(t.GetConstructor(Type.EmptyTypes) != null)
					{
						// Add each subclass type to a hashtable
						derivedTypes.Add(t.FullName, t);	
					}
				}
			}
		}
	}
}&lt;/pre&gt;

&lt;p&gt;Next we have to implement the ConvertTo and From methods. The design time requires us to be able to convert to two types : string and InstanceDescriptor but only needs to ConvertFrom a string. The implementation of the CanConvertTo/From is trivial, look at the source code provided in this article.&lt;/p&gt;

&lt;p&gt;ConvertFrom takes the string entered by the user, looks into the dictionnary, finds the Type and uses Activator.CreateInstance() to create a new instance of the specified type. If the string was "(null)" it returns null.&lt;/p&gt;
&lt;b&gt;Code :&lt;/b&gt;
&lt;pre&gt;public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo info, object value) 
{
	if(value is string) 
	{
		string val = (string) value;
		// Return null if the user selected (null) in the lists
		if(val == "(null)")
			return null;
		
		// Build a new instance of the selected type
		try 
		{
			EnsureTypesArePopulated(context);
			
			// Get the type of the new instance to create.
			Type selectedType = derivedTypes[val];
			if(selectedType != null)
				return Activator.CreateInstance(selectedType);
		}
		catch {}
		throw new ArgumentException("The arguments were not valid.");
	}
	return base.ConvertFrom(context, info, value);
}&lt;/pre&gt;
&lt;p&gt;In ConvertTo, if the destinationType is a string we simply return the name of the Type of the object to convert. If the destination is an InstanceDescriptor we have to do a bit of System.Reflection work to create an InstanceDescriptor that matches the object. If the object is null, we simply return "(null)".&lt;/p&gt;
&lt;b&gt;Code :&lt;/b&gt;
&lt;pre&gt;public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
{
	if((value == null) &amp;amp;&amp;amp; (destinationType == typeof(string)))
		return "(null)";
	
	// If the source value is of the property type
	if(value.GetType() == propertyType) 
	{
		// Convert it to a string
		if(destinationType == typeof(string)) 
		{
			return value.GetType().FullName;
		}
		
		// Convert it to an InstanceDescriptor
		if(destinationType == typeof(InstanceDescriptor)) 
		{
			// Loop through the object's properties and display them
			PropertyInfo[] props = value.GetType().GetProperties();
			int i = 0;
			object[] properties = new object[props.Length];
			Type[] types = new Type[props.Length];
			foreach(PropertyInfo pi in props)
			{
				properties[i] = pi.GetValue(value, null);
				types[i] = pi.GetType();
				i++;
			}
			
			// Get the default constructor
			ConstructorInfo ci = value.GetType().GetConstructor(System.Type.EmptyTypes);
			return new InstanceDescriptor(ci, properties);
		}
	}                
	// use base if destination type is not string or InstanceDescriptor
	return base.ConvertTo(context, culture, value, destinationType);
} &lt;/pre&gt;

Our TypeConverter is now ready, we only need to put the TypeConverterAttribute on the Contract property of the Customer class :
&lt;b&gt;Code:&lt;/b&gt;
&lt;pre&gt;private BaseContract m_contract;
[TypeConverter(typeof(GruikSoft.ComponentModel.DerivedClassesTypeConverter))]
public BaseContract Contract
{
	get { return this.m_contract; }
	set { this.m_contract = value; }
}&lt;/pre&gt;

&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/Demo1.png" border="0" /&gt;&lt;br /&gt;
The Contract is null at the begining&lt;/p&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/Demo2.png" border="0" /&gt;&lt;br /&gt;
Clicking on the arrow pops up the list of types&lt;/p&gt;
&lt;p&gt;&lt;img src="http://stup.org/blogs/Images/nidhogg/Demo3.png" border="0" /&gt;&lt;br /&gt;
We chose a type and the instance automatically appears&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;
I hope this article was useful to you, feel free to post you suggestions, flames etc. in the comments or email me at &lt;a href="mailto:nidhogg@spamfree.fr"&gt;nidhogg@spamfree.fr&lt;/a&gt; (remove "spam" from the address).</description></item><item><dc:creator>Nidhogg</dc:creator><title>Back from Praloup</title><link>http://stup.org/blogs/nidhogg/archive/2004/02/10/266.aspx</link><pubDate>Tue, 10 Feb 2004 07:51:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/02/10/266.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/266.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/02/10/266.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/266.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/266.aspx</trackback:ping><description>&lt;p&gt;I had a blast last week. I went snowboarding at &lt;a href="http://www.praloup.com"&gt;Praloup&lt;/a&gt; (Southern Alps in France). Great snow, great weather, nice resort, nice people. This is one of the best holidays I've had in a while. Can't wait to go snowboarding again... Maybe this season if I get the chance.&lt;/p&gt;
&lt;p&gt;I'll post a few photos once the gallery application is in place on stup.org which should be "real soon now" (I've been saying this for years ... ;)&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Table variables in MS SQL Server</title><link>http://stup.org/blogs/nidhogg/archive/2004/01/27/264.aspx</link><pubDate>Tue, 27 Jan 2004 08:45:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/01/27/264.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/264.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/01/27/264.aspx#Feedback</comments><slash:comments>80</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/264.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/264.aspx</trackback:ping><description>&lt;p&gt;I just discovered today that SQL Server allows table variables. This means that in cases where you had to create a temporary table, fill it with temp data and drop it, you now can declare a table variable, fill it with data and forget it. It is a lot more efficient as everything happens in memory, the server does not create any locks on system tables. This is especially useful when you need to cascade delete rows from 2 tables that are linked by a foreign key for example but I can see plenty of possibilites.&lt;/p&gt;
&lt;p&gt;Here is an example using Northwind that creates such a variable and fills it with some data : &lt;/p&gt;
&lt;pre&gt;
DECLARE @regions TABLE ([RegionID] [int] NOT NULL , [RegionDescription] [nchar](50) NOT NULL)
INSERT into @regions SELECT * from RegionID
&lt;/pre&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Weird site problem</title><link>http://stup.org/blogs/nidhogg/archive/2004/01/14/260.aspx</link><pubDate>Wed, 14 Jan 2004 16:18:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/01/14/260.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/260.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/01/14/260.aspx#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/260.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/260.aspx</trackback:ping><description>&lt;p&gt;Apparently the blogs went down sometime today. I traced the problem and found that an assembly required by .Text (sgmlreaderdll.dll) had been transformed into a 0 byte file. Very strange. I hope it does not mean data corruption problems on the server...&lt;/p&gt;
&lt;p&gt;Anyway, it is fixed.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Team based RTS idea</title><link>http://stup.org/blogs/nidhogg/archive/2004/01/07/254.aspx</link><pubDate>Wed, 07 Jan 2004 11:54:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2004/01/07/254.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/254.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2004/01/07/254.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/254.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/254.aspx</trackback:ping><description>I had an idea during the holidays. As of now, the major RTS titles support team play in a very limited fashion. Players are allies and fight a common ennemy. 

My biggest gripe with this kind of games is the micro-management stuff (making sure that peon #15 is actually chopping wood and not idling around, that kind of stuff). It makes me feel like I need another pair of hands, eyes and a brain addon to take care of everything I know I need to take care of. Now I know lots of people actually like this part of the game. So why not make a RTS game where the resources management is handled by one player, and battle by one or more other players. That way battles could be more complex.

There would be drawbacks but it could seriously boost team play in this kind of games.
</description></item><item><dc:creator>Nidhogg</dc:creator><title>Back from Taiwan</title><link>http://stup.org/blogs/nidhogg/archive/2003/12/15/242.aspx</link><pubDate>Mon, 15 Dec 2003 08:55:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2003/12/15/242.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/242.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2003/12/15/242.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/242.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/242.aspx</trackback:ping><description>&lt;p&gt;It's been a busy time since I returned from a business trip to Taiwan 3 weeks ago. The trip in itself was very smooth. I went there to install some software I had been working on for a couple of weeks. No problems whatsoever. Piece of cake.&lt;/p&gt;
&lt;p&gt;The business we had was in Tainan (in the south) and since everything was smooth I travelled to Taipei for the week-end for a little tourism and clubbing. I did not expect Taipei to be a great city but it is. The only problem is pollution which is incredibly irritating. Anyway, I visited a few typical places (the Confucius temple, various open markets, the Tchang Kai Chek memorial, the 101 tower...). I also stopped by a big computer show right next to the 101 tower. Nothing to see there except lots of taiwanese trying to get a good deal on some piece of hardware. I thought hardware prices would be good in Taiwan but they are not. Better buy your hardware in the US and keep the warranty.&lt;/p&gt;
&lt;p&gt;On the first night I stopped at the Carneggie's, a pub with a long bar and lots of people, mostly taiwanese but some were foreigners. There was a lot of dancing on the bar, good music, frienldy staff. A very good place. The second night I went to the Plush, a night club located on the 12th floor of a shopping center. It has a great view, cosy atmosphere, lots of taiwanese also and a bit more foreigners than the Carneggie's. Also a very good place although I didn't like the music, way too much rap and R'n'B for my taste. And the good thing is that if you're a foreigner you are admitted everywere. No need to wait in line. No need to pay too much attention to your clothes. No need to know anybody to get in. This is a nice change to the so-called &lt;i&gt;select&lt;/i&gt; places in Europe or the US.&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>Network security on ATM's</title><link>http://stup.org/blogs/nidhogg/archive/2003/12/03/230.aspx</link><pubDate>Wed, 03 Dec 2003 08:50:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2003/12/03/230.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/230.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2003/12/03/230.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/230.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/230.aspx</trackback:ping><description>&lt;p&gt;This morning while browsing my morning news I saw articles titled "&lt;a href="http://www.infoworld.com/article/03/12/02/HNwinatm_1.html"&gt;Windows ATMs raise security concerns&lt;/a&gt;". The tone of the article indicates that banks are moving their atm systems over to Windows XP and can now be the target of worms and other security threats.&lt;/p&gt;
&lt;p&gt;What is not said about this issue, if I understand correctly, is that until now security on ATM's has been quite weak, relying on OS/2's inherent security (partly due to the fact that very few virus/worm writers care to target a system nobody uses...). ATM's did not even have a network firewall, I can't believe it ! WTF ? Even on the most secure OS you HAVE to have a network firewall. On less secure OS you also need to disable unused services and perform a few other routine security tasks. That is security 101 not rocket science. Every half competent sysadmin knows that.&lt;/p&gt;
&lt;p&gt;And now that they put up windows XP on these ATM they complain that they have additionnal system administration tasks to perform to have a secure system. An ATM ought to be secure and there HAS to be a lot of security work on the systems. I think the banks avoided the security issue on their ATMs relying on security through obscurity and now that they use a general purpose OS they face the problems they ought to have solved decades ago.&lt;/p&gt;
&lt;p&gt;As far as I'm concerned, ATM manufacturers whose products can be hit by a worm or a virus are incompetent, that's all there is to it. And if they blame the OS on this they are incompetent AND they lie.&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>HFNetChk is your friend</title><link>http://stup.org/blogs/nidhogg/archive/2003/11/18/209.aspx</link><pubDate>Tue, 18 Nov 2003 08:00:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2003/11/18/209.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/209.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2003/11/18/209.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/209.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/209.aspx</trackback:ping><description>&lt;p&gt;I've been using &lt;a href="http://www.shavlik.com/pHFNetChkEXE.aspx"&gt;HFNetChk.exe&lt;/a&gt; from &lt;a href="http://www.shavlik.com/"&gt;Shavlik Technologies&lt;/a&gt; for years now. This little command line utility scans your computer and tells you which patches are missing. It works for Windows (NT, 2K, XP, 2003), IIS, SQL server, IE, Windows Media Player and other system components. After the scan, it displays a list of missing patches along with some basic information and a microsoft Knowledge Base number you can google to get the patch.&lt;/p&gt;

&lt;p&gt;I just tried &lt;a href="http://www.shavlik.com/pHFNetChkLT.aspx"&gt;HFNetChk LT&lt;/a&gt; which has a lot more features than the command line version. It has a GUI, can scan a network or domain instead of just one machine and it automatically installs the patches instead of letting you manually download and install them. Shavlik maintains a list of patches and deployment scripts on their servers so you don't have to worry about that. It looks like a very powerful tool. Much more powerful than what I'm using it for ... But it does a better job than &lt;a href="http://www.windowsupdate.com"&gt;Windows Update&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are both lazy &lt;b&gt;and&lt;/b&gt; paranoid, give it a try ;)&lt;/p&gt;

</description></item><item><dc:creator>Nidhogg</dc:creator><title>Books and music are like cheese and wine</title><link>http://stup.org/blogs/nidhogg/archive/2003/11/14/207.aspx</link><pubDate>Fri, 14 Nov 2003 11:45:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2003/11/14/207.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/207.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2003/11/14/207.aspx#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/207.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/207.aspx</trackback:ping><description>&lt;p&gt;This morning I had a revelation. I was in the subway, reading "&lt;i&gt;Blood and Gold&lt;/i&gt;", one of the latest installments in the vampire series from Anne Rice. In case you are not into this kind of books, two of the books in the series have been holliwoodized : &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0345337662/qid=1068817062/sr=5-1/ref=cm_lm_asin/104-3639616-3143960?v=glance"&gt;Interview with the vampire&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0345351525/qid=1068817062/sr=5-1/ref=cm_lm_asin/104-3639616-3143960?v=glance"&gt;The Queen of the Damned&lt;/a&gt;&lt;/i&gt; (although the book is orders of magnitude better than the movie). Needless to say those are all fantastic books.&lt;/p&gt;
&lt;p&gt;Anyway, I was reading while listening to the &lt;i&gt;Lake Of Sorrow&lt;/i&gt; album from a band called &lt;a href="http://www.tsotb.com/"&gt;The Sins Of Thy Beloved&lt;/a&gt;. It's a kind of death metal with the usual deep male voice, high pitched female voice, slow rhythm and a nice addition : a violin. The music felt absolutely right for the story and its environment. They both mix evil and good, brutality and beauty, senseless violence and deep feelings. The music is slow as must be the passing of time for vampires, it is also dark as is their world. A perfect match.&lt;/p&gt;
&lt;p&gt;This is why I think music and books are like cheese and wine. You have to find the right combination to fully enjoy it. Here is a list of music/book pairs that I find most interesting :&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0395595118/tolkiensites-20/104-3639616-3143960"&gt;The Lord of the Rings&lt;/a&gt;&lt;/i&gt;, or other epic fantasy (like Terry Brooks's &lt;i&gt;Shanara&lt;/i&gt; series or &lt;a href="http://www.terrygoodkind.com/"&gt;Terry Goodkind&lt;/a&gt;'s &lt;i&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/stores/series/-/3/mass_market/ref=pd_serl_books/104-3639616-3143960"&gt;Sword Of Truth&lt;/a&gt;&lt;/i&gt; series) is fantastic while listening to Rhapsody or Nightwish&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.annerice.com/"&gt;Anne Rice&lt;/a&gt;'s &lt;a href="http://www.amazon.com/exec/obidos/tg/listmania/list-browse/-/3HML8JDHJDDV4/qid=1068817062/sr=5-1/ref=sr_5_1/104-3639616-3143960"&gt;vampire series&lt;/a&gt; and witches series definitely needs &lt;a href="http://www.tsotb.com/"&gt;The Sins Of Thy Beloved&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Frank Herbert's &lt;i&gt;Dune&lt;/i&gt; series is at its best with traditional arab songs, music of the desert people. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know if you discover some other nice pairs.&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Outlook 2003 + SpamBayes does the trick</title><link>http://stup.org/blogs/nidhogg/archive/2003/11/05/202.aspx</link><pubDate>Wed, 05 Nov 2003 07:07:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2003/11/05/202.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/202.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2003/11/05/202.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/202.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/202.aspx</trackback:ping><description>&lt;p&gt;I've been using &lt;a href="http://www.mozilla.org/projects/firebird/"&gt;Mozilla Firebird&lt;/a&gt; for quite some time now and I am happy to do so. Obviously the open source products are getting better and better so a few weeks ago I decided to try &lt;a href="http://www.mozilla.org/projects/thunderbird/"&gt;Mozilla Thunderbird&lt;/a&gt;, the email client derived from the &lt;a href="http://www.mozilla.org/"&gt;Mozilla&lt;/a&gt; project. Unfortunately, as of now Thunderbird has some bugs, some serious, some simply annoying that led to a quick Shift-Del on the Thunderbird folder. I won't go into details but here is a quick summary :&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Does not handle 800x600 (I use this resolution when remote controlling my PC).&lt;/li&gt;
&lt;li&gt;Refuses to run sometimes. It may be because I have a lot of archived email but anyway, sometimes it took a few tries to get it to launch properly.&lt;/li&gt;
&lt;li&gt;Its much praised spam filter does not recognize a valid Microsoft Security Bulletin from the latest slew of virus generated message that &lt;i&gt;look like&lt;/i&gt; a security bulletin.&lt;/li&gt;
&lt;li&gt;All in all the spam filter does not work for me and there is no plugin to handle that differently. After about a month I still had spam in my inbox and even worse valid emails in the junk box.&lt;/li&gt;
&lt;li&gt;Does not synchronize with PDAs&lt;/li&gt;
&lt;li&gt;Does not have any calendaring or todo feature. Ok that one is not a required feature for an email client but I got used to Outlook and I miss that possibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As much as I would like to use Thunderbird I don't think I am going to risk it just now. I'll try again in a few months to let it mature a bit.&lt;/p&gt;
&lt;p&gt;I am now back to Outlook 2003 and find it great. It does what I want &lt;i&gt;and&lt;/i&gt; synchronizes with my old &lt;a href="http://www.handspring.com/"&gt;Visor&lt;/a&gt; and my phone. I used &lt;a href="http://www.cloudmark.com/"&gt;CloudMark SpamNet&lt;/a&gt; for some time when it was a free service but I certainly will not pay for it so I went into a quest for the ultimate spam filtering plugin for Outlook. After some time on review sites I found the &lt;a href="http://spambayes.sourceforge.net/windows.html"&gt;SpamBayes plugin&lt;/a&gt; for outlook. Open Source, free, filters my inbox, works like a charm. No more spam. No more false positives. Go get it if you run Outlook !&lt;/p&gt;
</description></item><item><dc:creator>Nidhogg</dc:creator><title>Microsoft is listening to us</title><link>http://stup.org/blogs/nidhogg/archive/2003/10/31/198.aspx</link><pubDate>Fri, 31 Oct 2003 06:55:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2003/10/31/198.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/198.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2003/10/31/198.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://stup.org/blogs/nidhogg/comments/commentRss/198.aspx</wfw:commentRss><trackback:ping>http://stup.org/blogs/nidhogg/services/trackbacks/198.aspx</trackback:ping><description>&lt;p&gt;From what I gather about what was demoed at the PDC, &lt;a href="http://www.asp.net/whidbey/ScreenShots.aspx?tabindex=0&amp;amp;tabid=1"&gt;it looks like&lt;/a&gt; Microsoft is really listening to the developers. About all the issues I have with Visual Studio.NET have been dealt with in the next version. That includes Intellisense in .aspx files, proper deployment features, markup validation, refactoring, customizing the tag formatting options, and a built-in web server for those without a IIS server handy.&lt;/p&gt;
&lt;p&gt;The same can be said about &lt;a href="http://www.asp.net/whidbey/whitepapers/AspNetOverview.aspx?tabindex=0&amp;amp;tabid=1"&gt;ASP.NET 2.0&lt;/a&gt;. Missing stuff like master pages, ready-made controls for security, user preferences, image generation and so on has been included.&lt;/p&gt;
&lt;p&gt;I am really looking forward to this. There was a lot of hype before the PDC but the stuff Microsoft showed was good. No vaporware, working code, lots of information. The next few years are going to be great for developers on Microsoft technologies.&lt;/p&gt;
&lt;p&gt;Does Microsoft have a Euro-PDC for people who can't afford to fly out to LA ?&lt;/p&gt;</description></item><item><dc:creator>Nidhogg</dc:creator><title>Web project deployment in Visual Studio Whidbey ... at last !</title><link>http://stup.org/blogs/nidhogg/archive/2003/10/23/192.aspx</link><pubDate>Thu, 23 Oct 2003 06:57:00 GMT</pubDate><guid>http://stup.org/blogs/nidhogg/archive/2003/10/23/192.aspx</guid><wfw:comment>http://stup.org/blogs/nidhogg/comments/192.aspx</wfw:comment><comments>http://stup.org/blogs/nidhogg/archive/2003/10/23/192.aspx#Feedback</comments><slash:comments>55</slash:comments><wfw:comme