<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>Mark Michaelis' Weblog</title>
  <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/" />
  <link rel="self" href="http://mark.michaelis.net/Blog/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2007-12-06T17:13:10.691875-08:00</updated>
  <author>
    <name>Mark Michaelis</name>
  </author>
  <subtitle>A cacophony of ramblings from my potpourri of notes</subtitle>
  <id>http://mark.michaelis.net/Blog/</id>
  <generator uri="http://www.dasblog.net" version="2.0.7180.0">DasBlog</generator>
  <entry>
    <title>Enumerating Process.GetProcesses() fails on Vista</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/EnumeratingProcessGetProcessesFailsOnVista.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=0071dfb3-3556-4a66-a887-b94846a798dd</id>
    <published>2007-12-04T22:31:28.629375-08:00</published>
    <updated>2007-12-06T17:13:10.691875-08:00</updated>
    <content type="html">&lt;p&gt;
It is hard to believe something as common as this could fail but it appears that enumerating &lt;font face="Courier New"&gt;System.Diagnostics.Process.GetProcesses()&lt;/font&gt; and
calling a &lt;font face="Courier New"&gt;Process&lt;/font&gt; property fails on Vista.&amp;nbsp; Here
is the test demonstrating the issue:
&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;      [&gt;&lt;span style="color: #0000ff"&gt;TestMethod&lt;/span&gt;&lt;span style="color: #000000"&gt;]
[&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ExpectedException&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a31515"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000"&gt;(System.ComponentModel.&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Win32Exception&lt;/span&gt;&lt;span style="color: #000000"&gt;))] &lt;/span&gt;&lt;span style="color: #a31515"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #a31515"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; EnumeratingGetProcessesThrowWin32Exception()
{&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #a31515"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Process&lt;/span&gt;&lt;span style="color: #000000"&gt; process &lt;/span&gt;&lt;span style="color: #a31515"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;span style="color: #000000"&gt;System.Diagnostics.&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Process&lt;/span&gt;&lt;span style="color: #000000"&gt;.GetProcesses()&lt;/span&gt;)
{ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Console&lt;/span&gt;&lt;span style="color: #000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;"{0}:
"&lt;/span&gt;&lt;span style="color: #000000"&gt;, process.ProcessName); &lt;/span&gt;&lt;span style="color: #a31515"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ProcessModule&lt;/span&gt;&lt;span style="color: #000000"&gt; module &lt;/span&gt;&lt;span style="color: #a31515"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; process.Modules)
{ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Console&lt;/span&gt;&lt;span style="color: #000000"&gt;.Write(&lt;/span&gt;&lt;span style="color: #ff00ff"&gt;"
{0},"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Path&lt;/span&gt;&lt;span style="color: #000000"&gt;PRE&lt; P&gt;.GetFileName(module.FileName));
} } }&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
The message corresponding to the error is the ever helpful, "Access is denied" and
it occurs regardless of whether you are running as an elevated process or not. The
problem is caused by at least three processes when running elevated (as Administrator)
or with UNC disabled:&amp;nbsp; audiodg, &lt;font face="Courier New"&gt;System&lt;/font&gt;, and &lt;font face="Courier New"&gt;Idle&lt;/font&gt;.&amp;nbsp;
(&lt;font face="Courier New"&gt;audiodg&lt;/font&gt; process which is used as part of the digital
rights management piece in Windows Vista.)&amp;nbsp; Calling virtually an property on
these three processes throws a &lt;font face="Courier New"&gt;Win32Exception&lt;/font&gt;. 
&lt;/p&gt;
&lt;p&gt;
To eliminate processes that throw exceptions on their properties from the GetProcesses()
return using a where query operator (C# 3.0): 
&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;font face="Courier New"&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Process
process &lt;span class="kwrd"&gt;in&lt;/span&gt; System.Diagnostics.Process.GetProcesses().Where(&lt;br&gt;
process =&amp;gt; { &lt;span class="kwrd"&gt;bool&lt;/span&gt; hasException = &lt;span class="kwrd"&gt;false&lt;/span&gt;; &lt;span class="kwrd"&gt;try&lt;/span&gt; {
IntPtr x = process.Handle; } &lt;span class="kwrd"&gt;catch&lt;/span&gt; { hasException = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
} &lt;span class="kwrd"&gt;return&lt;/span&gt; !hasException; }) ) { &lt;span class="rem"&gt;// ...&lt;/span&gt; }&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt; &lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre&gt;&lt;span style="color: #000000"&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
As part of investigating this I wondered what Sysinternal's &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=0071dfb3-3556-4a66-a887-b94846a798dd&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2ftechnet%2fsysinternals%2futilities%2fprocessexplorer.mspx"" target="_blank"&gt;Process
Explorer&lt;/a&gt; did. It just shows the exception error message, "Access is denied." 
&lt;/p&gt;
&lt;p&gt;
UPDATE 2007-12-06:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="color: #000000"&gt; Updated the where clause to filter by processes that
threw exceptions and pointed out that Sysinternal's Process Explorer shows the properties
for the processes with the exception message.
&lt;/p&gt;
&gt;&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=0071dfb3-3556-4a66-a887-b94846a798dd" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>31 Spiritual Questions to Diagnose and Reflect on Your Life</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/31SpiritualQuestionsToDiagnoseAndReflectOnYourLife.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=173f120e-b467-4fae-b485-1f5fd378ed1b</id>
    <published>2007-04-26T21:35:22.046875-07:00</published>
    <updated>2007-04-26T21:35:22.046875-07:00</updated>
    <content type="html">&lt;p&gt;
Tomorrow I am heading out to &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=173f120e-b467-4fae-b485-1f5fd378ed1b&amp;amp;url=http%3a%2f%2fwww.riverviewbiblecamp.com%2f"" target="_blank"&gt;Riverview&lt;/a&gt; for
a "day with God."&amp;nbsp; It is just a day of reflection on my life, my relationship
with God, my family, my work, etc.&amp;nbsp; In the past (especially in college) these
used to be an annual or semi-annual occurrence.&amp;nbsp; Unfortunately, I have allowed
the clutter in my life to crowd out these times.&amp;nbsp; So... tomorrow I am "disciplining"
it in.
&lt;/p&gt;
&lt;p&gt;
I have found it best not to write a list of tasks for the time or even to make a schedule.&amp;nbsp;
Rather, just take the day slowly, spend lots of time in prayer - mostly listening,
perhaps a little reading.&amp;nbsp; The only thing on my agenda is to spend some time
reflecting on my life through a bunch of questions from &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=173f120e-b467-4fae-b485-1f5fd378ed1b&amp;amp;url=http%3a%2f%2fbiblicalspirituality.org%2f"" target="_blank"&gt;Donald
S. Whitney&lt;/a&gt;.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
What ‘s one thing you could do this year to increase your enjoyment of God?&lt;/li&gt;
&lt;li&gt;
What’s the most humanly impossible thing you will ask God to do this year?&lt;/li&gt;
&lt;li&gt;
What’s the single most important thing you could do to improve the quality of your
family life this year?&lt;/li&gt;
&lt;li&gt;
In which spiritual discipline do you most want to make progress this year, and what
will you do about it?&lt;/li&gt;
&lt;li&gt;
What is the single biggest time-waster in your life, and what will you do about it
this year?&lt;/li&gt;
&lt;li&gt;
What is the most helpful new way you could strengthen your church?&lt;/li&gt;
&lt;li&gt;
For whose salvation will you pray most fervently this year?&lt;/li&gt;
&lt;li&gt;
What’s the most important way you will, by God’s grace, try to make this year different
from last year?&lt;/li&gt;
&lt;li&gt;
What one thing could you do to improve your prayer life this year?&lt;/li&gt;
&lt;li&gt;
What single thing that you plan to do this year will matter most in 10 years? In eternity?&lt;/li&gt;
&lt;li&gt;
What’s the most important decision you need to make this year?&lt;/li&gt;
&lt;li&gt;
What area of your life most needs simplifying, and what’s one way you could simplify
in that area?&lt;/li&gt;
&lt;li&gt;
What’s the most important need you feel burdened to meet this year?&lt;/li&gt;
&lt;li&gt;
What habit would you most like to establish this year?&lt;/li&gt;
&lt;li&gt;
Who do you most want to encourage this year?&lt;/li&gt;
&lt;li&gt;
What is your most important financial goal this year, what is the most important step
you can take toward achieving it?&lt;/li&gt;
&lt;li&gt;
What’s the single most important thing you could do to improve the quality of your
work life this year?&lt;/li&gt;
&lt;li&gt;
What’s one new way you could be a blessing to your pastor (or to another who ministers
to you) this year?&lt;/li&gt;
&lt;li&gt;
What’s one thing you could do this year to enrich the spiritual legacy you will leave
to your children and grandchildren?&lt;/li&gt;
&lt;li&gt;
What book, in addition to the Bible, do you most want to read this year?&lt;/li&gt;
&lt;li&gt;
What one thing do you most regret about last year, and what will you do about it this
year?&lt;/li&gt;
&lt;li&gt;
What single blessing from God do you want to seek most earnestly this year?&lt;/li&gt;
&lt;li&gt;
In what area of your life do you most need growth, and what will you do about it his
year?&lt;/li&gt;
&lt;li&gt;
What’s the most important trip you want to take this year?&lt;/li&gt;
&lt;li&gt;
What skill do you most want to learn or improve this year?&lt;/li&gt;
&lt;li&gt;
To what need or ministry will you try to give an unprecedented amount this year?&lt;/li&gt;
&lt;li&gt;
What’s the single most important thing you could do to improve the quality of you
commute this year?&lt;/li&gt;
&lt;li&gt;
What one biblical doctrine do you most want to understand better this year, and what
will you do about it?&lt;/li&gt;
&lt;li&gt;
If those who know you best gave you one piece of advice, what would they say? Would
they be right? What will you do about it?&lt;/li&gt;
&lt;li&gt;
What’s the most important new item you want to buy this year?&lt;/li&gt;
&lt;li&gt;
In what area of your life do you most need change, and what will you do about it this
year?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Dr. Whitney has these in&amp;nbsp;word &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=173f120e-b467-4fae-b485-1f5fd378ed1b&amp;amp;url=http%3a%2f%2fbiblicalspirituality.org%2finserts%2fnewyear.doc"" target="_blank"&gt;Word
document handout form&lt;/a&gt;&amp;nbsp;on his web site.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
(I didn't recognize&amp;nbsp;Dr. Whitney's&amp;nbsp;name until I went to his web site and
saw that I have read his book, &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=173f120e-b467-4fae-b485-1f5fd378ed1b&amp;amp;url=http%3a%2f%2fbiblicalspirituality.org%2fbooks.html%23SDCL"" target="_blank"&gt;Spiritual
Disciplines for the Christian Life&lt;/a&gt;,&amp;nbsp;and appreciated it.&amp;nbsp; Furthermore,
I used to regularly meet with Keith Draper at &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=173f120e-b467-4fae-b485-1f5fd378ed1b&amp;amp;url=http%3a%2f%2fwww.glenfield.org%2f"" target="_blank"&gt;Glenfield
Baptist in Glen Ellyn, IL&lt;/a&gt;&amp;nbsp;which was Dr. Whitney's church.&amp;nbsp; Funny how
things link together at times.)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=173f120e-b467-4fae-b485-1f5fd378ed1b" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>What Appreciation Would Leave You Jumping for Joy</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/WhatAppreciationWouldLeaveYouJumpingForJoy.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=11ee66bc-e95b-47b5-a2dd-475386e9a8f9</id>
    <published>2007-04-16T11:43:58.984375-07:00</published>
    <updated>2007-04-16T11:43:58.984375-07:00</updated>
    <category term="Personal" label="Personal" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Personal" />
    <category term="Personal/In Pursuit of God" label="Personal/In Pursuit of God" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Personal%7cIn+Pursuit+of+God" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last night Patty Christopherson presented me with the question, "What appreciation
might someone give you that would leave you jumping for joy."  What can someone
thank you for that would excite you?
</p>
        <p>
It took me several minutes to figure out my answer.  For me, the appreciation
I receive that most excites me, that sticks with me longest, is when people share
with my how I have had an affect of them - God has used me to change their life. 
They express how I helped them to grow closer to or be more like Christ or that I
taught them something that they will be able to use or even better, I modeled something
that made an impact and caused them to live differently.
</p>
        <p>
Now, the rubber meets the road question for me.  Is what gives me joy consistent
with what God desires of my life.  YES!  And, am I living my life in a way
that is consistent with creating opportunities to accomplish this?  
</p>
        <ul>
          <li>
Is the time I spend with my family consistent with what I know to be important?</li>
          <li>
Does coaching Upwards Soccer create opportunities that will change lives?</li>
          <li>
As an Trainer, am I making a difference in people's lives?  Similarly with my
role as an Enterprise Architect and Author?</li>
          <li>
Is the class I teach at church on the Gospel of Mark make a difference to those in
the class?</li>
          <li>
What about conference speaking, VSTS consulting, Microsoft SDRs, the emails I send
and receive, etc.</li>
        </ul>
        <p>
Hmmm....
</p>
        <img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=11ee66bc-e95b-47b5-a2dd-475386e9a8f9" />
        <br />
        <hr />
© Copyright 2005-2008 Mark Michaelis
</div>
    </content>
  </entry>
  <entry>
    <title>Skrbl - The Ultimate in Real Time Electronic Whiteboarding</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/SkrblTheUltimateInRealTimeElectronicWhiteboarding.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=d294617e-956f-4e95-ada6-db89cf44ca77</id>
    <published>2007-04-09T23:16:20.640625-07:00</published>
    <updated>2007-04-09T23:16:20.640625-07:00</updated>
    <category term="Computer Related" label="Computer Related" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related" />
    <category term="Computer Related/.Net" label="Computer Related/.Net" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7c.Net" />
    <category term="Computer Related/Miscellaneous" label="Computer Related/Miscellaneous" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7cMiscellaneous" />
    <content type="html">&lt;p&gt;
I came across &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=d294617e-956f-4e95-ada6-db89cf44ca77&amp;amp;url=http%3a%2f%2fwww.skrbl.com%2f"" target="_blank"&gt;this&lt;/a&gt; some
time ago and immediately&amp;nbsp;took a fancy.&amp;nbsp; Tonight I needed it again for some
collaboration and again I was amazed.&amp;nbsp;&amp;nbsp;The figure below is my real-time
collaboration with Prashant tonight.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://mark.michaelis.net/blog/content/binary/SkrblTheUltimateinRealTimeElectronicWhiteboarding/Skrbl.jpg"&gt; 
&lt;/p&gt;
&lt;p&gt;
Multiple users can "collaborate" by posting and editing content in real time onto
the whiteboard.&amp;nbsp; What is most incredible about it is the fact that there is no
install - none!&amp;nbsp; Nada... it appears to use&amp;nbsp;Java Script entirely.
&lt;/p&gt;
&lt;p&gt;
The difference between collaborating with this versus collaborating&amp;nbsp;with Word
is amazing.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
With MS Word, 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
I type something 
&lt;/li&gt;
&lt;li&gt;
Save it&lt;/li&gt;
&lt;li&gt;
Email it or post it to SharePoint&lt;/li&gt;
&lt;li&gt;
You open&amp;nbsp;it&lt;/li&gt;
&lt;li&gt;
turn on track changes, 
&lt;/li&gt;
&lt;li&gt;
edit it, 
&lt;/li&gt;
&lt;li&gt;
email it back... etc.&amp;nbsp; 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Instead, we just do Skrbl.com.&amp;nbsp; So I exaggerate slightly but you get the idea.&amp;nbsp;
It is so incredibly intuitive as well.&amp;nbsp; The only thing it took me a minute or
so to find was delete.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Heck... imagine pair programming with this technology.&amp;nbsp; Even&amp;nbsp;my 4 Gb VSTS
install&amp;nbsp;can't do this nearly as easily.&amp;nbsp; :)
&lt;/p&gt;
&lt;p&gt;
You GOTTA check it out.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=d294617e-956f-4e95-ada6-db89cf44ca77" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>Google Reader</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/GoogleReader.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=ac361f56-616e-46a5-8e97-9df8458ca86d</id>
    <published>2007-02-18T23:14:29.181257-08:00</published>
    <updated>2007-02-18T23:14:29.181257-08:00</updated>
    <category term="Computer Related" label="Computer Related" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related" />
    <category term="Computer Related/Blogging" label="Computer Related/Blogging" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7cBlogging" />
    <category term="Computer Related/Miscellaneous" label="Computer Related/Miscellaneous" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7cMiscellaneous" />
    <content type="html">&lt;p&gt;
For a few weeks now I have been using &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=ac361f56-616e-46a5-8e97-9df8458ca86d&amp;amp;url=http%3a%2f%2freader.google.com%2f"" target="_blank"&gt;Google
Reader&lt;/a&gt; as a means of reading a few blogs every now and then.&amp;nbsp; At first I
was relatively pleased.&amp;nbsp; It did a good job of importing my OPML files and in
spite of the fact that I was using a web based interface, the response time was fast
and I could zip through posts relatively quickly.&amp;nbsp; Most of all, I really like
having the feeds online.&amp;nbsp; I switch repeatedly between multiple computers and
my phone on occasion, and the fact that I don't have to worry about any synchronization
is a pleasure.&amp;nbsp; (Not to mention the convenient&amp;nbsp;fact that it is free.)
&lt;/p&gt;
&lt;p&gt;
Now that I have banged it around for a few weeks I am not so enamored, however.&amp;nbsp;
Several times the automatic marking of posts as read has not worked, especially when
switching between my phone and computer.&amp;nbsp; The result is that I end up reading
the same post twice.&amp;nbsp; Also, you can't apply any rules or filters, which means
I can't use it to block material from large feeds (such as &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=ac361f56-616e-46a5-8e97-9df8458ca86d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2f"" target="_blank"&gt;MSDN
Blogs&lt;/a&gt;) that I am not interested in or filter out duplicates.
&lt;/p&gt;
&lt;p&gt;
By far the most ironic (if not the most irritating) is the fact that &lt;strong&gt;Google
reader does not support any search capability&lt;/strong&gt;.&amp;nbsp; Really... isn't that
amazing?&amp;nbsp; I haven't yet looked around for the alternative (well I scanned &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=ac361f56-616e-46a5-8e97-9df8458ca86d&amp;amp;url=http%3a%2f%2fmy.yahoo.com%2f"&gt;my
Yahoo&lt;/a&gt;&amp;nbsp;and was unimpressed)&amp;nbsp;but I don't think the current choice is going
to last either.&amp;nbsp; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=ac361f56-616e-46a5-8e97-9df8458ca86d" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>Funny - Free PHP Training to Learn ASP.NET</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/FunnyFreePHPTrainingToLearnASPNET.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=ec1fd35c-5c08-4822-9352-22820475ca4c</id>
    <published>2007-02-16T06:40:44.8042781-08:00</published>
    <updated>2007-02-16T06:41:59.8847741-08:00</updated>
    <category term="Computer Related" label="Computer Related" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related" />
    <category term="Computer Releated/.Net" label="Computer Releated/.Net" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Releated%7c.Net" />
    <content type="html">&lt;p&gt;
&amp;nbsp;While browsing&amp;nbsp;&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=ec1fd35c-5c08-4822-9352-22820475ca4c&amp;amp;url=http%3a%2f%2fwww.learn2asp.net%2f"" target="_blank"&gt;Microsoft's
ASP.NET online course offerings&lt;/a&gt;,&amp;nbsp;some of which&amp;nbsp;&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=ec1fd35c-5c08-4822-9352-22820475ca4c&amp;amp;url=http%3a%2f%2fpluralsight.com%2fblogs%2ffritz%2f"" target="_blank"&gt;Fritz
Onion&lt;/a&gt; is presenting&amp;nbsp;for Microsoft (so &lt;img alt="A seat in a new 3-hour PHP e-learning clinic and workshop&amp;quot;" src="http://mark.michaelis.net/blog/content/binary/FunnyFreePHPTrainingtoLearnASPNET/MicrosoftWebDevelopmentKit.gif" align="right"&gt;check
them out), I came across a rather humorous offer/give away.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
"A seat in a new 3-hour PHP e-learning clinic and workshop"
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
I suspect they intended this to feature a 3-hour ASP.NET class for PHP developers
but that certainly isn't what it comes across as.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=ec1fd35c-5c08-4822-9352-22820475ca4c" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>Using Yahoo Pipes for English MSDN Blog Feed</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/UsingYahooPipesForEnglishMSDNBlogFeed.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=be587f4a-34e8-4232-8560-39f0b6aacf26</id>
    <published>2007-02-10T14:14:57.9375-08:00</published>
    <updated>2007-02-13T04:56:18.921875-08:00</updated>
    <category term="Computer Related" label="Computer Related" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related" />
    <category term="Computer Related/.Net" label="Computer Related/.Net" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7c.Net" />
    <category term="Computer Related/Blogging" label="Computer Related/Blogging" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7cBlogging" />
    <category term="Computer Related/Miscellaneous" label="Computer Related/Miscellaneous" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7cMiscellaneous" />
    <content type="html">&lt;p&gt;
Wow..... imagine a feeds designer that allows you to take input from multiple locations,
run it through a designer, and output a new feed.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Consider for example the MSDN RSS Feed.&amp;nbsp; If you subscribe to this feed and read
the posts then, 1)&amp;nbsp; You have too much time on your hands, and 2) You will find
that this single feed uses many languages.
&lt;/p&gt;
&lt;p&gt;
What is to be done.&amp;nbsp; In the past if I did happen to read the feed I would just
have to skip posts that were in a language I didn't understand or use some type of
filter in my blog reader so that I never even saw them.&amp;nbsp; It so happens&amp;nbsp;that
the current blog reader I use (&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=be587f4a-34e8-4232-8560-39f0b6aacf26&amp;amp;url=http%3a%2f%2freader.google.com"&gt;http://reader.google.com&lt;/a&gt;)&amp;nbsp;doesn't
support any filter mechanism.&amp;nbsp; Instead, I decided to create a new feed using &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=be587f4a-34e8-4232-8560-39f0b6aacf26&amp;amp;url=http%3a%2f%2fpipes.yahoo.com%2f"" target="_blank"&gt;Yahoo
Pipes&lt;/a&gt;.&amp;nbsp; What's more, I can publish this feed so that others can take advantage
of it.&amp;nbsp; There is not better way to understand Yahoo Pipes besides trying it I
expect, but Tim O'Reilly, &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=be587f4a-34e8-4232-8560-39f0b6aacf26&amp;amp;url=http%3a%2f%2fradar.oreilly.com%2farchives%2f2007%2f02%2fpipes_and_filte.html"" target="_blank"&gt;a
pretty good description&lt;/a&gt;.&amp;nbsp; Essentially, you can&amp;nbsp;take a data source (RSS
for example), and run it through a series of operators, perhaps combine it with other
feeds, and create a new feed.&amp;nbsp; The Yahoo Pipes name comes from the command line
pipe operator that allows one to pass output from one command to the next.&amp;nbsp; It
is really amazing what they were able to accomplish in the designer considering I
didn't encounter any security dialogs when running it.
&lt;/p&gt;
&lt;p&gt;
My first test was to create an MSDN Blog feed that was entirely English.&amp;nbsp; Currently
the feed simply filters out languages other than English.&amp;nbsp; However, it seems
relatively simply to add the capacity to&amp;nbsp;automatically translate those in other
languages.&amp;nbsp; &amp;nbsp;&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=be587f4a-34e8-4232-8560-39f0b6aacf26&amp;amp;url=http%3a%2f%2fpipes.yahoo.com%2f"" target="_blank"&gt;Yahoo
Pipes&lt;/a&gt;&amp;nbsp;includes a BabelFish operator that can translate a feed from one language
to another.&amp;nbsp; I confess I haven't done this yet (I haven't identified the languages
for some posts).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=be587f4a-34e8-4232-8560-39f0b6aacf26&amp;amp;url=http%3a%2f%2fwww.shahine.com%2fomar"" target="_blank"&gt;Omar
Shahine&lt;/a&gt;&amp;nbsp;points out &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=be587f4a-34e8-4232-8560-39f0b6aacf26&amp;amp;url=http%3a%2f%2fwww.shahine.com%2fomar%2fHowToCustomizeTheLifeHackerFeed.aspx"" target="_blank"&gt;another
opportunity for customization of feeds&lt;/a&gt;.&amp;nbsp; In his post he praises how certain
tags can be removed from &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=be587f4a-34e8-4232-8560-39f0b6aacf26&amp;amp;url=http%3a%2f%2fwww.lifehacker.com%2f"&gt;LifeHacker&lt;/a&gt;.&amp;nbsp;
Yahoo Pipes could of course do the same thing for any feed and it provides a much
higher customization capability - one not necessarily&amp;nbsp;based on tags for example.&amp;nbsp;
With Yahoo Pipes Omar could have shared his feed of LifeHacker so others who had similar
filters could use it directly or even customize it further (either via coping it or
having it as the feed to a new pipe).
&lt;/p&gt;
&lt;p&gt;
Anyway, this is a pretty cool app that demonstrates SOA, mashing, and the like, in
a whole new way.&amp;nbsp; Wowzers!!
&lt;/p&gt;
&lt;p&gt;
&lt;strike&gt;For those interested in the resulting MSDN Blogs in English feed, the RSS
URL is: http://pipes.yahoo.com/pipes/DtICXmC42xGAi_AREpPZnA/run?_render=rss&lt;/strike&gt;
&lt;/p&gt;
&lt;p&gt;
Give it a try... feedback is welcome.&amp;nbsp; I will continue to remove or translate
posts as I encounter them coming through.
&lt;/p&gt;
&lt;p&gt;
[UPDATE] 2/13/2006
&lt;/p&gt;
&lt;p&gt;
It really is amazing what they have done in Java Script but the&amp;nbsp;site still has
some growing up to do.&amp;nbsp; Each time I re-load my filter I have to reset the fields
because they are not loading correctly.&amp;nbsp; I have crossed out the URL so as to
not have any (further) expectations that this will work.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=be587f4a-34e8-4232-8560-39f0b6aacf26" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>The Internals of foreach</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/TheInternalsOfForeach.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=15134e07-2290-43b6-9083-40979d15a397</id>
    <published>2007-02-02T01:03:21.578125-08:00</published>
    <updated>2007-02-02T01:06:23.46875-08:00</updated>
    <category term="Computer Related" label="Computer Related" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related" />
    <category term="Computer Related/.Net" label="Computer Related/.Net" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7c.Net" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Many moons ago I discussed the <a href="http://mark.michaelis.net/Blog/ct.ashx?id=15134e07-2290-43b6-9083-40979d15a397&amp;url=http%3a%2f%2fmark.michaelis.net%2fBlog%2fCForeachWithArrays.aspx">foreach
loop</a>.  I expand on that post here as I continue my series for the <a href="http://mark.michaelis.net/Blog/ct.ashx?id=15134e07-2290-43b6-9083-40979d15a397&amp;url=http%3a%2f%2fmark.michaelis.net%2fBlog%2fct.ashx%3fid%3d1af5d51a-d313-4f0b-afd0-0f2dd71e8900%26url%3dhttp%253a%252f%252fmsdn.microsoft.com%252fvcsharp">MSDN
C# Developer Center</a>. 
</p>
        <p>
The advantage of a foreach loop over a for loop is the fact that it is unnecessary
to know the number of items within the collection when an iteration starts. This avoids
iterating off the end of the collection using an index that is not available. As Bill
Wagner pointed out in his <a href="http://mark.michaelis.net/Blog/ct.ashx?id=15134e07-2290-43b6-9083-40979d15a397&amp;url=http%3a%2f%2fmsdn2.microsoft.com%2fen-us%2fvcsharp%2fbb264519.aspx">Custom
Iterators</a> article last week, a foreach loop also allows code to iterate over a
collection without first loading the collection in entirety into memory. In this article
I am going to explore how the foreach statement works under the covers. This sets
the stage for a follow on discussion of how the yield statement works. 
</p>
        <h3>
          <strong>
            <font face="Courier New">foreach</font> with Arrays</strong>
        </h3>
        <p>
Consider the foreach code listing shown in Listing 1: 
</p>
        <p>
Listing 1: <font face="Courier New">foreach</font> with Arrays<a></a></p>
        <blockquote>
          <p>
            <font face="Courier New">
              <font color="#0000ff">int</font>[] array = <font color="#0000ff">new
int</font>[]{1, 2, 3, 4, 5, 6};<br /></font>
            <font face="Courier New">
              <font color="#0000ff">foreach</font>(<font color="#0000ff">int</font> item <font color="#0000a0">in</font> array)<br /></font>
            <font face="Courier New">{<br />
     Console.WriteLine(item);<br />
}</font>
          </p>
        </blockquote>
        <p>
From this code, the C# compiler creates CIL equivalent of a for loop like this (Listing
2): 
</p>
        <p>
          <a>
          </a>Listing 2: Compiled Implementation of foreach with Arrays 
</p>
        <blockquote>
          <p>
            <font face="Courier New">
              <font face="Courier New" color="#0000ff">int</font>[] tempArray;<br /><font face="Courier New" color="#0000ff">int</font>[] array = <font color="#0000ff">new
int</font>[]{1, 2, 3, 4, 5, 6};<br />
tempArray = array;<br /><font color="#0000ff">for</font> (<font face="Courier New" color="#0000ff">int</font> counter=0;
(counter &lt; tempArray.Length); counter++)<br />
{<br />
     <font color="#0000ff">readonly int</font> item = tempArray[counter];<br />
     Console.WriteLine(item);<br />
}</font>
          </p>
        </blockquote>
        <p>
Since the collection is an array and indexing the array is fast, the foreach loop
implementation relies on support for the Length property and the index operator ([]).
However, these two array features are not available on all collections. Many collections
do not have a known number of elements and many collection classes do not support
retrieving elements by index. 
</p>
        <h3>
          <strong>
            <font face="Courier New">foreach</font> with <font face="Courier New">IEnumerable&lt;T&gt;</font></strong>
        </h3>
        <p>
To address this, the foreach loop uses the <font face="Courier New">System.Collections.Generic.IEnumerator&lt;T&gt;</font>.
(Given C# 2.0’s generics support, there is very little reason to consider using the
non-generic equivalent collections so I will ignore them from this discussion except
to say their behavior is almost identical.) <font face="Courier New">IEnumerator&lt;T&gt;</font> is
designed to enable the iterator pattern for iterating over collections of elements,
rather than the length-index pattern shown in earlier. <font face="Courier New">IEnumerator&lt;T&gt;</font> includes
three members. The first is bool <font face="Courier New">MoveNext()</font>. Using
this method, we can move from one element within the collection to the next while
at the same time detecting when we have enumerated through every item using the Boolean
return. The second member, a read-only property called Current, returns the element
currently in process. With these two members on the collection class, it is possible
to iterate over the collection simply using a while loop as demonstrated in the code
listing below (Listing 3): 
</p>
        <p>
Listing 3: Iterating over a collection using <font face="Courier New">while</font></p>
        <blockquote>
          <p>
            <font face="Courier New">System.Collections.Generic.Stack&lt;<font color="#0000ff">int</font>&gt;
stack =<br />
     </font>
            <font face="Courier New">
              <font color="#0000ff">new</font> System.Collections.Generic.Stack&lt;<font color="#0000ff">int</font>&gt;();<br /></font>
            <font face="Courier New">
              <font color="#0000ff">int</font> number;<br /></font>
            <font face="Courier New">// ...<br /></font>
            <font face="Courier New">// This code is conceptual, not that the actual code.<br /></font>
            <font face="Courier New">
              <font color="#0000ff">while</font>(stack.MoveNext())<br /></font>
            <font face="Courier New">{<br /></font>
            <font face="Courier New">     number = stack.Current;<br /></font>
            <font face="Courier New">     Console.WriteLine(number);<br /></font>
            <font face="Courier New">}</font>
          </p>
        </blockquote>
        <p>
The <font face="Courier New">MoveNext()</font> method in this listing returns false
when it moves past the end of the collection. This replaces the need to count elements
while looping. (The last member on <font face="Courier New">IEnumerator&lt;T&gt;</font>, <font face="Courier New">Reset()</font>,
will reset the enumeration.) This while listing shows the gist of the C# compiler
output, but it doesn’t actually work this way because it omits two important details
about the actual implementation: interleaving and error handling. 
</p>
        <h3>
          <strong>Interleaving</strong>
        </h3>
        <p>
The problem with is that if there are two (or more) interleaving loops over the same
collection, one foreach inside another, then the collection must maintain a state
indicator of the current element so that when <font face="Courier New">MoveNext()</font> is
called, the next element can be determined. The problem is that one interleaving loop
can affect the other. (The same is true of loops executed by multiple threads.) 
</p>
        <p>
          <img height="319" alt="C:\Dev\Projects\Books\EssentialC#\12-08.IEnumeratorAndIEnumeratorInterfaces.png" src="http://mark.michaelis.net/blog/Content/binary/TheInternalsofforeach_D7D/clip_image0022.gif" width="485" border="0" />
        </p>
        <p>
          <a>
          </a>Figure 1: <font face="Courier New">IEnumerable</font> class diagram 
</p>
        <p>
To overcome this problem, the <font face="Courier New">IEnumerator&lt;T&gt;</font> interfaces
are not supported by the collection classes directly. As shown in Figure 1, there
is a second interface called <font face="Courier New">IEnumerable&lt;T&gt;</font> whose
only method is <font face="Courier New">GetEnumerator()</font>. The purpose of this
method is to return an object that supports <font face="Courier New">IEnumerator&lt;T&gt;</font>.
Rather than the collection class maintaining the state itself, a different class,
usually a nested class so that it has access to the internals of the collection, will
support the <font face="Courier New">IEnumerator&lt;T&gt;</font> interface and keep
the state of the iteration loop. Using this pattern, the C# equivalent of a foreach
loop will look like what's shown in Listing 4. 
</p>
        <p>
          <a>
          </a>Listing 4: A separate enumerator maintains state during an iteration 
</p>
        <blockquote>
          <p>
            <font face="Courier New">System.Collections.Generic.Stack&lt;int&gt; stack =<br />
     </font>
            <font face="Courier New">new System.Collections.Generic.Stack&lt;int&gt;();<br /></font>
            <font face="Courier New">int number;<br /></font>
            <font face="Courier New">System.Collections.Generic.Stack&lt;int&gt;.IEnumerator&lt;int&gt; </font>
            <font face="Courier New">enumerator;<br /></font>
            <font face="Courier New">
              <br />
// ...<br /></font>
            <font face="Courier New">// If IEnumerable&lt;T&gt; is implemented explicitly, 
<br /></font>
            <font face="Courier New">// then a cast is required.<br /></font>
            <font face="Courier New">// ((IEnumerable)stack).GetEnumeraor();<br /></font>
            <font face="Courier New">enumerator = stack.GetEnumerator();<br /></font>
            <font face="Courier New">while (enumerator.MoveNext())<br /></font>
            <font face="Courier New">{<br /></font>
            <font face="Courier New">     number = enumerator.Current;<br /></font>
            <font face="Courier New">     Console.WriteLine(number);<br /></font>
            <font face="Courier New">}</font>
          </p>
        </blockquote>
        <h3>
          <strong>Error Handling</strong>
        </h3>
        <p>
Since the classes that implement the <font face="Courier New">IEnumerator&lt;T&gt;</font> interface
maintain the state, there are occasions when the state needs cleaning up after all
iterations have completed. To achieve this, the <font face="Courier New">IEnumerator&lt;T&gt;</font> interface
derives from <font face="Courier New">IDisposable</font>. Enumerators that implement <font face="Courier New">IEnumerator</font> do
not necessarily implement <font face="Courier New">IDisposable</font>, but if they
do, <font face="Courier New">Dispose()</font> will be called as well. This enables
the calling of <font face="Courier New">Dispose()</font> after the foreach loop exits.
The C# equivalent of the final CIL code, therefore, looks like Listing 5. 
</p>
        <p>
          <a>
          </a>Listing 5: Compiled Result of foreach on Collections 
</p>
        <blockquote>
          <p>
            <font face="Courier New">System.Collections.Generic.Stack&lt;int&gt; stack =<br />
     </font>
            <font face="Courier New">new System.Collections.Generic.Stack&lt;int&gt;();<br /></font>
            <font face="Courier New">int number;<br /></font>
            <font face="Courier New">System.Collections.Generic.Stack&lt;int&gt;.Enumerator&lt;int&gt; </font>
            <font face="Courier New">enumerator;<br /></font>
            <font face="Courier New">IDisposable disposable;<br /></font>
            <font face="Courier New">enumerator = stack.GetEnumerator();<br /><br /></font>
            <font face="Courier New">try<br /></font>
            <font face="Courier New">{<br /></font>
            <font face="Courier New">     while (enumerator.MoveNext())<br /></font>
            <font face="Courier New">     {<br /></font>
            <font face="Courier New">         
number = enumerator.Current;<br /></font>
            <font face="Courier New">         
Console.WriteLine(number);<br /></font>
            <font face="Courier New">     }<br /></font>
            <font face="Courier New">}<br /></font>
            <font face="Courier New">finally<br /></font>
            <font face="Courier New">{<br /></font>
            <font face="Courier New">     // Explicit cast used for
IEnumerator&lt;T&gt;.<br /></font>
            <font face="Courier New">     disposable = (IDisposable)
enumerator;<br /></font>
            <font face="Courier New">     disposable.Dispose();<br /></font>
            <font face="Courier New">
              <br />
     // IEnumerator will use the as operator unless IDisposable<br /></font>
            <font face="Courier New">     // support determinable at
compile time.<br /></font>
            <font face="Courier New">     // disposable = (enumerator
as IDisposable);<br /></font>
            <font face="Courier New">     // if (disposable != null)<br />
     </font>
            <font face="Courier New">// {<br /></font>
            <font face="Courier New">     // disposable.Dispose();<br /></font>
            <font face="Courier New">     // }<br /></font>
            <font face="Courier New">}</font>
          </p>
        </blockquote>
        <p>
Notice that because the <font face="Courier New">IDisposable</font> interface is supported
by <font face="Courier New">IEnumerator&lt;T&gt;</font>, the C# code can be simplified
with the using keyword as shown in Listing 6. 
</p>
        <p>
          <a>
          </a>Listing 6: Error handling and resource cleanup with using 
</p>
        <blockquote>
          <p>
            <font face="Courier New">System.Collections.Generic.Stack&lt;int&gt; stack =<br />
     </font>
            <font face="Courier New">new System.Collections.Generic.Stack&lt;int&gt;();<br /></font>
            <font face="Courier New">int number;<br /><br /></font>
            <font face="Courier New">using(<br />
     </font>
            <font face="Courier New">System.Collections.Generic.Stack&lt;int&gt;.Enumerator&lt;int&gt; </font>
            <font face="Courier New">enumerator
= 
<br />
          stack.GetEnumerator())<br /></font>
            <font face="Courier New">{<br />
     </font>
            <font face="Courier New">while (enumerator.MoveNext())<br /></font>
            <font face="Courier New">     {<br /></font>
            <font face="Courier New">         
number = enumerator.Current;<br /></font>
            <font face="Courier New">         
Console.WriteLine(number);<br /></font>
            <font face="Courier New">     }<br /></font>
            <font face="Courier New">}</font>
          </p>
        </blockquote>
        <p>
However, recall that the using keyword is not directly supported by CIL either, so
in reality the former code is a more accurate C# representation of the foreach CIL
code. 
</p>
        <p>
Readers may recall that the compiler prevents assignment of the <font face="Courier New">foreach</font> variable
identifier (<font face="Courier New">number</font>). As is demonstrated in Listing
6, an assignment of number would not be a change to the collection element itself
so rather than mistakenly assume that, the C# compiler prevents such an assignment
altogether. 
</p>
        <p>
In addition, the element count within a collection cannot be modified during the execution
of a <font face="Courier New">foreach</font> loop. If, for example, we called <font face="Courier New">stack.Push(42)</font> inside
the <font face="Courier New">foreach</font> loop, it would be ambiguous whether the
iterator should ignore or incorporate the change to stack – should iterator iterate
over the newly added item or ignore it and assume the exact same state as when it
was instantiated. 
</p>
        <p>
Because of this ambiguity, an exception of type <font face="Courier New">System.InvalidOperationException</font> is
thrown if the collection is modified within a <font face="Courier New">foreach</font> loop,
reporting that the collection was modified after the enumerator was instantiated. 
</p>
        <p>
(This content was largely taken from the Collections chapter of my book, <a href="http://mark.michaelis.net/Blog/ct.ashx?id=15134e07-2290-43b6-9083-40979d15a397&amp;url=http%3a%2f%2fmark.michaelis.net%2fessentialcsharp">Essential
C# 2.0 [Addison-Wesley]</a>)
</p>
        <img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=15134e07-2290-43b6-9083-40979d15a397" />
        <br />
        <hr />
© Copyright 2005-2008 Mark Michaelis
</div>
    </content>
  </entry>
  <entry>
    <title>Exception Handling Changes in C# 2.0</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/ExceptionHandlingChangesInC20.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=1af5d51a-d313-4f0b-afd0-0f2dd71e8900</id>
    <published>2007-01-18T14:48:32.29575-08:00</published>
    <updated>2007-01-18T14:48:32.29575-08:00</updated>
    <content type="html">&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=1af5d51a-d313-4f0b-afd0-0f2dd71e8900&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fcharlie%2f"" target="_blank"&gt;Charlie
Calvert&lt;/a&gt; asked me to write some C# posts for &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=1af5d51a-d313-4f0b-afd0-0f2dd71e8900&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fvcsharp"" target="_blank"&gt;MSDN
C# Developer Center&lt;/a&gt;.&amp;nbsp; This article is the first of a series about the changes
from C# 1.0 to C# 2.0. By this I don’t mean enhancements (generics, partial classes,
etc), but items that would either cause compile errors, create warnings, or change
(presumably improve) behavior. I haven’t seen much of a comprehensive listing of these
changes so I decided to try my hand at coming up with one. In today’s post I am going
to talk about a change in exception handling. 
&lt;p&gt;
Consider the following code listing: &lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;b&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;/b&gt; System;&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;b&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/b&gt; Program&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;{&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/b&gt; &lt;b&gt;void&lt;/b&gt; Main()&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&lt;/font&gt;&lt;b&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;try&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New"&gt;Console.WriteLine(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#800000"&gt;"Hello.
My name is Inigo Montoya."&lt;/font&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New"&gt;}&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;catch&lt;/font&gt;&lt;/b&gt;(Exception
)&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;//
…&lt;br&gt;
&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New"&gt;}&lt;br&gt;
&lt;/font&gt;&lt;b&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;catch&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New"&gt;Console.WriteLine(&lt;font color="#800000"&gt;"UNEXPECTED
EXCEPTION"&lt;/font&gt;);&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
In C# 1.0, this code was perfectly valid. However, in C# 2.0 it results in a warning.
Why is that? 
&lt;p&gt;
An empty catch block (&lt;font face="Courier New"&gt;catch{ … }&lt;/font&gt;), compiles down to
CIL code that is the equivalent of &lt;font face="Courier New"&gt;catch(object ){ … }&lt;/font&gt;.
In other words, an empty catch block in C# is a catch block for any and all types
that are thrown as exceptions. (Interestingly, C# doesn’t allow you to explicitly
code &lt;font face="Courier New"&gt;catch(object ){ … }&lt;/font&gt;. Therefore, there is no means
of catching a non-&lt;font face="Courier New"&gt;System.Exception&lt;/font&gt;-derived exception
and have the exception instance to scrutinize.) 
&lt;p&gt;
It is perhaps surprising that &lt;font face="Courier New"&gt;catch(object ){ … }&lt;/font&gt; is
needed because C# doesn’t allow you to throw an exception that doesn’t derive from
System.Exception. However, the same restriction does not apply to other languages.
C++, for example, can throw an object of any type (whether derived from &lt;font face="Courier New"&gt;System.Exception&lt;/font&gt; or
not). As a result, in C# 1.0, the only way to ensure that all exceptions were caught
was to include an empty catch block. 
&lt;p&gt;
In C# 2.0 the rules improved. Although it is still possible for other languages to
throw exceptions of any type, the CLR will wrap all exceptions that do not derive
from &lt;font face="Courier New"&gt;System.Exception&lt;/font&gt; into a &lt;font face="Courier New"&gt;System.Runtime.CompilerServices.RuntimeWrappedException&lt;/font&gt; object,
which does derive from &lt;font face="Courier New"&gt;System.Exception&lt;/font&gt;. In other
words, all exceptions, whether &lt;font face="Courier New"&gt;System.Exception&lt;/font&gt;-derived
or not when they are thrown, will be caught in C# 2.0 code by a &lt;font face="Courier New"&gt;catch(Exception
){ … }&lt;/font&gt; block. 
&lt;p&gt;
Therefore, if you follow a &lt;font face="Courier New"&gt;catch(Exception ){ … }&lt;/font&gt; block
by an empty exception block (as shown in the initial code listing), the empty exception
block will never execute. All exceptions will be wrapped in the &lt;font face="Courier New"&gt;RuntimeWrappedException&lt;/font&gt; if
they do not derive from System.Exception already and therefore be caught by &lt;font face="Courier New"&gt;catch(Exception
){ … }&lt;/font&gt;. 
&lt;p&gt;
One more thing to note: If you wish your code to behave as it did with C# 1.0 in this
area, you can add the RuntimeCompatibility assembly attribute as in: &lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;[&lt;font color="#0000ff"&gt;assembly&lt;/font&gt;:System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows
= &lt;font color="#0000ff"&gt;false&lt;/font&gt;)]&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This will no longer produce the warning since it will also turn off the new CLR 2.0
behavior in which non-&lt;font face="Courier New"&gt;System.Exception&lt;/font&gt;-derived exceptions
are wrapped with &lt;font face="Courier New"&gt;RuntimeWrappedException&lt;/font&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=1af5d51a-d313-4f0b-afd0-0f2dd71e8900" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>Associating a Work Item to a Changeset After Checking in</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/AssociatingAWorkItemToAChangesetAfterCheckingIn.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=acd8e54e-6c15-464b-a1bf-f349a2188e13</id>
    <published>2006-12-07T08:56:31.549375-08:00</published>
    <updated>2006-12-07T08:56:31.549375-08:00</updated>
    <category term="Computer Related" label="Computer Related" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related" />
    <category term="Computer Releated/.Net" label="Computer Releated/.Net" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Releated%7c.Net" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today I received an email asking how to associate a work item with a changeset after
all the code was checked in (without performing the association.)
</p>
        <p>
It turns out the solution is relatively simple.  On the <strong>Links</strong> tab
of the work item select <strong>Add</strong>.  By default, this shows the <strong>Link
Type</strong> is set to <strong>Work Item</strong>.  However, you can change
the type to <strong>Changeset</strong> and then browse for the changeset(s) you wish
to associate with the code.
</p>
        <p>
          <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="Work Item Add Link" src="http://mark.michaelis.net/blog/Content/binary/AssociatingaWorkItemtoaChangesetAfterChe_7C22/WorkItemAddLink.jpg" border="0" />
        </p>
        <p>
(The browse functionality is a good reason why you always want to include comments
with your check-in.)
</p>
        <img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=acd8e54e-6c15-464b-a1bf-f349a2188e13" />
        <br />
        <hr />
© Copyright 2005-2008 Mark Michaelis
</div>
    </content>
  </entry>
  <entry>
    <title>What Are You Doing Hanna?</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/WhatAreYouDoingHanna.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=8c03545e-f086-46ea-8ab7-108c4c1603e5</id>
    <published>2006-11-27T20:56:00.031-08:00</published>
    <updated>2006-11-27T20:56:23.3125-08:00</updated>
    <category term="Personal" label="Personal" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Personal" />
    <category term="Personal/My Family" label="Personal/My Family" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Personal%7cMy+Family" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Hanna (four) and Abigail (16 months) are upstairs and there has been a rather eerie
slience for too long so I call up and ask, "What are you doing Hanna?"
</p>
        <p>
"Playing"
</p>
        <p>
Not feeling quite satisfied with the answer I ask again, "Playing what?"
</p>
        <p>
"Well..., I'm playing with Abigail and Abigail is playing with me."
</p>
        <p>
Ahh.... That clarifies...  Thanks! Why don't you two carry on.
</p>
        <img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=8c03545e-f086-46ea-8ab7-108c4c1603e5" />
        <br />
        <hr />
© Copyright 2005-2008 Mark Michaelis
</div>
    </content>
  </entry>
  <entry>
    <title>Sam Hog Is Coming To Town</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/SamHogIsComingToTown.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=04ad3b90-efe5-4fec-9657-18b6ac456e7c</id>
    <published>2006-11-27T20:49:42.515-08:00</published>
    <updated>2006-11-27T20:59:15.703125-08:00</updated>
    <category term="Personal" label="Personal" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Personal" />
    <category term="Personal/My Family" label="Personal/My Family" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Personal%7cMy+Family" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
During dance last week my daughter learned the song, "Sam Hog is Coming to Town." 
Confused, we have tried to share with her that, in fact, it is Santa Claus that
is coming... but to no avail.  As she puts it, "I'm the one who was there, it
is my class, so I know.'  Here are the words according to my four year old.
</p>
        <p align="center">
You better watch out 
<br />
You better not cry 
<br />
You better not pout 
<br />
I'm telling you <strong>guys</strong> <br /><strong>Sam Hog</strong> is coming to town 
<br /><strong>Sam Hog</strong> is coming to town 
<br /><strong>Sam Hog</strong> is coming to town
</p>
        <p>
Thanks for educating us Hanna.  :)
</p>
        <img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=04ad3b90-efe5-4fec-9657-18b6ac456e7c" />
        <br />
        <hr />
© Copyright 2005-2008 Mark Michaelis
</div>
    </content>
  </entry>
  <entry>
    <title>Rating Charities</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/RatingCharities.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=844a5c49-5eae-48f4-94d3-27d740fb977b</id>
    <published>2006-11-24T22:47:17.813-08:00</published>
    <updated>2006-12-12T07:09:14.0845-08:00</updated>
    <category term="Miscellaneous" label="Miscellaneous" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Miscellaneous" />
    <category term="Personal" label="Personal" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Personal" />
    <category term="Personal/In Pursuit of God" label="Personal/In Pursuit of God" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Personal%7cIn+Pursuit+of+God" />
    <content type="html">&lt;p&gt;
In and effort to reach my giving goal for the year, I was pleased to come across &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=844a5c49-5eae-48f4-94d3-27d740fb977b&amp;amp;url=http%3a%2f%2fwww.charitynavigator.org"" target="_blank"&gt;Charity
Navigator&lt;/a&gt;, an independent charity evaluator.&amp;nbsp; (Perhaps surprisingly, I came
across this web site via &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=844a5c49-5eae-48f4-94d3-27d740fb977b&amp;amp;url=http%3a%2f%2fwww.pcmag.com%2farticle2%2f0%2c1895%2c2012301%2c00.asp"" target="_blank"&gt;PC
Magazine&lt;/a&gt;.)&amp;nbsp; Charity Navigator seems similar to a Christian specific version, &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=844a5c49-5eae-48f4-94d3-27d740fb977b&amp;amp;url=http%3a%2f%2fwww.ecfa.org%2f"" target="_blank"&gt;ECFA&lt;/a&gt;,
the organization I hear about more frequently in this regard.
&lt;/p&gt;
&lt;p&gt;
One particular organization&amp;nbsp;I&amp;nbsp;like is &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=844a5c49-5eae-48f4-94d3-27d740fb977b&amp;amp;url=http%3a%2f%2fwww.wr.org%2f"" target="_blank"&gt;World
Relief&lt;/a&gt;&amp;nbsp;and&amp;nbsp;Charity Navigator gave it a&amp;nbsp;rating of five stars.&amp;nbsp;The
history ratings for organizations on&amp;nbsp; Charity Navigator were interesting as well.&amp;nbsp;
Two of the organizations to which&amp;nbsp;my wife and I&amp;nbsp;contribute have had five
stars for the past two years but they appear to have dropped significantly this year.&amp;nbsp;
Hmmm....
&lt;/p&gt;
&lt;p&gt;
Perhaps most important to me when&amp;nbsp;wondering about whether the organizations are
good stewards of what we donate, all the organizations that I checked (and we donate)&amp;nbsp;were
given five stars for their efficiency rating.
&lt;/p&gt;
&lt;p&gt;
UPDATE:
&lt;/p&gt;
&lt;p&gt;
Added ECFA and PC Magazine links.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=844a5c49-5eae-48f4-94d3-27d740fb977b" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>Essential C# Chapter on MSDN C# Developer Center</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/EssentialCChapterOnMSDNCDeveloperCenter.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=43aaa715-cdc0-4fe5-96a9-331a33771f56</id>
    <published>2006-10-30T23:48:55.79-07:00</published>
    <updated>2006-11-14T06:29:03.5575-08:00</updated>
    <category term="Computer Related" label="Computer Related" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related" />
    <category term="Computer Related/.Net" label="Computer Related/.Net" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7c.Net" />
    <content type="html">&lt;p&gt;
I just noticed today that Charlie Calvert has posted my&amp;nbsp;&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=43aaa715-cdc0-4fe5-96a9-331a33771f56&amp;amp;url=http%3a%2f%2fmark.michaelis.net%2fessentialcsharp%2fGenerics_ch11.pdf"" target=_blank&gt;Chapter
11 - Generics&lt;/a&gt;&amp;nbsp;of my &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=43aaa715-cdc0-4fe5-96a9-331a33771f56&amp;amp;url=http%3a%2f%2fmark.michaelis.net%2fEssentialCSharp"" target=_blank&gt;Essential
C# (Addison-Wesley)&lt;/a&gt;&amp;nbsp;book to the &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=43aaa715-cdc0-4fe5-96a9-331a33771f56&amp;amp;url=http%3a%2f%2fmsdn2.microsoft.com%2fen-us%2fvcsharp%2fdefault.aspx"" target=_blank&gt;C#
Developer Center&lt;/a&gt;.&amp;nbsp; &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=43aaa715-cdc0-4fe5-96a9-331a33771f56&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fnoahc"&gt;Noah
Coad&lt;/a&gt; pointed out to me that this shows up in on the Start Page of Visual Studio
if you have C# as you language (and SQL Server didn't change the RSS feed).
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;img alt="Chapter 11 announcement within Visual Studio" hspace=0 src="http://mark.michaelis.net/Blog/content/binary/EssentialCChapterOnMSDNCDeveloperCenter/Chapter11WithinVisualStudio.jpg" align=baseline border=0&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Thanks Charlie!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=43aaa715-cdc0-4fe5-96a9-331a33771f56" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
  <entry>
    <title>What's Next for the .NET CLR?</title>
    <link rel="alternate" type="text/html" href="http://mark.michaelis.net/Blog/WhatsNextForTheNETCLR.aspx" />
    <id>http://mark.michaelis.net/Blog/PermaLink.aspx?guid=e9f42908-9515-4312-8e7a-6c1ae2b5f69e</id>
    <published>2006-10-22T21:41:16.462-07:00</published>
    <updated>2006-10-23T12:11:08.712375-07:00</updated>
    <category term="Computer Related" label="Computer Related" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related" />
    <category term="Computer Related/.Net" label="Computer Related/.Net" scheme="http://mark.michaelis.net/Blog/CategoryView.aspx?category=Computer+Related%7c.Net" />
    <content type="html">&lt;p&gt;
&lt;strong&gt;2000&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Microsoft releases beta versions of the .NET Framework.&amp;nbsp; At that time the .NET
Framework and the CLR&amp;nbsp;were the core, the foundation of .NET.&amp;nbsp;&amp;nbsp;The CLR
was&amp;nbsp;modernizing/popularizing/mainstreaming&amp;nbsp;compile-on-demand, runtime hosted
programming.&amp;nbsp; (Sure, Java was doing&amp;nbsp;it, but .NET ushered in a change such
that&amp;nbsp;programming languages were to predominantly consist of languages&amp;nbsp;compiled
to IL and hosted in a runtime.)&amp;nbsp; The Microsoft development division leaders were
those building the framework.&amp;nbsp; (Okay, C# was cool to but not really a revolution...
just the perfect language to match the Framework.&amp;nbsp; What made C# spectacular was
it's meticulous development and painstaking pursuit of OOP perfection.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;2003&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fmark.michaelis.net%2fessentialcsharp%2fGenerics_ch11.pdf"" target=_blank&gt;Generics&lt;/a&gt; are
added to early betas of&amp;nbsp;the .NET Framework.&amp;nbsp; Revolutionary... no... just
an obvious next step that folks begged for at the language level but Microsoft wisely
postponed so that it could be in the Framework.&amp;nbsp; Was there anything revolutionary
at the time for the .NET CLR.... not particularly.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;2006&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Okay, so what is on the horizon in the .NET CLR?&amp;nbsp; I would say &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fnetframework%2ffuture%2flinq"" target=_blank&gt;LINQ&lt;/a&gt; but
unlike generics, this is a language implemented feature, not some fundamental change
in the CLR.&amp;nbsp; Well, Microsoft is obviously&amp;nbsp;very pregnant with WCF/WF/WPF
- known as .NET 3.0.&amp;nbsp; But this didn't emerge from the CLR team and there wasn't
any fundamental CLR change needed to support .NET 3.0 development.&amp;nbsp; &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fresearch.microsoft.com%2fphoenix%2f"" target=_blank&gt;Phoenix&lt;/a&gt; is
cool too but not anything that is garnering wide spread adoption.
&lt;/p&gt;
&lt;p&gt;
So... what's next for the CLR?&amp;nbsp; As I see it there are three main possibilities:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Move to maintenance only mode.&amp;nbsp; Heck, lets focus higher up the stack, we have
solved this level in the same way that we "solved" assembler - making it unnecessary
detail for the vast majority of developers. 
&lt;li&gt;
Aspect Oriented Programming:&amp;nbsp; The idea has fallen out of vogue but there is still
an untapped vision here. 
&lt;li&gt;
.NET scripting/dynamic language&amp;nbsp;support&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Well, Microsoft's recent hire of&amp;nbsp;&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fwww.iunknown.com%2f"" target=_blank&gt;John
Lam&lt;/a&gt; seems to&amp;nbsp;be pretty indicative of where they are investing.&amp;nbsp;And I
am excited.&amp;nbsp; If the&amp;nbsp;&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fmark.michaelis.net%2fBlog%2fMSHMonadTheGoodTheBadAndTheUgly.aspx"" target=_blank&gt;pain&lt;/a&gt; I
have &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fmark.michaelis.net%2fBlog%2fMyFirstMSHScript.aspx"" target=_blank&gt;endured&lt;/a&gt; to
learn &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fwindowsserver2003%2ftechnologies%2fmanagement%2fpowershell%2fdefault.mspx"" target=_blank&gt;PowerShell&lt;/a&gt; is
any indication, Microsoft has lots of work to do in this area.&amp;nbsp; Sure, I love
PowerShell but only because it has a .NET object pipe and that it exposes .NET objects
on the command line.&amp;nbsp; After that... Yuck!&amp;nbsp; Anyway, imagine a world in which
the &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fresearch.microsoft.com%2f%257Eemeijer%2fPapers%2fRDL04Meijer.pdf"" target=_blank&gt;CLR
changes to truly embrace and conquer the dichotomy between strongly typed languages
and scripting languages&lt;/a&gt;.&amp;nbsp; Imagine scripting languages that supported intellisense.&amp;nbsp;
Imagine writing C# code on the command line and not having to go through the bother
of compilation to an executable.
&lt;/p&gt;
&lt;p&gt;
Well.... is that where Microsoft is going for sure?&amp;nbsp; I can't say unfortunately,
but I do know that the CLR team has been wrestling with it and the dabbling with &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fsearch.msdn.microsoft.com%2fsearch%2fRedirect.aspx%3ftitle%3dMSDN%2bTV%253a%2bIronPython%253a%2bPython%2bon%2bthe%2b.NET%2bFramework%26url%3dhttp%3a%2f%2fmsdn.microsoft.com%2fmsdntv%2fepisode.aspx%3fxml%3depisodes%2fen%2f20051110PythonJH%2fmanifest.xml"" target=_blank&gt;Python&lt;/a&gt;,
...,&amp;nbsp;&lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fresearch.microsoft.com%2f%7eemeijer%2fPapers%2fMondrianDDJ.pdf"" target=_blank&gt;etc&lt;/a&gt;&amp;nbsp;means
they clearly looking at it today&amp;nbsp;and have been for some time now.&amp;nbsp; I look
forward to seeing what will emerge.&amp;nbsp; I hope there is enough time to still see
it in Orcas?
&lt;/p&gt;
&lt;p&gt;
P.S.&amp;nbsp; In hiring &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fwww.iunknown.com%2f"" target=_blank&gt;John
Lam&lt;/a&gt;, Microsoft has&amp;nbsp;made another &lt;em&gt;surprising&lt;/em&gt; hiring move.&amp;nbsp; Not
because it was a bad move - certainly not!&amp;nbsp; Rather, it is surprising because
John Lam was willing to be hired by Microsoft.&amp;nbsp; Again, not because&amp;nbsp;he should
have any unwillingness to working for Microsoft - certainly&amp;nbsp;not!&amp;nbsp; Rather,
it is surprising because&amp;nbsp;top industry experts have&amp;nbsp;already been courted&amp;nbsp;unsuccessfully
by Microsoft multiple times in the past(meaning each expert multiple times).&amp;nbsp;
What makes this time different?&amp;nbsp; I don't know in this particular case besides &lt;a href="http://mark.michaelis.net/Blog/ct.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e&amp;amp;url=http%3a%2f%2fwww.iunknown.com%2farticles%2f2006%2f10%2f20%2fdynamic-languages-microsoft-and-me"" target=_blank&gt;what
John states in his blog&lt;/a&gt;, but I do know that Microsoft does not just make one attempt
to hire these types of people and then quit.&amp;nbsp; Generally,&amp;nbsp;expert hires like
this&amp;nbsp;only come about by long term relationships - some times taking years.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://mark.michaelis.net/Blog/aggbug.ashx?id=e9f42908-9515-4312-8e7a-6c1ae2b5f69e" /&gt;
&lt;br /&gt;
&lt;hr /&gt;© Copyright 2005-2008 Mark Michaelis</content>
  </entry>
</feed>