<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Not Rocket Science</title>
	<atom:link href="http://www.stum.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.stum.de</link>
	<description>Random thoughts of neat disorder</description>
	<lastBuildDate>Fri, 05 Mar 2010 07:42:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>TimeSpan.js Version 1.2 released</title>
		<link>http://www.stum.de/2010/03/05/timespan-js-version-1-2-released/</link>
		<comments>http://www.stum.de/2010/03/05/timespan-js-version-1-2-released/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 07:42:48 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[My Tools]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=770</guid>
		<description><![CDATA[I've just pushed a new Version of my TimeSpan Library to GitHub. Version 1.2 contains a new "static" constructor TimeSpan.FromDates which takes two dates and returns the difference between them as a TimeSpan. If the second date is earlier than the first date, the TimeSpan will be negative. Pass true as third parameter to force [...]]]></description>
			<content:encoded><![CDATA[<p>I've just pushed a new Version of my <a href="http://github.com/mstum/TimeSpan.js/downloads">TimeSpan Library to GitHub</a>. Version 1.2 contains a new "static" constructor TimeSpan.FromDates which takes two dates and returns the difference between them as a TimeSpan. If the second date is earlier than the first date, the TimeSpan will be negative. Pass true as third parameter to force it to be positive.</p>
<p>Usage example:</p>
<pre class="prettyprint lang-js">
var date1 = new Date(2010, 3, 1, 10, 10, 5, 0);
var date2 = new Date(2010, 3, 1, 10, 10, 10, 0);
var ts = TimeSpan.FromDates(date2, date1);
var ts2 = TimeSpan.FromDates(date2, date1, true);
alert(ts.totalSeconds()); // -5, because we put the later date first
alert(ts2.totalSeconds()); // 5, because we passed true as third parameter
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/03/05/timespan-js-version-1-2-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Running three Monitors off a Radeon 5870 card</title>
		<link>http://www.stum.de/2010/03/03/running-three-monitors-off-a-radeon-5870-card/</link>
		<comments>http://www.stum.de/2010/03/03/running-three-monitors-off-a-radeon-5870-card/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 03:09:48 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=768</guid>
		<description><![CDATA[Okay, as said last time, I bought a Radeon 5870 card with the desire to drive three monitors. Now, ATI proudly claims that they have three independent display controllers, which is true. And the card has 2x DVI, 1x HDMI and 1x Display Port, so you would expect a setup of 2x DVI and 1x [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, as said last time, I bought a <a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16814161301">Radeon 5870</a> card with the desire to drive three monitors. Now, ATI proudly claims that they have three independent display controllers, which is true. And the card has 2x DVI, 1x HDMI and 1x Display Port, so you would expect a setup of 2x DVI and 1x HDMI to work, right?</p>
<p>Wrong. You see, DVI/HDMI and DisplayPort have different Signal Types. DVI and HDMI use <a href="http://en.wikipedia.org/wiki/TDMS">TDMS</a>, while Display Port uses a completely <a href="http://en.wikipedia.org/wiki/DisplayPort#Advantages_over_DVI">different protocol</a>. And guess what? The card only supports up to two TDMS Signals, which means 1x DVI and 1x HDMI or 2x DVI, but not 2x DVI and 1x HDMI as that would require three TDMS outputs.</p>
<p>Now, the solution seems easy, just get one of those cheap $10 DisplayPort > HDMI or DVI adapters, right? Wrong again. Those adapters do not convert the signal, they seem only able to mechanically convert and then require the host to generate a TDMS Signal. You need an "active" Adapter, that is an adapter that actually converts the signal. Those require extra power, usually provided through an USB Port. And they are expensive.</p>
<p>I bought <a href="http://accessories.us.dell.com/sna/products/Cables/productdetail.aspx?c=us&#038;l=en&#038;s=dhs&#038;cs=19&#038;sku=330-5521">one from Dell (R478G)</a>, which set me back a hundred bucks. Other adapters are sold by Sapphire or Accell and possibly others, but they are all around that price range. Sadly, I already had three Monitors at that point, otherwise I would recommend paying the extra money for a DisplayPort Monitor as the Adapter can cause problems (check the reviews) or even considering a second graphics card, which kinda defeats the purpose of getting a Radeon 5xxx in the first place.</p>
<p>Oh well, at least I now finally have three monitors for a 6016 Pixel wide screen...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/03/03/running-three-monitors-off-a-radeon-5870-card/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Monitors are now armed&#8230;</title>
		<link>http://www.stum.de/2010/02/26/my-monitors-are-now-armed/</link>
		<comments>http://www.stum.de/2010/02/26/my-monitors-are-now-armed/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 04:26:35 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Misc.]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=761</guid>
		<description><![CDATA[When I bought my PC, I wanted a no-compromise Developer and Gaming workstation. In the past, I worked with 2 Monitors (best optimization ever!), but I found even two monitors too limiting at times, especially if I need Visual Studio, my application, a Web Browser, e-Mail and Twitter clients, some command windows, explorer windows and [...]]]></description>
			<content:encoded><![CDATA[<p>When I bought my PC, I wanted a no-compromise Developer and Gaming workstation. In the past, I worked with 2 Monitors (best optimization ever!), but I found even two monitors too limiting at times, especially if I need Visual Studio, my application, a Web Browser, e-Mail and Twitter clients, some command windows, explorer windows and notepad instances running, not to mention some non-development related apps like iTunes.</p>
<p>So this time, I wanted three monitors. As I wanted to avoid two graphics cards (always gets crowded inside the PC, also as my graphics card needs to be good enough for high-end-gaming I didn't want to run 2 different cards, but also not buy 2 $400+ cards...), I ended up buying a ATI Radeon 5870 which has 2 DVI, 1 HDMI and 1 DisplayPort connector and can drive 3 screens at a time. Well, in theory. I'm going to make another posting, but basically one of the three monitors <em>has</em> to be DisplayPort, 2x DVI and 1xHDMI will not work, and neither will the cheap Adapters - I'm currently waiting for my $100 DP->DVI Adapter to be delivered as I already have 3 Monitors.</p>
<p>But anyway, the problem with 3 big monitors is that they take up an insane amount of space on the desk. I bought a big desk, but still it's too much. I remembered <a href="http://www.codinghorror.com/blog/2007/09/lcd-monitor-arms.html">a posting from Jeff Atwood</a> about monitor arms and thought I'd give them a try. I bought an <a href="http://ergotron.com/Products/tabid/65/PRDID/247/language/en-US/default.aspx">Ergotron LX Dual Side-by-Side Arm (45-218-194)</a> which holds two monitors, as long as they are max. 20 lbs/9.1 kg each (basically everything up to and including 24" - if you weigh, remember to remove the foot before). The two monitors I've connected currently are <a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16824009173">Acer B233HUbmidhz</a> - 23", 16:9, 2048x1152.</p>
<p>The Ergotron arms are solid metal and certainly make a very sturdy impression. The users manual on the other side is IKEA-quality, that is barely understandable pictures instead of good explanations. Definitely take some time when you install them, it took me a bit more than an hour. The nice thing about the Ergotron arms is that you can either drill through your table or mount it using a clamp - no drilling! But make sure you have some space under your desk - I thought I had enough, but I underestimated the size of the clamp...</p>
<p><img src="http://www.stum.de/wp-content/uploads/2010/02/UnderDesk.jpg" alt="" title="UnderDesk" width="600" height="244" class="aligncenter size-full wp-image-762" /></p>
<p>Luckily it still fit well enough to hold the screens, phew! It takes a little time adjusting them properly, because of the two parts of the arm (one can be removed) - prepare to move the clamp. As said, take your time. Oh, and another hint: There are two plastic caps that you put on the holder after installation to make it look nice. These caps are <em>hard</em> to remove, so installing them should be the very last thing you do, after mounting the monitors and adjusting them completely. Also, another important hint: You can (and need) adjust the strength of the spring that holds the monitor. Do not wonder if you just mounted your monitor and it's weight drags the arm down - do not write an angry review on Amazon that makes you look bad, but look at the (as said, horrible) manual again (Step 7a) and tighten the screw. Last hint: Make sure your cables are long enough.</p>
<p>I'm definitely happy with it, removing the feet of the monitors makes the desk much more tidy in my opinion. For my third Monitor, I'm looking at the normal LX Arm.</p>
<p><img src="http://www.stum.de/wp-content/uploads/2010/02/Installed.jpg" alt="" title="Installed" width="600" height="450" class="aligncenter size-full wp-image-763" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/26/my-monitors-are-now-armed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lawyer von Gravenreuth commits suicide&#8230;</title>
		<link>http://www.stum.de/2010/02/22/lawyer-von-gravenreuth-commits-suicide/</link>
		<comments>http://www.stum.de/2010/02/22/lawyer-von-gravenreuth-commits-suicide/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 21:19:34 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Misc.]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=758</guid>
		<description><![CDATA[Just got the news that Günter Freiherr von Gravenreuth commited suicide last night. Non-German readers may not know him, so allow me to quickly give a breakdown why he was an important figure in the German computer "scene".
During the 1980s, he put up advertisements in newspapers, posing as 15 year old Tanja Nolte-Berndel and asking [...]]]></description>
			<content:encoded><![CDATA[<p>Just got the news that <a href="http://www.gravenreuth.de/">Günter Freiherr von Gravenreuth</a> commited suicide last night. Non-German readers may not know him, so allow me to quickly give a <a href="http://de.wikipedia.org/wiki/G%C3%BCnter_Freiherr_von_Gravenreuth">breakdown</a> why he was an important figure in the German computer "scene".</p>
<p>During the 1980s, he put up <a href="http://www.martinvogel.de/blog/uploads/Fotos/BriefvonTanjaNolte-BerndelohneFoto.jpg">advertisements</a> in newspapers, posing as 15 year old <a href="http://2.bp.blogspot.com/__pd5tylrvuc/RgY7IcQgL1I/AAAAAAAAAG8/OVRZaH0sa-Q/s400/tanja.jpg">Tanja Nolte-Berndel</a> and asking to "share" software, only to sue responders for breach of copyright laws. In later years, he was active in some controversial lawsuits regarding brand copyrights for brands like "Explorer" (suing Microsoft and some newspapers for using the brand, even though to this day it's not entirely clear if the claim was ever valid, the German patent office even deleted the entry for Explorer). Recently, he was found guilty of Fraud and sentenced to 14 months jail, which were supposed to start this month.</p>
<p>Needless to say, he was not a very popular figure, and that is as nice as I can say it.</p>
<p>But still, he made a name for himself and to this day, "Tanja" and "Gravenreuth" remain an insider under C-64 (and other 80's computer) users. It is part of computer history in Germany now, so when I heard the news, my first thought was "Whoa". It's weird seeing something or someone who just seemed to be always there go away. Maybe it's just a sign that I'm getting old (even though I'm only 26), maybe it's just a sign that the 1980s and my childhood are really over.</p>
<p>While I can't say that I'm crying, I'm also not cheering. I can't say much good about him, except that he was part of the culture I grew up in and as such made an impact, and so there is a certain emptiness now. That and suicide is always a horrible way to make things end.</p>
<p>Goodbye, 1980's.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/22/lawyer-von-gravenreuth-commits-suicide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why is it so hard to list proper technical specifications?</title>
		<link>http://www.stum.de/2010/02/22/why-is-it-so-hard-to-list-proper-technical-specifications/</link>
		<comments>http://www.stum.de/2010/02/22/why-is-it-so-hard-to-list-proper-technical-specifications/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 04:02:18 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Misc.]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=756</guid>
		<description><![CDATA[I never read user manuals, because they are usually a waste of time. The main reasons for me to read user manuals is because I need to check something that is not listed in the technical specifications.
A few weeks back I ranted about TV manufacturers unable to properly list their Inputs/Outputs in the specs and [...]]]></description>
			<content:encoded><![CDATA[<p>I never read user manuals, because they are usually a waste of time. The main reasons for me to read user manuals is because I need to check something that is not listed in the technical specifications.</p>
<p>A few weeks back <a href="http://www.stum.de/2009/11/28/if-you-want-my-money-show-me-your-sexy-back/">I ranted</a> about TV manufacturers unable to properly list their Inputs/Outputs in the specs and how I have to read the user manual to find out if I really am able to use it. Weirdly, some companies are unable to provide a shot from the back and a user manual.</p>
<p>My current reason to rant is the <a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16824009173">Acer B233HU</a> monitor. I bought it more or less blindly because it has a resolution of 2048x1152 and because it has an HDMI input that supports that resolution (my graphics card can drive 3 monitors, but only has 2 DVI Ports, so I needed a HDMI or Display Port Monitor). Now I'm realizing how much space my monitors take up on my desk, so I remembered Jeff Atwood <a href="http://www.codinghorror.com/blog/2007/09/lcd-monitor-arms.html">posting about Monitor Arms</a> some time ago.</p>
<p>Now, to buy a Monitor Arm, I need to know the proper measurements for VESA Mounts. There is 75x75mm, 100x100mm and some other sizes. For my Philips 240BW that's no problem: Go to Philips website, look at specs, see that it's 100x100mm. But my Acer Monitor? No information. I can guess or measure myself that it's also 100x100mm (it is), but really, that belongs in the specs or the manual!</p>
<p>I think it's astounding that they list stuff like what the pins of the DVI Port do (As it's important for me to know that Pin 24 is DDC TMDS Clock-) but not what measurements their VESA Mount it.</p>
<p>Seriously, why is it so hard for companies to determine which specs are important and list them? Yes, I know that I belong to the minority of people who look at the specs and buy stuff that fits a need rather than just buying stuff because of bling-bling and advertising, but do you really need to constantly remind me of that fact? Can't you just - at least sometimes - pretend that us engineers are still valued customers?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/22/why-is-it-so-hard-to-list-proper-technical-specifications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Extension method to replace multiple Chars in a string</title>
		<link>http://www.stum.de/2010/02/16/an-extension-method-to-replace-multiple-chars-in-a-string/</link>
		<comments>http://www.stum.de/2010/02/16/an-extension-method-to-replace-multiple-chars-in-a-string/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 02:14:44 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=740</guid>
		<description><![CDATA[I needed a Sanitizer function for a project, which will replace chars in a string with other chars. To my dismay, I found that there is only a function to replace a single char or string. Of course, I could chain multiple string.Replace calls, but that creates a new string every time which can add [...]]]></description>
			<content:encoded><![CDATA[<p>I needed a Sanitizer function for a project, which will replace chars in a string with other chars. To my dismay, I found that there is only a function to replace a single char or string. Of course, I could chain multiple string.Replace calls, but that creates a new string every time which can add quite a bit of overhead. So I've created a function that takes two Lists of chars and then replaces each occurrence of one char with another one. This also allowed me to implement a second function I was missing from string.Replace, the ability to remove chars (it's possible if you use the string overloads, but not the char ones). The second List is of nullable char type, so just pass in null to remove a char.</p>
<pre class="prettyprint lang-cs">
public static string ReplaceMultiple(this string input,
                                     IDictionary&lt;char,char?> replacements)
{
    var sb = new StringBuilder(input.Length);
    foreach (char c in input)
    {
        if (!replacements.ContainsKey(c))
        {
            sb.Append(c);
        }
        else
        {
            char? replacement = replacements[c];
            if (replacement.HasValue)
            {
                sb.Append(replacement.Value);
            }
        }
    }
    return sb.ToString();
}
</pre>
<p>Usage example:</p>
<pre class="prettyprint">
public string SanitizeTitle(string title)
{
    // Replace space with _ and remove ? and :
    var replacements = new Dictionary&lt;char, char?>
                           {
                               {' ', '_'},
                               {'?', null},
                               {':', null}
                           };
    return title.ReplaceMultiple(replacements);
}
</pre>
<p><strong>Update:</strong> The previous version had two lists. When working with that, I found it rather stupid to keep two lists in sync (they need to have the same count, and the order needs to be correct). So this updated version uses a Dictionary instead, which also allowed me to remove the Exception.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/16/an-extension-method-to-replace-multiple-chars-in-a-string/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript TimeSpan library updated to 1.1</title>
		<link>http://www.stum.de/2010/02/13/javascript-timespan-library-updated-to-1-1/</link>
		<comments>http://www.stum.de/2010/02/13/javascript-timespan-library-updated-to-1-1/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 04:08:39 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=738</guid>
		<description><![CDATA[I have polished the TimeSpan library a bit more. I ran it through JSLint to get the formatting right, and I changed it's function names to follow the common practice in the JavaScript world. Also, there is now a Documentation with some examples.
Note that due to the naming changes, this is a breaking change.
Download it [...]]]></description>
			<content:encoded><![CDATA[<p>I have polished the TimeSpan library a bit more. I ran it through <a href="http://jslint.com/">JSLint</a> to get the formatting right, and I changed it's function names to follow the common practice in the JavaScript world. Also, there is now a Documentation with some examples.</p>
<p>Note that due to the naming changes, this is a breaking change.</p>
<p>Download it from <a href="http://github.com/mstum/TimeSpan.js/downloads">GitHub</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/13/javascript-timespan-library-updated-to-1-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript TimeSpan Library</title>
		<link>http://www.stum.de/2010/02/11/javascript-timespan-library/</link>
		<comments>http://www.stum.de/2010/02/11/javascript-timespan-library/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 09:14:50 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=732</guid>
		<description><![CDATA[Working with Time is always weird. Some functions want milliseconds, others want seconds. And if you want to express "3 hours" in milliseconds, usually the result looks like var targetTime = 3 * 60 * 60 * 1000; which is a bit ugly in my opinion. Also, I always have to remember what to actually [...]]]></description>
			<content:encoded><![CDATA[<p>Working with Time is always weird. Some functions want milliseconds, others want seconds. And if you want to express "3 hours" in milliseconds, usually the result looks like <code>var targetTime = 3 * 60 * 60 * 1000;</code> which is a bit ugly in my opinion. Also, I always have to remember what to actually add together <img src='http://www.stum.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>As a .net Developer, I'm used to the useful <a href="http://msdn.microsoft.com/en-us/library/system.timespan.aspx">System.TimeSpan</a> and <a href="http://msdn.microsoft.com/en-us/library/system.datetime.aspx">System.DateTime</a> structs which have such useful features like AddHours or TotalMilliseconds to have a more natural way to work with Time.</p>
<p>I wrote a JavaScript library that mixes useful functionality from these two structs into "class". Here is a quick example:</p>
<pre class="prettyprint">
var ts = new TimeSpan();
ts.AddHours(3);
alert(ts.TotalMilliseconds()); // Outputs 10800000

// There are also "static constructors":
var ts = TimeSpan.FromHours(3);
alert(ts.TotalMilliseconds()); // Outputs 10800000
</pre>
<p>There are also functions to Add/Subtract another TimeSpan and an Equals function to compare two TimeSpans. Note that there are two types of getters. There are the TotalSeconds/Hours/etc. functions that return a floating point number. And then there are the Seconds/Hours/etc. functions that return an Integer, but that only return a fraction of the TimeSpan that can be used to create a clock. This mirrors the behavior of the .net TimeSpan.</p>
<p>Example:</p>
<pre class="prettyprint">
// TimeSpan for 3 Days, 2 Hours, 10 Minutes and 4 Seconds
var ts1 = new TimeSpan(0, 4, 10, 2, 3);
alert(ts1.TotalDays()); // 3.0903240740740743
alert(ts1.TotalHours()); // 74.16777777777777
alert(ts1.Hours()); // 2, not 74.
alert(ts1.Days()); // 3
</pre>
<p>I haven't written Documentation or VSDoc comments yet, and there is no minified version either, but in the next days I'll add them. In the meantime, <a href="http://github.com/mstum/TimeSpan.js">Download it from GitHub</a>. It is licensed under <a href="http://opensource.org/licenses/mit-license.php">MIT license</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/11/javascript-timespan-library/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Why I think Internet Explorer is the best browser for JavaScript development&#8230;</title>
		<link>http://www.stum.de/2010/02/09/why-i-think-internet-explorer-is-the-best-browser-for-javascript-development/</link>
		<comments>http://www.stum.de/2010/02/09/why-i-think-internet-explorer-is-the-best-browser-for-javascript-development/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 00:13:03 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=729</guid>
		<description><![CDATA[I've started learning JavaScript in November 2009, so about 2 months ago. I am a WebForms developer in my Job, thanks to SharePoint, and I was fed up one day with static/postback-only user interfaces. I wanted to make them snappy, cool, Web 2.0™.
One of the things that kept me away from JavaScript in the past [...]]]></description>
			<content:encoded><![CDATA[<p>I've started learning JavaScript in November 2009, so about 2 months ago. I am a WebForms developer in my Job, thanks to SharePoint, and I was fed up one day with static/postback-only user interfaces. I wanted to make them snappy, cool, Web 2.0™.</p>
<p>One of the things that kept me away from JavaScript in the past was the browser support hell. Every browser has little differences in it's implementation, and even trivial operation often require an if-statement with 3+ branches to get the differences straightened out. Luckily, libraries like <a href="http://jquery.com/">jQuery</a> are available to abstract the whole mess away and give us a clean interface to interact with the browser. I am a big fan of abstractions as long as I know what I'm abstracting away, and jQuery is pure gold that allows me to focus on the actual application/user interface I'm building. After lerning about JavaScripts scoping rules (variables are available to the entire function - { and } do <strong>not</strong> create a new scope) I was finally able to understand, troubleshoot, and <a href="http://meta.stackoverflow.com/questions/22883/tagging-autocomplete-bug-with-mouse/37517#37517">(hopefully) fix</a> a bug in a third party library that I'm using - finally being in control feels great!</p>
<p>But, I have one issue, which is the JavaScript support in Chrome and Firefox. This is a controversial statement for sure, as pretty much everyone agrees that Firefox and <a href="http://getfirebug.com/">Firebug</a> is the de-facto standard for JavaScript development, which I would normally agree with - as good as the Web Developer Toolbar became in Internet Explorer 8, Firebug is still the nicer tool. But my problem with Firefox and Chrome is that they are too lenient about bad JavaScript.</p>
<p>I'm guessing that this is because most JavaScript on the web is simply broken, and throwing an error every time an error is occurs would seriously degrade browsing experience. So I'm guessing that just as with broken HTML, "modern" browsers try to fuzz and fix the JavaScript. One of the reasons XHTML failed was because it was too strict, and because browsers didn't complain loud enough.</p>
<p>I had 3 hard to track down JavaScript errors. Well, hard to track down for me. In all three cases, the error was mine. An extra comma before a closing bracket, forgetting to close a bracket etc. Firefox worked flawlessly. Chrome had a subtle bug. The only browser that constantly does the right thing is Internet Explorer 8: It refuses to execute the JavaScript and throws an error instead.</p>
<p><img src="http://img9.imageshack.us/img9/5152/ieerror.png" alt="Internet Explorer showing an Error" /></p>
<p>When developing, this is what I want. I want any errors to be reported. I want the application to crash hard. I want the browser equivalent of <a href="http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html">-Wall and -Werror</a>. Granted, the Internet Explorer error messages are not that helpful as they only roughly outline what the problem is, but still they are useful enough to work with.</p>
<p>As a developer, I still care about my code. I try to write valid HTML, valid CSS and valid JavaScript whenever possible and at least know when I'm breaking the rules in the cases where valid code is not feasible. So any functionality that sweetens the experience for the end user by hiding errors is making the experience for the developer worse. I know that there are many advocates of loose standards and "just somehow automatically fix it", but ultimately I think that standards exist for a reason and I'd like to at least <strong>know</strong> that I'm doing something wrong.</p>
<p>But then again, this is the Internet and I realize that design and content are much, much more important than code quality, and I agree that providing value to the customer is ultimately more important than having a solid code base. But still, please leave me my illusion that good code and web application are not mutually exclusive <img src='http://www.stum.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/09/why-i-think-internet-explorer-is-the-best-browser-for-javascript-development/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Beginning Debugging in VS2010 Episode 2: Advanced Breakpoints</title>
		<link>http://www.stum.de/2010/02/05/vs2010debuging-1-2/</link>
		<comments>http://www.stum.de/2010/02/05/vs2010debuging-1-2/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 19:26:06 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=723</guid>
		<description><![CDATA[This episode focuses on some advanced concepts with breakpoints, like conditions or exporting/importing them. We also look at the breakpoint window. After this episode, you should be able to use breakpoints more efficiently than just as on/off switches.
Okay, this took a little longer because of a broken Power Supply in my PC. Also, due to [...]]]></description>
			<content:encoded><![CDATA[<p>This episode focuses on some advanced concepts with breakpoints, like conditions or exporting/importing them. We also look at the breakpoint window. After this episode, you should be able to use breakpoints more efficiently than just as on/off switches.</p>
<p>Okay, this took a little longer because of a broken Power Supply in my PC. Also, due to software problems, there are no titles, but I didn't want to wait much longer. If you happen to know a proper Video Editing solution for Windows, please answer this <a href="http://superuser.com/questions/105074/">SuperUser</a> question <img src='http://www.stum.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><object width="640" height="360"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9225475&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=9225475&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"></embed></object>
<p><a href="http://vimeo.com/9225475">Beginning Debugging in VS2010 Episode 2: Advanced Breakpoints</a> from <a href="http://vimeo.com/mstum">Michael Stum</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>The source code for the demo application is <a href="http://www.stum.de/debugging/DebuggingApp1.zip">available here</a>.</p>
<p><a href="http://www.stum.de/2010/01/25/vs2010debugging/">Overview of all Episodes</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/05/vs2010debuging-1-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Re-Thinking SWiki</title>
		<link>http://www.stum.de/2010/02/01/re-thinking-swiki/</link>
		<comments>http://www.stum.de/2010/02/01/re-thinking-swiki/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 16:32:24 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[SWiki]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=721</guid>
		<description><![CDATA[Yesterday, I spent an hour setting up a Debian Linux VM to host a MediaWiki, which is now a 1.2 GB big folder in the /doc folder of a new project, checked into SVN. While I was doing that despite the utter stupidity behind it, I was remembering that I tried to create a better [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, I spent an hour setting up a Debian Linux VM to host a MediaWiki, which is now a 1.2 GB big folder in the /doc folder of a new project, checked into SVN. While I was doing that despite the utter stupidity behind it, I was remembering that I tried to create a better Wiki System a few months back with <a href="http://www.stum.de/2009/08/02/swiki-a-simple-standalone-wiki/">SWiki</a>. Now SWiki is nice in theory, but I think I made some fundamentally wrong decisions in it's scope and in the end, I didn't want to use it myself for anything. So I was thinking again about what problem I tried to solve and what I want to achieve.</p>
<p>MediaWiki is a fantastic system, but it requires a LAMP Stack to really work, and the fact that all data is in a database doesn't make it very Source Control friendly. So I really wanted to solve two different problems: I wanted all the data in the file system, so that it can be checked into source control and easily be shared by other people. So no database server. But to share it with other people, they need to be easily able to read the files. I did not want an application that digs deep into the system. Ideally, I do not want to require installation at all and leave no marks in the system.</p>
<p>So the original SWiki solved problem 1 by using a SQLite Database. There is nothing wrong with using a database as long as it's 100% filesystem based. My attempt at Problem 2 was to host the Internet Explorer COM Object Microsoft exposes and feed it HTML. That way, I don't even need a web server. But that attempt ultimately proved a failure. I could not do much of the rich formatting I wanted, even embedding images was impossible. At some point I questioned whether my use of HTML was correct, or if I shouldn't just use RTF and embed stuff using OLE.</p>
<p>But my problem wasn't the Markup part. I like the <a href="http://wikiplex.codeplex.com/">WikiPlex</a> markup, and the library is clean and extensible. I really didn't want to try using OLE/RTF as these technologies are not meant for human consumption. Also, I want to keep the ability to export the Wiki to HTML so that it can be hosted on a real web server if desired (e.g., the documentation section of a project).</p>
<p>So really, I need a Web Server. But I don't need a particularly "good" one, especially because I do not want a large "footprint" in the network. Really, running a web server is a great way to trigger all sorts of security software across the entire company. But without a webserver, SWiki is simply not good. So I've started looking at the <a href="http://blogs.msdn.com/dmitryr/archive/2008/10/03/cassini-for-framework-3-5.aspx">Cassini Web Server</a>, which is conveniently open source under Ms-PL. This is a great server for many reasons. One, it's 100% managed code, so it can be completely embedded in my app. But more importantly, it can be configured to only ever listen on local loopback, that is 127.0.0.1 for IPv4 or ::1 for IPv6. This may still trigger some security software, but it seals off the application from the network, so no interruption should be caused in theory.</p>
<p>Overall, this is a good compromise. I gain the ability to turn SWiki into a full-blown ASP.net application by simply bundling it with a lightweight web server and control utility, all while still being able to keep the data in a single file. So this is what I will do now. I haven't decided if I keep SQLite as database or use SQL Compact due to it's much better integration and if I'm able to offer an upgrade for databases between "SWiki old" and "SWiki new". I haven't even decided if I keep the name or change it, although the existence of another wiki by that name makes me want to change it.</p>
<p>The only thing I really <em>have</em> decided on is that it will support images and that it will still use WikiPlex as it's parser, all while still requiring .net 3.5 and all while - at it's core - still being a simple, standalone desktop wiki, although a little bit less simple than originally envisioned.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/02/01/re-thinking-swiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An ASP.net AJAX UpdateProgress that can render Inline</title>
		<link>http://www.stum.de/2010/01/28/an-asp-net-ajax-updateprogress-that-can-render-inline/</link>
		<comments>http://www.stum.de/2010/01/28/an-asp-net-ajax-updateprogress-that-can-render-inline/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 02:02:34 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=718</guid>
		<description><![CDATA[I've been starting to pick up ASP.net AJAX again, mainly because as a SharePoint developer I will be "stuck" with WebForms 3.5 for the next few years (SharePoint 2010 will not be a .net 4.0 application). As part of that, I remembered one issue I had: The UpdateProgress renders a div with display:block set, which [...]]]></description>
			<content:encoded><![CDATA[<p>I've been starting to pick up ASP.net AJAX again, mainly because as a SharePoint developer I will be "stuck" with WebForms 3.5 for the next few years (SharePoint 2010 will not be a .net 4.0 application). As part of that, I remembered one issue I had: <a href="http://stackoverflow.com/questions/42499/">The UpdateProgress renders a div with display:block</a> set, which means it is not possible to have the updateProgress right next to a button. Joe Audette <a href="http://www.joeaudette.com/solving-the-aspnet-updateprogress-div-problem.aspx">had the right idea</a>: Grab the UpdateProgress from the Mono Project and modify it. The nice thing about the Class Libraries of Mono is that they are licensed under the very liberal <a href="http://www.opensource.org/licenses/mit-license.html">MIT X11</a> license, making them good candidates as a base for modifications.</p>
<p>Here is the source code of the UpdateProgressEx, which includes a new Property, DisplayInline. If this is set to true, then we render a span with display: inline. If this is set to false or not set at all, we have the default behavior of a div/block. If DisplayInline is set to true, then we force DynamicLayout to be false. Why? Because if DynamicLayout is true, then it seems like the MS AJAX JavaScript control the display, and they render it as a block. As I did not want to modify it any further, I just force DynamicLayout to false because for me, that works good enough. Also, I haven't tested if it works in visual design mode and if the property panel shows the new DisplayInline Property, as I work only in code view. YMMV, but it's Open Source after all, so feel free to properly fix it <img src='http://www.stum.de/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Here is the code:</p>
<pre class="prettyprint lang-cs">
// UpdateProgressEx
//
// Author:
//  Michael Stum &lt;website@stum.de>
//  http://www.stum.de/2010/01/28/an-asp-net-ajax-updateprogress-that-can-render-inline
//
// Original Author:
//   Igor Zelmanovich &lt;igorz@mainsoft.com>
//   (C) 2007 Mainsoft, Inc.  http://www.mainsoft.com
//
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Web.UI;

namespace StumDE.WebControls
{
    [PersistChildren(false)]
    [ParseChildren(true)]
    [DefaultProperty("AssociatedUpdatePanelID")]
    [Designer("System.Web.UI.Design.UpdateProgressDesigner, System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
    public class UpdateProgressEx : Control, IScriptControl
    {
        ITemplate _progressTemplate;
        ScriptManager _scriptManager;

        [Category("Behavior")]
        [DefaultValue("")]
        [IDReferenceProperty(typeof(UpdatePanel))]
        public string AssociatedUpdatePanelID
        {
            get
            {
                return (string)ViewState["AssociatedUpdatePanelID"] ?? String.Empty;
            }
            set
            {
                ViewState["AssociatedUpdatePanelID"] = value;
            }
        }

        [Category("Behavior")]
        [DefaultValue(false)]
        public bool DisplayInline
        {
            get
            {
                object o = ViewState["DisplayInline"];
                if (o == null)
                    return false;
                return (bool)o;
            }
            set
            {
                ViewState["DisplayInline"] = value;
            }
        }

        [Category("Behavior")]
        [DefaultValue(500)]
        public int DisplayAfter
        {
            get
            {
                object o = ViewState["DisplayAfter"];
                if (o == null)
                    return 500;
                return (int)o;
            }
            set
            {
                ViewState["DisplayAfter"] = value;
            }
        }

        [Category("Behavior")]
        [DefaultValue(true)]
        public bool DynamicLayout
        {
            get
            {
                // If DisplayInline is set, force dynamic layout to be false
                if(DisplayInline) return false;
                object o = ViewState["DynamicLayout"];
                if (o == null)
                    return true;
                return (bool)o;
            }
            set
            {
                ViewState["DynamicLayout"] = value;
            }
        }

        [PersistenceMode(PersistenceMode.InnerProperty)]
        [Browsable(false)]
        public ITemplate ProgressTemplate
        {
            get
            {
                return _progressTemplate;
            }
            set
            {
                _progressTemplate = value;
            }
        }

        ScriptManager ScriptManager
        {
            get
            {
                if (_scriptManager == null)
                {
                    _scriptManager = ScriptManager.GetCurrent(Page);
                    if (_scriptManager == null)
                        throw new InvalidOperationException(String.Format("The control with ID '{0}' requires a ScriptManager on the page. The ScriptManager must appear before any controls that need it.", ID));
                }
                return _scriptManager;
            }
        }

        protected virtual IEnumerable&lt;ScriptDescriptor> GetScriptDescriptors()
        {
            string updatePanelClientId;
            if (String.IsNullOrEmpty(AssociatedUpdatePanelID))
                updatePanelClientId = null;
            else
            {
                var updatePanel = FindControl(AssociatedUpdatePanelID) as UpdatePanel;
                if (updatePanel == null)
                    throw new InvalidOperationException("No UpdatePanel found for AssociatedUpdatePanelID '" + AssociatedUpdatePanelID + "'.");
                updatePanelClientId = updatePanel.ClientID;
            }
            var descriptor = new ScriptControlDescriptor("Sys.UI._UpdateProgress", this.ClientID);
            descriptor.AddProperty("associatedUpdatePanelId", updatePanelClientId);
            descriptor.AddProperty("displayAfter", DisplayAfter);
            descriptor.AddProperty("dynamicLayout", DynamicLayout);
            descriptor.AddProperty("displayInline", DisplayInline);
            yield return descriptor;
        }

        protected virtual IEnumerable&lt;ScriptReference> GetScriptReferences()
        {
            yield break;
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            ScriptManager.RegisterScriptControl(this);

            if (_progressTemplate == null)
                throw new InvalidOperationException(String.Format("A ProgressTemplate must be specified on UpdateProgress control with ID '{0}'.", ID));

            var container = new Control();
            _progressTemplate.InstantiateIn(container);
            Controls.Add(container);
        }

        protected override void Render(HtmlTextWriter writer)
        {
            if (DynamicLayout)
                writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "none");
            else
            {

                writer.AddStyleAttribute(HtmlTextWriterStyle.Display, DisplayInline ? "inline" : "block");
                writer.AddStyleAttribute(HtmlTextWriterStyle.Visibility, "hidden");
            }
            writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
            if (DisplayInline)
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Span);
            }
            else
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Div);
            }
            base.Render(writer);
            writer.RenderEndTag();

            ScriptManager.RegisterScriptDescriptors(this);
        }

        #region IScriptControl Members

        IEnumerable&lt;ScriptDescriptor> IScriptControl.GetScriptDescriptors()
        {
            return GetScriptDescriptors();
        }

        IEnumerable&lt;ScriptReference> IScriptControl.GetScriptReferences()
        {
            return GetScriptReferences();
        }

        #endregion
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/01/28/an-asp-net-ajax-updateprogress-that-can-render-inline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WSSv3/Sharepoint 2007 does not support nested master pages</title>
		<link>http://www.stum.de/2010/01/27/wssv3sharepoint-2007-does-not-support-nested-master-pages/</link>
		<comments>http://www.stum.de/2010/01/27/wssv3sharepoint-2007-does-not-support-nested-master-pages/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 19:14:17 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=716</guid>
		<description><![CDATA[For a Project I had on a SharePoint site I thought it would be a good idea to create a new master page that is based on the default.master and exposes some placeholder for my content pages to use. Nested Master Pages are trivial to do in ASP.net normally, but for some reason on my [...]]]></description>
			<content:encoded><![CDATA[<p>For a Project I had on a SharePoint site I thought it would be a good idea to create a new master page that is based on the default.master and exposes some placeholder for my content pages to use. Nested Master Pages are <a href="http://msdn.microsoft.com/en-us/library/x2b3ktt7.aspx">trivial to do in ASP.net</a> normally, but for some reason on my SharePoint site, the child page was not rendering its content in one of the new placeholders.</p>
<p>Well, turns out that SharePoint 2007/WSSv3 explicitly <strong>does not support nested master pages</strong>. To quote <a href="http://msdn.microsoft.com/en-us/library/ms476046.aspx">an Article in MSDN</a> directly:</p>
<blockquote><p>Although the underlying technology enables the creation of nested master pages, nested master pages are not supported in Windows SharePoint Services.  Using nested master pages can cause unexpected behavior in some scenarios, such as preventing content from rendering.</p></blockquote>
<p>Indeed, unexpected behavior, such as content not rendering is the exact problem I have. Now I remember why I love SharePoint so much: It's taking the essential functions of ASP.net and then adds some traps that really hurt you unexpectedly.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/01/27/wssv3sharepoint-2007-does-not-support-nested-master-pages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beginning Debugging in VS2010 Episode 1: Breakpoints and Locals</title>
		<link>http://www.stum.de/2010/01/25/vs2010debuging-1-1/</link>
		<comments>http://www.stum.de/2010/01/25/vs2010debuging-1-1/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 23:17:26 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=708</guid>
		<description><![CDATA[The first episode in the Debugging in Visual Studio 2010 series is about the most fundamental concept of all, Breakpoints. Also, we cover the Locals window, which is the first additional window of the debugger.
As this is the first episode, there are some kinks I haven't manage to fully iron out. The audio quality isn't [...]]]></description>
			<content:encoded><![CDATA[<p>The first episode in the <a href="http://www.stum.de/2010/01/25/vs2010debugging">Debugging in Visual Studio 2010</a> series is about the most fundamental concept of all, Breakpoints. Also, we cover the Locals window, which is the first additional window of the debugger.</p>
<p>As this is the first episode, there are some kinks I haven't manage to fully iron out. The audio quality isn't perfect, mainly because the Microphone I specifically bought for stuff like this turned out to be junk and I had to use the one in my Webcam. Also I experimented with having a script vs. speaking freely and tend to overuse the phrase "You may notice" quite a bit...</p>
<p>You can watch the video in higher, full HD quality directly on Vimeo.</p>
<p><object width="640" height="360"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8954697&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8954697&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"></embed></object>
<p><a href="http://vimeo.com/8954697">Beginning Debugging in VS2010 Episode 1: Breakpoints and Locals</a> from <a href="http://vimeo.com/mstum">Michael Stum</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>The source code for the demo application is <a href="http://www.stum.de/debugging/DebuggingApp1.zip">available here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/01/25/vs2010debuging-1-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Debugging in Visual Studio 2010 Video Series</title>
		<link>http://www.stum.de/2010/01/25/vs2010debugging/</link>
		<comments>http://www.stum.de/2010/01/25/vs2010debugging/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 23:16:28 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=704</guid>
		<description><![CDATA[I found that if I want to learn something, I should try explaining or teaching it to someone else. As I work as a SharePoint Developer, the Debugger became my best friend very quickly, but I always ever only touched the surface and maybe a little bit more. A recent problem requires me now to [...]]]></description>
			<content:encoded><![CDATA[<p>I found that if I want to learn something, I should try explaining or teaching it to someone else. As I work as a SharePoint Developer, the Debugger became my best friend very quickly, but I always ever only touched the surface and maybe a little bit more. A recent problem requires me now to dig really deep and is forcing me to really learn to use the debugger. So I thought this would be an excellent opportunity to create a little video series, of which the first chapter will be "Beginning Debugging in Visual Studio 2010". Now let me first start with a disclaimer: I am still learning this stuff. I am not a senior developer at Microsoft with 20 years experience writing operating system, I am just someone who picked up C# 4 years ago and is now trying to learn through teaching.</p>
<p>This series is not about design or architecture, it is not about unit testing or best practices. This is purely about having some buggy code and using the debugger to find the issue and solve it. This is about moving from trial-and-error/guessing to evidence-gathering.</p>
<p>There is no set schedule for releases and I am not sure how many episodes there will be. I do have plans for three chapters of varying "difficulty" and I do have a to-do list of stuff I want to cover, but as some items on this list are really hardcore I'm not sure what will come out of this.</p>
<p>Anyway, here is an index to all released episodes:</p>
<ul>
<li><strong>Chapter One: Beginning Debugging in Visual Studio 2010</strong>
<ul>
<li><a href="http://www.stum.de/2010/01/25/vs2010debuging-1-1">Episode 01: Breakpoints and Locals, posted 2010-01-25</a></li>
<li><a href="http://www.stum.de/2010/02/05/vs2010debuging-1-2">Episode 02: Advanced Breakpoints, posted 2010-02-05</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/01/25/vs2010debugging/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
