<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>Software Development</title><link>http://blog.eqinox.net/alcedo/category/2.aspx</link><description>Software Development</description><managingEditor>Fredrik Mörk</managingEditor><dc:language>sv-SE</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Fredrik Mörk</dc:creator><title>Running MS SQL scripts from .Net</title><link>http://blog.eqinox.net/alcedo/archive/2007/12/02/1903.aspx</link><pubDate>Sun, 02 Dec 2007 18:12:00 GMT</pubDate><guid>http://blog.eqinox.net/alcedo/archive/2007/12/02/1903.aspx</guid><wfw:comment>http://blog.eqinox.net/alcedo/comments/1903.aspx</wfw:comment><comments>http://blog.eqinox.net/alcedo/archive/2007/12/02/1903.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.eqinox.net/alcedo/comments/commentRss/1903.aspx</wfw:commentRss><trackback:ping>http://blog.eqinox.net/alcedo/services/trackbacks/1903.aspx</trackback:ping><description>&lt;p&gt;I was trying to have some C# code execute a database script to set up an MS SQL database, but the script was failing. Google helped me out (a bit lazy this sunday evening) by providing this blog post: &lt;a href="http://blogs.msdn.com/dszabo/archive/2007/05/28/how-to-run-a-sql-database-installer-from-your-net-application.aspx"&gt;How to run a SQL database installer from your .net application&lt;/a&gt;, by David Szabo. However, the script still failed me (much later in the script, but still). This time it was more obvious. David's solution to the problem was simply to split the string containing the script on the word "GO". In my case though, the script included the creation of a stored procedure containing a GOTO statement. Since I was splitting the string on the characters "GO", GOTO lost its verb, and the remaining part got to start a new element in my string array of commands to execute. So, I altered the solution slightly to include the carriage-return and line feed characters before and after the GO statement in the script:
&lt;CODE class="CodeBlock"&gt;&lt;PRE&gt;
 &lt;SPAN class="CodeComment"&gt;       // Runs the given database script on the given connection. The script
        // is divided into commands by splitting the incoming script string
        // on the "GO" word, including the surrounding carriage-return and
        // newline characters, in order to avoid splitting on other occurrances
        // of the characters "GO"&lt;/SPAN&gt;
        &lt;SPAN class="CodeKeyword"&gt;private static void &lt;/SPAN&gt;RunScript(SqlConnection connection, &lt;SPAN class="CodeKeyword"&gt;string&lt;/SPAN&gt; script)
        {
            &lt;SPAN class="CodeKeyword"&gt;string&lt;/SPAN&gt;[] commands = script.Split(
                new &lt;SPAN class="CodeKeyword"&gt;string&lt;/SPAN&gt;[] { &lt;span class="CodeString"&gt;"\r\nGO\r\n"&lt;/span&gt; },
                StringSplitOptions.RemoveEmptyEntries);

            &lt;SPAN class="CodeKeyword"&gt;for&lt;/SPAN&gt; (&lt;SPAN class="CodeKeyword"&gt;int&lt;/SPAN&gt; i = 0; i &lt; commands.Length; i++)
            {
                SqlCommand command = new SqlCommand(commands[i], connection);
                command.ExecuteNonQuery();
                command.Dispose();
            }

        }&lt;/PRE&gt;&lt;/CODE&gt;
&lt;/p&gt;
&lt;p&gt;The script worked, and I was happy and smiling.&lt;/p&gt;&lt;img src ="http://blog.eqinox.net/alcedo/aggbug/1903.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Fredrik Mörk</dc:creator><title>The importance of a consistent UI</title><link>http://blog.eqinox.net/alcedo/archive/2006/03/17/1090.aspx</link><pubDate>Fri, 17 Mar 2006 14:39:00 GMT</pubDate><guid>http://blog.eqinox.net/alcedo/archive/2006/03/17/1090.aspx</guid><wfw:comment>http://blog.eqinox.net/alcedo/comments/1090.aspx</wfw:comment><comments>http://blog.eqinox.net/alcedo/archive/2006/03/17/1090.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.eqinox.net/alcedo/comments/commentRss/1090.aspx</wfw:commentRss><trackback:ping>http://blog.eqinox.net/alcedo/services/trackbacks/1090.aspx</trackback:ping><description>&lt;P&gt;Programmers are not generally known to be the best UI designers. Many programmers will willingly say that "GUI design is not really my cup of tea; I want to write code" or something like that. And that's fine. This means that when a typical programmer throw together some little application for their own use, the GUI of that application might not be perfect. And that's fine too. But when you start to charge prices in the neighbourhood of &amp;#8364;1000, then you can't do that anymore. &lt;/P&gt;
&lt;P&gt;&lt;IMG height=177 src="/images/blog_eqinox_net/alcedo/18/o_not-consistent.PNG" width=321 align=right border=1&gt;The screenshot provided here comes from such a software, showing the lower-right corner of two dialog boxes (the upper dialog is displayed by the lower dialog). Notice how elegantly the "OK" and "Cancel" buttons traded places. I wonder how many users (apart from myself) that happened to hit the Cancel button, get a bit surprised, opening the dialog and re-making the selections and then realizing what happened. Also notice how it says "OK" with capital letters (as it should) in one dialog, and "Ok" with lower-case "k" in the other. &lt;/P&gt;
&lt;P&gt;In this case it didn't do any big damage: I lost a few seconds of time in an operation that is not repeated very often. But the damage that it does make, is that it damages my confidence in the company releasing the software; if they have these kinds of flaws in the UI, what is there to be found in the code?&lt;/P&gt;&lt;img src ="http://blog.eqinox.net/alcedo/aggbug/1090.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Fredrik Mörk</dc:creator><title>Future .Net Framework stuff</title><link>http://blog.eqinox.net/alcedo/archive/2005/09/14/1039.aspx</link><pubDate>Wed, 14 Sep 2005 09:11:00 GMT</pubDate><guid>http://blog.eqinox.net/alcedo/archive/2005/09/14/1039.aspx</guid><wfw:comment>http://blog.eqinox.net/alcedo/comments/1039.aspx</wfw:comment><comments>http://blog.eqinox.net/alcedo/archive/2005/09/14/1039.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.eqinox.net/alcedo/comments/commentRss/1039.aspx</wfw:commentRss><trackback:ping>http://blog.eqinox.net/alcedo/services/trackbacks/1039.aspx</trackback:ping><description>&lt;P&gt;Microsoft has published some information about what we will see in &lt;A href="http://msdn.microsoft.com/netframework/future/" target="_blank"&gt;future versions&lt;/A&gt; of the .Net Framework. One of the most interesting things in my opinion is the LINQ Project. It is an extension to&amp;nbsp;the .Net Framework&amp;nbsp;that will give developers some new language elements to create queries and such integrated in the native code. Instead of building a string containing an SQL statement, the query is constructed directly by code elements. Apparently it will work on any object that implements the IEnumerable interface, making it useful not only when working with databases.&lt;/P&gt;
&lt;P&gt;You can read more about this on the &lt;A href="http://msdn.microsoft.com/netframework/future/linq/default.aspx" target="_blank"&gt;LINQ Project&lt;/A&gt; web site.&lt;/P&gt;&lt;img src ="http://blog.eqinox.net/alcedo/aggbug/1039.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Fredrik Mörk</dc:creator><title>Issues With Immutable Strings</title><link>http://blog.eqinox.net/alcedo/archive/2005/08/15/1025.aspx</link><pubDate>Mon, 15 Aug 2005 13:55:00 GMT</pubDate><guid>http://blog.eqinox.net/alcedo/archive/2005/08/15/1025.aspx</guid><wfw:comment>http://blog.eqinox.net/alcedo/comments/1025.aspx</wfw:comment><comments>http://blog.eqinox.net/alcedo/archive/2005/08/15/1025.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.eqinox.net/alcedo/comments/commentRss/1025.aspx</wfw:commentRss><trackback:ping>http://blog.eqinox.net/alcedo/services/trackbacks/1025.aspx</trackback:ping><description>&lt;P&gt;The &lt;CODE&gt;String&lt;/CODE&gt; class in .NET is &lt;A href="http://encarta.msn.com/dictionary_/immutable.html" target=_blank&gt;immutable&lt;/A&gt;. That means that once an instance of the &lt;CODE&gt;String&lt;/CODE&gt; class has been created, its content cannot change. Look at the following code:&lt;/P&gt;&lt;CODE class=CodeBlock&gt;&lt;PRE&gt;&lt;SPAN class=CodeKeyword&gt;Dim&lt;/SPAN&gt; vTheString &lt;SPAN class=CodeKeyword&gt;As&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;String&lt;/SPAN&gt; = &lt;SPAN class=CodeString&gt;"Some random text"&lt;/SPAN&gt;
vTheString = &lt;SPAN class=CodeString&gt;"Some other text"&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/CODE&gt;
&lt;P&gt;What happens here is that a string instance is created with the value &lt;CODE&gt;"Some random text"&lt;/CODE&gt;, and it is referenced by the variable &lt;CODE&gt;vTheString&lt;/CODE&gt;. Then a new string instance is created with the value &lt;CODE&gt;"Some other text"&lt;/CODE&gt;, and the variable &lt;CODE&gt;vTheString&lt;/CODE&gt; will be altered to reference that new string instance instead. This is usually not an issue, but there are things to be aware of here. An example:&lt;/P&gt;&lt;CODE class=CodeBlock&gt;&lt;PRE&gt;&lt;SPAN class=CodeKeyword&gt;Module&lt;/SPAN&gt; AppMain
    &lt;SPAN class=CodeKeyword&gt;Private&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;Class&lt;/SPAN&gt; JustForTesting
        &lt;SPAN class=CodeKeyword&gt;Public&lt;/SPAN&gt; Value &lt;SPAN class=CodeKeyword&gt;As&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;String&lt;/SPAN&gt;
    &lt;SPAN class=CodeKeyword&gt;End&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;Class&lt;/SPAN&gt;

    &lt;SPAN class=CodeKeyword&gt;Sub&lt;/SPAN&gt; Main()
        &lt;SPAN class=CodeKeyword&gt;Dim&lt;/SPAN&gt; vTestObject &lt;SPAN class=CodeKeyword&gt;As&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;New&lt;/SPAN&gt; JustForTesting
        vTestObject.Value = &lt;SPAN class=CodeString&gt;"This is my test."&lt;/SPAN&gt;
        AlterTestObject(vTestObject)
        Console.Write(vTestObject.Value)
    &lt;SPAN class=CodeKeyword&gt;End&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;Sub&lt;/SPAN&gt;

    &lt;SPAN class=CodeKeyword&gt;Private&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;Sub&lt;/SPAN&gt; AlterTestObject(&lt;SPAN class=CodeKeyword&gt;ByVal&lt;/SPAN&gt; testObject &lt;SPAN class=CodeKeyword&gt;As&lt;/SPAN&gt; JustForTesting)
        &lt;SPAN class=CodeKeyword&gt;With&lt;/SPAN&gt; testObject.Value
            &lt;SPAN class=CodeKeyword&gt;If&lt;/SPAN&gt; .StartsWith(&lt;SPAN class=CodeString&gt;"This"&lt;/SPAN&gt;) &lt;SPAN class=CodeKeyword&gt;Then&lt;/SPAN&gt;
                testObject.Value = &lt;SPAN class=CodeString&gt;"Which"&lt;/SPAN&gt; &amp;amp; .Substring(4)
            &lt;SPAN class=CodeKeyword&gt;End&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;If&lt;/SPAN&gt;
            &lt;SPAN class=CodeKeyword&gt;If&lt;/SPAN&gt; .EndsWith(&lt;SPAN class=CodeString&gt;"."&lt;/SPAN&gt;) &lt;SPAN class=CodeKeyword&gt;Then&lt;/SPAN&gt;
                testObject.Value = .Substring(0, .Length - 1) &amp;amp; &lt;SPAN class=CodeString&gt;"?"&lt;/SPAN&gt;
            &lt;SPAN class=CodeKeyword&gt;End&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;If&lt;/SPAN&gt;
        &lt;SPAN class=CodeKeyword&gt;End&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;With&lt;/SPAN&gt;
    &lt;SPAN class=CodeKeyword&gt;End&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;Sub&lt;/SPAN&gt;
&lt;SPAN class=CodeKeyword&gt;End&lt;/SPAN&gt; &lt;SPAN class=CodeKeyword&gt;Module&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/CODE&gt;
&lt;P&gt;This code will create a &lt;CODE&gt;JustForTesting&lt;/CODE&gt; instance, assign the string &lt;CODE&gt;"This is my test."&lt;/CODE&gt; to the &lt;CODE&gt;Value&lt;/CODE&gt; field, call a method that apparently replaces the word "This" with the word "Which" and also replaces the dot in the end with a questionmark. It then prints the content of the &lt;CODE&gt;Value&lt;/CODE&gt; field to the console output. And what it prints is:&lt;/P&gt;&lt;PRE&gt;This is my test?
&lt;/PRE&gt;
&lt;P&gt;Why is that? Where did the replacement of "This" to "Which" go? This is where immutable comes into the picture. The &lt;CODE&gt;AlterTestObject&lt;/CODE&gt; method starts off by setting up a With-block which is often considered good practice when you are about to access an object several times, in order to improve performance a little bit. When the with block is set up, it will reference the string instance of the &lt;CODE&gt;Value&lt;/CODE&gt; field of the &lt;CODE&gt;JustForTesting&lt;/CODE&gt; object that is passed to the method. The code then checks if that string instance starts with "This". It does, so the code will assign a new string, starting with "Which", followed by the string after character 4 in the string instance referenced by the with block (resulting in &lt;CODE&gt;"Which is my test."&lt;/CODE&gt;). &lt;/P&gt;
&lt;P&gt;Since the content of a string instance cannot change, a new string instance will be created and the &lt;CODE&gt;JustForTesting&lt;/CODE&gt; object's &lt;CODE&gt;Value&lt;/CODE&gt; field will be changed to reference that new instance. This is where it goes "wrong". The &lt;CODE&gt;Value&lt;/CODE&gt; field is now referencing a new string instance, so the with-block and the &lt;CODE&gt;Value&lt;/CODE&gt; field are now pointing at two different strings.&lt;/P&gt;
&lt;P&gt;Next the code will check if the string referenced by the with-block (which is no longer the same string instance as the &lt;CODE&gt;Value&lt;/CODE&gt; field) ends with a dot. It does, so the code will assign a new string, starting with the string referenced by the with block up to the second last character, followed by a questionmark (resulting in &lt;CODE&gt;"This is my test?"&lt;/CODE&gt;).&lt;/P&gt;
&lt;P&gt;Conclusion: do not set up with-blocks which reference immutable objects, if the code within the block might alter their content.&lt;/P&gt;&lt;img src ="http://blog.eqinox.net/alcedo/aggbug/1025.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Fredrik Mörk</dc:creator><title>Enum, 0 and Nothing</title><link>http://blog.eqinox.net/alcedo/archive/2005/07/26/1015.aspx</link><pubDate>Tue, 26 Jul 2005 10:26:00 GMT</pubDate><guid>http://blog.eqinox.net/alcedo/archive/2005/07/26/1015.aspx</guid><wfw:comment>http://blog.eqinox.net/alcedo/comments/1015.aspx</wfw:comment><comments>http://blog.eqinox.net/alcedo/archive/2005/07/26/1015.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.eqinox.net/alcedo/comments/commentRss/1015.aspx</wfw:commentRss><trackback:ping>http://blog.eqinox.net/alcedo/services/trackbacks/1015.aspx</trackback:ping><description>&lt;P&gt;One feature that I like a lot in the .NET framework is &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconenumerations.asp?frame=true" target=_blank&gt;Enumerations&lt;/A&gt;. They can be used for all sorts of things; indicating a variation of an object, encapsulating a static list of values that a certain field or property can hold and more. Since all Enumerations are based on Integer-related datatypes (such as Byte, Long or Integer), so the individual enumeration values will in the end be an integral numeric value. So far, so god. Let's make an enumeration (I'll use VB.NET syntax):&lt;/P&gt;
&lt;CODE class="CodeBlock"&gt;&lt;PRE&gt;&lt;SPAN class="CodeKeyword"&gt;Private Enum&lt;/span&gt; UIState
    Resting
    Working
&lt;SPAN class="CodeKeyword"&gt;End Enum&lt;/span&gt;&lt;/PRE&gt;&lt;/CODE&gt;&lt;P&gt;This is a very simple enumeration for indicating the current state of the GUI. Either it's Resting, waiting for user input, or it's working, so the user will wait. Actually, this enumeration is so simple that it could have been replaced by a Boolean, but for the sake of the discussion, I'll disregard from that.&lt;/P&gt;
&lt;P&gt;Since I have not declared a type for the enumeration, it will be Integer, and as I have not assigned values to the enumeration members, they will automatically get a sequence of values starting at 0 (0, 1, 2, ...). Great! Seems simple enough. Now, I want to write a function which will set the correct properties of my controls depending on the current state. If the method is called with no state passed, I want it to default to Working:&lt;/P&gt;
&lt;CODE class="CodeBlock"&gt;&lt;PRE&gt;&lt;SPAN class="CodeKeyword"&gt;Private Sub&lt;/SPAN&gt; SetControlState(state &lt;SPAN class="CodeKeyword"&gt;As&lt;/SPAN&gt; UIState)
    &lt;SPAN class="CodeKeyword"&gt;Dim&lt;/SPAN&gt; vLocalState &lt;SPAN class="CodeKeyword"&gt;As&lt;/SPAN&gt; UIState
    &lt;SPAN class="CodeKeyword"&gt;If&lt;/SPAN&gt; state = Nothing &lt;SPAN class="CodeKeyword"&gt;Then&lt;/SPAN&gt;
        vLocalState = UIState.Working
    &lt;SPAN class="CodeKeyword"&gt;Else&lt;/SPAN&gt;
        vLocalState = state
    &lt;SPAN class="CodeKeyword"&gt;End If&lt;/SPAN&gt;
    &lt;SPAN class="CodeComment"&gt;' Here comes the code to set state of controls...&lt;/SPAN&gt;
    &lt;SPAN class="CodeComment"&gt;' ...&lt;/SPAN&gt;
&lt;SPAN class="CodeKeyword"&gt;End Function&lt;/SPAN&gt;
&lt;/PRE&gt;&lt;/CODE&gt;
&lt;P&gt;Now comes the funny part. If I make the call &lt;CODE&gt;SetControlState(Nothing)&lt;/CODE&gt;, I will assume that it uses the &lt;CODE&gt;UIState.Working&lt;/CODE&gt; value to carry out its operations. It won't. Instead it will happily use &lt;CODE&gt;UIState.Resting&lt;/CODE&gt;. Why is that? The answer is; because the values of &lt;CODE&gt;UIState&lt;/CODE&gt; are of a value type. In the .NET world of integral values, 0 and &lt;CODE&gt;Nothing&lt;/CODE&gt; (or &lt;CODE&gt;null&lt;/CODE&gt; in C#) are the same. So the following two lines of code will give the same result:&lt;/P&gt;
&lt;CODE class="CodeBlock"&gt;&lt;PRE&gt;    &lt;SPAN class="CodeKeyword"&gt;If&lt;/span&gt; state = UIState.Resting &lt;SPAN class="CodeKeyword"&gt;Then&lt;/span&gt;
        ...
    &lt;SPAN class="CodeKeyword"&gt;If&lt;/span&gt; state = &lt;SPAN class="CodeKeyword"&gt;Nothing Then&lt;/span&gt;
       ...
&lt;/PRE&gt;&lt;/CODE&gt;
&lt;P&gt;Since &lt;CODE&gt;UIState.Resting = 0&lt;/CODE&gt;, and &lt;CODE&gt;Nothing = 0&lt;/CODE&gt;, they are the same. How do we get around this? It's easy: always assign explicit values to your enumeration members, and don't use 0:&lt;/P&gt;
&lt;CODE class="CodeBlock"&gt;&lt;PRE&gt;&lt;SPAN class="CodeKeyword"&gt;Private Enum&lt;/span&gt; UIState
    Resting = 1
    Working = 2
&lt;SPAN class="CodeKeyword"&gt;End Enum&lt;/span&gt;
&lt;/PRE&gt;&lt;/CODE&gt;
&lt;P&gt;Now the &lt;CODE&gt;SetControlState&lt;/CODE&gt; method will correctly default to &lt;CODE&gt;Working&lt;/CODE&gt; if &lt;CODE&gt;Nothing&lt;/CODE&gt; is passed as parameter.&lt;/P&gt;
&lt;P&gt;There is one thing to keep in mind if you use enumerations like this, though. If you make a user control (or any other type that will be used in a design time environment), and that type has a public property that is of an enumeration type that does not have a member with the value of 0, you will get some error messages from the development environment. By default it will try to assign 0 to the property, which is an invalid value. There are two ways around this; either make sure to define a valid default value for that property (using the &lt;CODE&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcomponentmodeldefaultvalueattributeclasstopic.asp" target=_blank&gt;DefaultValue&lt;/A&gt;&lt;/CODE&gt; attribute) or create a member called "NotSet" (or "None" or something similar) and give it the value 0.&lt;/P&gt;&lt;img src ="http://blog.eqinox.net/alcedo/aggbug/1015.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Fredrik Mörk</dc:creator><title>To Hungarian or Not to Hungarian</title><link>http://blog.eqinox.net/alcedo/archive/2005/05/12/386.aspx</link><pubDate>Thu, 12 May 2005 08:36:00 GMT</pubDate><guid>http://blog.eqinox.net/alcedo/archive/2005/05/12/386.aspx</guid><wfw:comment>http://blog.eqinox.net/alcedo/comments/386.aspx</wfw:comment><comments>http://blog.eqinox.net/alcedo/archive/2005/05/12/386.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.eqinox.net/alcedo/comments/commentRss/386.aspx</wfw:commentRss><trackback:ping>http://blog.eqinox.net/alcedo/services/trackbacks/386.aspx</trackback:ping><description>&lt;P&gt;When I started out programming, even though I was never a C programmer, it was more or less mandatory to use Hungarian Notation when naming variables. With the introduction of .NET the official recommendation was not to use it, since it didn't really add any value (which I very much agree with). But it seems as if the Hungarian that has been used by many programmers (myself included) is based on a simple misinterpretation of the original notation, which is actually very useful, strong type system or not.&lt;/P&gt;
&lt;P&gt;There is an interesting article on the subject on &lt;A href="http://www.joelonsoftware.com/articles/Wrong.html" target=_blank&gt;joelonsoftware.com&lt;/A&gt;.&lt;/P&gt;&lt;img src ="http://blog.eqinox.net/alcedo/aggbug/386.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>