<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Where did the time go?</title>
    <link>http://blog.j-maxx.net/</link>
    <description>Brain Powered</description>
    <language>en-us</language>
    <copyright>Jeff Klawiter</copyright>
    <lastBuildDate>Wed, 17 Dec 2008 17:05:58 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8102.813</generator>
    <managingEditor>Jeff.Klawiter@sierra-bravo.com</managingEditor>
    <webMaster>Jeff.Klawiter@sierra-bravo.com</webMaster>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=e9d4a219-7479-42aa-9cf0-5989be6e34eb</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,e9d4a219-7479-42aa-9cf0-5989be6e34eb.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,e9d4a219-7479-42aa-9cf0-5989be6e34eb.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e9d4a219-7479-42aa-9cf0-5989be6e34eb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">For those of you still playing with the
VS2010 and .NET 4.0 CTP bits, be aware that it will stop working on Jan 1st. MS has
not released any word if we will be getting an updated CTP or a beta anytime soon.
This is a bit unlike them where they had a bit of overlap between a VS CTP and the
beta. 
<br /><br />
There are some ways around this. I found a nice post that covers some of the options
and links to the information<br />
http://blogs.msdn.com/granth/archive/2008/12/10/visual-studio-2010-ctp-vpc-will-expire-jan-1-2009.aspx<br /><br />
Basically you need to disable time syncronization for the VPC image. 
<br /><br />
I was worried about this since the get go. I wanted to do some talks coming up on
.NET 4.0 and the new parallelism features but it's very hard to do that when you're
not sure if you'll even have a working copy to demonstrate on.<br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=e9d4a219-7479-42aa-9cf0-5989be6e34eb" /></body>
      <title>VS2010 CTP Expiring Jan 1st</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,e9d4a219-7479-42aa-9cf0-5989be6e34eb.aspx</guid>
      <link>http://blog.j-maxx.net/2008/12/17/VS2010CTPExpiringJan1st.aspx</link>
      <pubDate>Wed, 17 Dec 2008 17:05:58 GMT</pubDate>
      <description>For those of you still playing with the VS2010 and .NET 4.0 CTP bits, be aware that it will stop working on Jan 1st. MS has not released any word if we will be getting an updated CTP or a beta anytime soon. This is a bit unlike them where they had a bit of overlap between a VS CTP and the beta. &lt;br&gt;
&lt;br&gt;
There are some ways around this. I found a nice post that covers some of the options
and links to the information&lt;br&gt;
http://blogs.msdn.com/granth/archive/2008/12/10/visual-studio-2010-ctp-vpc-will-expire-jan-1-2009.aspx&lt;br&gt;
&lt;br&gt;
Basically you need to disable time syncronization for the VPC image. 
&lt;br&gt;
&lt;br&gt;
I was worried about this since the get go. I wanted to do some talks coming up on
.NET 4.0 and the new parallelism features but it's very hard to do that when you're
not sure if you'll even have a working copy to demonstrate on.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=e9d4a219-7479-42aa-9cf0-5989be6e34eb" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,e9d4a219-7479-42aa-9cf0-5989be6e34eb.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=8058005e-d353-4c93-a3dd-c8d667156d91</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,8058005e-d353-4c93-a3dd-c8d667156d91.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,8058005e-d353-4c93-a3dd-c8d667156d91.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=8058005e-d353-4c93-a3dd-c8d667156d91</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Well I took my MCPD: ASP.NET 2.0 test yesterday
and passed. It has been just over a year since I took my .NET 2.0 Foundation test.
In that time I've taken MCTS for windows and web and now MCPD. There are many more
certs to go. Next stop I think are the new .NET 3.5 TS certs.<br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=8058005e-d353-4c93-a3dd-c8d667156d91" /></body>
      <title>MCPD: Web</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,8058005e-d353-4c93-a3dd-c8d667156d91.aspx</guid>
      <link>http://blog.j-maxx.net/2008/12/09/MCPDWeb.aspx</link>
      <pubDate>Tue, 09 Dec 2008 15:25:58 GMT</pubDate>
      <description>Well I took my MCPD: ASP.NET 2.0 test yesterday and passed. It has been just over a year since I took my .NET 2.0 Foundation test. In that time I've taken MCTS for windows and web and now MCPD. There are many more certs to go. Next stop I think are the new .NET 3.5 TS certs.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=8058005e-d353-4c93-a3dd-c8d667156d91" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,8058005e-d353-4c93-a3dd-c8d667156d91.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=545b9748-44b6-4b6b-8b4c-dbdd5a95a30d</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,545b9748-44b6-4b6b-8b4c-dbdd5a95a30d.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,545b9748-44b6-4b6b-8b4c-dbdd5a95a30d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=545b9748-44b6-4b6b-8b4c-dbdd5a95a30d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">I'm definitely installing this one when
I get a chance. <a href="http://channel9.msdn.com/posts/briankel/PDC2008-ShowOff-Entry-Clipboard-History-for-Visual-Studio/">http://channel9.msdn.com/posts/briankel/PDC2008-ShowOff-Entry-Clipboard-History-for-Visual-Studio/<br /></a><br />
Basically it keeps a history of your clipboard items like Office but with one killer
twist. "Paste as {Language}". It will take the C# you copied and Paste it as VB. I'm
sure it's not 100% but still helps quite a bit.<br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=545b9748-44b6-4b6b-8b4c-dbdd5a95a30d" /></body>
      <title>PDC Showoff: DevXpress VS2008 Clipboard History</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,545b9748-44b6-4b6b-8b4c-dbdd5a95a30d.aspx</guid>
      <link>http://blog.j-maxx.net/2008/10/28/PDCShowoffDevXpressVS2008ClipboardHistory.aspx</link>
      <pubDate>Tue, 28 Oct 2008 17:29:58 GMT</pubDate>
      <description>I'm definitely installing this one when I get a chance. &lt;a href="http://channel9.msdn.com/posts/briankel/PDC2008-ShowOff-Entry-Clipboard-History-for-Visual-Studio/"&gt;http://channel9.msdn.com/posts/briankel/PDC2008-ShowOff-Entry-Clipboard-History-for-Visual-Studio/&lt;br&gt;
&lt;/a&gt;
&lt;br&gt;
Basically it keeps a history of your clipboard items like Office but with one killer
twist. "Paste as {Language}". It will take the C# you copied and Paste it as VB. I'm
sure it's not 100% but still helps quite a bit.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=545b9748-44b6-4b6b-8b4c-dbdd5a95a30d" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,545b9748-44b6-4b6b-8b4c-dbdd5a95a30d.aspx</comments>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=0e8abe73-81d5-4db4-9115-2f8d2356f043</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,0e8abe73-81d5-4db4-9115-2f8d2356f043.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,0e8abe73-81d5-4db4-9115-2f8d2356f043.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0e8abe73-81d5-4db4-9115-2f8d2356f043</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">All of these new C# 4.0 dynamic features
require parts of the DLR. Thus it looks like MS is taking the DLR and making it a
first class citizen in the CLR. This also I'm guessing will make IronPython and IronRuby
first class citizens as well. A huge win for the dynamic languages community. For
C# 4.0 it is bittersweet. It means better interoperability when calling things created
in IronRuby or IronPython but there are limitations. Below is an excerpt from the
C# 4.0 WhitePaper (available here <a href="http://code.msdn.microsoft.com/csharpfuture">http://code.msdn.microsoft.com/csharpfuture</a>)<br /><fieldset><style><!--
 /* Font Definitions */
 @font-face
	{font-family:Wingdings;
	panose-1:5 0 0 0 0 0 0 0 0 0;
	mso-font-charset:2;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Cambria;
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073741899 0 0 159 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:modern;
	mso-font-pitch:fixed;
	mso-font-signature:-1610611985 1073750091 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
h2
	{mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 2 Char";
	mso-style-next:Normal;
	margin-top:10.0pt;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan lines-together;
	page-break-after:avoid;
	mso-outline-level:2;
	font-size:13.0pt;
	font-family:"Cambria","serif";
	mso-ascii-font-family:Cambria;
	mso-ascii-theme-font:major-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:major-fareast;
	mso-hansi-font-family:Cambria;
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:major-bidi;
	color:#4F81BD;
	mso-themecolor:accent1;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
span.Heading2Char
	{mso-style-name:"Heading 2 Char";
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 2";
	mso-ansi-font-size:13.0pt;
	mso-bidi-font-size:13.0pt;
	font-family:"Cambria","serif";
	mso-ascii-font-family:Cambria;
	mso-ascii-theme-font:major-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:major-fareast;
	mso-hansi-font-family:Cambria;
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:major-bidi;
	color:#4F81BD;
	mso-themecolor:accent1;
	font-weight:bold;}
p.Code, li.Code, div.Code
	{mso-style-name:Code;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.2in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:Consolas;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
span.Codefragment
	{mso-style-name:"Code fragment";
	mso-style-priority:1;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-ansi-font-size:10.0pt;
	font-family:Consolas;
	mso-ascii-font-family:Consolas;
	mso-hansi-font-family:Consolas;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
 /* List Definitions */
 @list l0
	{mso-list-id:49888064;
	mso-list-type:hybrid;
	mso-list-template-ids:-372898770 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
	{mso-level-number-format:bullet;
	mso-level-text:;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;
	font-family:Symbol;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
--></style><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}
</style>
<![endif]--><h2>Open issues
</h2><p class="MsoNormal">
There are a few limitations and things that might work differently than you would
expect.
</p><p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol;"><span style="">·<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span></span><!--[endif]-->The DLR allows objects to be created from objects that represent classes.
However, the current implementation of C# doesn’t have syntax to support this.
</p><p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol;"><span style="">·<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span></span><!--[endif]-->Dynamic lookup will not be able to find extension methods. Whether extension
methods apply or not depends on the static context of the call (i.e. which using clauses
occur), and this context information is not currently kept as part of the payload.
</p><p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol;"><span style="">·<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span></span><!--[endif]-->Anonymous functions (i.e. lambda expressions) cannot appear as arguments
to a dynamic method call. The compiler cannot bind (i.e. “understand”) an anonymous
function without knowing what type it is converted to.
</p><p class="MsoNormal">
One consequence of these limitations is that you cannot easily use LINQ queries over
dynamic objects:
</p><p class="Code">
dynamic collection = …;
</p><p class="Code">
var result = collection.Select(e =&gt; e + 5);
</p><p class="MsoNormal">
If the <span class="Codefragment"><span style="font-size: 10pt; line-height: 115%;">Select</span></span> method
is an extension method, dynamic lookup will not find it. Even if it is an instance
method, the above does not compile, because a lambda expression cannot be passed as
an argument to a dynamic operation.
</p><p class="MsoNormal">
There are no plans to address these limitations in C# 4.0.
</p></fieldset><br />
To me this is a very huge limitation. I can already see that most of my interop with
dynamic languages will probably involve collections of some sort. Also this would
come into play with collections from Dynamic COM objects. LINQ is so powerful and
easy to use, it may end up being a major annoyance to have to move away from it for
dynamic typing. I hope they work on this for C# 4.5<br /><br /><br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=0e8abe73-81d5-4db4-9115-2f8d2356f043" /></body>
      <title>CLR 4.0 to include the DLR - With Limitations</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,0e8abe73-81d5-4db4-9115-2f8d2356f043.aspx</guid>
      <link>http://blog.j-maxx.net/2008/10/28/CLR40ToIncludeTheDLRWithLimitations.aspx</link>
      <pubDate>Tue, 28 Oct 2008 16:23:43 GMT</pubDate>
      <description>All of these new C# 4.0 dynamic features require parts of the DLR. Thus it looks like MS is taking the DLR and making it a first class citizen in the CLR. This also I'm guessing will make IronPython and IronRuby first class citizens as well. A huge win for the dynamic languages community. For C# 4.0 it is bittersweet. It means better interoperability when calling things created in IronRuby or IronPython but there are limitations. Below is an excerpt from the C# 4.0 WhitePaper (available here &lt;a href="http://code.msdn.microsoft.com/csharpfuture"&gt;http://code.msdn.microsoft.com/csharpfuture&lt;/a&gt;)&lt;br&gt;
&lt;fieldset&gt;
&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:Wingdings;
	panose-1:5 0 0 0 0 0 0 0 0 0;
	mso-font-charset:2;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Cambria;
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073741899 0 0 159 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:modern;
	mso-font-pitch:fixed;
	mso-font-signature:-1610611985 1073750091 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
h2
	{mso-style-priority:9;
	mso-style-qformat:yes;
	mso-style-link:"Heading 2 Char";
	mso-style-next:Normal;
	margin-top:10.0pt;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:0in;
	margin-bottom:.0001pt;
	line-height:115%;
	mso-pagination:widow-orphan lines-together;
	page-break-after:avoid;
	mso-outline-level:2;
	font-size:13.0pt;
	font-family:"Cambria","serif";
	mso-ascii-font-family:Cambria;
	mso-ascii-theme-font:major-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:major-fareast;
	mso-hansi-font-family:Cambria;
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:major-bidi;
	color:#4F81BD;
	mso-themecolor:accent1;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
span.Heading2Char
	{mso-style-name:"Heading 2 Char";
	mso-style-priority:9;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Heading 2";
	mso-ansi-font-size:13.0pt;
	mso-bidi-font-size:13.0pt;
	font-family:"Cambria","serif";
	mso-ascii-font-family:Cambria;
	mso-ascii-theme-font:major-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:major-fareast;
	mso-hansi-font-family:Cambria;
	mso-hansi-theme-font:major-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:major-bidi;
	color:#4F81BD;
	mso-themecolor:accent1;
	font-weight:bold;}
p.Code, li.Code, div.Code
	{mso-style-name:Code;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.2in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:Consolas;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
span.Codefragment
	{mso-style-name:"Code fragment";
	mso-style-priority:1;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-ansi-font-size:10.0pt;
	font-family:Consolas;
	mso-ascii-font-family:Consolas;
	mso-hansi-font-family:Consolas;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
 /* List Definitions */
 @list l0
	{mso-list-id:49888064;
	mso-list-type:hybrid;
	mso-list-template-ids:-372898770 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
	{mso-level-number-format:bullet;
	mso-level-text:;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;
	font-family:Symbol;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
--&gt;
&lt;/style&gt;
&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;
&lt;h2&gt;Open issues
&lt;/h2&gt;
&lt;p class="MsoNormal"&gt;
There are a few limitations and things that might work differently than you would
expect.
&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;
&lt;!--[if !supportLists]--&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;!--[endif]--&gt;The DLR allows objects to be created from objects that represent classes.
However, the current implementation of C# doesn’t have syntax to support this.
&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;
&lt;!--[if !supportLists]--&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;!--[endif]--&gt;Dynamic lookup will not be able to find extension methods. Whether extension
methods apply or not depends on the static context of the call (i.e. which using clauses
occur), and this context information is not currently kept as part of the payload.
&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"&gt;
&lt;!--[if !supportLists]--&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;!--[endif]--&gt;Anonymous functions (i.e. lambda expressions) cannot appear as arguments
to a dynamic method call. The compiler cannot bind (i.e. “understand”) an anonymous
function without knowing what type it is converted to.
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
One consequence of these limitations is that you cannot easily use LINQ queries over
dynamic objects:
&lt;/p&gt;
&lt;p class="Code"&gt;
dynamic collection = …;
&lt;/p&gt;
&lt;p class="Code"&gt;
var result = collection.Select(e =&amp;gt; e + 5);
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
If the &lt;span class="Codefragment"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;Select&lt;/span&gt;&lt;/span&gt; method
is an extension method, dynamic lookup will not find it. Even if it is an instance
method, the above does not compile, because a lambda expression cannot be passed as
an argument to a dynamic operation.
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
There are no plans to address these limitations in C# 4.0.
&lt;/p&gt;
&lt;/fieldset&gt;
&lt;br&gt;
To me this is a very huge limitation. I can already see that most of my interop with
dynamic languages will probably involve collections of some sort. Also this would
come into play with collections from Dynamic COM objects. LINQ is so powerful and
easy to use, it may end up being a major annoyance to have to move away from it for
dynamic typing. I hope they work on this for C# 4.5&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=0e8abe73-81d5-4db4-9115-2f8d2356f043" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,0e8abe73-81d5-4db4-9115-2f8d2356f043.aspx</comments>
      <category>C# 4.0</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=4615cd55-a3f0-4d8e-9131-f82995cf1470</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,4615cd55-a3f0-4d8e-9131-f82995cf1470.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,4615cd55-a3f0-4d8e-9131-f82995cf1470.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4615cd55-a3f0-4d8e-9131-f82995cf1470</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">While browsing through MSDN blogs I came
across this nice little post. <a href="http://blogs.msdn.com/dparys/archive/2008/10/28/neue-m-glichkeiten-in-c-4-0.aspx">http://blogs.msdn.com/dparys/archive/2008/10/28/neue-m-glichkeiten-in-c-4-0.aspx</a> .
After translating the page I found that he linked to the new C# 40 page <a href="http://code.msdn.microsoft.com/csharpfuture">http://code.msdn.microsoft.com/csharpfuture</a><br /><br />
I played around with VS 2010 last night. I was able to test the dynamic keyword. It
works as advertised but the biggest thing one has to realize is using it removes intellisense
for that variable. Compiling type safety as well. I hope they'll be able to add some
sort of limited intellisense by looking at the last assigned type.<br /><br />
Also on the Dynamic front is DynamicObject. A new base object type that allows for
on the fly Property declaration. The DynamicObject uses a PropertyBag (looks like
a Dictionary&lt;string,object&gt;). You can declare properties on the fly. Like<br /><pre name="code" class="c#">public class MyBag : DynamicObject
{
// überschreibt Getter / Setter
} 
dynamic b = new MyBag();
b.Id = 124;
b.Name = "Windows 7"
b.Price = 499.99m;
b.IsAvailable = false;

</pre>One
thing I was unable to figure out was the optional, default and named parameters. Again
the blog provided some answers.<br /><br /><pre name="code" class="c#">public void InsertCustomer( int customerId,
                          string companyName = "Neue Firma",
                          decimal creditLimit = 2000m )
{
}

InsertCustomer( 1, creditLimit: 2000m );  

InsertCustomer( creditLimit: 2000m, customerId: 1 );

</pre><br /><br /><br /><br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=4615cd55-a3f0-4d8e-9131-f82995cf1470" /></body>
      <title>Update on new C# 4 features</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,4615cd55-a3f0-4d8e-9131-f82995cf1470.aspx</guid>
      <link>http://blog.j-maxx.net/2008/10/28/UpdateOnNewC4Features.aspx</link>
      <pubDate>Tue, 28 Oct 2008 14:13:13 GMT</pubDate>
      <description>While browsing through MSDN blogs I came across this nice little post. &lt;a href="http://blogs.msdn.com/dparys/archive/2008/10/28/neue-m-glichkeiten-in-c-4-0.aspx"&gt;http://blogs.msdn.com/dparys/archive/2008/10/28/neue-m-glichkeiten-in-c-4-0.aspx&lt;/a&gt; .
After translating the page I found that he linked to the new C# 40 page &lt;a href="http://code.msdn.microsoft.com/csharpfuture"&gt;http://code.msdn.microsoft.com/csharpfuture&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
I played around with VS 2010 last night. I was able to test the dynamic keyword. It
works as advertised but the biggest thing one has to realize is using it removes intellisense
for that variable. Compiling type safety as well. I hope they'll be able to add some
sort of limited intellisense by looking at the last assigned type.&lt;br&gt;
&lt;br&gt;
Also on the Dynamic front is DynamicObject. A new base object type that allows for
on the fly Property declaration. The DynamicObject uses a PropertyBag (looks like
a Dictionary&amp;lt;string,object&amp;gt;). You can declare properties on the fly. Like&lt;br&gt;
&lt;pre name="code" class="c#"&gt;public class MyBag : DynamicObject
{
// überschreibt Getter / Setter
} 
dynamic b = new MyBag();
b.Id = 124;
b.Name = "Windows 7"
b.Price = 499.99m;
b.IsAvailable = false;

&lt;/pre&gt;One
thing I was unable to figure out was the optional, default and named parameters. Again
the blog provided some answers.&lt;br&gt;
&lt;br&gt;
&lt;pre name="code" class="c#"&gt;public void InsertCustomer( int customerId,
                          string companyName = "Neue Firma",
                          decimal creditLimit = 2000m )
{
}

InsertCustomer( 1, creditLimit: 2000m );  

InsertCustomer( creditLimit: 2000m, customerId: 1 );

&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=4615cd55-a3f0-4d8e-9131-f82995cf1470" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,4615cd55-a3f0-4d8e-9131-f82995cf1470.aspx</comments>
      <category>C#</category>
      <category>C# 4.0</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=6af08b32-a592-4086-b634-04bce5effdb3</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,6af08b32-a592-4086-b634-04bce5effdb3.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,6af08b32-a592-4086-b634-04bce5effdb3.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6af08b32-a592-4086-b634-04bce5effdb3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Well I spent most of the day working on
some peculiar problems with PICK. Then left to take my girlfriend out for her birthday.
Just now catching up on whats gone on today at PDC. Man it seems like it was a huge
day.<br /><br />
First off Windows Azure and the new .NET Services. From what I've read so far I can
see some compelling uses for the .NET services and sharing content, id's and roles
around the web. 
<br /><br />
The big one that I haven't seen much press on yet is C# 4.0. Looks like we are getting
dynamic binding in the language. While this loses compile type safety it gives C#
good ground against things like Ruby and PHP.<br /><br />
Named, Optional and Default parameters. Oh how I've been waiting for these since switching
to .NET from PHP. I used to take advantage of these features all the time. It annoys
me when I can use them in Attributes in C# but not on actual methods. I'm going to
love this.<br /><br />
VS2010 and C# will CTP are available in a <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&amp;displaylang=en">virtual
PC here</a><br /><br />
Here's a better overview stolen from <a href="http://blogs.msdn.com/samng/archive/2008/10/28/microsoft-visual-studio-2010.aspx">http://blogs.msdn.com/samng/archive/2008/10/28/microsoft-visual-studio-2010.aspx<br /></a><blockquote><ol><li><strong>Dynamic binding. </strong>We've introduced a new type, <font face="courier new">dynamic</font>,
which behaves much like <font face="courier new">object</font>, but allows the operations
performed on your object to be bound at runtime instead of compile time.</li><li><strong>Named and Optional parameters. </strong>You can now specify default values
for your parameters, allowing them to be optionally specified at the call site. We've
also added the ability for your arguments to be passed by name, so that you can specify
exactly which arguments you want to give, and refrain from specifying the rest (assuming
they're optional).</li><li><strong>Com interop features. </strong>We've done quite a bit of work to improve COM
interop. These include:</li></ol><ul><li><strong>No ref for COM calls.</strong> For all COM calls that take ref arguments,
you can specify an argument without a ref, and the compiler will generate a local
for you and generate a ref to that local as the argument.</li><li><strong>No PIA. </strong>We have introduced the ability to deploy your applications
which use Primary Interop Assemblies (PIAs) without referencing the actual PIA at
runtime. This allows compiling against them, but not needing to ship them with your
application.</li><li><strong>Implicit dynamic for COM types. </strong>We now give you the option of turning
all <font face="courier new">object</font>s returned from COM into <font face="courier new">dynamic</font>s
so that you can perform late bound calls off of them instead of having to cast the
result in order to make it useful.</li></ul></blockquote><br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=6af08b32-a592-4086-b634-04bce5effdb3" /></body>
      <title>PDC Announcements Day 1</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,6af08b32-a592-4086-b634-04bce5effdb3.aspx</guid>
      <link>http://blog.j-maxx.net/2008/10/28/PDCAnnouncementsDay1.aspx</link>
      <pubDate>Tue, 28 Oct 2008 01:03:34 GMT</pubDate>
      <description>Well I spent most of the day working on some peculiar problems with PICK. Then left to take my girlfriend out for her birthday. Just now catching up on whats gone on today at PDC. Man it seems like it was a huge day.&lt;br&gt;
&lt;br&gt;
First off Windows Azure and the new .NET Services. From what I've read so far I can
see some compelling uses for the .NET services and sharing content, id's and roles
around the web. 
&lt;br&gt;
&lt;br&gt;
The big one that I haven't seen much press on yet is C# 4.0. Looks like we are getting
dynamic binding in the language. While this loses compile type safety it gives C#
good ground against things like Ruby and PHP.&lt;br&gt;
&lt;br&gt;
Named, Optional and Default parameters. Oh how I've been waiting for these since switching
to .NET from PHP. I used to take advantage of these features all the time. It annoys
me when I can use them in Attributes in C# but not on actual methods. I'm going to
love this.&lt;br&gt;
&lt;br&gt;
VS2010 and C# will CTP are available in a &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&amp;amp;displaylang=en"&gt;virtual
PC here&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
Here's a better overview stolen from &lt;a href="http://blogs.msdn.com/samng/archive/2008/10/28/microsoft-visual-studio-2010.aspx"&gt;http://blogs.msdn.com/samng/archive/2008/10/28/microsoft-visual-studio-2010.aspx&lt;br&gt;
&lt;/a&gt;&lt;blockquote&gt; 
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic binding. &lt;/strong&gt;We've introduced a new type, &lt;font face="courier new"&gt;dynamic&lt;/font&gt;,
which behaves much like &lt;font face="courier new"&gt;object&lt;/font&gt;, but allows the operations
performed on your object to be bound at runtime instead of compile time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Named and Optional parameters. &lt;/strong&gt;You can now specify default values
for your parameters, allowing them to be optionally specified at the call site. We've
also added the ability for your arguments to be passed by name, so that you can specify
exactly which arguments you want to give, and refrain from specifying the rest (assuming
they're optional).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Com interop features. &lt;/strong&gt;We've done quite a bit of work to improve COM
interop. These include:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No ref for COM calls.&lt;/strong&gt; For all COM calls that take ref arguments,
you can specify an argument without a ref, and the compiler will generate a local
for you and generate a ref to that local as the argument.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No PIA. &lt;/strong&gt;We have introduced the ability to deploy your applications
which use Primary Interop Assemblies (PIAs) without referencing the actual PIA at
runtime. This allows compiling against them, but not needing to ship them with your
application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implicit dynamic for COM types. &lt;/strong&gt;We now give you the option of turning
all &lt;font face="courier new"&gt;object&lt;/font&gt;s returned from COM into &lt;font face="courier new"&gt;dynamic&lt;/font&gt;s
so that you can perform late bound calls off of them instead of having to cast the
result in order to make it useful.&lt;/li&gt;
&lt;/ul&gt;
&gt;
&lt;/blockquote&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=6af08b32-a592-4086-b634-04bce5effdb3" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,6af08b32-a592-4086-b634-04bce5effdb3.aspx</comments>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=1da60d75-703c-48ff-bd8b-334ca7aaaa25</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,1da60d75-703c-48ff-bd8b-334ca7aaaa25.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,1da60d75-703c-48ff-bd8b-334ca7aaaa25.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1da60d75-703c-48ff-bd8b-334ca7aaaa25</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">So today I was tasked with helping a client
move an old custom VB6 app to a new Windows 2003 server. The company that created
it was asking for an arm and a leg for a simple transfer. After we moved the entire
program directory over everything seemed to be fine until we encountered an "ActiveX
component can't create object" error. I was perplexed on how to track down the issue.
There were not accompanying DLLs or OCX files. I tried Process Explorer to see if
I could find any failed openings and the strings contained in the exe. 
<br /><br />
After some searching on the net I found this lovely page <a href="http://www.cryer.co.uk/brian/windows/trbl_nt_axccco.htm">http://www.cryer.co.uk/brian/windows/trbl_nt_axccco.htm</a> .
It details on how to use <a href="http://technet.microsoft.com/en-us/sysinternals/bb896652.aspx">Sysinternals
Regmon</a> to track down issues with failed ActiveX creation. Basicall you watch your
program for registery key openings and look for any failed opens in the HKCR/Classes
path. After running the program and encountering the error I found it. 
<br />
HCKR\Classes\cdonts<br /><br />
When I saw that come up I immediately knew what to do. cdonts is no longer included
with windows server. It is an emailing library using cdo. I've had to install it on
new Windows 2003 servers more than once so old ASP classic sites could run. All I
needed to do after figuring it out was copy the cdonts.dll over to the C:\windows\system32\
directory and run regsvr32 on it. Everything was golden. 
<br /><br />
I've been using <a href="http://technet.microsoft.com/en-us/sysinternals/default.aspx">Sysinternals</a> for
years. I'm always amazed at what new ways I can use their utilities to track down
issues. <a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx">Process
Explorer</a> has been a godsend for me over the years. After discovering it, removing
malware from computers took me less than half the time it used to. It gives me so
much information I'm not sure how I got by without it.<br /><br />
The Sysinternals Suite is a must have for any serious windows programmer or administrator.
It ranges from programs to monitor network connections to being able to see and suspend
individual threads in a program. 
<br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=1da60d75-703c-48ff-bd8b-334ca7aaaa25" /></body>
      <title>Windows Troubleshooting Tip of the Day: Failed ActiveX object creation</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,1da60d75-703c-48ff-bd8b-334ca7aaaa25.aspx</guid>
      <link>http://blog.j-maxx.net/2008/10/24/WindowsTroubleshootingTipOfTheDayFailedActiveXObjectCreation.aspx</link>
      <pubDate>Fri, 24 Oct 2008 15:25:44 GMT</pubDate>
      <description>So today I was tasked with helping a client move an old custom VB6 app to a new Windows 2003 server. The company that created it was asking for an arm and a leg for a simple transfer. After we moved the entire program directory over everything seemed to be fine until we encountered an "ActiveX component can't create object" error. I was perplexed on how to track down the issue. There were not accompanying DLLs or OCX files. I tried Process Explorer to see if I could find any failed openings and the strings contained in the exe. &lt;br&gt;
&lt;br&gt;
After some searching on the net I found this lovely page &lt;a href="http://www.cryer.co.uk/brian/windows/trbl_nt_axccco.htm"&gt;http://www.cryer.co.uk/brian/windows/trbl_nt_axccco.htm&lt;/a&gt; .
It details on how to use &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896652.aspx"&gt;Sysinternals
Regmon&lt;/a&gt; to track down issues with failed ActiveX creation. Basicall you watch your
program for registery key openings and look for any failed opens in the HKCR/Classes
path. After running the program and encountering the error I found it. 
&lt;br&gt;
HCKR\Classes\cdonts&lt;br&gt;
&lt;br&gt;
When I saw that come up I immediately knew what to do. cdonts is no longer included
with windows server. It is an emailing library using cdo. I've had to install it on
new Windows 2003 servers more than once so old ASP classic sites could run. All I
needed to do after figuring it out was copy the cdonts.dll over to the C:\windows\system32\
directory and run regsvr32 on it. Everything was golden. 
&lt;br&gt;
&lt;br&gt;
I've been using &lt;a href="http://technet.microsoft.com/en-us/sysinternals/default.aspx"&gt;Sysinternals&lt;/a&gt; for
years. I'm always amazed at what new ways I can use their utilities to track down
issues. &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;Process
Explorer&lt;/a&gt; has been a godsend for me over the years. After discovering it, removing
malware from computers took me less than half the time it used to. It gives me so
much information I'm not sure how I got by without it.&lt;br&gt;
&lt;br&gt;
The Sysinternals Suite is a must have for any serious windows programmer or administrator.
It ranges from programs to monitor network connections to being able to see and suspend
individual threads in a program. 
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=1da60d75-703c-48ff-bd8b-334ca7aaaa25" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,1da60d75-703c-48ff-bd8b-334ca7aaaa25.aspx</comments>
      <category>blog</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=e5cb71ba-7715-4b6a-8d22-391d9953c85c</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,e5cb71ba-7715-4b6a-8d22-391d9953c85c.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,e5cb71ba-7715-4b6a-8d22-391d9953c85c.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e5cb71ba-7715-4b6a-8d22-391d9953c85c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">The other day I was posed with a problem
to implement a "Send as Attachment" feature to an existing application. I thought,
well this should be easy I've seen many other do it before. I quoted the work at a
few hours, figuring some quick searching would give my my answers. I was wrong.<br /><br />
Sending an email using the default email client is very easy with the mailto: protocol.
The problem lies in adding an attachment. Common mail programs like Outlook and Thunderbird
do not support the attachment option. So, I started looking at MAPI the native API
for doing this. I could not find any .NET wrappers. I did find that there were controls
created by MS for VB6. Most of the .NET examples I found used COM interop with the
ActiveX controls. But after trying these controls (which look like they were last
updated in 98) I found them to not work in XP SP3. I'd get random exceptions and was
never able to actually get an email dialog to pop up.<br /><br />
After failing with the ActiveX controls I was out of time. The MAPI native commands
may have worked but it would take too long to set up the native calls and test it.
After discussing with the client we ended up coming up with a bit hackish but workable
solution. I would use the mailto: protocol and then launch explorer with the attachment
selected. To them this is a minor annoyance that is acceptable. To me this an unfortunate
sign of the times. 
<br /><br />
Things that were once "easy" for native applications become complicated and buggy
for managed. It seems too often that I must make use native calls or old unsuported
COM objects to get the job done. While MS has done a great job building up the .NET
Framework. It seems that many native API's still remain unwrapped. Furthermore some
places I read that the MAPI api is unstable on Vista. It seems that some API's are
slipping through the cracks.<br /><br /><br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=e5cb71ba-7715-4b6a-8d22-391d9953c85c" /></body>
      <title>Deprecation of API's and Native Calls</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,e5cb71ba-7715-4b6a-8d22-391d9953c85c.aspx</guid>
      <link>http://blog.j-maxx.net/2008/10/24/DeprecationOfAPIsAndNativeCalls.aspx</link>
      <pubDate>Fri, 24 Oct 2008 02:15:23 GMT</pubDate>
      <description>The other day I was posed with a problem to implement a "Send as Attachment" feature to an existing application. I thought, well this should be easy I've seen many other do it before. I quoted the work at a few hours, figuring some quick searching would give my my answers. I was wrong.&lt;br&gt;
&lt;br&gt;
Sending an email using the default email client is very easy with the mailto: protocol.
The problem lies in adding an attachment. Common mail programs like Outlook and Thunderbird
do not support the attachment option. So, I started looking at MAPI the native API
for doing this. I could not find any .NET wrappers. I did find that there were controls
created by MS for VB6. Most of the .NET examples I found used COM interop with the
ActiveX controls. But after trying these controls (which look like they were last
updated in 98) I found them to not work in XP SP3. I'd get random exceptions and was
never able to actually get an email dialog to pop up.&lt;br&gt;
&lt;br&gt;
After failing with the ActiveX controls I was out of time. The MAPI native commands
may have worked but it would take too long to set up the native calls and test it.
After discussing with the client we ended up coming up with a bit hackish but workable
solution. I would use the mailto: protocol and then launch explorer with the attachment
selected. To them this is a minor annoyance that is acceptable. To me this an unfortunate
sign of the times. 
&lt;br&gt;
&lt;br&gt;
Things that were once "easy" for native applications become complicated and buggy
for managed. It seems too often that I must make use native calls or old unsuported
COM objects to get the job done. While MS has done a great job building up the .NET
Framework. It seems that many native API's still remain unwrapped. Furthermore some
places I read that the MAPI api is unstable on Vista. It seems that some API's are
slipping through the cracks.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=e5cb71ba-7715-4b6a-8d22-391d9953c85c" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,e5cb71ba-7715-4b6a-8d22-391d9953c85c.aspx</comments>
      <category>Rant</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=babd16a4-2f0a-4d5a-88a6-17f50443c9d7</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,babd16a4-2f0a-4d5a-88a6-17f50443c9d7.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,babd16a4-2f0a-4d5a-88a6-17f50443c9d7.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=babd16a4-2f0a-4d5a-88a6-17f50443c9d7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">There are blogs on MSDN popping up that
SilverLight 2 is indeed gold and will be public tomorrow Oct 14th. They also announced <a href="http://www.eclipse4sl.org/">Silverlight
Tools for Eclipse</a> with the promise of cross platform development for Silverlight.
I think this is a huge step in the right direction for MS. By giving developers on
OS's other than windows to do Silverlight Development in a fairly competent IDE it
will give them a better position against Flex.<br /><br />
I have done some playing around in Silverlight 2 and really loved it. I'm just hoping
for a Silverlight 2 project to come our way at Sierra Bravo.<br /><br />
I look forward to downloading the public bits and seeing what I can do with the full
version. 
<br /><br /><br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=babd16a4-2f0a-4d5a-88a6-17f50443c9d7" /></body>
      <title>SilverLight 2 Released</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,babd16a4-2f0a-4d5a-88a6-17f50443c9d7.aspx</guid>
      <link>http://blog.j-maxx.net/2008/10/13/SilverLight2Released.aspx</link>
      <pubDate>Mon, 13 Oct 2008 18:22:40 GMT</pubDate>
      <description>There are blogs on MSDN popping up that SilverLight 2 is indeed gold and will be public tomorrow Oct 14th. They also announced &lt;a href="http://www.eclipse4sl.org/"&gt;Silverlight
Tools for Eclipse&lt;/a&gt; with the promise of cross platform development for Silverlight.
I think this is a huge step in the right direction for MS. By giving developers on
OS's other than windows to do Silverlight Development in a fairly competent IDE it
will give them a better position against Flex.&lt;br&gt;
&lt;br&gt;
I have done some playing around in Silverlight 2 and really loved it. I'm just hoping
for a Silverlight 2 project to come our way at Sierra Bravo.&lt;br&gt;
&lt;br&gt;
I look forward to downloading the public bits and seeing what I can do with the full
version. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=babd16a4-2f0a-4d5a-88a6-17f50443c9d7" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,babd16a4-2f0a-4d5a-88a6-17f50443c9d7.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=5b0a348b-9f98-4706-b1c1-21bc9a1338cb</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,5b0a348b-9f98-4706-b1c1-21bc9a1338cb.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,5b0a348b-9f98-4706-b1c1-21bc9a1338cb.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5b0a348b-9f98-4706-b1c1-21bc9a1338cb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Well Code Camp 5 is in the bag. It was
a large turn out and many great talks. My talk however drew no interest. Oh well,
I tried and will try again. I'm thinking of making my post about <a href="http://blog.j-maxx.net/2008/08/23/LINQRefactoringInlineInstantiation.aspx">LINQ
and Refactoring</a> into a talk.<br /><br />
The talks I went to:<br /><a href="http://www.twincitiescodecamp.com/TCCC/Fall2008/Sessions.aspx#s3">The Intersection
of F# and LINQ</a><br />
This was a great talk about how F# takes LINQ and adds much more value to it with
it's functional nature. The demonstration was a ray tracer that used LINQ to build
up all of the reflected pixels. It was quite impressive. Combine it with the Arc talk
and I am now very interested in Functional programming.<br /><br /><a href="http://www.twincitiescodecamp.com/TCCC/Fall2008/Sessions.aspx#s11">The Arc
Programming Language</a><br />
I had seen this talk a few days earlier. The speaker was hilarious and did a great
job of bringing excitement back to lisp. Arc is a new dialect of Lisp that aims to
cut down on parenthesis and add shorthand for common operations. He added objects
to Arc with six lines of code, quite impressive.<br /><br /><a href="http://www.twincitiescodecamp.com/TCCC/Fall2008/Sessions.aspx#s8">BOO! A
Wrist-Friendly Language for the CLI</a><br />
BOO! is a another language along the lines of Lisp where it can redefine parts of
itself through macros. The difference is it is statically typed like C#. It does offer
quite a bit of reduction in code written. The presenter Justin Chase did a good job
showing many aspects of the language. I also won a shirt for figuring out that the
mystery function was calculating a fibonocci sequence. The code for it was quite cool,
a,b = b + a or something like that.<br /><br /><a href="http://www.twincitiescodecamp.com/TCCC/Fall2008/Sessions.aspx#s18">Building
MyTube with Microsoft Silverlight 2</a><br />
Jeff Brand from Microsoft was giving this talk. It was a basic overview on SilverLight,
the purpose for it and how to implement a simple youtube interface. I didn't stay
for the entire thing, I had to go get ready for my talk. 
<br /><br />
My talk "Pick/Multivalue 101"<br />
No one that was interested showed. Not that I was surprised but still a bit disappointed. 
While giving the talk at my work we had over 15 people show. One of my co-workers
showed and the other guy that showed was just looking for a place to sit. So instead
we talked about LINQ, customized programming in Linux and a bit about Multivalue<br /><br />
I went to the speakers after party, got to gossip with some people from Magenic. Learned
that Justin Chase left Magenic a few weeks ago to work on the Blend team at MS. He's
a lucky guy and seemed rather excited for the features they are working on that he
can't talk about. I'm sure some of them may come up soon at PDC. I did hear some gossip
earlier in the day that SilverLight 2 RTM is going to be released as early as tomorrow
(Oct 13th). 
<br /><p><br /></p><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=5b0a348b-9f98-4706-b1c1-21bc9a1338cb" /></body>
      <title>Twin Cities Code Camp 5: Over and Out</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,5b0a348b-9f98-4706-b1c1-21bc9a1338cb.aspx</guid>
      <link>http://blog.j-maxx.net/2008/10/12/TwinCitiesCodeCamp5OverAndOut.aspx</link>
      <pubDate>Sun, 12 Oct 2008 17:59:53 GMT</pubDate>
      <description>Well Code Camp 5 is in the bag. It was a large turn out and many great
talks. My talk however drew no interest. Oh well, I tried and will try
again. I'm thinking of making my post about &lt;a href="http://blog.j-maxx.net/2008/08/23/LINQRefactoringInlineInstantiation.aspx"&gt;LINQ
and Refactoring&lt;/a&gt; into a talk.&lt;br&gt;
&lt;br&gt;
The talks I went to:&lt;br&gt;
&lt;a href="http://www.twincitiescodecamp.com/TCCC/Fall2008/Sessions.aspx#s3"&gt;The Intersection
of F# and LINQ&lt;/a&gt;
&lt;br&gt;
This was a great talk about how F# takes LINQ and adds much more value to it with
it's functional nature. The demonstration was a ray tracer that used LINQ to build
up all of the reflected pixels. It was quite impressive. Combine it with the Arc talk
and I am now very interested in Functional programming.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.twincitiescodecamp.com/TCCC/Fall2008/Sessions.aspx#s11"&gt;The Arc
Programming Language&lt;/a&gt;
&lt;br&gt;
I had seen this talk a few days earlier. The speaker was hilarious and did a great
job of bringing excitement back to lisp. Arc is a new dialect of Lisp that aims to
cut down on parenthesis and add shorthand for common operations. He added objects
to Arc with six lines of code, quite impressive.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.twincitiescodecamp.com/TCCC/Fall2008/Sessions.aspx#s8"&gt;BOO! A
Wrist-Friendly Language for the CLI&lt;/a&gt;
&lt;br&gt;
BOO! is a another language along the lines of Lisp where it can redefine parts of
itself through macros. The difference is it is statically typed like C#. It does offer
quite a bit of reduction in code written. The presenter Justin Chase did a good job
showing many aspects of the language. I also won a shirt for figuring out that the
mystery function was calculating a fibonocci sequence. The code for it was quite cool,
a,b = b + a or something like that.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.twincitiescodecamp.com/TCCC/Fall2008/Sessions.aspx#s18"&gt;Building
MyTube with Microsoft Silverlight 2&lt;/a&gt;
&lt;br&gt;
Jeff Brand from Microsoft was giving this talk. It was a basic overview on SilverLight,
the purpose for it and how to implement a simple youtube interface. I didn't stay
for the entire thing, I had to go get ready for my talk. 
&lt;br&gt;
&lt;br&gt;
My talk "Pick/Multivalue 101"&lt;br&gt;
No one that was interested showed. Not that I was surprised but still a bit disappointed.&amp;nbsp;
While giving the talk at my work we had over 15 people show. One of my co-workers
showed and the other guy that showed was just looking for a place to sit. So instead
we talked about LINQ, customized programming in Linux and a bit about Multivalue&lt;br&gt;
&lt;br&gt;
I went to the speakers after party, got to gossip with some people from Magenic. Learned
that Justin Chase left Magenic a few weeks ago to work on the Blend team at MS. He's
a lucky guy and seemed rather excited for the features they are working on that he
can't talk about. I'm sure some of them may come up soon at PDC. I did hear some gossip
earlier in the day that SilverLight 2 RTM is going to be released as early as tomorrow
(Oct 13th). 
&lt;br&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=5b0a348b-9f98-4706-b1c1-21bc9a1338cb" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,5b0a348b-9f98-4706-b1c1-21bc9a1338cb.aspx</comments>
      <category>blog</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=bfe03fc5-0729-4833-914a-e2f93b416d48</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,bfe03fc5-0729-4833-914a-e2f93b416d48.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,bfe03fc5-0729-4833-914a-e2f93b416d48.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bfe03fc5-0729-4833-914a-e2f93b416d48</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Being a developer is one of the luckiest
professions in the world. Just take a minute and think about this: How many professions
out there are you paid to learn? Seriously, if we wish to succeed we must learn. Many
times we need to learn during the project. We are given the opportunity and often
encouraged to learn new ways of doing something, come up with innovative ideas, implement
new technologies. Many companies offer compensation for developers to get certified,
keep up, to learn. I've also found that many of the people I know that went to college
for CS came out ill prepared for the real development world.<br /><br />
I was lucky in some ways. I got a job running websites during high school, I was paid
to learn and mature as a programming. I wasn't lucky that pay sucked and I had to
get food from charity at times. But there was always being able to learn on the job
and the outlook that real developers jobs paid very well. 
<br /><br />
Over the years as I've matured as a developer I've learned quite a lot. I strive to
keep on learning, branching out into new areas. I've found that my inner urge to learn
is also what has allowed me to succeed. Below are some of my tips to being a successful
programmer<br /><br /><h2>Be passionate
</h2>
The one thing I've seen in every great developer I've ever met is passion. Passion
for the job, passion for learning, passion for being challenged. There is no way to
improve without having a need for it. If being a developer is just a job, just a way
to make money, I'm sorry but you should find something else to do. I've seen many
developers that have that attitude and they just don't make it. They make mistakes
and never learn from them, they have difficulties completing anything on time, and
wind up getting fired quite a bit.<br /><br /><h2>Never be afraid to try something new
</h2>
While sometimes it's hard to break out of things you know that work, learning that
things can/cannot be done another way expands your experience and keeps your mind
trying to work outside the box.<br /><h2>Keep up with the Joneses
</h2>
This one can be very hard if you have a full schedule. But trying to keep up with
the new technologies will expose you to new ideas, new ways of tackling problems.
One cannot grow if one does not see another way.<br /><br /><h2>Pursue certifications
</h2>
Some people see certifications as a croc. They see that lots of tech schools teach
for the test and thats it. I can understand that. I have persued certifications as
a professional goal. Going through the MCTS certifications for ASP.NET and Winforms
has exposed me to many things I probably wouldn't have known about in .NET. I try
to read through the entire training kit books MS puts out for the certifications. 
<br /><br />
Gaining the certifications are also good for ones ego. Having the goal to set out
and earn the certification can keep you discleplined and give you a sense of accomplishment.
It's something you can show your bosses and peers that you do indeed know what you're
talking about. It gives you more bargaining power when negotiating a raise or looking
for a new job. While some may not help you as much as you'd hope, having both real
world experience and certifications can be a 1-2 combo.<br /><br />
Microsoft's certification track is the best I've seen. You can start out by getting
Technological specific certifications with the MCTS series. You can get just certified
in ASP.NET, Windows Applications, Windows Mobile.. and on. Then you can expand on
those with Professional certifications with the MCPD's. These ones include application
lifecycle components. Professional ways of breaking down an application into logical,
component and class diagrams to implementation of architectures and finishing with
deployment and maintenance. 
<br /><br /><h2>Learn new languages 
</h2>
This one can be hard for people that only use one language at work. Learning a new
language again helps you get exposed to new ideas and ways of tackling problems. 
<br /><br />
The hardest thing is actually finding something to do in that language to learn it.
I've found that the best way is to have something you implement in every language.
Whether it's some tool you've developed or a little game. I had the Al Bhed translator.
I originally developed it in PHP to help me out with the game Final Fantasy 10. I
then tried doing it in JavaScript, then Java, then C++, XUL (firefox extension) and
then in C#.NET Winform. It gave me a common goal in each of the languages and forced
me to find out how to do it in each one. They all had their own strengths and weaknesses.
PHP's Array functions made some of it very easy to implement, where javascript was
a bit clunky. C# wasn't as elegant as the PHP but it was much faster in execution.<br /><br />
Try to find languages that have a different goal than just another application. Languages
like F# for example. While it's possible to write every day applications with it,
it's real power lies in analyzing and transforming data. Learning it opens up a world
of mathmatics in new ways.<br /><br /><h2>Learn new platforms  
</h2>
Simply this means do not just be a web developer or an application developer. Continuously
expanding the platforms you know can increase your understanding of how other people
develop. I started out as a web programmer and over the years I've written programs
for the commandline, windows services, web services, mobile phones, automated scripts,
desktop applications, rich internet apps (flash, silverlight), dynamic web sites and
more. I'm currently picking up XNA and trying to learn what programming a game is
like. I'm learning a newfound respect for game programmers.<br /><br /><h2>Seek out challenges 
</h2>
If your current job is not challenging you find a way to be challenged. Sometimes
even playing around things outside of work is enough. Go to your boss and see if theres
ways you can increase your workload, or get into more complex projects. Express an
interest in new things. If you are stuck at a job where that is impossible, I recommend
it may be time to look elsewhere. Get some certifications and new skills under your
belt and start looking. There are some great tech jobs out there, good places to find
a place to be challenged are in start ups or smaller custom software companies. Places
like where I work at, Sierra Bravo. When I joined I had 6 years experience but still
would consider myself a novice programmer. Within the next year I worked on more than
20 projects, on many platforms and felt like I had finally become a professional developer.<br /><br />
Now being on the verge of 4 years later I feel like I'm an accomplished developer,
I'm able to start incorporating more advanced concepts in to my projects. I can see
a much larger picture. As the years have gone on the scope of the picture I can see
has expanded. I once could only see the single web page I was working on. Then I was
able to start understanding the system of web pages I would design. I then started
graduating onto being able to write a complete web site. That is when I decided that
desktop applications were next. The scope expanded to understanding state, threads,
and desktop experience. My first applications were cluttered, did not have much for
layers. I started to learn more about the concept of breaking out applications into
libraries and layers. These days I've graduated to an architect that can take the
project proposal. Break it down to sections, logical components and build the applications
architecture. Define the database, the data layers, the data objects and the front
end. I can incorporate n-tier designs, abstract out business logic to a web service.
Write API's that work for websites as well as windows mobile.<br /><br />
Really it all boils down to is: Have passion for your job, passion to learn new things
and keep yourself challenged. Never be afraid to learn new skills. In this day an
age a developer needs to know more than just one platform. They need to understand
a larger scope to make it.<br /><br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=bfe03fc5-0729-4833-914a-e2f93b416d48" /></body>
      <title>Advice: How to be a successful developer</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,bfe03fc5-0729-4833-914a-e2f93b416d48.aspx</guid>
      <link>http://blog.j-maxx.net/2008/09/29/AdviceHowToBeASuccessfulDeveloper.aspx</link>
      <pubDate>Mon, 29 Sep 2008 21:28:37 GMT</pubDate>
      <description>Being a developer is one of the luckiest professions in the world. Just take a minute and think about this: How many professions out there are you paid to learn? Seriously, if we wish to succeed we must learn. Many times we need to learn during the project. We are given the opportunity and often encouraged to learn new ways of doing something, come up with innovative ideas, implement new technologies. Many companies offer compensation for developers to get certified, keep up, to learn. I've also found that many of the people I know that went to college for CS came out ill prepared for the real development world.&lt;br&gt;
&lt;br&gt;
I was lucky in some ways. I got a job running websites during high school, I was paid
to learn and mature as a programming. I wasn't lucky that pay sucked and I had to
get food from charity at times. But there was always being able to learn on the job
and the outlook that real developers jobs paid very well. 
&lt;br&gt;
&lt;br&gt;
Over the years as I've matured as a developer I've learned quite a lot. I strive to
keep on learning, branching out into new areas. I've found that my inner urge to learn
is also what has allowed me to succeed. Below are some of my tips to being a successful
programmer&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Be passionate
&lt;/h2&gt;
The one thing I've seen in every great developer I've ever met is passion. Passion
for the job, passion for learning, passion for being challenged. There is no way to
improve without having a need for it. If being a developer is just a job, just a way
to make money, I'm sorry but you should find something else to do. I've seen many
developers that have that attitude and they just don't make it. They make mistakes
and never learn from them, they have difficulties completing anything on time, and
wind up getting fired quite a bit.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Never be afraid to try something new
&lt;/h2&gt;
While sometimes it's hard to break out of things you know that work, learning that
things can/cannot be done another way expands your experience and keeps your mind
trying to work outside the box.&lt;br&gt;
&lt;h2&gt;Keep up with the Joneses
&lt;/h2&gt;
This one can be very hard if you have a full schedule. But trying to keep up with
the new technologies will expose you to new ideas, new ways of tackling problems.
One cannot grow if one does not see another way.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Pursue certifications
&lt;/h2&gt;
Some people see certifications as a croc. They see that lots of tech schools teach
for the test and thats it. I can understand that. I have persued certifications as
a professional goal. Going through the MCTS certifications for ASP.NET and Winforms
has exposed me to many things I probably wouldn't have known about in .NET. I try
to read through the entire training kit books MS puts out for the certifications. 
&lt;br&gt;
&lt;br&gt;
Gaining the certifications are also good for ones ego. Having the goal to set out
and earn the certification can keep you discleplined and give you a sense of accomplishment.
It's something you can show your bosses and peers that you do indeed know what you're
talking about. It gives you more bargaining power when negotiating a raise or looking
for a new job. While some may not help you as much as you'd hope, having both real
world experience and certifications can be a 1-2 combo.&lt;br&gt;
&lt;br&gt;
Microsoft's certification track is the best I've seen. You can start out by getting
Technological specific certifications with the MCTS series. You can get just certified
in ASP.NET, Windows Applications, Windows Mobile.. and on. Then you can expand on
those with Professional certifications with the MCPD's. These ones include application
lifecycle components. Professional ways of breaking down an application into logical,
component and class diagrams to implementation of architectures and finishing with
deployment and maintenance. 
&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Learn new languages 
&lt;/h2&gt;
This one can be hard for people that only use one language at work. Learning a new
language again helps you get exposed to new ideas and ways of tackling problems. 
&lt;br&gt;
&lt;br&gt;
The hardest thing is actually finding something to do in that language to learn it.
I've found that the best way is to have something you implement in every language.
Whether it's some tool you've developed or a little game. I had the Al Bhed translator.
I originally developed it in PHP to help me out with the game Final Fantasy 10. I
then tried doing it in JavaScript, then Java, then C++, XUL (firefox extension) and
then in C#.NET Winform. It gave me a common goal in each of the languages and forced
me to find out how to do it in each one. They all had their own strengths and weaknesses.
PHP's Array functions made some of it very easy to implement, where javascript was
a bit clunky. C# wasn't as elegant as the PHP but it was much faster in execution.&lt;br&gt;
&lt;br&gt;
Try to find languages that have a different goal than just another application. Languages
like F# for example. While it's possible to write every day applications with it,
it's real power lies in analyzing and transforming data. Learning it opens up a world
of mathmatics in new ways.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Learn new platforms&amp;nbsp; 
&lt;/h2&gt;
Simply this means do not just be a web developer or an application developer. Continuously
expanding the platforms you know can increase your understanding of how other people
develop. I started out as a web programmer and over the years I've written programs
for the commandline, windows services, web services, mobile phones, automated scripts,
desktop applications, rich internet apps (flash, silverlight), dynamic web sites and
more. I'm currently picking up XNA and trying to learn what programming a game is
like. I'm learning a newfound respect for game programmers.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Seek out challenges 
&lt;/h2&gt;
If your current job is not challenging you find a way to be challenged. Sometimes
even playing around things outside of work is enough. Go to your boss and see if theres
ways you can increase your workload, or get into more complex projects. Express an
interest in new things. If you are stuck at a job where that is impossible, I recommend
it may be time to look elsewhere. Get some certifications and new skills under your
belt and start looking. There are some great tech jobs out there, good places to find
a place to be challenged are in start ups or smaller custom software companies. Places
like where I work at, Sierra Bravo. When I joined I had 6 years experience but still
would consider myself a novice programmer. Within the next year I worked on more than
20 projects, on many platforms and felt like I had finally become a professional developer.&lt;br&gt;
&lt;br&gt;
Now being on the verge of 4 years later I feel like I'm an accomplished developer,
I'm able to start incorporating more advanced concepts in to my projects. I can see
a much larger picture. As the years have gone on the scope of the picture I can see
has expanded. I once could only see the single web page I was working on. Then I was
able to start understanding the system of web pages I would design. I then started
graduating onto being able to write a complete web site. That is when I decided that
desktop applications were next. The scope expanded to understanding state, threads,
and desktop experience. My first applications were cluttered, did not have much for
layers. I started to learn more about the concept of breaking out applications into
libraries and layers. These days I've graduated to an architect that can take the
project proposal. Break it down to sections, logical components and build the applications
architecture. Define the database, the data layers, the data objects and the front
end. I can incorporate n-tier designs, abstract out business logic to a web service.
Write API's that work for websites as well as windows mobile.&lt;br&gt;
&lt;br&gt;
Really it all boils down to is: Have passion for your job, passion to learn new things
and keep yourself challenged. Never be afraid to learn new skills. In this day an
age a developer needs to know more than just one platform. They need to understand
a larger scope to make it.&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=bfe03fc5-0729-4833-914a-e2f93b416d48" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,bfe03fc5-0729-4833-914a-e2f93b416d48.aspx</comments>
      <category>blog</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=3bbd92fc-f5d7-4445-9c64-8ec69279c6a9</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,3bbd92fc-f5d7-4445-9c64-8ec69279c6a9.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,3bbd92fc-f5d7-4445-9c64-8ec69279c6a9.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3bbd92fc-f5d7-4445-9c64-8ec69279c6a9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Ok in the last few years I've had to take
over a number of websites written in VB.NET, or I should say written in VB but somehow
using .NET. My issue really isn't with VB.NET itself. It's obvious the developers
that did these sites (none of them affiliated in any way) came from doing classic
ASP and moved onto ASP.NET. The problem is they continued with their classic ASP practices
and did not seem to come close to grasping what ASP.NET really was. 
<br /><br />
Issues I've had:<br /><ul><li>
None of the sites will compile in Visual Studio</li><li>
All of the sites were running in ASP.NET 2.0 but none used master pages. They all
used Server-Side Includes (which should be banned) to include common blocks. 
<br /></li><li>
No use of controls or classes.</li><li>
No use of code-behind</li><li>
All SQL is dynamic and full of SQL Injection vulnerabilities</li><li>
All used include files which set up global variables and functions to be used in the
page lifecycle (one of the main reasons the sites wont compile)</li><li>
One of the sites had every folder set up as it's own application in IIS. Their hosting
provider has no interface for even seeing this, the developer used to call in to have
this set up. More on this site later (refered to as BS1)<br /></li><li>
Most of the sites only make use of the most basic controls</li><li>
One site (BS1) tried to use more advanced controls like Formview but failed miserably.
In this instance, used all over the site, the developer made a formview, used an EditTemplate
and bound a dataset to the formview. Sounds decent so far right? The issue came in
after I made some changes that my data was not being updated in the dataset. Tracking
down the issue was very hard to do when you have no "Go to Definition" and there are
tons of "Include Files" that are copied and pasted throughout the site. I found that
there was a  "Magic" function that did what databinding is supposed to do. It
looked for any controls in the formview that matched the exact name of a column and
bound the data. 
<br /></li><li>
BS1 includes so many functions that recreate .NET functionality that his developer
seemed to give up on getting to work within an hour or trying. I want to go home sick
everytime a change comes up on this site.</li></ul>
Basically on every one of these sites we have pitched rewrites. Most of them on grounds
of security, which is completely true. One of the sites we've had to take down due
to rampant SQL Injections. It wont be up until the client decides on which overhaul
to rewrite proposal they want to to sign off on.<br /><br />
If the BS1 rewrite ever happens I hope I am not the one to do it. While the site needs
it, the business rules and database behind it are majorly complex and in some points
completely bonkers. Redesigning the database will be completely out of the question
due to the amount of time to migrate that and other business apps the client uses
to work with it. 
<br /><br />
After all of the things I've seen I'm scared of how many classic ASP developers have
moved to ASP.NET without taking the time to understand what ASP.NET (or even .NET)
is all about. The thing that scares me the most is that it has been 6 years since
.NET was released. Some of the sites were even written starting with ASP.NET 2.0.
Yet the developers probably used Visual Studio as nothing more than a bloated notepad. 
<br /><br />
I came from doing site development in PHP 3/4. Classic ASP and PHP 3/4 development
were alike in many ways. One would use server side includes to include headers/footers
for the page. There would more than likely be a main include script that set up all
the functions/classes and global variables to be used on the page. All the HTML was
generated with inline code. I can understand moving from an environtment like that
to ASP.NET you may start out recreating what you know. 
<br /><br />
What I don't understand why these developers never felt a need to move beyond that
when there is overwhelming evidence that ASP.NET can do so much more. The old way
is horrible to maintain, can take a long time to develop and there are much better
practices out there. While I was a PHP developer I started using Smarty templates.
I loved having templates that abstracted the presentation from the real code. Smarty
has become one of the defacto standards in PHP development over the years. It gave
me the introduction to using "controls" and "master pages". It made reuse easier and
presentation cleaner. To go so long continuing the same bad practices is unfathomable
to me.<br /><br />
Another thing that amazes me is ASP.NET actually works with server side includes.
The dynamic compiler for the site will included the code and build a DLL for the page.
I'm a bit pissy at MS for even allowing this. The included code is compiled into every
DLL and whenever a change is made every one of those pages must be recompiled. 
<br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=3bbd92fc-f5d7-4445-9c64-8ec69279c6a9" /></body>
      <title>Rant: Some VB.NET developers...</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,3bbd92fc-f5d7-4445-9c64-8ec69279c6a9.aspx</guid>
      <link>http://blog.j-maxx.net/2008/09/29/RantSomeVBNETDevelopers.aspx</link>
      <pubDate>Mon, 29 Sep 2008 19:14:14 GMT</pubDate>
      <description>Ok in the last few years I've had to take over a number of websites written in VB.NET, or I should say written in VB but somehow using .NET. My issue really isn't with VB.NET itself. It's obvious the developers that did these sites (none of them affiliated in any way) came from doing classic ASP and moved onto ASP.NET. The problem is they continued with their classic ASP practices and did not seem to come close to grasping what ASP.NET really was. &lt;br&gt;
&lt;br&gt;
Issues I've had:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;
None of the sites will compile in Visual Studio&lt;/li&gt;
&lt;li&gt;
All of the sites were running in ASP.NET 2.0 but none used master pages. They all
used Server-Side Includes (which should be banned) to include common blocks. 
&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
No use of controls or classes.&lt;/li&gt;
&lt;li&gt;
No use of code-behind&lt;/li&gt;
&lt;li&gt;
All SQL is dynamic and full of SQL Injection vulnerabilities&lt;/li&gt;
&lt;li&gt;
All used include files which set up global variables and functions to be used in the
page lifecycle (one of the main reasons the sites wont compile)&lt;/li&gt;
&lt;li&gt;
One of the sites had every folder set up as it's own application in IIS. Their hosting
provider has no interface for even seeing this, the developer used to call in to have
this set up. More on this site later (refered to as BS1)&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
Most of the sites only make use of the most basic controls&lt;/li&gt;
&lt;li&gt;
One site (BS1) tried to use more advanced controls like Formview but failed miserably.
In this instance, used all over the site, the developer made a formview, used an EditTemplate
and bound a dataset to the formview. Sounds decent so far right? The issue came in
after I made some changes that my data was not being updated in the dataset. Tracking
down the issue was very hard to do when you have no "Go to Definition" and there are
tons of "Include Files" that are copied and pasted throughout the site. I found that
there was a&amp;nbsp; "Magic" function that did what databinding is supposed to do. It
looked for any controls in the formview that matched the exact name of a column and
bound the data. 
&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
BS1 includes so many functions that recreate .NET functionality that his developer
seemed to give up on getting to work within an hour or trying. I want to go home sick
everytime a change comes up on this site.&lt;/li&gt;
&lt;/ul&gt;
Basically on every one of these sites we have pitched rewrites. Most of them on grounds
of security, which is completely true. One of the sites we've had to take down due
to rampant SQL Injections. It wont be up until the client decides on which overhaul
to rewrite proposal they want to to sign off on.&lt;br&gt;
&lt;br&gt;
If the BS1 rewrite ever happens I hope I am not the one to do it. While the site needs
it, the business rules and database behind it are majorly complex and in some points
completely bonkers. Redesigning the database will be completely out of the question
due to the amount of time to migrate that and other business apps the client uses
to work with it. 
&lt;br&gt;
&lt;br&gt;
After all of the things I've seen I'm scared of how many classic ASP developers have
moved to ASP.NET without taking the time to understand what ASP.NET (or even .NET)
is all about. The thing that scares me the most is that it has been 6 years since
.NET was released. Some of the sites were even written starting with ASP.NET 2.0.
Yet the developers probably used Visual Studio as nothing more than a bloated notepad. 
&lt;br&gt;
&lt;br&gt;
I came from doing site development in PHP 3/4. Classic ASP and PHP 3/4 development
were alike in many ways. One would use server side includes to include headers/footers
for the page. There would more than likely be a main include script that set up all
the functions/classes and global variables to be used on the page. All the HTML was
generated with inline code. I can understand moving from an environtment like that
to ASP.NET you may start out recreating what you know. 
&lt;br&gt;
&lt;br&gt;
What I don't understand why these developers never felt a need to move beyond that
when there is overwhelming evidence that ASP.NET can do so much more. The old way
is horrible to maintain, can take a long time to develop and there are much better
practices out there. While I was a PHP developer I started using Smarty templates.
I loved having templates that abstracted the presentation from the real code. Smarty
has become one of the defacto standards in PHP development over the years. It gave
me the introduction to using "controls" and "master pages". It made reuse easier and
presentation cleaner. To go so long continuing the same bad practices is unfathomable
to me.&lt;br&gt;
&lt;br&gt;
Another thing that amazes me is ASP.NET actually works with server side includes.
The dynamic compiler for the site will included the code and build a DLL for the page.
I'm a bit pissy at MS for even allowing this. The included code is compiled into every
DLL and whenever a change is made every one of those pages must be recompiled. 
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=3bbd92fc-f5d7-4445-9c64-8ec69279c6a9" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,3bbd92fc-f5d7-4445-9c64-8ec69279c6a9.aspx</comments>
      <category>Rant</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=19d6ccfd-59c0-48ba-8bdf-5d39a26314d2</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,19d6ccfd-59c0-48ba-8bdf-5d39a26314d2.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,19d6ccfd-59c0-48ba-8bdf-5d39a26314d2.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=19d6ccfd-59c0-48ba-8bdf-5d39a26314d2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">My company just launched a new Recruitment
site http://www.nerdery.com.<br /><br />
We are willing to pay you $50 for sending in a decent code sample and making it to
the interview. I personally love working here, I get paid to learn. As I've said before
I felt like I learned more in the first year working here than in the 5 years I did
prior. The availability of so many cutting edge projects keeps us always on our toes.
When I joined we had 11 employees, now we are up to 75 and are still going strong.
The demand for us keeps going up and we are adding new partners in other parts of
the US to keep it that way. 
<br /><br />
The site has some testimonials and videos . Alas I was on vacation when they did the
videos so I didn't get my butt on there. 
<br /><br />
If you're looking for a fast paced job in the programming industry and live in the
midwest, come check us out.<br /><br /><br /><a href="http://digg.com/programming/50_for_doing_a_code_sample_applying_for_a_Programming_job"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg!" /></a><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=19d6ccfd-59c0-48ba-8bdf-5d39a26314d2" /></body>
      <title>Join the Nerdery - Get $50 for just interviewing</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,19d6ccfd-59c0-48ba-8bdf-5d39a26314d2.aspx</guid>
      <link>http://blog.j-maxx.net/2008/09/24/JoinTheNerderyGet50ForJustInterviewing.aspx</link>
      <pubDate>Wed, 24 Sep 2008 14:49:02 GMT</pubDate>
      <description>My company just launched a new Recruitment site http://www.nerdery.com.&lt;br&gt;
&lt;br&gt;
We are willing to pay you $50 for sending in a decent code sample and making it to
the interview. I personally love working here, I get paid to learn. As I've said before
I felt like I learned more in the first year working here than in the 5 years I did
prior. The availability of so many cutting edge projects keeps us always on our toes.
When I joined we had 11 employees, now we are up to 75 and are still going strong.
The demand for us keeps going up and we are adding new partners in other parts of
the US to keep it that way. 
&lt;br&gt;
&lt;br&gt;
The site has some testimonials and videos . Alas I was on vacation when they did the
videos so I didn't get my butt on there. 
&lt;br&gt;
&lt;br&gt;
If you're looking for a fast paced job in the programming industry and live in the
midwest, come check us out.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="http://digg.com/programming/50_for_doing_a_code_sample_applying_for_a_Programming_job"&gt; &lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg!" /&gt; &lt;/a&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=19d6ccfd-59c0-48ba-8bdf-5d39a26314d2" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,19d6ccfd-59c0-48ba-8bdf-5d39a26314d2.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=91c07bc0-93a3-45b6-a0fd-de18c57fdc94</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,91c07bc0-93a3-45b6-a0fd-de18c57fdc94.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,91c07bc0-93a3-45b6-a0fd-de18c57fdc94.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=91c07bc0-93a3-45b6-a0fd-de18c57fdc94</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">The company I work for, Sierra Bravo Corp,
got its start connecting legacy PICK systems to the modern world. They accomplished
this via a proprietary client-server protocol we internally call db_server (Official
name is SierraDBC or BravoConnecter). Sure there are other PICK connection technologies
out there none of them support multiple PICK systems and OS Platforms. Currently we
support : D3, Universe, UniData, JBase, MvBase and others I don't remember right now.<br /><br />
I maintain the .NET client library. It was originally a port of the Java library which
was a port of the COM library. It's come quite a long way since then. Recently we've
found the need for compression to be added for some of our client. One in particular
has many employees out in the field connecting via AirCards where bandwidth availability
can be a problem. On top of that the application needs to retrieve quite a bit of
real time data from the home office. Retrieving 2mb of client history is not unheard
of.<br /><br />
After the server developer added compression to the result stream I started working
on the client end. I figured it should be a snap. If we have compression turned on,
just pass in a DeflateStream (fed by the NetworkStream of the TcpClient connection)
to the StreamReader we already use to retrieve the results. 
<br /><br /><pre name="code" class="c#">StreamReader ResultReader;
if (IsConnectionTypeSet(ConnectionOptionTypes.EnableCompression))
{
    DeflateStream dfs = new DeflateStream(ns,CompressionMode.Decompress);
    ResultReader = new StreamReader(dfs, Encoding.ASCII, false);
}
else
{
    ResultReader = new StreamReader(ns, Encoding.ASCII, false);
}</pre>One
would think that's all that it would take, right?<br /><br />
I was sadly mistaken. I would receive an exception (System.IO.InvalidDataException:"Block
length does not match with its complement.") every time I would try to read from the
stream.<br /><br />
The issue lies in the use of zlib for the compressed stream. zlib and DEFLATE use
the same algorithm for compression. The difference is zlib sends two bytes of header
data. So all the answers I found were to pop off the first two bytes of the stream.<br /><pre name="code" class="c#">StreamReader ResultReader;
if (IsConnectionTypeSet(ConnectionOptionTypes.EnableCompression))
{
    DeflateStream dfs = new DeflateStream(ns,CompressionMode.Decompress);
    ResultReader = new StreamReader(dfs, Encoding.ASCII, false);
    ns.ReadByte();
    ns.ReadByte();
}
else
{
    ResultReader = new StreamReader(ns, Encoding.ASCII, false);
}</pre> This
worked just fine but I was annoyed about how ugly it looked. I needed to move that
ugliness out of there. So I wrote a ZlibStream class to do this for me. I made it
for only Decompressing streams since I didn't have the budget to go and actually implement
the zlib headers.<br /><br />
[ZlibStream.cs]<br /><pre name="code" class="c#">    /// &lt;summary&gt;
    /// Supports decompressing a DeflateStream created by the zlib library
    /// &lt;/summary&gt;
    class ZlibStream : DeflateStream
    {
        #region Fields

        private bool HasRead = false;

        #endregion

        #region Constructors
        /// &lt;summary&gt;
        /// Initiates ZlibStream in Decompress mode
        /// &lt;/summary&gt;
        /// &lt;param name="stream"&gt;One of the System.IO.Compression.CompressionMode values that indicates the action to take&lt;/param&gt;
        public ZlibStream(Stream stream)
            : base(stream, CompressionMode.Decompress)
        {

        }
        /// &lt;summary&gt;
        /// Initiates ZlibStream in Decompress mode
        /// &lt;/summary&gt;
        /// &lt;param name="stream"&gt;One of the System.IO.Compression.CompressionMode values that indicates the action to take&lt;/param&gt;
        /// &lt;param name="leaveOpen"&gt;true to leave the stream open; otherwise, false.&lt;/param&gt;
        public ZlibStream(Stream stream, bool leaveOpen)
            : base(stream, CompressionMode.Decompress, leaveOpen)
        {

        }
        #endregion

        #region Public Methods

        public override int Read(byte[] array, int offset, int count)
        {
            if (HasRead == false)
            {
                this.BaseStream.ReadByte();
                this.BaseStream.ReadByte();
                this.HasRead = true;
            }
            return base.Read(array, offset, count);
        }

        #endregion

    }</pre>As
you can see it is very simple. Since all the StreamReader does is call the Read method
I just needed to remove those bytes during the first pass.  This class is extremely
simple and limited in its functionality. Doing Asynchronous reads with BeginRead will
not work. I checked via reflector and it does not use the DeflateStream.Read method.
It handles the BaseStream's Read methods on its own. 
<br /><br />
The one thing I may need to expand is doing the popping of the two bytes. Currently
it's not checking to see if the stream has any bytes to read. So far in testing this
hasn't been a problem. I'm going to try and see if I can create a situation where
the bytes are not available initially. I have a suspicion that the ReadByte() waits
for a Byte to be available and errors out on the Timeout value<br /><br />
So my result is as elegant as can be<br /><pre name="code" class="c#">StreamReader ResultReader;
if (IsConnectionTypeSet(ConnectionOptionTypes.EnableCompression))
{
    ZlibStream dfs = new ZlibStream(ns);
    ResultReader = new StreamReader(dfs, Encoding.ASCII, false);
}
else
{
    ResultReader = new StreamReader(ns, Encoding.ASCII, false);
}</pre><br /><p></p><img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=91c07bc0-93a3-45b6-a0fd-de18c57fdc94" /></body>
      <title>DeflateStream and zlib</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,91c07bc0-93a3-45b6-a0fd-de18c57fdc94.aspx</guid>
      <link>http://blog.j-maxx.net/2008/09/19/DeflateStreamAndZlib.aspx</link>
      <pubDate>Fri, 19 Sep 2008 14:42:40 GMT</pubDate>
      <description>The company I work for, Sierra Bravo Corp, got its start connecting legacy PICK systems to the modern world. They accomplished this via a proprietary client-server protocol we internally call db_server (Official name is SierraDBC or BravoConnecter). Sure there are other PICK connection technologies out there none of them support multiple PICK systems and OS Platforms. Currently we support : D3, Universe, UniData, JBase, MvBase and others I don't remember right now.&lt;br&gt;
&lt;br&gt;
I maintain the .NET client library. It was originally a port of the Java library which
was a port of the COM library. It's come quite a long way since then. Recently we've
found the need for compression to be added for some of our client. One in particular
has many employees out in the field connecting via AirCards where bandwidth availability
can be a problem. On top of that the application needs to retrieve quite a bit of
real time data from the home office. Retrieving 2mb of client history is not unheard
of.&lt;br&gt;
&lt;br&gt;
After the server developer added compression to the result stream I started working
on the client end. I figured it should be a snap. If we have compression turned on,
just pass in a DeflateStream (fed by the NetworkStream of the TcpClient connection)
to the StreamReader we already use to retrieve the results. 
&lt;br&gt;
&lt;br&gt;
&lt;pre name="code" class="c#"&gt;StreamReader ResultReader;
if (IsConnectionTypeSet(ConnectionOptionTypes.EnableCompression))
{
    DeflateStream dfs = new DeflateStream(ns,CompressionMode.Decompress);
    ResultReader = new StreamReader(dfs, Encoding.ASCII, false);
}
else
{
    ResultReader = new StreamReader(ns, Encoding.ASCII, false);
}&lt;/pre&gt;One
would think that's all that it would take, right?&lt;br&gt;
&lt;br&gt;
I was sadly mistaken. I would receive an exception (System.IO.InvalidDataException:"Block
length does not match with its complement.") every time I would try to read from the
stream.&lt;br&gt;
&lt;br&gt;
The issue lies in the use of zlib for the compressed stream. zlib and DEFLATE use
the same algorithm for compression. The difference is zlib sends two bytes of header
data. So all the answers I found were to pop off the first two bytes of the stream.&lt;br&gt;
&lt;pre name="code" class="c#"&gt;StreamReader ResultReader;
if (IsConnectionTypeSet(ConnectionOptionTypes.EnableCompression))
{
    DeflateStream dfs = new DeflateStream(ns,CompressionMode.Decompress);
    ResultReader = new StreamReader(dfs, Encoding.ASCII, false);
    ns.ReadByte();
    ns.ReadByte();
}
else
{
    ResultReader = new StreamReader(ns, Encoding.ASCII, false);
}&lt;/pre&gt;&amp;nbsp;This
worked just fine but I was annoyed about how ugly it looked. I needed to move that
ugliness out of there. So I wrote a ZlibStream class to do this for me. I made it
for only Decompressing streams since I didn't have the budget to go and actually implement
the zlib headers.&lt;br&gt;
&lt;br&gt;
[ZlibStream.cs]&lt;br&gt;
&lt;pre name="code" class="c#"&gt;    /// &amp;lt;summary&amp;gt;
    /// Supports decompressing a DeflateStream created by the zlib library
    /// &amp;lt;/summary&amp;gt;
    class ZlibStream : DeflateStream
    {
        #region Fields

        private bool HasRead = false;

        #endregion

        #region Constructors
        /// &amp;lt;summary&amp;gt;
        /// Initiates ZlibStream in Decompress mode
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="stream"&amp;gt;One of the System.IO.Compression.CompressionMode values that indicates the action to take&amp;lt;/param&amp;gt;
        public ZlibStream(Stream stream)
            : base(stream, CompressionMode.Decompress)
        {

        }
        /// &amp;lt;summary&amp;gt;
        /// Initiates ZlibStream in Decompress mode
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name="stream"&amp;gt;One of the System.IO.Compression.CompressionMode values that indicates the action to take&amp;lt;/param&amp;gt;
        /// &amp;lt;param name="leaveOpen"&amp;gt;true to leave the stream open; otherwise, false.&amp;lt;/param&amp;gt;
        public ZlibStream(Stream stream, bool leaveOpen)
            : base(stream, CompressionMode.Decompress, leaveOpen)
        {

        }
        #endregion

        #region Public Methods

        public override int Read(byte[] array, int offset, int count)
        {
            if (HasRead == false)
            {
                this.BaseStream.ReadByte();
                this.BaseStream.ReadByte();
                this.HasRead = true;
            }
            return base.Read(array, offset, count);
        }

        #endregion

    }&lt;/pre&gt;As
you can see it is very simple. Since all the StreamReader does is call the Read method
I just needed to remove those bytes during the first pass.&amp;nbsp; This class is extremely
simple and limited in its functionality. Doing Asynchronous reads with BeginRead will
not work. I checked via reflector and it does not use the DeflateStream.Read method.
It handles the BaseStream's Read methods on its own. 
&lt;br&gt;
&lt;br&gt;
The one thing I may need to expand is doing the popping of the two bytes. Currently
it's not checking to see if the stream has any bytes to read. So far in testing this
hasn't been a problem. I'm going to try and see if I can create a situation where
the bytes are not available initially. I have a suspicion that the ReadByte() waits
for a Byte to be available and errors out on the Timeout value&lt;br&gt;
&lt;br&gt;
So my result is as elegant as can be&lt;br&gt;
&lt;pre name="code" class="c#"&gt;StreamReader ResultReader;
if (IsConnectionTypeSet(ConnectionOptionTypes.EnableCompression))
{
    ZlibStream dfs = new ZlibStream(ns);
    ResultReader = new StreamReader(dfs, Encoding.ASCII, false);
}
else
{
    ResultReader = new StreamReader(ns, Encoding.ASCII, false);
}&lt;/pre&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.j-maxx.net/aggbug.ashx?id=91c07bc0-93a3-45b6-a0fd-de18c57fdc94" /&gt;</description>
      <comments>http://blog.j-maxx.net/CommentView,guid,91c07bc0-93a3-45b6-a0fd-de18c57fdc94.aspx</comments>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://blog.j-maxx.net/Trackback.aspx?guid=4bd0d31d-a9fa-4fe5-accc-fefcc44f0eda</trackback:ping>
      <pingback:server>http://blog.j-maxx.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.j-maxx.net/PermaLink,guid,4bd0d31d-a9fa-4fe5-accc-fefcc44f0eda.aspx</pingback:target>
      <dc:creator>Jeff Klawiter</dc:creator>
      <wfw:comment>http://blog.j-maxx.net/CommentView,guid,4bd0d31d-a9fa-4fe5-accc-fefcc44f0eda.aspx</wfw:comment>
      <wfw:commentRss>http://blog.j-maxx.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4bd0d31d-a9fa-4fe5-accc-fefcc44f0eda</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>LINQ: Refactoring Inline Instantiation</title>
      <guid isPermaLink="false">http://blog.j-maxx.net/PermaLink,guid,4bd0d31d-a9fa-4fe5-accc-fefcc44f0eda.aspx</guid>
      <link>http://blog.j-maxx.net/2008/08/23/LINQRefactoringInlineInstantiation.aspx</link>
      <pubDate>Sat, 23 Aug 2008 20:39:02 GMT</pubDate>
      <description>&lt;p&gt;
Over the summer I was able to run my first large project in .NET 3.5. I had a chance
to put to use all the new features and learned quite a bit on the way. I've blogged
a bit about this project before. The project contained 2 data backends a local SQL
database and a 3rd-party ASMX service. I took the approach of having a business object
library that contain only class definitions that I had full control over. I split
out the backends to their own libraries with a main Datalayer library that handled
the communication with the two underneath it.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Initially I started coding the two bottom layers to do the object instantiation inline
in the LINQ queries. As the layers grew I began to refactor much of the instantiation
to methods that mapped the layer objects to the business objects. 
&lt;/p&gt;
&lt;p&gt;
Converting an inline expression like this
&lt;/p&gt;
&lt;pre name="code" class="c#"&gt;var result = from id in dc.OrderDetails
             where id.OrderID == OrderId
             select new DataObjects.OrderItem()
             {
                 PartID = id.PartID,
                 Price = id.Price,
                 Quantity = id.Quantity
             };
&lt;/pre&gt;
&lt;p&gt;
To this
&lt;/p&gt;
&lt;pre name="code" class="c#"&gt;var result = from id in dc.OrderDetails
             where id.OrderID == OrderId
             select MapOrderDetailToOrderItem(id);
&lt;/pre&gt;
&lt;p&gt;
Using the LINQ to SQL Classes was a perfect fit. They are by far much easier to use
as an ORM than SQL Datasets and DataAdapters are. When retrieving lists such as items
on an order the relationship propertis on the SQL objects made it extremely easy to
have clean data access. 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
After completing the project I started thinking about what the performance impact
of the refactoring had on the data access. So I decided to run some tests. Initially
I thought that the inline instantiation would probably be faster since it was constructing
the object in the expression instead of getting the SQL objects and then passing it
to a function.
&lt;/p&gt;
&lt;p&gt;
I wrote a quick program to do some performance testing on both implementations. I
set up examples using a common real world call. Retrieving an order from a database
with the line items on the order Below you can see the inline call and the refactored
call. 
&lt;br&gt;
&lt;/p&gt;
[Tests.cs]&lt;br&gt;
&lt;pre name="code" class="c#"&gt;    static class Tests
    {
        public static void RunInlineInitialization()
        {
            using (SqlOrdersDataContext dc = new SqlOrdersDataContext())
            {
                var result = from o in dc.OrderHeaders
                             select new DataObjects.Order()
                             {
                                 CustomerID = o.CustomerID,
                                 OrderDate = o.OrderDate,
                                 OrderID = o.OrderID,
                                 OrderTotal = o.Total,
                                 ShippingAddress1 = o.ShippingAddress1,
                                 ShippingAddress2 = o.ShippingAddress2,
                                 ShippingCity = o.ShippingCity,
                                 ShippingDate = o.ShippingDate,
                                 ShippingMethod = o.ShippingMethod,
                                 ShippingState = o.ShippingState,
                                 ShippingTotal = o.ShippingTotal,
                                 ShippingZip = o.ShippingZip,
                                 SubTotal = o.SubTotal,
                                 TaxTotal = o.TaxTotal,
                                 TrackingNumber = o.TrackingNumber,
                                 Details = o.OrderDetails.Select(od =&amp;gt; new DataObjects.OrderItem()
                                 {
                                     PartID = od.PartID,
                                     Price = od.Price,
                                     Quantity = od.Quantity
                                 }).ToList()
                             };
                DataObjects.Order order = result.FirstOrDefault();
            }
        }
        public static void RunRefactoredInitialization()
        {
            using (SqlOrdersDataContext dc = new SqlOrdersDataContext())
            {
                var result = from o in dc.OrderHeaders
                             select MapOrderHeaderToDataObjectOrder(o);
                DataObjects.Order order = result.FirstOrDefault();
            }
        }

        private static LinqTest.DataObjects.Order MapOrderHeaderToDataObjectOrder(OrderHeader o)
        {
            return new DataObjects.Order()
            {
                CustomerID = o.CustomerID,
                OrderDate = o.OrderDate,
                OrderID = o.OrderID,
                OrderTotal = o.Total,
                ShippingAddress1 = o.ShippingAddress1,
                ShippingAddress2 = o.ShippingAddress2,
                ShippingCity = o.ShippingCity,
                ShippingDate = o.ShippingDate,
                ShippingMethod = o.ShippingMethod,
                ShippingState = o.ShippingState,
                ShippingTotal = o.ShippingTotal,
                ShippingZip = o.ShippingZip,
                SubTotal = o.SubTotal,
                TaxTotal = o.TaxTotal,
                TrackingNumber = o.TrackingNumber,
                Details = MapOrderDetailToDataObjectOrderItem(o)
            };
        }

        private static List&amp;lt;LinqTest.DataObjects.OrderItem&amp;gt; MapOrderDetailToDataObjectOrderItem(OrderHeader o)
        {
            return o.OrderDetails.Select(od =&amp;gt; new DataObjects.OrderItem()
            {
                PartID = od.PartID,
                Price = od.Price,
                Quantity = od.Quantity
            }).ToList();
        }
    }&lt;/pre&gt;
&lt;p&gt;
As you can see both public methods do the same thing. The second test was refactored
easily using the Refactor-Extract Method menu item in Visual Studio. I load the orders
from the database, take the SQL OrderHeader object and map it to the business object.
The Details property on the Order object is simply a generic list of OrderItems. To
retrieve them I do a quick lambda expression to query the OrderDetails relationship
property.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
For some the refactoring goes without saying. Modularizing code like this makes it
more maintainable and reusable. This concept can be foreign to some procedural programmers.
With Visual Studio and addins like Resharper refactoring becomes so easy it's almost
an afterthought to do it. For anyone that still doesn't see the benefit with refactoring,
I hope this article will help you.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
The testing program is pretty simple, pass in the amount of iterations and a boolean
to turn pre-JITing on or off. 
&lt;br&gt;
&lt;/p&gt;
[Program.cs - (some code removed for brevity)]&lt;br&gt;
&lt;pre name="code" class="c#"&gt;        static System.Diagnostics.Stopwatch stp = new System.Diagnostics.Stopwatch();
        static int Runs = 10;
        static bool PreJitRoutines = false;
        
        static void Main(string[] args)
        {
            ProcessCommandLineArguments(args);

            //Lets get JIT over all the methods in question
            if (PreJitRoutines)
            {
                PreJitTestRoutines();
            }
            //Display Current Selected Options
            Console.WriteLine("Number of Runs: {0}", Runs);
            Console.WriteLine("Pre JIT Enabled: {0}", PreJitRoutines);
            
            //Run and Measure Inline Test
            stp.Start();
            for (int i = 0; i &amp;lt;= Runs; i++)
            {
                Tests.RunInlineInitialization();
            }
            stp.Stop();
            //Display Test Results
            Console.WriteLine("Inline Initialization Test: {0} , Average: {1}", stp.Elapsed, new TimeSpan(stp.ElapsedTicks/Runs));
           
            //Save Result for later calculations
            TimeSpan FirstRun = stp.Elapsed;
            
            //Reset StopWatch
            stp.Reset();

            //Run and Measure Refactored Test
            stp.Start();
            for (int i = 0; i &amp;lt;= Runs; i++)
            {
                Tests.RunRefactoredInitialization();
            }
            stp.Stop();
            //Display Refactored test results
            Console.WriteLine("Refactored Initialization Test: {0} , Average: {1}", stp.Elapsed, new TimeSpan(stp.ElapsedTicks / Runs));
            
            //Perform and report comparisons between tests
            if (FirstRun.CompareTo(stp.Elapsed)&amp;lt;0)
                Console.WriteLine("Inline Construction Faster: {0:f}", stp.Elapsed.TotalMilliseconds / FirstRun.TotalMilliseconds);
            else
                Console.WriteLine("Refactored Construction Faster: {0:f}", FirstRun.TotalMilliseconds / stp.Elapsed.TotalMilliseconds);

        }
&lt;/pre&gt;
&lt;p&gt;
I ran the tests in release mode with iterations of 1, 10, 100 and 1000.&lt;br&gt;
&lt;/p&gt;
&lt;pre&gt;&amp;gt;LinqTest.exe 1  true
Number of Runs: 1
Pre JIT Enabled:  True
Inline  Initialization Test: 00:00:00.0124051 , Average: 00:00:00.0177619
Refactored  Initialization Test: 00:00:00.0121951 , Average: 00:00:00.0174613
Refactored  Construction Faster: 1.02


&amp;gt;LinqTest.exe  10 true
Number of Runs: 10
Pre JIT Enabled:  True
Inline  Initialization Test: 00:00:00.0701888 , Average: 00:00:00.0100497
Refactored  Initialization Test: 00:00:00.0650985 , Average: 00:00:00.0093209
Refactored  Construction Faster: 1.08


&amp;gt;LinqTest.exe  100 true
Number of Runs:  100
Pre JIT Enabled:  True
Inline  Initialization Test: 00:00:00.6291376 , Average: 00:00:00.0090081
Refactored  Initialization Test: 00:00:00.5354964 , Average: 00:00:00.0076673
Refactored  Construction Faster: 1.17


&amp;gt;LinqTest.exe  1000 true
Number of Runs:  1000
Pre JIT Enabled:  True
Inline  Initialization Test: 00:00:06.2699034 , Average: 00:00:00.0089773
Refactored  Initialization Test: 00:00:05.3725538 , Average: 00:00:00.0076925
Refactored  Construction Faster: 1.17
&lt;/pre&gt;
&lt;p&gt;
As you can see at 1 iteration there's barely a difference. As we move up the scale
the refactored code does consistently outperform the inline expression. This outcome
was different from my initial hypothesis. I decided to dig a bit deeper and find out
why. So I pulled out ILDasm to see what was going on. I was surprised to see that
the IL generated for inline test was twice as long as the refactored test. Looking
at the code it became clear what was going on. 
&lt;/p&gt;
Inline IL&lt;br&gt;
&lt;pre&gt; IL_0042:   stloc.3
 IL_0043:   ldloc.3
 IL_0044:   ldc.i4.0
 IL_0045:   ldtoken    method instance void  LinqTest.DataObjects.Order::set_CustomerID(int32)
 IL_004a:   call       class [mscorlib]System.Reflection.MethodBase  [mscorlib]System.Reflection.MethodBase::GetMethodFromHandle(valuetype  [mscorlib]System.RuntimeMethodHandle)
 IL_004f:   castclass  [mscorlib]System.Reflection.MethodInfo
 IL_0054:   ldloc.2
 IL_0055:   ldtoken    method instance int32  LinqTest.OrderHeader::get_CustomerID()
 IL_005a:   call       class [mscorlib]System.Reflection.MethodBase  [mscorlib]System.Reflection.MethodBase::GetMethodFromHandle(valuetype  [mscorlib]System.RuntimeMethodHandle)
 IL_005f:   castclass  [mscorlib]System.Reflection.MethodInfo
 IL_0064:   call       class  [System.Core]System.Linq.Expressions.MemberExpression  [System.Core]System.Linq.Expressions.Expression::Property(class  [System.Core]System.Linq.Expressions.Expression,
 class  [mscorlib]System.Reflection.MethodInfo)
 IL_0069:   call       class  [System.Core]System.Linq.Expressions.MemberAssignment  [System.Core]System.Linq.Expressions.Expression::Bind(class  [mscorlib]System.Reflection.MethodInfo,
 class  [System.Core]System.Linq.Expressions.Expression)
&lt;/pre&gt;
Refactored IL&lt;br&gt;
&lt;pre&gt; IL_0005:   stloc.0
 IL_0006:   ldloc.0
 IL_0007:   ldarg.0
 IL_0008:   callvirt   instance int32 LinqTest.OrderHeader::get_CustomerID()
 IL_000d:   callvirt   instance void  LinqTest.DataObjects.Order::set_CustomerID(int32)
&lt;/pre&gt;
&lt;p&gt;
The inline call uses reflection on the objects to build the instantiation into the
expression tree. It has to load the information about the SQL OrderHeader.CustomerID
property via reflection. It then does the same thing for Order.CustomerID on the business
object. After that it takes the value loaded from the sql object and binds it to the
business object.&amp;nbsp; 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
The refactored code skips the reflection entirely. Since the method is expecting an
order object LINQ to SQL just needs to do what it does best, load data from the database
and map it to the ORM object. The refactored methods just need to do straight property
assignment&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Now most of this testing was doing with the C# LINQ syntax and not the chained function
calls. I'm going to dig a bit deeper and recreate this with pure lambda expressions
and see how that stacks up. I have a feeling they will probably perform close to the
refactored examples
&lt;/p&gt;
&lt;p&gt;
Another thing that makes me curious is the plateau reached and the differences between
1 to 100 iterations. I have a sneaking suspiscion that some of this maybe related
to the JIT compiler and the garbage collector optimizing for the pattern of execution.
I'll probably throw in some garbage collection counters to see how different they
are.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
So for now the moral of the story is refactoring is not only good for code reuse,
simplicity it can also help increase performance. Without moving the mapping into
another method other calls would have increased JIT time due to