<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:idx="urn:atom-extension:indexing" xmlns:gr="http://www.google.com/schemas/reader/atom/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" idx:index="no"><!--
Content-type: Preventing XSRF in IE.

--><generator uri="http://www.google.com/reader">Google Reader</generator><id>tag:google.com,2005:reader/user/03932364210302262295/label/indyndabloggers</id><title type="text">IndyNDA Bloggers</title><gr:continuation>CIag8r_Mw5kC</gr:continuation><author><name>Jeff</name></author><updated>2009-06-30T22:09:21Z</updated><subtitle type="html">A blog roll of people that attend the Indianapolis .NET Users Group (IndyNDA) and blog about software development, programming, and .net.</subtitle><link rel="self" href="http://feeds.feedburner.com/indyndabloggers" type="application/atom+xml" /><entry gr:crawl-timestamp-msec="1246399761754"><id gr:original-id="d10481e0-d7e7-4234-9ab6-db53a9657b7e:8917">tag:google.com,2005:reader/item/8fdba03e5df8dcb2</id><title type="html">Wow… simply wow.</title><published>2009-06-30T22:01:48Z</published><updated>2009-06-30T22:01:48Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/eUnynvzHWyY/wow-simply-wow.aspx" type="text/html" /><summary xml:base="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="html">&lt;p&gt;I attended Ken’s ScrumMaster (tm) course over the last two days. Possibly more on that later, but for not I want to focus on something entirely different. People are just very incredibly decent when it comes right down to it. &lt;/p&gt;  &lt;p&gt;Ken has an absolution jar in the center of the room to catch the $1 owed for being late back to your table or for cussing in the course. Each day a charity is chosen that has a connection to somebody in the room for the money to go to afterward. On Monday, I mentioned that I ran Dan Shi Martial Arts club, and it was selected as Monday’s charity. By the end of the day the jar held $21, and I took $20 of it to deposit as an anonymous donation. Awesome idea, and thank you everybody!&lt;/p&gt;  &lt;p&gt;Tuesday morning I thanked everybody during the morning agenda for sharing their sins with the needy, and commented that they’d sponsored a single student for a single month, which is hugely appreciated. At some point during the day, people must have talked it around, because around 3pm Ken tapped me on the shoulder and told me that the group had collectively decided to send Tuesday’s money Dan Shi’s way as well… THANK YOU!&lt;/p&gt;  &lt;p&gt;Around 4:45 I straightened up the money because I was having problems putting my dollar in for being late back from break. I counted ~$30 at that point. At 5:15 I collected the money, and found &lt;strong&gt;&lt;u&gt;&lt;em&gt;EIGHTY THREE DOLLARS &lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;in the mug. Everybody, thank you! That is hugely significant to an unfunded organization, and we thank you very very much.&lt;/p&gt;  &lt;p&gt;You have collectively allowed us to sponsor a child for almost half a year. Thank you.  You are all awesome, and it just reminds again that no matter how much we may disagree, argue, or bicker professionally, every single individual is first and foremost a person doing the best they can do.&lt;/p&gt;&lt;img src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=8917" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/eUnynvzHWyY" height="1" width="1"/&gt;</summary><author><name>willeke</name></author><source gr:stream-id="feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx"><id>tag:google.com,2005:reader/feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx</id><title type="html">Rediscovering the Obvious</title><link rel="alternate" href="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="text/html" /></source><feedburner:origLink>http://manicprogrammer.com/cs/blogs/willeke/archive/2009/06/30/wow-simply-wow.aspx</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1246299209068"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/06/29/new-screencast-working-with-property-grids/">tag:google.com,2005:reader/item/0efea2abd77e3d15</id><category term="Webcast" /><title type="html">New Screencast: Working with Property Grids</title><published>2009-06-29T16:56:23Z</published><updated>2009-06-29T16:56:23Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/z6xahZe6Bv0/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/06/screencast1thumbthumbthumb1.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px" title="screencast1thumbthumb-thumb1" border="0" alt="screencast1thumbthumb-thumb1" align="right" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/06/screencast1thumbthumbthumb1-thumb.png" width="128" height="128"&gt;&lt;/a&gt; I have a new 8 min 7 sec training webcast up over working with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.propertygrid.aspx"&gt;PropertyGrid&lt;/a&gt; control in Windows Forms applications.&lt;/p&gt;
&lt;p&gt;The video is available through &lt;a href="http://www.jupitermedia.com"&gt;JupiterMedia&lt;/a&gt; and can be viewed at &lt;a href="http://www.internet.com/video/"&gt;http://www.internet.com/video/&lt;/a&gt;. Just look for the &amp;quot;Developer Video&amp;quot; titled &amp;quot;Working with Property Grids&amp;quot;.&lt;/p&gt;
&lt;p&gt;Direct links are:    &lt;br&gt;&lt;a title="http://www.internet.com/video/?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=27475045001" href="http://www.internet.com/video/?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=27475045001"&gt;http://www.internet.com/video/?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=27475045001&lt;/a&gt;&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/06/29/new-screencast-working-with-property-grids/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/06/29/new-screencast-working-with-property-grids/&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=YwraF83HXcw:O6v9T77Ur6o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=YwraF83HXcw:O6v9T77Ur6o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=YwraF83HXcw:O6v9T77Ur6o:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=YwraF83HXcw:O6v9T77Ur6o:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=YwraF83HXcw:O6v9T77Ur6o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=YwraF83HXcw:O6v9T77Ur6o:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=YwraF83HXcw:O6v9T77Ur6o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=YwraF83HXcw:O6v9T77Ur6o:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=YwraF83HXcw:O6v9T77Ur6o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=YwraF83HXcw:O6v9T77Ur6o:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=YwraF83HXcw:O6v9T77Ur6o:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/YwraF83HXcw" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/z6xahZe6Bv0" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/YwraF83HXcw/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1244639912364"><id gr:original-id="tag:blogger.com,1999:blog-6800934446457898793.post-680453867994856278">tag:google.com,2005:reader/item/d60ffac42d21608b</id><title type="html">The First Few Milliseconds of an HTTPS Connection</title><published>2009-06-10T12:57:00Z</published><updated>2009-06-11T03:49:18Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/uj5tqMoY4Iw/first-few-milliseconds-of-https.html" type="text/html" /><content xml:base="http://www.moserware.com/" type="html">&lt;p&gt;Convinced from spending hours reading &lt;a href="http://www.amazon.com/Tuscan-Whole-Milk-Gallon-128/product-reviews/B00032G1S0/ref=dp_top_cm_cr_acr_txt?ie=UTF8&amp;amp;showViewpoints=1"&gt;rave reviews&lt;/a&gt;, Bob eagerly clicked "Proceed to Checkout" for his gallon of &lt;a href="http://www.amazon.com/gp/product/B00032G1S0?ie=UTF8&amp;amp;tag=moserware-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B00032G1S0"&gt;Tuscan Whole Milk&lt;/a&gt; and...&lt;/p&gt;&lt;p&gt;Whoa! What just happened?&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_Zfbv3mHcYrc/ShgnOU1MihI/AAAAAAAABNI/BAF-YQdhkJU/s1600-h/securitysymbols.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Zfbv3mHcYrc/ShgnOU1MihI/AAAAAAAABNI/BAF-YQdhkJU/s400/securitysymbols.png"&gt;&lt;/a&gt; &lt;p&gt;In the 220 milliseconds that flew by, a lot of interesting stuff happened to make Firefox change the address bar color and put a lock in the lower right corner. With the help of &lt;a href="http://www.wireshark.org/"&gt;Wireshark&lt;/a&gt;, my favorite network tool, and a slightly modified debug build of Firefox, we can see &lt;i&gt;exactly&lt;/i&gt; what's going on.&lt;/p&gt;&lt;p&gt;By agreement of &lt;a href="http://tools.ietf.org/html/rfc2818"&gt;RFC 2818&lt;/a&gt;, Firefox knew that "https" meant it should connect to &lt;a href="http://tools.ietf.org/html/rfc2818#section-2.3"&gt;port 443&lt;/a&gt; at Amazon.com:&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_Zfbv3mHcYrc/Si8K9mA5QcI/AAAAAAAABOI/1agNWSS6NBE/s1600-h/httpsport.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Zfbv3mHcYrc/Si8K9mA5QcI/AAAAAAAABOI/1agNWSS6NBE/s400/httpsport.png"&gt;&lt;/a&gt; &lt;p&gt;Most people associate HTTPS with &lt;a title="SSL" href="http://en.wikipedia.org/wiki/Secure_Sockets_Layer"&gt;SSL&lt;/a&gt; (Secure Sockets Layer) which was &lt;a title="created by Netscape" href="http://www.mozilla.org/projects/security/pki/nss/history.html"&gt;created by Netscape in the mid 90's&lt;/a&gt;. This is becoming less true over time. As Netscape lost market share, SSL's maintenance moved to the Internet Engineering Task Force (&lt;a href="http://en.wikipedia.org/wiki/IETF"&gt;IETF&lt;/a&gt;). The first post-Netscape version was re-branded as Transport Layer Security (&lt;a href="http://en.wikipedia.org/wiki/Secure_Sockets_Layer"&gt;TLS&lt;/a&gt;) 1.0 which &lt;a href="http://tools.ietf.org/html/rfc2246"&gt;was released&lt;/a&gt; in January 1999. It's rare to see true "SSL" traffic given that TLS has been around for 10 years. &lt;/p&gt;&lt;h4&gt;Client Hello&lt;/h4&gt;&lt;p&gt;TLS wraps all traffic in "records" of different types. We see that the first byte out of our browser is the hex byte 0x16 = 22 which &lt;a title="means" href="http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml"&gt;means&lt;/a&gt; that this is a "handshake" record:&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_Zfbv3mHcYrc/Si-df4pU51I/AAAAAAAABQg/A1flWimwg9M/s1600-h/clienthellowithannotations.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Zfbv3mHcYrc/Si-df4pU51I/AAAAAAAABQg/A1flWimwg9M/s400/clienthellowithannotations.png"&gt;&lt;/a&gt; &lt;p&gt;The next two bytes are 0x0301 which indicate that this is a version 3.1 record which shows that TLS 1.0 is essentially SSL 3.1. &lt;/p&gt;&lt;p&gt;The handshake record is broken out into several messages. The first is our "Client Hello" message (0x01). There are a few important things here:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Random:&lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Si8g9EXh8uI/AAAAAAAABOY/oBt1zr_n1XE/s1600-h/randomclientbytes.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Si8g9EXh8uI/AAAAAAAABOY/oBt1zr_n1XE/s400/randomclientbytes.png"&gt;&lt;/a&gt;&lt;br&gt;There are four bytes representing the current Coordinated Universal Time (&lt;a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time"&gt;UTC&lt;/a&gt;) in the Unix epoch format, which is the number of seconds since January 1, 1970. In this case, 0x4a2f07ca. It's followed by 28 random bytes. This will be used later on. &lt;/li&gt;&lt;li&gt;Session ID:&lt;br&gt;&lt;br&gt;&lt;a href="http://4.bp.blogspot.com/_Zfbv3mHcYrc/Si8iGgIk_gI/AAAAAAAABOg/NsPg9pMMpCw/s1600-h/sessionid.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Zfbv3mHcYrc/Si8iGgIk_gI/AAAAAAAABOg/NsPg9pMMpCw/s400/sessionid.png"&gt;&lt;/a&gt;&lt;br&gt;Here it's empty/null. If we had previously connected to Amazon.com a few seconds ago, we could potentially resume a session and avoid a full handshake. &lt;/li&gt;&lt;li&gt;Cipher Suites:&lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Si8i6DwZDiI/AAAAAAAABOo/_Pv_1d-PbgU/s1600-h/ciphersuites.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Si8i6DwZDiI/AAAAAAAABOo/_Pv_1d-PbgU/s400/ciphersuites.png"&gt;&lt;/a&gt;&lt;br&gt;This is a list of all of the encryption algorithms that the browser is willing to support. Its top pick is a very strong choice of "&lt;a href="http://en.wikipedia.org/wiki/Secure_Sockets_Layer"&gt;TLS&lt;/a&gt;_&lt;a href="http://en.wikipedia.org/wiki/Elliptic_Curve_Diffie-Hellman"&gt;ECDHE&lt;/a&gt;_&lt;a href="http://en.wikipedia.org/wiki/Elliptic_Curve_DSA"&gt;ECDSA&lt;/a&gt;_WITH_&lt;a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"&gt;AES&lt;/a&gt;_256_&lt;a href="http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29"&gt;CBC&lt;/a&gt;_&lt;a href="http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-0_and_SHA-1"&gt;SHA&lt;/a&gt;" followed by 33 others that it's willing to accept. Don't worry if none of that makes sense. We'll find out later that Amazon doesn't pick our first choice anyway. &lt;/li&gt;&lt;li&gt;&lt;a title="server_name extension" href="http://tools.ietf.org/html/rfc4366#section-3.1"&gt;server_name extension&lt;/a&gt;:&lt;br&gt;&lt;br&gt;&lt;a href="http://1.bp.blogspot.com/_Zfbv3mHcYrc/Si8jtnutNFI/AAAAAAAABOw/Czowyq3F-6Y/s1600-h/server_name.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Zfbv3mHcYrc/Si8jtnutNFI/AAAAAAAABOw/Czowyq3F-6Y/s400/server_name.png"&gt;&lt;/a&gt;&lt;br&gt;This is a way to tell Amazon.com that our browser is trying to reach &lt;a href="https://www.amazon.com/"&gt;https://www.amazon.com/&lt;/a&gt;. This is really convenient because our TLS handshake occurs long before any HTTP traffic. HTTP has a &lt;a title="" href="http://tools.ietf.org/html/rfc2616#section-14.23"&gt;"Host" header&lt;/a&gt; which allows a cost-cutting Internet hosting companies to pile hundreds of websites onto a single IP address. SSL has traditionally required a different IP for each site, but this extension allows the server to respond with the appropriate certificate that the browser is looking for. If nothing else, this extension should allow an extra week or so of IPv4 addresses. &lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Server Hello&lt;/h4&gt;&lt;p&gt;Amazon.com replies with a handshake record that's a massive two packets in size (2,551 bytes). The record has version bytes of 0x0301 meaning that Amazon agreed to our request to use TLS 1.0. This record has three sub-messages with some interesting data:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;"Server Hello" Message (2):&lt;br&gt;&lt;a href="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si-euEnAA6I/AAAAAAAABQo/l4-KRrTyNWY/s1600-h/serverhello.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si-euEnAA6I/AAAAAAAABQo/l4-KRrTyNWY/s400/serverhello.png"&gt;&lt;/a&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;We get the server's four byte time Unix epoch time representation and its 28 random bytes that will be used later.&lt;br&gt;&lt;/li&gt;&lt;li&gt;A 32 byte session ID in case we want to reconnect without a big handshake.&lt;br&gt;&lt;/li&gt;&lt;li&gt;Of the 34 cipher suites we offered, Amazon picked "TLS_RSA_WITH_RC4_128_MD5" (0x0004). This means that it will use the "&lt;a href="http://en.wikipedia.org/wiki/RSA"&gt;RSA&lt;/a&gt;" &lt;a href="http://en.wikipedia.org/wiki/Public-key_cryptography"&gt;public key&lt;/a&gt; algorithm to verify certificate signatures and exchange keys, the &lt;a href="http://en.wikipedia.org/wiki/RC4"&gt;RC4&lt;/a&gt; encryption algorithm to encrypt data, and the &lt;a href="http://en.wikipedia.org/wiki/MD5"&gt;MD5&lt;/a&gt; hash function to verify the contents of messages. We'll cover these in depth later on. I personally think Amazon had selfish reasons for choosing this cipher suite. Of the ones on the list, it was the one that was least CPU intensive to use so that Amazon could crowd more connections onto each of their servers. A much less likely &lt;span style="font-size:85%"&gt;possibility &lt;/span&gt;is that they wanted to pay special tribute to &lt;a href="http://en.wikipedia.org/wiki/Ronald_L._Rivest"&gt;Ron Rivest&lt;/a&gt;, who created all three of these algorithms.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Certificate Message (11):&lt;br&gt;&lt;br&gt;&lt;a href="http://4.bp.blogspot.com/_Zfbv3mHcYrc/Si8lTxR3m0I/AAAAAAAABPA/I-le95y0ldw/s1600-h/certificatemessage.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Zfbv3mHcYrc/Si8lTxR3m0I/AAAAAAAABPA/I-le95y0ldw/s400/certificatemessage.png"&gt;&lt;/a&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;This message takes a whopping 2,464 bytes and is the certificate that the client can use to validate Amazon's. It isn't anything fancy. You can view most of its contents in your browser:&lt;br&gt;&lt;br&gt;&lt;a href="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Sirx5XZBa5I/AAAAAAAABNo/Z-R75rsjCL8/s1600-h/AmazonBasicCertInfo.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Sirx5XZBa5I/AAAAAAAABNo/Z-R75rsjCL8/s400/AmazonBasicCertInfo.png"&gt;&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;"Server Hello Done" Message (14):&lt;br&gt;&lt;br&gt;&lt;a href="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8l2fMvVlI/AAAAAAAABPI/QrxJ3S9ezOo/s1600-h/serverhellodone.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8l2fMvVlI/AAAAAAAABPI/QrxJ3S9ezOo/s400/serverhellodone.png"&gt;&lt;/a&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;This is a zero byte message that tells the client that it's done with the "Hello" process and indicate that the server won't be asking the client for a certificate.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Checking out the Certificate&lt;/h4&gt;&lt;p&gt;The browser has to &lt;a href="http://www.koders.com/c/fid340AB659241B7C717B5B3E0095BBA4245FCE34FD.aspx#L862"&gt;figure out&lt;/a&gt; if it should trust Amazon.com. In this case, it's using certificates. It looks at Amazon's certificate and &lt;a href="http://www.koders.com/c/fid9207CD3EB61F5F08E38858D14997264BEDB5B62C.aspx#L1091"&gt;sees&lt;/a&gt; that the current time is between the "not before" time of August 26th, 2008 and before the "not after" time of August 27, 2009. It also &lt;a href="http://www.koders.com/c/fid9207CD3EB61F5F08E38858D14997264BEDB5B62C.aspx?s=CERT_CheckCertValidTimes#L1211"&gt;checks&lt;/a&gt; to make sure that the certificate's public key is authorized for exchanging secret keys. &lt;/p&gt;&lt;p&gt;Why should we trust this certificate? &lt;/p&gt;&lt;p&gt;Attached to the certificate is a "signature" that is just a really long number in &lt;a href="http://en.wikipedia.org/wiki/Endianness#Big-endian"&gt;big-endian&lt;/a&gt; format:&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_Zfbv3mHcYrc/SihpJBoNeDI/AAAAAAAABNg/DgLY221ncEo/s1600-h/AmazonCertSigned.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Zfbv3mHcYrc/SihpJBoNeDI/AAAAAAAABNg/DgLY221ncEo/s400/AmazonCertSigned.png"&gt;&lt;/a&gt; &lt;p&gt;Anyone could have sent us these bytes. Why should we trust this signature? To answer that question, need to make a speedy detour into &lt;a title="mathemagic land" href="http://en.wikipedia.org/wiki/Donald_in_Mathmagic_Land"&gt;mathemagic land&lt;/a&gt;:&lt;/p&gt;&lt;h4&gt;Interlude: A Short, Not &lt;i&gt;Too&lt;/i&gt; Scary, Guide to RSA&lt;/h4&gt;&lt;p&gt;People &lt;a href="http://stackoverflow.com/questions/575561/do-programmers-have-to-be-good-in-mathematics-closed"&gt;sometimes wonder&lt;/a&gt; if math has any relevance to programming. Certificates give a very practical example of applied math. Amazon's certificate tells us that we should use the RSA algorithm to check the signature. &lt;a title="RSA" href="http://en.wikipedia.org/wiki/RSA"&gt;RSA&lt;/a&gt; was created in the 1970's by MIT professors &lt;a title="Ron Rivest" href="http://people.csail.mit.edu/rivest/"&gt;Ron *R*ivest&lt;/a&gt;, &lt;a title="Adi  Shamir" href="http://en.wikipedia.org/wiki/Adi_Shamir"&gt;Adi *S*hamir&lt;/a&gt;, and &lt;a title="Len  Adleman" href="http://en.wikipedia.org/wiki/Leonard_Adleman"&gt;Len *A*dleman&lt;/a&gt; who found a &lt;a title="tied together" href="http://people.csail.mit.edu/rivest/Rsapaper.pdf"&gt;clever way&lt;/a&gt; to combine ideas spanning &lt;a title="Greek mathematician from 300 BC" href="http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm"&gt;2000&lt;/a&gt; &lt;a title="a third century AD Chinese mathematician" href="http://en.wikipedia.org/wiki/Chinese_remainder_theorem"&gt;years&lt;/a&gt; &lt;a title="a 17th century French judge" href="http://en.wikipedia.org/wiki/Fermat%27s_little_theorem"&gt;of&lt;/a&gt; &lt;a title="18th century math wizard" href="http://en.wikipedia.org/wiki/Euler_totient_function"&gt;math&lt;/a&gt; development to come up with a &lt;a href="http://mathworld.wolfram.com/RSAEncryption.html"&gt;beautifully simple algorithm&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;You &lt;a title="pick" href="http://en.wikipedia.org/wiki/Primality_test"&gt;pick&lt;/a&gt; two huge prime numbers "p" and "q." Multiply them to get "n = p*q." Next, you pick a small public &lt;a href="http://en.wikipedia.org/wiki/Exponentiation"&gt;exponent&lt;/a&gt; "e" which is the "encryption exponent" and &lt;a title="a specially crafted inverse" href="http://en.wikipedia.org/wiki/Modular_multiplicative_inverse"&gt;a specially crafted inverse&lt;/a&gt; of "e" called "d" as the "decryption exponent." You then &lt;b&gt;make "n" and "e" public and keep "d" as secret as you possibly can&lt;/b&gt; and then throw away "p" and "q" (or keep them as secret as "d"). It's really important to remember that "e" and "d" are inverses of each other. &lt;/p&gt;&lt;p&gt;Now, if you have some message, you just need to interpret its bytes as a number "M." If you want to "encrypt" a message to create a "ciphertext", you'd calculate:&lt;/p&gt;&lt;p&gt;C ≡ M&lt;sup&gt;e&lt;/sup&gt; (mod n)&lt;/p&gt;&lt;p&gt;This means that you multiply "M" by itself "e" times. The "mod n" means that we only take the remainder (e.g. "&lt;a href="http://en.wikipedia.org/wiki/Modular_arithmetic"&gt;modulus&lt;/a&gt;") when dividing by "n." For example, 11 AM + 3 hours ≡ 2 (PM) (mod 12 hours). The other recipient knows "d" which allows them to invert the message to recover the original message:&lt;/p&gt;&lt;p&gt;C&lt;sup&gt;d&lt;/sup&gt; ≡ (M&lt;sup&gt;e&lt;/sup&gt;)&lt;sup&gt;d&lt;/sup&gt; ≡ M&lt;sup&gt;e*d&lt;/sup&gt; ≡ M&lt;sup&gt;1&lt;/sup&gt; ≡ M (mod n)&lt;/p&gt;&lt;p&gt;Just as interesting is that the person with "d" can "sign" a document by raising a message "M" to the "d" exponent:&lt;/p&gt;&lt;p&gt;M&lt;sup&gt;d&lt;/sup&gt; ≡ S (mod n)&lt;/p&gt;&lt;p&gt;This works because "signer" makes public "S", "M", "e", and "n." Anyone can verify the signature "S" with a simple calculation:&lt;/p&gt;&lt;p&gt;S&lt;sup&gt;e&lt;/sup&gt; ≡ (M&lt;sup&gt;d&lt;/sup&gt;)&lt;sup&gt;e&lt;/sup&gt; ≡ M&lt;sup&gt;d*e&lt;/sup&gt; ≡ M&lt;sup&gt;e*d&lt;/sup&gt; ≡ M&lt;sup&gt;1&lt;/sup&gt; ≡ M (mod n)&lt;/p&gt;&lt;p&gt;Public key cryptography algorithms like RSA are often called "asymmetric" algorithms because the encryption key (in our case, "e") is not equal to (e.g. "symmetric" with) the decryption key "d". Reducing everything "mod n" makes it impossible to use the easy techniques that we're used to such as normal &lt;a href="http://en.wikipedia.org/wiki/Logarithm"&gt;logarithms&lt;/a&gt;. The magic of RSA works because you can calculate/encrypt C ≡ M&lt;sup&gt;e&lt;/sup&gt; (mod n) &lt;a href="http://en.wikipedia.org/wiki/Modular_exponentiation"&gt;very quickly&lt;/a&gt;, but it is &lt;i&gt;really hard&lt;/i&gt; to calculate/decrypt C&lt;sup&gt;d&lt;/sup&gt; ≡ M (mod n) without knowing "d." As we saw earlier, "d" is derived from &lt;a href="http://en.wikipedia.org/wiki/Integer_factorization"&gt;factoring&lt;/a&gt; "n" back to its "p" and "q", which is a &lt;a href="http://en.wikipedia.org/wiki/NP_%28complexity%29"&gt;tough problem&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;Verifying Signatures&lt;/h4&gt;&lt;p&gt;The big thing to keep in mind with RSA in the real world is that all of the numbers involved have to be &lt;i&gt;big&lt;/i&gt; to make things really hard to break using the &lt;a href="http://en.wikipedia.org/wiki/General_number_field_sieve"&gt;best algorithms that we have&lt;/a&gt;. How big? Amazon.com's certificate was "signed" by "VeriSign Class 3 Secure Server CA." From the certificate, we see that this VeriSign modulus "n" is 2048 bits long which has this 617 digit base-10 representation:&lt;/p&gt;&lt;blockquote&gt;1890572922 9464742433 9498401781 6528521078 8629616064 3051642608 4317020197 7241822595 6075980039 8371048211 4887504542 4200635317 0422636532 2091550579 0341204005 1169453804 7325464426 0479594122 4167270607 6731441028 3698615569 9947933786 3789783838 5829991518 1037601365 0218058341 7944190228 0926880299 3425241541 4300090021 1055372661 2125414429 9349272172 5333752665 6605550620 5558450610 3253786958 8361121949 2417723618 5199653627 5260212221 0847786057 9342235500 9443918198 9038906234 1550747726 8041766919 1500918876 1961879460 3091993360 6376719337 6644159792 1249204891 7079005527 7689341573 9395596650 5484628101 0469658502 1566385762 0175231997 6268718746 7514321&lt;/blockquote&gt;&lt;p&gt;(Good luck trying to find "p" and "q" from this "n" - if you could, you could generate real-looking VeriSign certificates.)&lt;/p&gt;&lt;p&gt;VeriSign's "e" is 2^16 + 1 = 65537. Of course, they keep their "d" value secret, probably on a safe hardware device protected by retinal scanners and armed guards. Before signing, VeriSign checked the validity of the contents that Amazon.com claimed on its certificate using a real-world "handshake" that involved &lt;a href="http://www.verisign.com/ssl/ssl-information-center/ssl-basics/index.html#a7"&gt;looking at several of their business documents&lt;/a&gt;. Once VeriSign was satisfied with the documents, they used the &lt;a href="http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-0_and_SHA-1"&gt;SHA-1&lt;/a&gt; hash algorithm to get a hash value of the certificate that had all the claims. In Wireshark, the full certificate shows up as the "signedCertificate" part:&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8nWe2TGdI/AAAAAAAABPY/E9qxHxjy0xA/s1600-h/certsignature.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Si8m5BF5D2I/AAAAAAAABPQ/Ljv8Jd0uBEE/s400/signedcertificate.png"&gt;&lt;/a&gt; &lt;p&gt;It's sort of a misnomer since it actually means that those are the bytes that the signer is &lt;i&gt;going to sign &lt;/i&gt;and not the bytes that already include a signature.&lt;/p&gt;&lt;img src="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8nWe2TGdI/AAAAAAAABPY/E9qxHxjy0xA/s400/certsignature.png"&gt; &lt;p&gt;The actual signature, "S", is simply called "encrypted" in Wireshark. If we raise "S" to VeriSign's public "e" exponent of 65537 and then take the remainder when divided by the modulus "n", we get this "decrypted" signature hex value:&lt;/p&gt;&lt;blockquote&gt;0001FFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF00302130 0906052B0E03021A 05000414C19F8786 871775C60EFE0542 E4C2167C830539DB&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://tools.ietf.org/html/rfc2313#page-9"&gt;Per the PKCS #1 v1.5 standard&lt;/a&gt;, the first byte is "00" and it "ensures that the encryption block, [when] converted to an integer, is less than the modulus." The second byte of "01" indicates that this is a private key operation (e.g. it's a signature). This is followed by a lot of "FF" bytes that are used to pad the result to make sure that it's big enough. The padding is terminated by a "00" byte. It's followed by "30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14" which is the &lt;a title="PKCS #1 v2.1 way" href="http://tools.ietf.org/html/rfc3447#page-43"&gt;PKCS #1 v2.1 way&lt;/a&gt; of specifying the &lt;a href="http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-0_and_SHA-1"&gt;SHA-1&lt;/a&gt; hash algorithm. The last 20 bytes are SHA-1 hash digest of the bytes in "signedCertificate."&lt;/p&gt;&lt;p&gt;Since the decrypted value &lt;a href="http://www.matasano.com/log/558/public-key-signature-forgery-collected/"&gt;is properly formatted&lt;/a&gt; and the last bytes are the same hash value that we can calculate independently, we can assume that whoever knew "VeriSign Class 3 Secure Server CA"'s private key "signed" it. We implicitly trust that only VeriSign knows the private key "d."&lt;/p&gt;&lt;p&gt;We can repeat the process to verify that "VeriSign Class 3 Secure Server CA"'s certificate was signed by VeriSign's "Class 3 Public Primary Certification Authority."&lt;/p&gt;&lt;p&gt;But why should we trust &lt;i&gt;that&lt;/i&gt;? There are no more levels on the trust chain. &lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_Zfbv3mHcYrc/Sihn_4zmOYI/AAAAAAAABNY/di1a-vsPbYA/s1600-h/BuiltInCertificateHierarchy.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Zfbv3mHcYrc/Sihn_4zmOYI/AAAAAAAABNY/di1a-vsPbYA/s400/BuiltInCertificateHierarchy.png"&gt;&lt;/a&gt; &lt;p&gt;The top "VeriSign Class 3 Public Primary Certification Authority" was signed by &lt;i&gt;itself&lt;/i&gt;. This certificate has been built into Mozilla products as an implicitly trusted good certificate since version &lt;a href="http://bonsai.mozilla.org/cvslog.cgi?file=mozilla/security/nss/lib/ckfw/builtins/certdata.txt&amp;amp;rev=NSS_3_12_2_WITH_CKBI_1_73_RTM&amp;amp;mark=1.51"&gt;1.4 of certdata.txt&lt;/a&gt; in the Network Security Services (&lt;a href="http://www.mozilla.org/projects/security/pki/nss/"&gt;NSS&lt;/a&gt;) library. It was checked-in on September 6, 2000 by Netscape's Robert Relyea with the following comment:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;"Make the framework compile with the rest of NSS. Include a 'live' certdata.txt with those certs we have permission to push to open source (additional certs will be added as we get permission from the owners)." &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This decision has had a relatively long impact since the certificate has a validity range of January 28, 1996 - August 1, 2028.&lt;/p&gt;&lt;p&gt;As Ken Thompson explained so well in his "&lt;a href="http://www.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf"&gt;Reflections on Trusting Trust&lt;/a&gt;", you ultimately have to implicitly trust somebody. There is no way around this problem. In this case, we're implicitly trusting that Robert Relyea made a good choice. We also hope that &lt;a href="http://www.mozilla.org/projects/security/certs/policy/"&gt;Mozilla's built-in certificate policy&lt;/a&gt; is reasonable for the other built-in certificates.&lt;/p&gt;&lt;p&gt;One thing to keep in mind here is that all these certificates and signatures were simply used to form a trust chain. On the public Internet, VeriSign's root certificate is implicitly trusted by Firefox long before you go to any website. In a company, you can create your own root certificate authority (CA) that you can install on everyone's machine. &lt;/p&gt;&lt;p&gt;Alternatively, you can get around having to pay companies like VeriSign and avoid certificate trust chains altogether. Certificates are used to establish trust by using a trusted third-party (in this case, VeriSign). If you have a secure means of sharing a secret "key", such as whispering a long password into someone's ear, then you can use that pre-shared key (PSK) to establish trust. There are extensions to TLS to allow this, such as &lt;a href="http://tools.ietf.org/html/rfc4279"&gt;TLS-PSK&lt;/a&gt;, and my personal favorite, &lt;a href="http://tools.ietf.org/html/rfc5054"&gt;TLS with Secure Remote Password (SRP) extensions&lt;/a&gt;. Unfortunately, these extensions aren't nearly as widely deployed and supported, so they're usually not practical. Additionally, these alternatives impose a burden that we have to have some other secure means of communicating the secret that's more cumbersome than what we're trying to establish with TLS (otherwise, why wouldn't we use &lt;i&gt;that&lt;/i&gt; for everything?).&lt;/p&gt;&lt;p&gt;One final check that we need to do is to verify that the host name on the certificate is what we expected. &lt;a href="http://www.linkedin.com/in/nelsonbolyard"&gt;Nelson Bolyard&lt;/a&gt;'s comment in the &lt;a href="http://www.koders.com/c/fid1C807D78F4E4CA73466FEEAA78EA9F0B2D618199.aspx#L260"&gt;SSL_AuthCertificate function&lt;/a&gt; explains why: &lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color:rgb(0,128,0)"&gt;/* cert is OK. This is the client side of an SSL connection.&lt;br&gt; * Now check the name field in the cert against the desired hostname.&lt;br&gt; * NB: This is our only defense against Man-In-The-Middle (MITM) attacks! */&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;This check helps prevent against a &lt;a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack"&gt;man-in-the-middle&lt;/a&gt; attack because we are implicitly trusting that the people on the certificate trust chain wouldn't do something bad, like sign a certificate claiming to be from Amazon.com unless it actually was Amazon.com. If an attacker is able to modify your DNS server by using a technique like &lt;a href="http://en.wikipedia.org/wiki/DNS_cache_poisoning"&gt;DNS cache poisoning&lt;/a&gt;, you might be fooled into thinking you're at a trusted site (like Amazon.com) because the address bar will look normal. This last check implicitly trusts certificate authorities to stop these bad things from happening.&lt;/p&gt;&lt;h4&gt;Pre-Master Secret&lt;/h4&gt;&lt;p&gt;We've verified some claims about Amazon.com and know its public encryption exponent "e" and modulus "n." Anyone listening in on the traffic can know this as well (as evidenced because we are using Wireshark captures). Now we need to create a random secret key that an eavesdropper/attacker can't figure out. This isn't as easy as it sounds. In 1996, researchers figured out that &lt;a href="http://en.wikipedia.org/wiki/Netscape_Navigator"&gt;Netscape Navigator&lt;/a&gt; 1.1 was &lt;a title="using only three sources" href="http://www.cs.berkeley.edu/~daw/papers/ddj-netscape.html"&gt;using only three sources&lt;/a&gt; to seed their pseudo-random number generator (&lt;a href="http://en.wikipedia.org/wiki/Pseudorandom_number_generator"&gt;PRNG&lt;/a&gt;). The sources were: the time of day, the process id, and the parent process id. As the researchers showed, these "random" sources aren't that random and were relatively easy to figure out.&lt;/p&gt;&lt;p&gt;Since everything else was derived from these three "random" sources, it was possible to "break" the SSL "security" in 25 seconds on a 1996 era machine. If you still don't believe that finding randomness is hard, just &lt;a title="ask the Debian OpenSSL maintainers" href="http://www.schneier.com/blog/archives/2008/05/random_number_b.html"&gt;ask the Debian OpenSSL maintainers&lt;/a&gt;. If you mess it up, all the security built on top of it is suspect.&lt;/p&gt;&lt;p&gt;On Windows, random numbers used for cryptographic purposes are generated by calling the &lt;a title="CryptGenRandom function" href="http://msdn.microsoft.com/en-us/library/aa379942%28VS.85%29.aspx"&gt;CryptGenRandom function&lt;/a&gt; that hashes bits &lt;a title="sampled from over 125 sources" href="http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx#353493"&gt;sampled from over 125 sources&lt;/a&gt;. Firefox uses this function along with some bits derived from &lt;a title="its own  function" href="http://www.koders.com/c/fidBC778BD3666AA64522D1FD4F4EC3331E44B4D204.aspx?s=RNG_GetNoise"&gt;its own function&lt;/a&gt; to seed its &lt;a title="pseudo-random number generator" href="http://www.koders.com/c/fidD184CA9064625C0ADF48025F3FA0588FCD664057.aspx"&gt;pseudo-random number generator&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The 48 byte "pre-master secret" random value that's generated isn't used directly, but it's very important to keep it secret since a lot of things are derived from it. Not surprisingly, Firefox makes it hard to find out this value. I had to compile a debug version and set the &lt;a title="SSLDEBUGFILE" href="http://www.koders.com/c/fidCFCD763A9E0B2BEF3FB9D4D6C17B4094CBF21548.aspx#L2092"&gt;SSLDEBUGFILE&lt;/a&gt; and &lt;a title="SSLTRACE" href="http://www.koders.com/c/fidCFCD763A9E0B2BEF3FB9D4D6C17B4094CBF21548.aspx#L2101"&gt;SSLTRACE&lt;/a&gt; environment variables to see it. &lt;/p&gt;&lt;p&gt;In this particular session, the pre-master secret showed up in the SSLDEBUGFILE as: &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;4456: SSL[131491792]: Pre-Master Secret [Len: 48]&lt;br&gt;03 01 bb 7b 08 98 a7 49 de e8 e9 b8 91 52 ec 81 ...{...I.....R..&lt;br&gt;4c c2 39 7b f6 ba 1c 0a b1 95 50 29 be 02 ad e6 L.9{......P)....&lt;br&gt;ad 6e 11 3f 20 c4 66 f0 64 22 57 7e e1 06 7a 3b .n.? .f.d"W~..z; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Note that it's not completely random. The first two bytes are, &lt;a title="by convention" href="http://tools.ietf.org/html/rfc2246#page-44"&gt;by convention&lt;/a&gt;, the TLS version (03 01).&lt;/p&gt;&lt;h4&gt;Trading Secrets&lt;/h4&gt;&lt;p&gt;We now need to get this secret value over to Amazon.com. By Amazon's wishes of "TLS_RSA_WITH_RC4_128_MD5", we will use RSA to do this. You &lt;em&gt;could&lt;/em&gt; make your input message equal to just the 48 byte pre-master secret, but the Public Key Cryptography Standard (PKCS) #1, version 1.5 RFC &lt;a title="states" href="http://tools.ietf.org/html/rfc2313#page-8"&gt;tells us&lt;/a&gt; that we should pad these bytes with &lt;i&gt;random&lt;/i&gt; data to make the input equal to exactly the size of the modulus (1024 bits/128 bytes). This makes it harder for an attacker to determine our pre-master secret. It also gives us one last chance to protect ourselves in case we did something really bone-headed, like reusing the same secret. If we reused the key, the eavesdropper would likely see a different value placed on the network due to the random padding.&lt;/p&gt;&lt;p&gt;Again, Firefox makes it hard to see these random values. I had to insert debugging statements into &lt;a title="the padding function" href="http://www.koders.com/c/fid1EB31A222A560045DBF9EC54457A1E0339825D58.aspx#L190"&gt;the padding function&lt;/a&gt; to see what was going on:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;wrapperHandle = fopen(&lt;span style="color:rgb(163,21,21)"&gt;"plaintextpadding.txt"&lt;/span&gt;, &lt;span style="color:rgb(163,21,21)"&gt;"a"&lt;/span&gt;);&lt;br&gt;fprintf(wrapperHandle, &lt;span style="color:rgb(163,21,21)"&gt;"PLAINTEXT = "&lt;/span&gt;);&lt;br&gt;&lt;span style="color:rgb(0,0,255)"&gt;for&lt;/span&gt;(i = 0; i &amp;lt; modulusLen; i++)&lt;br&gt;{&lt;br&gt;    fprintf(wrapperHandle, &lt;span style="color:rgb(163,21,21)"&gt;"%02X "&lt;/span&gt;, block[i]);&lt;br&gt;}&lt;br&gt;fprintf(wrapperHandle, &lt;span style="color:rgb(163,21,21)"&gt;"\r\n"&lt;/span&gt;);&lt;br&gt;fclose(wrapperHandle);&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;In this session, the full padded value was:&lt;/p&gt;&lt;blockquote&gt;00 02 12 A3 EA B1 65 D6 81 6C 13 14 13 62 10 53 23 B3 96 85 FF 24 FA CC 46 11 21 24 A4 81 EA 30 63 95 D4 DC BF 9C CC D0 2E DD 5A A6 41 6A 4E 82 65 7D 70 7D 50 09 17 CD 10 55 97 B9 C1 A1 84 F2 A9 AB EA 7D F4 CC 54 E4 64 6E 3A E5 91 A0 06 00 03 01 BB 7B 08 98 A7 49 DE E8 E9 B8 91 52 EC 81 4C C2 39 7B F6 BA 1C 0A B1 95 50 29 BE 02 AD E6 AD 6E 11 3F 20 C4 66 F0 64 22 57 7E E1 06 7A 3B&lt;br&gt;&lt;/blockquote&gt;&lt;p&gt;Firefox took this value and &lt;a href="http://www.koders.com/c/fid1B0E0F62F1B3DB6D7272F0BD781A1609D76FE6FE.aspx#L312"&gt;calculated&lt;/a&gt; "C ≡ M&lt;sup&gt;e&lt;/sup&gt; (mod n)" to get the value we see in the "&lt;a title="Client Key Exchange" href="http://tools.ietf.org/html/rfc2246#page-43"&gt;Client Key Exchange&lt;/a&gt;" record:&lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8oafu_5aI/AAAAAAAABPg/r41rp34D1pw/s1600-h/clientkeyexchange.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8oafu_5aI/AAAAAAAABPg/r41rp34D1pw/s400/clientkeyexchange.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Finally, Firefox sent out one last unencrypted message, a "&lt;a title="Change Cipher  Spec" href="http://tools.ietf.org/html/rfc2246#page-24"&gt;Change Cipher Spec&lt;/a&gt;" record: &lt;/p&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Si8o_0Qi0HI/AAAAAAAABPo/M1cyaQ6le5A/s1600-h/clientchangecipherspec.png"&gt;&lt;img src="http://3.bp.blogspot.com/_Zfbv3mHcYrc/Si8o_0Qi0HI/AAAAAAAABPo/M1cyaQ6le5A/s400/clientchangecipherspec.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is Firefox's way of telling Amazon that it's going to start using the agreed upon secret to encrypt its next message.&lt;/p&gt;&lt;h4&gt;Deriving the Master Secret&lt;/h4&gt;&lt;p&gt;If we've done everything correctly, both sides (and only those sides) now know the 48 byte (256 bit) pre-master secret. There's a slight trust issue here from Amazon's perspective: the pre-master secret just has bits that were generated by the client, they don't take anything into account from the server or anything we said earlier. We'll fix that be computing the "master secret." &lt;a title="Per the spec" href="http://tools.ietf.org/html/rfc2246#page-47"&gt;Per the spec&lt;/a&gt;, this is done by calculating:&lt;/p&gt;&lt;blockquote&gt;master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random)&lt;br&gt;&lt;/blockquote&gt;&lt;p&gt;The "pre_master_secret" is the secret value we sent earlier. The "master secret" is simply a string whose &lt;a href="http://en.wikipedia.org/wiki/ASCII"&gt;ASCII&lt;/a&gt; bytes (e.g. "6d 61 73 74 65 72 ...") are used. We then concatenate the random values that were sent in the ClientHello and ServerHello (from Amazon) messages that we saw at the beginning.&lt;/p&gt;&lt;p&gt;The PRF is the "Pseudo-Random Function" that's also &lt;a title="defined in the  spec" href="http://tools.ietf.org/html/rfc2246#page-11"&gt;defined in the spec&lt;/a&gt; and is quite clever. It combines the secret, the ASCII label, and the seed data we give it by using the keyed-Hash Message Authentication Code (&lt;a href="http://en.wikipedia.org/wiki/HMAC"&gt;HMAC&lt;/a&gt;) versions of both &lt;a title="MD5" href="http://en.wikipedia.org/wiki/MD5"&gt;MD5&lt;/a&gt; and &lt;a title="SHA-1" href="http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-0_and_SHA-1"&gt;SHA-1&lt;/a&gt; hash functions. Half of the input is sent to each hash function. It's clever because it is quite resistant to attack, even in the face of &lt;a title="MD5" href="http://www.win.tue.nl/hashclash/rogue-ca/"&gt;weaknesses in MD5&lt;/a&gt; &lt;a title="and SHA-1" href="http://www.schneier.com/blog/archives/2005/02/sha1_broken.html"&gt;and SHA-1&lt;/a&gt;. This process can feedback on itself and iterate forever to generate as many bytes as we need. &lt;/p&gt;&lt;p&gt;Following this procedure, we obtain a 48 byte "master secret" of &lt;/p&gt;&lt;blockquote&gt;4C AF 20 30 8F 4C AA C5 66 4A 02 90 F2 AC 10 00 39 DB 1D E0 1F CB E0 E0 9D D7 E6 BE 62 A4 6C 18 06 AD 79 21 DB 82 1D 53 84 DB 35 A7 1F C1 01 19&lt;br&gt;&lt;/blockquote&gt;&lt;h4&gt;Generating Lots of Keys&lt;/h4&gt;&lt;p&gt;Now that both sides have a "master secrets", the spec &lt;a title="shows us" href="http://tools.ietf.org/html/rfc2246#page-21"&gt;shows us&lt;/a&gt; how we can derive all the needed session keys we need using the PRF to create a "key block" where we will pull data from:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;key_block = PRF(SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParameters.client_random);&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The bytes from "key_block" are used to populate the following:&lt;/p&gt;&lt;blockquote&gt;client_write_MAC_secret[SecurityParameters.hash_size]&lt;br&gt;server_write_MAC_secret[SecurityParameters.hash_size]&lt;br&gt;client_write_key[SecurityParameters.key_material_length]&lt;br&gt;server_write_key[SecurityParameters.key_material_length]&lt;br&gt;client_write_IV[SecurityParameters.IV_size]&lt;br&gt;server_write_IV[SecurityParameters.IV_size]&lt;br&gt;&lt;/blockquote&gt;&lt;p&gt;Since we're using a &lt;a title="stream cipher" href="http://en.wikipedia.org/wiki/Stream_cipher"&gt;stream cipher&lt;/a&gt; instead of a &lt;a title="block cipher" href="http://en.wikipedia.org/wiki/Block_cipher"&gt;block cipher&lt;/a&gt; like the Advanced Encryption Standard (&lt;a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"&gt;AES&lt;/a&gt;), we don't need the Initialization Vectors (&lt;a title="Initialization Vector" href="http://en.wikipedia.org/wiki/Initialization_vector"&gt;IV&lt;/a&gt;s). Therefore, we just need two Message Authentication Code (&lt;a title="Message Authentication Code" href="http://en.wikipedia.org/wiki/Message_authentication_code"&gt;MAC&lt;/a&gt;) keys for each side that are 16 bytes (128 bits) each since the specified MD5 hash digest size is 16 bytes. In addition, the RC4 cipher uses a 16 byte (128 bit) key that both sides will need as well. All told, we need 2*16 + 2*16 = 64 bytes from the key block.&lt;/p&gt;&lt;p&gt;Running the PRF, we get these values: &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;client_write_MAC_secret = 80 B8 F6 09 51 74 EA DB 29 28 EF 6F 9A B8 81 B0&lt;br&gt;server_write_MAC_secret = 67 7C 96 7B 70 C5 BC 62 9D 1D 1F 4A A6 79 81 61&lt;br&gt;client_write_key = 32 13 2C DD 1B 39 36 40 84 4A DE E5 6C 52 46 72&lt;br&gt;server_write_key = 58 36 C4 0D 8C 7C 74 DA 6D B7 34 0A 91 B6 8F A7&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;Prepare to be Encrypted!&lt;/h4&gt;&lt;p&gt;The last handshake message the client sends out is the "&lt;a title="Finished messages" href="http://tools.ietf.org/html/rfc2246#page-46"&gt;Finished message&lt;/a&gt;." This is a clever message that proves that no one tampered with the handshake and it proves that we know the key. The client takes all bytes from all handshake messages and puts them into a "handshake_messages" buffer. We then calculate 12 bytes of "verify_data" using the pseudo-random function (PRF) with our master key, the label "client finished", and an MD5 and SHA-1 hash of "handshake_messages": &lt;/p&gt;&lt;blockquote&gt;verify_data = PRF(master_secret, "client finished", MD5(handshake_messages) + SHA-1(handshake_messages)) [12]&lt;br&gt;&lt;/blockquote&gt;&lt;p&gt;We take the result and add a record header byte "0x14" to indicate "finished" and length bytes "00 00 0c" to indicate that we're sending 12 bytes of verify data. Then, like all future encrypted messages, we need to make sure the decrypted contents haven't been tampered with. Since our cipher suite in use is TLS_RSA_WITH_RC4_128_MD5, this means we use the MD5 hash function.&lt;/p&gt;&lt;p&gt;Some people get paranoid when they hear MD5 because it has some weaknesses. I certainly don't advocate using it as-is. However, TLS is smart in that it doesn't use MD5 directly, but rather the &lt;a href="http://en.wikipedia.org/wiki/HMAC"&gt;HMAC&lt;/a&gt; version of it. This means that instead of using MD5(m) directly, we calculate:&lt;/p&gt;&lt;blockquote&gt;HMAC_MD5(Key, m) = MD5((Key ⊕ opad) ++ MD5((Key ⊕ ipad) ++ m)&lt;/blockquote&gt;&lt;p&gt;(The ⊕ means &lt;a href="http://en.wikipedia.org/wiki/Exclusive_or"&gt;XOR&lt;/a&gt;, ++ means concatenate, "opad" is the bytes "5c 5c ... 5c", and "ipad" is the bytes "36 36 ... 36").&lt;/p&gt;&lt;p&gt;In particular, we calculate:&lt;/p&gt;&lt;blockquote&gt;HMAC_MD5(client_write_MAC_secret, seq_num + TLSCompressed.type + TLSCompressed.version + TLSCompressed.length + TLSCompressed.fragment));&lt;br&gt;&lt;/blockquote&gt;&lt;p&gt;As you can see, we include a sequence number ("seq_num") along with attributes of the plaintext message (here it's called "TLSCompressed"). The sequence number foils attackers who might try to take a previously encrypted message and insert it midstream. If this occurred, the sequence numbers would definitely be different than what we expected. This also protects us from an attacker dropping a message. &lt;/p&gt;&lt;p&gt;All that's left is to encrypt these bytes.&lt;/p&gt;&lt;h4&gt;RC4 Encryption&lt;/h4&gt;&lt;p&gt;Our negotiated cipher suite was TLS_RSA_WITH_RC4_128_MD5. This tells us that we need to use &lt;a href="http://people.csail.mit.edu/rivest/faq.html"&gt;&lt;span style="color:rgb(128,0,128)"&gt;Ron's Code&lt;/span&gt;&lt;/a&gt; #4 (&lt;a title="RC4" href="http://en.wikipedia.org/wiki/RC4"&gt;RC4&lt;/a&gt;) to encrypt the traffic. &lt;a href="http://en.wikipedia.org/wiki/Ron_Rivest"&gt;Ron Rivest&lt;/a&gt; developed the RC4 algorithm to generate random bytes based on a 256 byte key. The algorithm is so simple you can actually memorize it in a few minutes. &lt;/p&gt;&lt;p&gt;RC4 begins by creating a 256-byte "S" byte array and populating it with 0 to 255. You then iterate over the array by mixing in bytes from the key. You do this to create a state machine that is used to generate "random" bytes. To generate a random byte, we shuffle around the "S" array.&lt;/p&gt;&lt;p&gt;Put graphically, it looks like this:&lt;/p&gt;&lt;a href="http://en.wikipedia.org/wiki/RC4"&gt;&lt;img src="http://4.bp.blogspot.com/_Zfbv3mHcYrc/SihmoVyIg1I/AAAAAAAABNQ/Jl6kMd1z2hE/s320/RC4.png"&gt;&lt;/a&gt; &lt;p&gt;To encrypt a byte, we &lt;a href="http://en.wikipedia.org/wiki/Exclusive_or"&gt;xor&lt;/a&gt; this pseudo-random byte with the byte we want to encrypt. Remember that xor'ing a bit with 1 causes it to flip. Since we're generating random numbers, on average the xor will flip half of the bits. This random bit flipping is effectively how we encrypt data. As you can see, it's not very complicated and thus it runs quickly. I think that's why Amazon chose it. &lt;/p&gt;&lt;p&gt;Recall that we have a "client_write_key" and a "server_write_key." The means we need to create two RC4 instances: one to encrypt what our browser sends and the other to decrypt what the server sent us.&lt;/p&gt;&lt;p&gt;The first few random bytes out of the "client_write" RC4 instance are "7E 20 7A 4D FE FB 78 A7 33 ..." If we xor these bytes with the unencrypted header and verify message bytes of "14 00 00 0C 98 F0 AE CB C4 ...", we'll get what appears in the encrypted portion that we can see in Wireshark:&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_Zfbv3mHcYrc/Si8ryrIoGrI/AAAAAAAABP4/1bSIRcRkERw/s1600-h/clientencryptedkeyexchange.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Zfbv3mHcYrc/Si8ryrIoGrI/AAAAAAAABP4/1bSIRcRkERw/s400/clientencryptedkeyexchange.png"&gt;&lt;/a&gt; &lt;p&gt;The server does almost the same thing. It sends out a "Change Cipher Spec" and then a "Finished Message" that includes all handshake messages, including the &lt;em&gt;decrypted&lt;/em&gt; version of the client's "Finished Message." Consequently, this proves to the client that the server was able to successfully decrypt our message. &lt;/p&gt;&lt;h4&gt;Welcome to the Application Layer!&lt;/h4&gt;&lt;p&gt;Now, 220 milliseconds after we started, we're finally ready for the application layer. We can now send normal HTTP traffic that'll be encrypted by the TLS layer with the RC4 write instance and decrypt traffic with the server RC4 write instance. In addition, the TLS layer will check each record for tampering by computing the HMAC_MD5 hash of the contents.&lt;/p&gt;&lt;p&gt;At this point, the handshake is over. Our TLS record's content type is now 23 (0x17). Encrypted traffic begins with "17 03 01" which indicate the record type and TLS version. These bytes are followed by our encrypted size, which includes the HMAC hash. &lt;/p&gt;&lt;p&gt;Encrypting the plaintext of:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;GET /gp/cart/view.html/ref=pd_luc_mri HTTP/1.1&lt;br&gt;Host: www.amazon.com&lt;br&gt;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009060911 Minefield/3.0.10 (.NET CLR 3.5.30729)&lt;br&gt;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br&gt;Accept-Language: en-us,en;q=0.5&lt;br&gt;Accept-Encoding: gzip,deflate&lt;br&gt;Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br&gt;Keep-Alive: 300&lt;br&gt;Connection: keep-alive&lt;br&gt;...&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;will give us the bytes we see on the wire:&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8s4nuKH8I/AAAAAAAABQA/feL3OBZV83s/s1600-h/firstclientappdataencrypted.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8s4nuKH8I/AAAAAAAABQA/feL3OBZV83s/s400/firstclientappdataencrypted.png"&gt;&lt;/a&gt; &lt;p&gt;The only other interesting fact is that the sequence number increases on each record, it's now 1 (and the next record will be 2, etc).&lt;/p&gt;&lt;p&gt;The server does the same type of thing on its side using the server_write_key. We see its response, including the tell-tale application data header:&lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8tz1Y9BqI/AAAAAAAABQQ/B6_UN0lX7fM/s1600-h/firstserverappdata.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Zfbv3mHcYrc/Si8tz1Y9BqI/AAAAAAAABQQ/B6_UN0lX7fM/s400/firstserverappdata.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Decrypting this gives us: &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;HTTP/1.1 200 OK&lt;br&gt;Date: Wed, 10 Jun 2009 01:09:30 GMT&lt;br&gt;Server: Server&lt;br&gt;...&lt;br&gt;Cneonction: close&lt;br&gt;Transfer-Encoding: chunked&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;which is a normal HTTP reply that includes a non-descriptive "Server: Server" header and a misspelled "&lt;a title="Cneonction: close" href="http://www.nextthing.org/archives/2005/08/07/fun-with-http-headers"&gt;Cneonction: close&lt;/a&gt;" header coming from Amazon's load balancers.&lt;/p&gt;&lt;p&gt;TLS is just below the application layer. The HTTP server software can act as if it's sending unencrypted traffic. The only change is that it writes to a library that does all the encryption. &lt;a href="http://www.openssl.org/"&gt;OpenSSL&lt;/a&gt; is a popular open-source library for TLS.&lt;/p&gt;&lt;p&gt;The connection will stay open while both sides send and receive encrypted data until either side sends out a "&lt;a href="http://tools.ietf.org/html/rfc2246#page-25"&gt;closure alert&lt;/a&gt;" message and then closes the connection. If we reconnect shortly after disconnecting, we can re-use the negotiated keys (if the server still has them cached) without using public key operations, otherwise we do a completely new full handshake.&lt;/p&gt;&lt;p&gt;It's important to realize that application data records can be &lt;i&gt;anything&lt;/i&gt;. The only reason "HTTPS" is special is because the web is so popular. There are lots of other TCP/IP based protocols that ride on top of TLS. For example, TLS is used by &lt;a title="SFTP" href="http://tools.ietf.org/html/rfc4217"&gt;FTPS&lt;/a&gt; and &lt;a title="extensions to SMTP" href="http://tools.ietf.org/html/rfc3207"&gt;secure extensions to SMTP&lt;/a&gt;. It's certainly better to use TLS than inventing your own solution. Additionally, you'll benefit from a protocol that has withstood careful &lt;a href="http://tools.ietf.org/html/rfc5246#appendix-F"&gt;security analysis&lt;/a&gt;. &lt;/p&gt;&lt;h4&gt;... And We're Done!&lt;/h4&gt;&lt;p&gt;The very readable &lt;a title="TLS RFC" href="http://tools.ietf.org/html/rfc5246"&gt;TLS RFC&lt;/a&gt; covers many more details that were missed here. We covered just one single path in our observation of the 220 millisecond dance between Firefox and Amazon's server. Quite a bit of the process was affected by the TLS_RSA_WITH_RC4_128_MD5 Cipher Suite selection that Amazon made with its ServerHello message. It's a reasonable choice that slightly favors speed over security. &lt;/p&gt;&lt;p&gt;As we saw, if someone could secretly factor Amazon's "n" modulus into its respective "p" and "q", they could effectively decrypt all "secure" traffic until Amazon changes their certificate. Amazon counter-balances this concern this with a short one year duration certificate:&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_Zfbv3mHcYrc/Si8u2evehpI/AAAAAAAABQY/pFMUJ5-vmOU/s1600-h/amazoncertvalidity.png"&gt;&lt;img src="http://1.bp.blogspot.com/_Zfbv3mHcYrc/Si8u2evehpI/AAAAAAAABQY/pFMUJ5-vmOU/s400/amazoncertvalidity.png"&gt;&lt;/a&gt; &lt;p&gt;One of the cipher suites that was offered was "TLS_DHE_RSA_WITH_AES_256_CBC_SHA" which uses the &lt;a title="Diffie-Hellman key exchange" href="http://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange"&gt;Diffie-Hellman key exchange&lt;/a&gt; that has a nice property of "&lt;a title="forward secrecy" href="http://en.wikipedia.org/wiki/Perfect_forward_secrecy"&gt;forward secrecy&lt;/a&gt;." This means that if someone cracked the mathematics of the key exchange, they'd be no better off to decrypt another session. One downside to this algorithm is that it requires more math with big numbers, and thus is a little more computationally taxing on a busy server. The "Advanced Encryption Standard" (&lt;a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"&gt;AES&lt;/a&gt;) algorithm was present in many of the suites that we offered. It's different than RC4 in that it works on 16 byte "blocks" at a time rather than a single byte. Since its key can be up to 256 bits, many consider this to be more secure than RC4.&lt;/p&gt;&lt;p&gt;In just 220 milliseconds, two endpoints on the Internet came together, provided enough credentials to trust each other, set up encryption algorithms, and started to send encrypted traffic.&lt;/p&gt;&lt;p&gt;And to think, all of this just so Bob can buy milk.&lt;/p&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6800934446457898793-680453867994856278?l=www.moserware.com"&gt;&lt;/div&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=qjQlyUN8Tnk:aE0vXZ6n9s0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=qjQlyUN8Tnk:aE0vXZ6n9s0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=qjQlyUN8Tnk:aE0vXZ6n9s0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?i=qjQlyUN8Tnk:aE0vXZ6n9s0:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=qjQlyUN8Tnk:aE0vXZ6n9s0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?i=qjQlyUN8Tnk:aE0vXZ6n9s0:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=qjQlyUN8Tnk:aE0vXZ6n9s0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?i=qjQlyUN8Tnk:aE0vXZ6n9s0:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=qjQlyUN8Tnk:aE0vXZ6n9s0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?i=qjQlyUN8Tnk:aE0vXZ6n9s0:4cEx4HpKnUU" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Moserware/~4/qjQlyUN8Tnk" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/uj5tqMoY4Iw" height="1" width="1"/&gt;</content><author><name>Jeff Moser</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/Moserware"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/Moserware</id><title type="html">Moserware</title><link rel="alternate" href="http://www.moserware.com/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/Moserware/~3/qjQlyUN8Tnk/first-few-milliseconds-of-https.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1244623916474"><id gr:original-id="d10481e0-d7e7-4234-9ab6-db53a9657b7e:8909">tag:google.com,2005:reader/item/7706f927b6198912</id><title type="html">Feature Deduction</title><published>2009-06-10T08:21:26Z</published><updated>2009-06-10T08:21:26Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/M2jOtSYJk1o/feature-deduction.aspx" type="text/html" /><summary xml:base="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="html">&lt;h3&gt;The problem&lt;/h3&gt;  &lt;p&gt;You have what Chris Matts calls an “Order Taker” as your business analyst. This individual is occasionally your only access to the people that actually understand what’s needed, yet they’ve been positioned as the gatekeepers of knowledge.&lt;/p&gt;  &lt;h3&gt;Consider this tactic&lt;/h3&gt;  &lt;p&gt;Combine “The 5 Why’s” and “Feature Injection” and see if you can deduce the real information that led to a specific requirement or change. &lt;/p&gt;  &lt;h3&gt;The basis&lt;/h3&gt;  &lt;p&gt;The thing is, the person the BA is talking to likely does Feature Injection, even if they don’t know they’re doing it. They’ve created their mental model (or “understanding”) of what problems this software they’ve asked for will solve. Something comes along and breaks the model (or “Doesn’t quite match what we’re doing”), and they change the model (or “submit a change request”). &lt;/p&gt;  &lt;p&gt;If you look at the outputs of this (the delta, or the specific change), you’ll observe that they probably share a common theme or two. If you keep asking “why” on the changes, you’ll accomplish two things. You’ll be able to understand what sort of learning occurred, and the further “why’s” will either lead to better answers (less “telephone” effect) or more questions for the actual business owner. Second, you’ll probably frustrate the hell out of the order taking BA, and there’s a tiny chance they’ll learn to act differently.&lt;/p&gt;  &lt;p&gt;Either way, you probably understand the &lt;em&gt;intent&lt;/em&gt; of the changes better, which means you can do a better job providing value.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;btw, please please please try and fix the organizational structure first, but if you can’t do so, then you can begin finding the right ways to work around the impediments.&lt;/p&gt;&lt;img src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=8909" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/M2jOtSYJk1o" height="1" width="1"/&gt;</summary><author><name>willeke</name></author><source gr:stream-id="feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx"><id>tag:google.com,2005:reader/feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx</id><title type="html">Rediscovering the Obvious</title><link rel="alternate" href="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="text/html" /></source><feedburner:origLink>http://manicprogrammer.com/cs/blogs/willeke/archive/2009/06/10/feature-deduction.aspx</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1244552455157"><id gr:original-id="d10481e0-d7e7-4234-9ab6-db53a9657b7e:8908">tag:google.com,2005:reader/item/665587163ef424be</id><title type="html">Using IIS7 Failure Tracing</title><published>2009-06-09T12:11:03Z</published><updated>2009-06-09T12:11:03Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/o3vduP-lxGw/using-iis7-failure-tracing.aspx" type="text/html" /><summary xml:base="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="html">&lt;ul&gt;   &lt;p&gt;In the process of debugging an issue with a sample web application, I was forced to learn a bit more about IIS7's management model, and I found some very valuable information.&lt;/p&gt;    &lt;p&gt;The problem: the user my request was running as did not have ACL-level access to the .svc file for that web service.&lt;/p&gt;    &lt;p&gt;My old solution: Try random accounts before giving up and just giving access to &amp;quot;Everyone&amp;quot; for the entire web tree. (Yes, bad, but it&amp;#39;s a sample)&lt;/p&gt;    &lt;p&gt;My hope: There is a way to find out via logs, console, etc what the actual user is based on the actual failure rather than looking at all security configurations and randomly trying the referenced accounts.&lt;/p&gt;    &lt;p&gt;What I found:&lt;/p&gt;    &lt;p&gt;Open IIS manager, click at the web site level, and choose &amp;quot;Failed Request Tracing Rules&amp;quot;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image0015_2EB6EE1A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image001[5]" border="0" alt="clip_image001[5]" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image0015_thumb_676428D8.png" width="509" height="214"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;On the right, choose &amp;quot;Edit Site Tracing…&amp;quot;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image002_729043D3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image002" border="0" alt="clip_image002" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image002_thumb_140F7363.png" width="216" height="282"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Check &amp;quot;Enable&amp;quot;, and note the location of the log files (note, there are implications on production sites. I don&amp;#39;t know what they are. Be warned.)&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image003_05D38B24.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image003" border="0" alt="clip_image003" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image003_thumb_5135BF99.png" width="317" height="188"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Now, click &amp;quot;Add…&amp;quot; on the right, and choose your settings:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image004_001B022F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image004" border="0" alt="clip_image004" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image004_thumb_445DFA2C.png" width="270" height="257"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image005_219CC26F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image005" border="0" alt="clip_image005" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image005_thumb_236D1836.png" width="274" height="258"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image006_4EB43FEE.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image006" border="0" alt="clip_image006" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image006_thumb_5DEAA8BB.png" width="277" height="268"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;When you finish, you'll see something like this:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image007_04BB4FAD.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image007" border="0" alt="clip_image007" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image007_thumb_2F964470.png" width="709" height="148"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;At this point, you can go to your logs folder and see the XML results of any errors that match your filters:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image008_457FB6C0.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image008" border="0" alt="clip_image008" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image008_thumb_55225282.png" width="568" height="225"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Opening one of those applies a nice transform (freb.xsl, I assume), and we have our data:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image009_14EEC9B9.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image009" border="0" alt="clip_image009" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image009_thumb_3AE70AC0.png" width="687" height="257"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Including my answer:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image010_62AFA18E.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image010" border="0" alt="clip_image010" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image010_thumb_4FFAA7D7.png" width="244" height="42"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;And lots of other cool information:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image011_5B92F5C7.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image011" border="0" alt="clip_image011" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image011_thumb_1F69BAD0.png" width="705" height="290"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image012_05981552.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image012" border="0" alt="clip_image012" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image012_thumb_62D6DD94.png" width="405" height="320"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image013_5AE1CBE3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image013" border="0" alt="clip_image013" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image013_thumb_28145620.png" width="713" height="282"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;And a summary view:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image014_297B09A3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image014" border="0" alt="clip_image014" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image014_thumb_0413A6E6.png" width="715" height="324"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Including some really useful information that I would usually try to get out of Fiddler2 because of the challenge in collecting it in some configurations:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image015_773BE178.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image015" border="0" alt="clip_image015" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image015_thumb_091B05F7.png" width="720" height="99"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image016_386C7B81.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image016" border="0" alt="clip_image016" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image016_thumb_0F646D36.png" width="309" height="60"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://manicprogrammer.com/cs/blogs/willeke/clip_image017_50FEA982.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="clip_image017" border="0" alt="clip_image017" src="http://manicprogrammer.com/cs/blogs/willeke/clip_image017_thumb_44FF49FF.png" width="746" height="360"&gt;&lt;/a&gt;&lt;/p&gt; &lt;/ul&gt;&lt;img src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=8908" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/o3vduP-lxGw" height="1" width="1"/&gt;</summary><author><name>willeke</name></author><source gr:stream-id="feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx"><id>tag:google.com,2005:reader/feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx</id><title type="html">Rediscovering the Obvious</title><link rel="alternate" href="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="text/html" /></source><feedburner:origLink>http://manicprogrammer.com/cs/blogs/willeke/archive/2009/06/09/using-iis7-failure-tracing.aspx</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1243453674469"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/05/27/oslo-may-2009-ctp-intellipad-changes/">tag:google.com,2005:reader/item/189d80b89bf9f314</id><category term="Oslo" /><title type="html">Oslo May 2009 CTP: Intellipad Changes</title><published>2009-05-27T18:47:40Z</published><updated>2009-05-27T18:47:40Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/zug8giGO62Q/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;p&gt;&lt;a href="javascript:void(0);"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px" title="oslo_thumb3" border="0" alt="oslo_thumb3" align="right" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/oslo-thumb3.png" width="121" height="100"&gt;&lt;/a&gt;The &lt;a href="http://www.danrigsby.com/blog/index.php/2009/05/27/oslo-may-2009-ctp-released/"&gt;May 2009 CTP of “Oslo”&lt;/a&gt; introduces a lot of new features and enhancements to the existing toolset.  As a developer, my primary “Oslo” tool has been Intellipad.  It does seem much faster and more stable after a little over an hour of use.  Previous CTPs were memory hogs and would occasionally crash.  I will be upgrading all of my demos and work projects over to the latest CTP over the next week, so I will get to see how much more stable it really is.  Here is an overview of some of the UI Change:&lt;/p&gt;
&lt;h2&gt;Shell&lt;/h2&gt;
&lt;p&gt;For the most part we have the same familiar interface.  You have the same basic layout shell which is a mixture of a standard application frame and menu bar in one.  Everything else in Intellipad is a workspace window which can be docked any number of ways inside this shell.  The shell itself has a couple of new features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A new icon  (same icon used by Quadrant) &lt;/li&gt;
&lt;li&gt;The build number is now displayed next to the control box &lt;/li&gt;
&lt;li&gt;Menu items now appear to use much less white space, display proper “…” labels on items that open new windows, and a few other UI adjustments &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="javascript:void(0);"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image_thumb11" border="0" alt="image_thumb11" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb111.png" width="694" height="478"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Workspace Window&lt;/h2&gt;
&lt;p&gt;Each workspace window has its own title bar as always.  The title bar appears to be the same.  We still have the document name, zoom level, a drop down to change “Modes” and a close button.  However, now the the active workspace window is highlighted in “Oslo Green”.  This is a minor change, but really comes in hand when working with multiple documents. &lt;/p&gt;
&lt;p&gt;The “Edit” menu item for windows has a number of new features.  Check out the list of commands:&lt;/p&gt;
&lt;p&gt;&lt;a href="javascript:void(0);"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image_thumb14" border="0" alt="image_thumb14" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb141.png" width="446" height="392"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;We have our standard Undo/Redo/Cut/Copy/Paste/Delete/Find/Replace/GotoLine options which we had before, but now we have:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Disable External Changes:Behaviors
&lt;ol&gt;
&lt;li&gt;Selection Highlight: This is really neat! With this option as you select text in the document, it will be highlighted in “Oslo Green” and other uses of that same text in the same document will also be highlighted in blue. &lt;/li&gt;
&lt;li&gt;Error Squiggles: Whether or not to show the red squiggle under errors.  if you turn this off, you will still see errors in the error window, but you will have no visual indicator on the document, nor will you have the error tooltips &lt;/li&gt;
&lt;li&gt;Column Indicator: &lt;/li&gt;
&lt;li&gt;Link Navigation: &lt;/li&gt;
&lt;li&gt;Work Wrap: Wraps the text at the end of the line &lt;/li&gt;
&lt;li&gt;Line Numbers: Provides line numbers to the left of the document &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;This screenshot shows the “error squiggle” and “selection highlighting” in action:      &lt;br&gt;&lt;/em&gt;&lt;a href="javascript:void(0);"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image_thumb16" border="0" alt="image_thumb16" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb161.png" width="487" height="470"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;There is new a View menu item which generously gives us support for quickly launching the three most important developer windows: Minibuffer, Errors, and Notifications.    &lt;br&gt;&lt;a href="javascript:void(0);"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image_thumb26" border="0" alt="image_thumb26" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb26.png" width="422" height="185"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;There is also a new Help menu item for displaying an “Intellipad Primer” document in Rich Text mode:&lt;a href="javascript:void(0);"&gt;      &lt;br&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image_thumb25" border="0" alt="image_thumb25" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb25.png" width="487" height="470"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;Mini-Buffer&lt;/h2&gt;
&lt;p&gt;The mini buffer has change dramatically.  It use to pop up a kind of modal WPF dialog which allowed you to enter in commands.  This would occasionally cause Intellipad to crash on me.  In May CTP, it is now a standard document window where you can enter in commands and see previous commands much like if it were a command line window.&lt;/p&gt;
&lt;p&gt;&lt;a href="javascript:void(0);"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image_thumb18" border="0" alt="image_thumb18" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb18.png" width="693" height="130"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Some people may dislike this little change, but personally I like this change as it is more consistent with the rest of the UI and user friendly.&lt;/p&gt;
&lt;h2&gt;DSL Authoring Mode&lt;/h2&gt;


&lt;p&gt;The “DSL Authoring Mode” is a 3-Windows view inside of Intellipad which contains:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The document containing the DSL &lt;/li&gt;
&lt;li&gt;The input: some document were you could enter in data to test against the DSL &lt;/li&gt;
&lt;li&gt;The output: The AST tree that was generated from the input via the DSL &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This mode is the preferred way to write a DSL as you can see how changes affect the schema in real time.&lt;/p&gt;
&lt;p&gt;In previous CTPs you had to launch a Intellipad with special command line options to be able to work in what was known as “DSL Authoring Mode”.  This usually meant selecting “Intellipad (Samples Enabled)” from the start menu instead of just “Intellipad”.  This was annoying at best.  In the May CTP however, you can now enter “DSL Authoring Mode” from the standard launch of Intellipad.  Just open a document in “DSL Grammar Mode”, and there is a new DSL menu item called “Split New Input and Output Views” which launches the 3-Window view.&lt;/p&gt;
&lt;p&gt;&lt;a href="javascript:void(0);"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image_thumb21" border="0" alt="image_thumb21" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb21.png" width="693" height="184"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="javascript:void(0);"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px" title="image_thumb22" border="0" alt="image_thumb22" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb22.png" width="694" height="478"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/05/27/oslo-may-2009-ctp-intellipad-changes/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/05/27/oslo-may-2009-ctp-intellipad-changes/&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=li-yVQcIDSw:XniztOxe25g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=li-yVQcIDSw:XniztOxe25g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=li-yVQcIDSw:XniztOxe25g:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=li-yVQcIDSw:XniztOxe25g:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=li-yVQcIDSw:XniztOxe25g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=li-yVQcIDSw:XniztOxe25g:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=li-yVQcIDSw:XniztOxe25g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=li-yVQcIDSw:XniztOxe25g:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=li-yVQcIDSw:XniztOxe25g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=li-yVQcIDSw:XniztOxe25g:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=li-yVQcIDSw:XniztOxe25g:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/li-yVQcIDSw" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/zug8giGO62Q" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/li-yVQcIDSw/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1243443980234"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/05/27/oslo-may-2009-ctp-released/">tag:google.com,2005:reader/item/878be9987d3e14bc</id><category term="Oslo" /><title type="html">Oslo May 2009 CTP: Released</title><published>2009-05-27T16:49:00Z</published><updated>2009-05-27T16:49:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/8EUkBGInu4o/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/oslo.png"&gt;&lt;img title="oslo" border="0" alt="oslo" align="right" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/oslo-thumb.png" width="121" height="100"&gt;&lt;/a&gt; It’s been many long months since the last drop of &lt;a href="http://msdn.microsoft.com/en-us/oslo/default.aspx"&gt;Oslo&lt;/a&gt; (January 2009).  Last night, Chris Sells and others announced the &lt;a href="http://blogs.msdn.com/modelcitizen/archive/2009/05/27/about-the-oslo-may-2009-ctp.aspx"&gt;May 2009 CTP of Oslo&lt;/a&gt; (version 0.4.2).  Each new CTP brings more features, more documentation, and more stability.  The May CTP holds true with many new features including:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first public release of &lt;a href="http://msdn.microsoft.com/en-us/library/dd857506(VS.85).aspx"&gt;Quadrant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Major updates to Intellipad (including a built in authoring mode) &lt;/li&gt;
&lt;li&gt;A unified tool set for all “M” languages &lt;/li&gt;
&lt;li&gt;A new installer (themed like Intellipad and Quadrant) &lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd857485(VS.85).aspx"&gt;UML Domain&lt;/a&gt; support (Use Case, Activity, Class, Sequence, Component diagrams, etc) and a loader to import UML diagrams in XMI format into the repository &lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd857487(VS.85).aspx"&gt;CLR Domain&lt;/a&gt; support and a loader to import .NET assemblies into the repository &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I was told that we would have support for most of the command line tools in Intellipad for this release such as being able to compile and deploy to the repository. However, after having played with Intellipad for 30 minutes this morning, I can’t find any of these commands.  They should be some simple customizations via python scripts and modifying some xml files.  Hopefully the team will release these additions as well.&lt;/p&gt;
&lt;p&gt;Download the CTP here: &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=827122a5-3ca0-4389-a79e-87af37cbf60d&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=827122a5-3ca0-4389-a79e-87af37cbf60d&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;&lt;/h4&gt;
&lt;h4&gt;&lt;/h4&gt;
&lt;h4&gt;Install Experience&lt;/h4&gt;
&lt;p&gt;The install experience has been greatly improved. (Be sure to install any previous versions first) Here are some screenshots:&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="133"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image3.png"&gt;&lt;img title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb3.png" width="244" height="181"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td valign="top" width="133"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image4.png"&gt;&lt;img title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb4.png" width="244" height="181"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td valign="top" width="133"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image5.png"&gt;&lt;img title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb5.png" width="244" height="181"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="133"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image6.png"&gt;&lt;img title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb6.png" width="244" height="181"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td valign="top" width="133"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image7.png"&gt;&lt;img title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb7.png" width="244" height="181"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td valign="top" width="133"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image8.png"&gt;&lt;img title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb8.png" width="244" height="181"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="133"&gt;
&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image9.png"&gt;&lt;img title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb9.png" width="244" height="181"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="133"&gt; &lt;/td&gt;
&lt;td valign="top" width="133"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/05/27/oslo-may-2009-ctp-released/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/05/27/oslo-may-2009-ctp-released/&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=odsimS2i6Rg:ovZtgXQaVPg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=odsimS2i6Rg:ovZtgXQaVPg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=odsimS2i6Rg:ovZtgXQaVPg:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=odsimS2i6Rg:ovZtgXQaVPg:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=odsimS2i6Rg:ovZtgXQaVPg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=odsimS2i6Rg:ovZtgXQaVPg:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=odsimS2i6Rg:ovZtgXQaVPg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=odsimS2i6Rg:ovZtgXQaVPg:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=odsimS2i6Rg:ovZtgXQaVPg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=odsimS2i6Rg:ovZtgXQaVPg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=odsimS2i6Rg:ovZtgXQaVPg:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/odsimS2i6Rg" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/8EUkBGInu4o" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/odsimS2i6Rg/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1242959984521"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/05/21/visual-studio-2010-extension-manager/">tag:google.com,2005:reader/item/c7e52b19d7767bff</id><category term="Visual Studio" /><title type="html">Visual Studio 2010: Extension Manager</title><published>2009-05-21T23:51:53Z</published><updated>2009-05-21T23:51:53Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/x2NP8AmEDzU/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;p&gt;Since PDC 2008 we have been hearing about the &lt;a href="http://www.codeplex.com/MEF"&gt;Managed Extensibility Framework&lt;/a&gt; (MEF) support in Visual Studio 2010.  Now that the Beta has been released, we can start to see how it is coming together.  To access the MEF extensions, just open the Extension Manager from the menu bar: Tools –&amp;gt; Extension Manager.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/521200911549pm1.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="5-21-2009 1-15-49 PM" border="0" alt="5-21-2009 1-15-49 PM" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/521200911549pm-thumb.png" width="644" height="446"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;It appears that we will have a host of categories for different types extensions.  You can choose from “Installed Extensions” or browse the “Online Gallery”. The major categories are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Controls
&lt;ol&gt;
&lt;li&gt;ASP.Net Controls &lt;/li&gt;
&lt;li&gt;Framework &amp;amp; Libraries &lt;/li&gt;
&lt;li&gt;Sharepoint Controls &lt;/li&gt;
&lt;li&gt;Silverlight Controls &lt;/li&gt;
&lt;li&gt;Windows Forms Controls &lt;/li&gt;
&lt;li&gt;WPF Controls &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Templates
&lt;ol&gt;
&lt;li&gt;Windows Forms &lt;/li&gt;
&lt;li&gt;WPF &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Tools
&lt;ol&gt;
&lt;li&gt;Build &lt;/li&gt;
&lt;li&gt;Coding &lt;/li&gt;
&lt;li&gt;Data &lt;/li&gt;
&lt;li&gt;Documentation &lt;/li&gt;
&lt;li&gt;Modeling &lt;/li&gt;
&lt;li&gt;Other &lt;/li&gt;
&lt;li&gt;Performance &lt;/li&gt;
&lt;li&gt;Programming &amp;amp; Languages &lt;/li&gt;
&lt;li&gt;Reporting &lt;/li&gt;
&lt;li&gt;Setup &amp;amp; Deployment &lt;/li&gt;
&lt;li&gt;Source Control &lt;/li&gt;
&lt;li&gt;Team Development &lt;/li&gt;
&lt;li&gt;Testing &lt;/li&gt;
&lt;li&gt;Web &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Currently there are only 12 extensions available, and none appear to be new UI controls. Some of them are pretty interesting, but I am excited about what this could lead to. You seem to be able to extend quite a few areas of Visual Studio now!&lt;/p&gt;
&lt;p&gt;Some of the more interesting existing extensions are:&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="706"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="394"&gt;&lt;strong&gt;Intellisense Presenter&lt;/strong&gt;           &lt;br&gt;A new way to view your intellisense in a WPF fashion.&lt;/td&gt;
&lt;td valign="top" width="310"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb.png" width="244" height="81"&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="394"&gt;&lt;strong&gt;RegEx Editor&lt;/strong&gt;           &lt;br&gt;Regular expression syntax highlighting, intellisense, in place testing, and more right from your code.&lt;/td&gt;
&lt;td valign="top" width="310"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image1.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb1.png" width="200" height="200"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="394"&gt;&lt;strong&gt;Image Insertion            &lt;br&gt;&lt;/strong&gt;This allows you to insert images into code files.  Great for adding developer documentation, but not sure what else it would be useful for.&lt;/td&gt;
&lt;td valign="top" width="310"&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image2.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="image" border="0" alt="image" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/image-thumb2.png" width="201" height="200"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;I haven’t been able to find the WPF xml document visualizer that they showed off at PDC 2008. Hopefully this will show up in the gallery soon along with other useful nuggets.&lt;/p&gt;
&lt;p&gt;I wonder if this will turn into a platform for pushing out new controls to use in our applications in between releases.  It was disappointing to not find any new controls in the toolbox when working with WinForms or WPF.  It is also unclear about how a developer can submit new extensions that be browsed through the gallery.&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/05/21/visual-studio-2010-extension-manager/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/05/21/visual-studio-2010-extension-manager/&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SiBHmAbqo7g:vV2KholbWXA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SiBHmAbqo7g:vV2KholbWXA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SiBHmAbqo7g:vV2KholbWXA:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SiBHmAbqo7g:vV2KholbWXA:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SiBHmAbqo7g:vV2KholbWXA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SiBHmAbqo7g:vV2KholbWXA:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SiBHmAbqo7g:vV2KholbWXA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SiBHmAbqo7g:vV2KholbWXA:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SiBHmAbqo7g:vV2KholbWXA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SiBHmAbqo7g:vV2KholbWXA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SiBHmAbqo7g:vV2KholbWXA:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/SiBHmAbqo7g" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/x2NP8AmEDzU" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/SiBHmAbqo7g/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1242860627125"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/05/20/entity-framework-40-scalar-and-void-functions/">tag:google.com,2005:reader/item/04afa8156cfba9ce</id><category term="Entity Framework" /><title type="html">Entity Framework 4.0: Scalar and Void Functions</title><published>2009-05-20T22:52:10Z</published><updated>2009-05-20T22:52:10Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/Zywm7YMRdJ8/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;p&gt;One feature that was sorely missing in the first version of Entity Framework was the automated ability to work with stored procedures that didn’t return back entities.  This could have been sprocs that returned void, a scalar value, or some other custom construct.  &lt;/p&gt;
&lt;h2&gt;Entity Framework v1&lt;/h2&gt;
&lt;p&gt;In Entity Framework v1 you could create a “Function Import” from these stored procedures types, but there would be no generated code that would give you access to them directly in the ObjectContext object.  You could only access them via pure &lt;a href="http://msdn.microsoft.com/en-us/library/bb387145.aspx"&gt;Entity SQL&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;To add a “Function Import” you would just add the sproc to your entity model as your normally would, then right-click on the “Function Imports” in the “Model Browser”, and select “Add Function Import…”.  This would bring up the following screen which would allow you to add your function.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/5202009103234am.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="5-20-2009 10-32-34 AM" border="0" alt="5-20-2009 10-32-34 AM" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/5202009103234am-thumb.png" width="403" height="295"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;If you selected that the function returned an Entity, then you would be able to access that entity in the ObjectContext. However, if you selected scalar or void, then you would have to manually write some kind of Entity SQL.  It would be nice if these “Function Imports” appeared as operations in the ObjectContext as well.&lt;/p&gt;
&lt;h2&gt;Entity Framework 4.0 Solution&lt;/h2&gt;
&lt;p&gt;Microsoft finally completed the story for “Function Imports” in Entity Framework 4.0. As you can see in the image below, the “Add Function Import” dialog is virtually the same except for the new option to return a complex type.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/520200954225pm.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="5-20-2009 5-42-25 PM" border="0" alt="5-20-2009 5-42-25 PM" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/520200954225pm-thumb.png" width="467" height="364"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;You can select the None and Scalar return types as you could before.  However, when the “Function Import” is created, some new code is injected into the Model code behind file that materializes the stored procedure into an operation on the ObjectContext itself:&lt;/p&gt;
&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;border-right:silver 1px solid;padding-top:4px"&gt;
&lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; ObjectResult&amp;lt;Nullable&amp;lt;global::System.Int32&amp;gt;&amp;gt; GetProductCountByCategoryId(&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    Nullable&amp;lt;global::System.Int32&amp;gt; categoryID)&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;{&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    ObjectParameter categoryIDParameter;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (categoryID.HasValue)&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    {&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        categoryIDParameter = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ObjectParameter(&lt;span style="color:#006080"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, categoryID);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    }&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    {&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        categoryIDParameter = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ObjectParameter(&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;            &lt;span style="color:#006080"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;            &lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(global::System.Int32));&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    }&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;.ExecuteFunction&amp;lt;Nullable&amp;lt;global::System.Int32&amp;gt;&amp;gt;(&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        &lt;span style="color:#006080"&gt;&amp;quot;GetProductCountByCategoryId&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        categoryIDParameter);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;}&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A couple of nice things about this are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No matter what we select as the return type, it wraps it as a Nullable type since a database value can always be null &lt;/li&gt;
&lt;li&gt;The results are wrapped in an ObjectResult which makes it consistent with all other queries. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And as we expect, we can directly access these operations in our code:&lt;/p&gt;
&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;border-right:silver 1px solid;padding-top:4px"&gt;
&lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#0000ff"&gt;using&lt;/span&gt; (var context = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; NorthwindEntities())&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;{&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    ObjectResult&amp;lt;&lt;span style="color:#0000ff"&gt;int&lt;/span&gt;?&amp;gt; result =&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        context.GetProductCountByCategoryId(1);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    MessageBox.Show(&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        result.FirstOrDefault().Value.ToString());&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;}&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;New “Execute” operations&lt;/h2&gt;
&lt;p&gt;If you look at the last line of the code generated by “Add Function Import”, you might notice is making a call to a new method called ExecuteFunction&amp;lt;T&amp;gt;.  This method isn’t marked public, but there are two new methods on ObjectContext that we can use to execute functions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;int ExecuteStoreCommand&lt;/strong&gt;
&lt;p&gt;This method seems to work like “ExecuteCommand” and returns in int representing the result &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;T ExecuteStoreQuery&amp;lt;T&amp;gt;&lt;br&gt;
      &lt;br&gt;&lt;/strong&gt;This appears to be more of a combination of “ExecuteScalar”, “ExecuteNonQuery”, and “ExecuteReader”. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These methods give us the ability to run any imported stored procedure in a variety of ways.  Most users, will want to just stick with the generated operations, but its always good to have options!&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/05/20/entity-framework-40-scalar-and-void-functions/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/05/20/entity-framework-40-scalar-and-void-functions/&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SmpQW5Hj8bo:i8TkMijw8SE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SmpQW5Hj8bo:i8TkMijw8SE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SmpQW5Hj8bo:i8TkMijw8SE:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SmpQW5Hj8bo:i8TkMijw8SE:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SmpQW5Hj8bo:i8TkMijw8SE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SmpQW5Hj8bo:i8TkMijw8SE:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SmpQW5Hj8bo:i8TkMijw8SE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SmpQW5Hj8bo:i8TkMijw8SE:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SmpQW5Hj8bo:i8TkMijw8SE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SmpQW5Hj8bo:i8TkMijw8SE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SmpQW5Hj8bo:i8TkMijw8SE:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/SmpQW5Hj8bo" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/Zywm7YMRdJ8" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/SmpQW5Hj8bo/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1242829668419"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/05/20/new-screencast-custom-sprocs-in-entity-framework/">tag:google.com,2005:reader/item/c43c80ada0d14a45</id><category term="Entity Framework" /><category term="Webcast" /><title type="html">New Screencast: Custom Sprocs in Entity Framework</title><published>2009-05-20T14:11:00Z</published><updated>2009-05-20T14:11:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/sqIV37qDIIk/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/screencast1thumbthumb1.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px" title="screencast1thumb-thumb" border="0" alt="screencast1thumb-thumb" align="right" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/screencast1thumbthumb-thumb1.png" width="128" height="128"&gt;&lt;/a&gt; I have a new 8 min 35sec training webcast up over using custom stored procedures in Entity Framework.  This video introduces how to use custom sprocs in your Entity Framework model for inserts, updates, deletes, and custom sprocs for searching.  The video briefly talks about how to work with void and scalar sprocs, but doesn’t get far into these as this is a feature that is getting more attention in the next version of Entity Framework.&lt;/p&gt;
&lt;p&gt;The video is available through &lt;a href="http://www.jupitermedia.com"&gt;JupiterMedia&lt;/a&gt; and can be viewed at &lt;a href="http://www.internet.com/video/"&gt;http://www.internet.com/video/&lt;/a&gt;. Just look for the &amp;quot;Developer Video&amp;quot; titled &amp;quot;Custom Sprocs in Entity Framework&amp;quot;.&lt;/p&gt;
&lt;p&gt;Direct links are:    &lt;br&gt;&lt;a title="http://www.internet.com/player/index.php?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=22915014001" href="http://www.internet.com/player/index.php?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=22915014001"&gt;http://www.internet.com/player/index.php?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=22915014001&lt;/a&gt;&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/05/20/new-screencast-custom-sprocs-in-entity-framework/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/05/20/new-screencast-custom-sprocs-in-entity-framework/&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=O2jhKQvpDvg:hU4cf_VhGzo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=O2jhKQvpDvg:hU4cf_VhGzo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=O2jhKQvpDvg:hU4cf_VhGzo:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=O2jhKQvpDvg:hU4cf_VhGzo:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=O2jhKQvpDvg:hU4cf_VhGzo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=O2jhKQvpDvg:hU4cf_VhGzo:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=O2jhKQvpDvg:hU4cf_VhGzo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=O2jhKQvpDvg:hU4cf_VhGzo:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=O2jhKQvpDvg:hU4cf_VhGzo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=O2jhKQvpDvg:hU4cf_VhGzo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=O2jhKQvpDvg:hU4cf_VhGzo:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/O2jhKQvpDvg" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/sqIV37qDIIk" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/O2jhKQvpDvg/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1242813205595"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/05/19/new-webcast-adonet-data-services/">tag:google.com,2005:reader/item/344f18ca2b21473d</id><category term="Webcast" /><title type="html">New Webcast: ADO.Net Data Services</title><published>2009-05-20T01:19:23Z</published><updated>2009-05-20T01:19:23Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/V_7w6qMP4RI/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/screencast1thumbthumb.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px" title="screencast1thumb-thumb" border="0" alt="screencast1thumb-thumb" align="right" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/screencast1thumbthumb-thumb.png" width="128" height="128"&gt;&lt;/a&gt;I have a new 7 min 55 sec training webcast up over developing ADO.Net DataServices.  This video demonstrates how to create and consume  a simple ADO.Net Data service.&lt;/p&gt;
&lt;p&gt;The video is available through &lt;a href="http://www.jupitermedia.com"&gt;JupiterMedia&lt;/a&gt; and can be viewed at &lt;a href="http://www.internet.com/video/"&gt;http://www.internet.com/video/&lt;/a&gt;. Just look for the &amp;quot;Developer Video&amp;quot; titled &amp;quot;ADO.Net Data Services&amp;quot;.&lt;/p&gt;
&lt;p&gt;Direct links are:    &lt;br&gt;&lt;a title="http://www.internet.com/video/?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=13662214001" href="http://www.internet.com/video/?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=13662214001"&gt;http://www.internet.com/video/?bcpid=1534611832&amp;amp;bclid=1433966034&amp;amp;bctid=13662214001&lt;/a&gt;&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/05/19/new-webcast-adonet-data-services/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/05/19/new-webcast-adonet-data-services/&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SipQt2H-sfc:5pj4PCPru58:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SipQt2H-sfc:5pj4PCPru58:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SipQt2H-sfc:5pj4PCPru58:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SipQt2H-sfc:5pj4PCPru58:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SipQt2H-sfc:5pj4PCPru58:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SipQt2H-sfc:5pj4PCPru58:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SipQt2H-sfc:5pj4PCPru58:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SipQt2H-sfc:5pj4PCPru58:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SipQt2H-sfc:5pj4PCPru58:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=SipQt2H-sfc:5pj4PCPru58:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=SipQt2H-sfc:5pj4PCPru58:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/SipQt2H-sfc" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/V_7w6qMP4RI" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/SipQt2H-sfc/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1242813205594"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/05/19/entity-framework-40-pluralization/">tag:google.com,2005:reader/item/35c9c4f45a52a0db</id><category term="Entity Framework" /><title type="html">Entity Framework 4.0: Pluralization</title><published>2009-05-20T01:00:15Z</published><updated>2009-05-20T01:00:15Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/90KewmUVNNE/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;div&gt;One of the new features in Entity Framework 4.0 (EF v2) is a service call “Pluralization”.  This service is used to convert names of objects form singular and/or plural forms.  For instance, if you have a table in the database that has a plural name such as “Customers”, then Entity Framework will automatically generate both object Name and Entity Set Name to “Customers” as well.  The result is that in your code, the name will look like this:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;Customers c = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Customers();&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Ideally, it would have been nice for EF to see that the table was a plural name and set the object Name to a singular form.&lt;/p&gt;
&lt;p&gt;Now, you may be thinking that this is pretty trivial since you can manually change the generated name, but when when you have dozens or hundreds of tables this can be tedious at best.&lt;/p&gt;
&lt;p&gt;To use the PluralizationService when generating an Entity Framework model, you just select the option&amp;quot;Pluralize or singularize generated object names”:&lt;br&gt;
    &lt;br&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Pluralization" border="0" alt="Pluralization" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization-thumb.png" width="419" height="538"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or if you are using the EDMGen.exe tool, you can opt in using the &lt;strong&gt;/pluralize&lt;/strong&gt; option.&lt;/p&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;In the Northwind database, all the tables have plural names. (Note: It is typically recommended to name your tables in the singular form).&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Pluralization3" border="0" alt="Pluralization3" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization3-thumb.png" width="213" height="239"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When this database is generated using the PluralizationService, the names are set correctly.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization1.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Pluralization1" border="0" alt="Pluralization1" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization1-thumb.png" width="615" height="457"&gt;&lt;/a&gt; &lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization2.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Pluralization2" border="0" alt="Pluralization2" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization2-thumb.png" width="615" height="455"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h2&gt;Manually using the PluralizationService&lt;/h2&gt;
&lt;p&gt;The PluralizationService is in the System.Data.Entity.Design.dll under the System.Data.Entity.Design.PluralizationServices namespace. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization4.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Pluralization4" border="0" alt="Pluralization4" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization4-thumb.png" width="668" height="151"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;It is an abstract class and hence, can’t be directly instantiated.  However, there is a static CreateService method on the class to access instances of the service for various cultures.  At this time, the only culture implemented is “en-us”.&lt;/p&gt;
&lt;p&gt;It would have been very nice if this were implemented at a more core level of .Net since this could potentially be useful for a lot more than just for Entity Framework design.  Here are some examples using the service:&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;border-right:silver 1px solid;padding-top:4px"&gt;
&lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// Create an instance of the service for&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// a particular culture (only 'en-us' atm)&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;PluralizationService ps =&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    PluralizationService.CreateService(&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;         CultureInfo.GetCultureInfo(&lt;span style="color:#006080"&gt;&amp;quot;en-us&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// Convert strings to plural or singular&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; pluralName = ps.Pluralize(&lt;span style="color:#006080"&gt;&amp;quot;Goose&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; singularName = ps.Singularize(&lt;span style="color:#006080"&gt;&amp;quot;Territories&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// Note: Correctly returns Geese and Territory&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// Check if strings are plural or singular&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; isPluralName = ps.IsPlural(&lt;span style="color:#006080"&gt;&amp;quot;Sheep&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; isSingularName = ps.IsSingular(&lt;span style="color:#006080"&gt;&amp;quot;Sheep&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;// Note: Correctly sees both of these &lt;span style="color:#0000ff"&gt;as&lt;/span&gt; true&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a title="http://blogs.msdn.com/efdesign/archive/2008/12/02/pluralization.aspx" href="http://blogs.msdn.com/efdesign/archive/2008/12/02/pluralization.aspx"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;Adding your own pluralization mapping&lt;/h2&gt;
&lt;p&gt;There is an interface using by the PluralizationService called ICustomPluralizationMapping that isn’t publicly exposed.  However, since it is implemented, you can cast the service to this interface and make use of the AddWord method to add your own mapping.&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization5.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px" title="Pluralization5" border="0" alt="Pluralization5" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/05/pluralization5-thumb.png" width="539" height="147"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;In this example, we add a new word called “Foo” with the plural version being “Foos”:&lt;/p&gt;
&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;border-right:silver 1px solid;padding-top:4px"&gt;
&lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// Create an instance of the service for&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// a particular culture (only 'en-us' atm)&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;PluralizationService ps =&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    PluralizationService.CreateService(&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        CultureInfo.GetCultureInfo(&lt;span style="color:#006080"&gt;&amp;quot;en-us&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// Cast to the mapping interface&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;ICustomPluralizationMapping mapping =&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    ps &lt;span style="color:#0000ff"&gt;as&lt;/span&gt; ICustomPluralizationMapping;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;&lt;span style="color:#008000"&gt;// Add a new word mapping&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;mapping.AddWord(&lt;span style="color:#006080"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080"&gt;&amp;quot;Foos&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;You could then use the service to generate the metadata or use it in some other context:&lt;/div&gt;
&lt;div&gt;
&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;border-right:silver 1px solid;padding-top:4px"&gt;
&lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;EntityModelSchemaGenerator generator =&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;    &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; EntityModelSchemaGenerator(&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        entityContainer,&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;        ps);&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt; &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"&gt;var edm = generator.GenerateMetadata(); &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/05/19/entity-framework-40-pluralization/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/05/19/entity-framework-40-pluralization/&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=Bbf_E-ChG0Q:OP8UhqKXzFo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=Bbf_E-ChG0Q:OP8UhqKXzFo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=Bbf_E-ChG0Q:OP8UhqKXzFo:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=Bbf_E-ChG0Q:OP8UhqKXzFo:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=Bbf_E-ChG0Q:OP8UhqKXzFo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=Bbf_E-ChG0Q:OP8UhqKXzFo:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=Bbf_E-ChG0Q:OP8UhqKXzFo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=Bbf_E-ChG0Q:OP8UhqKXzFo:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=Bbf_E-ChG0Q:OP8UhqKXzFo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=Bbf_E-ChG0Q:OP8UhqKXzFo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=Bbf_E-ChG0Q:OP8UhqKXzFo:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/Bbf_E-ChG0Q" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/90KewmUVNNE" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/Bbf_E-ChG0Q/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1242141110435"><id gr:original-id="d10481e0-d7e7-4234-9ab6-db53a9657b7e:8852">tag:google.com,2005:reader/item/530ba0b9104a0ebb</id><category term="Job" scheme="http://manicprogrammer.com/cs/blogs/willeke/archive/tags/Job/default.aspx" /><title type="html">What’s next, and why?</title><published>2009-05-12T14:29:00Z</published><updated>2009-05-12T14:29:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/JKIrba48iOU/what-s-next-and-why.aspx" type="text/html" /><summary xml:base="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="html">&lt;p style="margin:0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;The time has come to take another big step towards my dreams and move into the next phase of my career. Understanding how this move is a natural extension of my current position requires an understanding of where I have been in the past and an appreciation of the context of each of those positions.&lt;span&gt;  &lt;/span&gt;I can divide my life to this point into five major phases of learning and development: childhood, college, and career phases one through three. I spent my childhood learning about the world around me, about whom I am, and about what core values I hold. I do not believe these core values or understandings will ever truly change, meaning I will for better or worse be a small-town Midwestern guy for my entire life. I then studied for four years at Rose-Hulman Institute of Technology. I acquired a great deal of knowledge in my time there, but more importantly, I became aware of how to learn. I gained the perspectives that allow me to compare what I see at any given moment against my experiences, the experiences of others, a varied set of perspectives, and an extensive body of knowledge. This process granted me the ability to quickly and accurately categorize information and identify inconsistencies within that information.&lt;/font&gt;&lt;/p&gt;
&lt;p style="margin:0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;Finally, I moved into my professional career. I invested seven years into SEP, Inc. on the north side of Indianapolis. I believe this time consisted of two different phases with a fuzzy boundary between them. First, I learned my craft. My first four years focused heavily on direct delivery of value as a developer. I observed leadership behaviors during this time, and I learned about more than technology, but my primary focus was becoming an expert developer and coder.&lt;span&gt;  &lt;/span&gt;Second, I began to make the first steps into technical leadership roles. I became aware of the value of learning techniques from outside my role, and later from outside my industry. I started studying and evaluating different approaches towards accomplishing software delivery. I took responsibility for the design, flow, and implementation of software projects. I explored the “rules” imposed by various regulatory frameworks, and became inspired by recognition of the essence of flow buried deep inside. I examined the structures of people and projects around me, better understanding their behaviors. In short, I became aware of the non-coding aspects of the software engineering industry.&lt;span&gt;  &lt;/span&gt;More importantly, I began reading a number of business and economics books, histories of capital and finance, current events in business and industry. I launched “Rediscovering the Obvious”. &lt;/font&gt;&lt;/p&gt;
&lt;p style="margin:0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;After a time, the yearning to do something different took over, and I accepted an offer to try my hand at product development. My first short gig in that direction did not work out, but I learned a great deal and moved to my current role at Inkubook.com. I came in as a senior software developer, but James, then director of Inkubook, promoted me to a software architecture role a short while later. This time was incredibly exciting to me professionally. This opportunity allowed me to spend nearly two years deeply focused on product development in a role allowing me a great deal of input into every aspect of the product and the context in which we built it. The environment at Inkubook is incredibly empowering in a number of ways. The team’s leadership offers individuals a great deal of flexibility and empowerment in how they approach their work and development. My management has been incredibly supportive of my speaking engagements, allowing me to tell the story of Inkubook publicly and providing time in which to do so. They have supported the team’s desire to learn with a very steady book budget and a ready environment in which we discuss what we learn. The architects regularly exchange sources and ideas about any number of technology topics. Ideas are encouraged and respected regardless of who originates them, and each idea is given a chance to prove itself before a decision is made. I have not worked in any environment so supportive of learning, and the effects are visible in the obvious engagement shown by each of my peers. This passion to improve amplifies itself within the team, leading us to a team culture of continuous self-improvement by each member of the team. &lt;/font&gt;&lt;/p&gt;
&lt;p style="margin:0in 0in 10pt"&gt;&lt;font face="Calibri" size="3"&gt;Why am I leaving Inkubook? I can honestly say there is no place in Indianapolis I would rather write software, it is a great place to work and the people are incredible. However, I have long been very passionate about how people go about writing software and delivering systems. EMC has offered me a position allowing me a great deal of freedom in my personal life. I will share more about the nature of this position when I understand which aspects are confidential strategy and which are more public. However, I will happily share my excitement on what this means for my life. First, I will be spending a month in London getting to know my team and delivering on some initial contracts over there. Then, I will be free of geographical constraints with the single primary restriction of needing to be near an airport. This frees Marian, Elle, and I to explore the world and try living different places. Equally importantly, this nicely aligns my daytime responsibilities with my learning passions, making work feel less like work. Finally, I love to teach, and much of this role will be directly helping people learn in various forms. Overall, this feels like the next natural evolution of my career, and I look forward to embracing the opportunity.&lt;/font&gt;&lt;/p&gt;&lt;img src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=8852" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/JKIrba48iOU" height="1" width="1"/&gt;</summary><author><name>willeke</name></author><source gr:stream-id="feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx"><id>tag:google.com,2005:reader/feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx</id><title type="html">Rediscovering the Obvious</title><link rel="alternate" href="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="text/html" /></source><feedburner:origLink>http://manicprogrammer.com/cs/blogs/willeke/archive/2009/05/12/what-s-next-and-why.aspx</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1240577641393"><id gr:original-id="tag:blogger.com,1999:blog-6800934446457898793.post-7080898641294242243">tag:google.com,2005:reader/item/1918727a37d9bed8</id><title type="html">Using Obscure Windows COM APIs in .NET</title><published>2009-04-24T12:37:00Z</published><updated>2009-04-24T13:41:06Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/8rfKADnH_g0/using-obscure-windows-com-apis-in-net.html" type="text/html" /><content xml:base="http://www.moserware.com/" type="html">&lt;p&gt;Most native Windows APIs are simple to call from .NET. For example, if you need to do something special when showing a window, you can use the &lt;a href="http://msdn.microsoft.com/en-us/library/ms633548%28VS.85%29.aspx"&gt;ShowWindow&lt;/a&gt; API using &lt;a href="http://en.wikipedia.org/wiki/Platform_Invocation_Services"&gt;Platform Invocation Services&lt;/a&gt; (P/Invoke) like this:&lt;/p&gt;&lt;pre&gt;[&lt;span style="color:rgb(43, 145, 175)"&gt;DllImport&lt;/span&gt;(&lt;span style="color:rgb(163, 21, 21)"&gt;"user32.dll"&lt;/span&gt;)]&lt;br&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;static&lt;/span&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;extern&lt;/span&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;bool&lt;/span&gt; ShowWindow(&lt;span style="color:rgb(43, 145, 175)"&gt;IntPtr&lt;/span&gt; hWnd, &lt;span style="color:rgb(0, 0, 255)"&gt;int&lt;/span&gt; nCmdShow);&lt;/pre&gt;&lt;p&gt;When you call this function, here's roughly what happens:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The CLR calls &lt;a href="http://msdn.microsoft.com/en-us/library/ms684175%28VS.85%29.aspx"&gt;LoadLibrary&lt;/a&gt; on the file (e.g. "user32.dll") &lt;/li&gt;&lt;li&gt;The CLR then calls &lt;a href="http://msdn.microsoft.com/en-us/library/ms683212%28VS.85%29.aspx"&gt;GetProcAddress&lt;/a&gt; on the function name (e.g. "ShowWindow") to get the address of where the function is located. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For the most part, it just magically works. If we had used a function like "MessageBox", the CLR would notice that it doesn't exist and would then pick between the ANSI version (e.g. "MessageBoxA") or the Unicode version (e.g. "MessageBoxW"). &lt;/p&gt;&lt;p&gt;With the address in hand, it's easy to &lt;a href="http://en.wikipedia.org/wiki/Branch_%28computer_science%29"&gt;jump&lt;/a&gt; to it and you're all set. Simple and easy.&lt;/p&gt;&lt;p&gt;I was expecting a simple API like this when I was investigating how to register my program as the default handler for ".wav" files on Vista. In the pre-Vista days, most programs would write directly into a registry key for the file extension (e.g. "&lt;a href="http://msdn.microsoft.com/en-us/library/ms724475%28VS.85%29.aspx"&gt;HKEY_CLASSES_ROOT&lt;/a&gt;\.wav") and move on. Problems come when your program wants to register itself as a handler for a "popular" extension like .MP3 or .HTM. Some programs go into an all out arms race with other programs in a fight of wills to make sure they keep the extension.&lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_Zfbv3mHcYrc/SfGs68ifNcI/AAAAAAAABNA/tJInxh8ezP0/s1600-h/SetFileAssociations.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Zfbv3mHcYrc/SfGs68ifNcI/AAAAAAAABNA/tJInxh8ezP0/s320/SetFileAssociations.png"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;In Windows Vista and later, Microsoft wants us to use the new "&lt;a href="http://msdn.microsoft.com/en-us/library/bb756951.aspx"&gt;Default Programs&lt;/a&gt;" feature. The idea is that you register what file extensions your program supports in the registry and then a nice UI allows people to easily pick which of those extensions they want to associate with your program. Digging around the documentation led me to discover that the bulk of the functionality was exposed via the &lt;a href="http://msdn.microsoft.com/en-us/library/bb776332.aspx"&gt;IApplicationAssociationRegistration&lt;/a&gt; COM interface.&lt;/p&gt;&lt;p&gt;Ah, COM. &lt;/p&gt;&lt;p&gt;Over the years, I've tried to keep my distance from it. This irrational fear came from wizards that "next, next, finish"'d your way into thousands of lines of inscrutable code. It took me years of passing glances to &lt;a href="http://www.moserware.com/2008/01/finally-understanding-com-after.html"&gt;finally understand its basics&lt;/a&gt;. Even then, when I needed to use it from .NET, I'd right click on my project references and click "Add Reference":&lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_Zfbv3mHcYrc/SevLN4jNxKI/AAAAAAAABMw/14fMxyJI9Dg/s1600-h/AddComReference.png"&gt;&lt;img src="http://2.bp.blogspot.com/_Zfbv3mHcYrc/SevLN4jNxKI/AAAAAAAABMw/14fMxyJI9Dg/s400/AddComReference.png"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;I'd pick the library I needed and then somehow I could use the types as if they were .NET objects. I didn't ask further questions and moved on.&lt;/p&gt;&lt;p&gt;Unfortunately, IApplicationAssociationRegistration was nowhere to be found on the "Add Reference" list since it doesn't seem to have a registered type library associated with it. Using my basic COM knowledge, I knew that if I wanted to use it I would need to know the interface identifier (IID) as well as a class identifier (CLSID) that pointed to a concrete implementation.&lt;/p&gt;&lt;p&gt;Following the MSDN documentation, I knew I'd probably find success in shobjidl.idl:&lt;/p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb776332.aspx"&gt;&lt;img src="http://1.bp.blogspot.com/_Zfbv3mHcYrc/SevPpp-xVNI/AAAAAAAABM4/UD8xgiLPBCo/s400/InterfaceInformation.png"&gt;&lt;/a&gt; &lt;p&gt;Sure enough, shobjidl.idl was sitting in my "C:\Program Files\Microsoft SDKs\Windows\&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&amp;amp;displaylang=en"&gt;v6.1&lt;/a&gt;\Include" directory and had this interface definition:&lt;/p&gt;&lt;pre&gt;[&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;object&lt;/span&gt;,&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;uuid&lt;/span&gt;(4e530b0a-e611-4c77-a3ac-9031d022281b),&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;pointer_default&lt;/span&gt;(&lt;span style="color:rgb(0, 0, 255)"&gt;unique&lt;/span&gt;),&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;helpstring&lt;/span&gt;(&lt;span style="color:rgb(163, 21, 21)"&gt;"Protocol URL and Extension File Application"&lt;/span&gt;)&lt;br&gt;]&lt;br&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;interface&lt;/span&gt; IApplicationAssociationRegistration : IUnknown&lt;br&gt;{&lt;br&gt; HRESULT QueryCurrentDefault(&lt;br&gt;     [&lt;span style="color:rgb(0, 0, 255)"&gt;in&lt;/span&gt;, &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt;] LPCWSTR pszQuery,&lt;br&gt;     [&lt;span style="color:rgb(0, 0, 255)"&gt;in&lt;/span&gt;] ASSOCIATIONTYPE atQueryType,&lt;br&gt;     [&lt;span style="color:rgb(0, 0, 255)"&gt;in&lt;/span&gt;] ASSOCIATIONLEVEL alQueryLevel,&lt;br&gt;     [&lt;span style="color:rgb(0, 0, 255)"&gt;out&lt;/span&gt;, &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt;] LPWSTR* ppszAssociation);&lt;br&gt;&lt;br&gt;...&lt;br&gt;}&lt;/pre&gt;&lt;p&gt;A little further down was the declaration for the concrete class (coclass) and its associated class id (CLSID):&lt;/p&gt;&lt;pre&gt;&lt;span style="color:rgb(0, 128, 0)"&gt;// CLSID_ApplicationAssociationRegistration&lt;/span&gt;&lt;br&gt;[ &lt;span style="color:rgb(0, 0, 255)"&gt;uuid&lt;/span&gt;(591209c7-767b-42b2-9fba-44ee4615f2c7) ] &lt;span style="color:rgb(0, 0, 255)"&gt;coclass&lt;/span&gt; ApplicationAssociationRegistration&lt;br&gt;{&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;interface&lt;/span&gt; IApplicationAssociationRegistration;&lt;br&gt;}&lt;/pre&gt;&lt;p&gt;In the IDL, we also see the definitions for the enums that the functions use:&lt;/p&gt;&lt;pre&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;typedef&lt;/span&gt; [v1_enum] &lt;span style="color:rgb(0, 0, 255)"&gt;enum&lt;/span&gt; tagASSOCIATIONLEVEL&lt;br&gt;{&lt;br&gt; AL_MACHINE,&lt;br&gt; AL_EFFECTIVE,&lt;br&gt; AL_USER,&lt;br&gt;} ASSOCIATIONLEVEL;&lt;br&gt;&lt;br&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;typedef&lt;/span&gt; [v1_enum] &lt;span style="color:rgb(0, 0, 255)"&gt;enum&lt;/span&gt; tagASSOCIATIONTYPE&lt;br&gt;{&lt;br&gt; AT_FILEEXTENSION,&lt;br&gt; AT_URLPROTOCOL,&lt;br&gt; AT_STARTMENUCLIENT,&lt;br&gt; AT_MIMETYPE,&lt;br&gt;} ASSOCIATIONTYPE;&lt;/pre&gt;&lt;p&gt;Getting this to work in .NET was surprisingly easy. The basic idea is that the CLR has to have just enough information to find the types:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The "&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comimportattribute.aspx"&gt;ComImportAttribute&lt;/a&gt;" is almost as simple to use as &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx"&gt;DllImportAttribute&lt;/a&gt;. In addition, you need to use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.guidattribute.aspx"&gt;GuidAttribute&lt;/a&gt; to specify the gigantic GUIDs. &lt;/li&gt;&lt;li&gt;You use the "&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.interfacetypeattribute.aspx"&gt;InterfaceTypeAttribute&lt;/a&gt;" to specify the basic interface(s) that the interface you're importing uses. In COM, all interfaces derive from &lt;a href="http://msdn.microsoft.com/en-us/library/ms680509.aspx"&gt;IUnknown&lt;/a&gt;. If the interface supports scripting then it implements &lt;a href="http://msdn.microsoft.com/en-us/library/ms221608.aspx"&gt;IDispatch&lt;/a&gt;. If you provide a speedy C++ way of accessing your interface (e.g. &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2004/02/05/68017.aspx"&gt;vtable definition&lt;/a&gt;) and the scripting IDispatch interface, you've got a "&lt;a href="http://msdn.microsoft.com/en-us/library/aa366807%28VS.85%29.aspx"&gt;dual&lt;/a&gt;" interface. &lt;/li&gt;&lt;li&gt;You need to translate the parameter types to their .NET equivalents. This is an incredibly mechanical process that's straightforward. If there is a chance that the underlying bits are different between COM and .NET (e.g. they're not &lt;a href="http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx"&gt;blittable&lt;/a&gt;) then you need to use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx"&gt;MarshalAsAttribute&lt;/a&gt; to tell the CLR how to convert the types as necessary. &lt;/li&gt;&lt;li&gt;You need to remember that COM handles errors by returning HRESULTs instead of natively using exceptions like .NET uses. By default, the CLR will make the last parameter that is an OUT parameter in the IDL to be the return value (it helps if it's marked by "retval"). Therefore, you can act as if the function really returns its last parameter and the CLR will automatically check the HRESULT and throw a corresponding .NET exception as needed.&lt;/li&gt;&lt;li&gt;Optionally, and perhaps most controversially, you're free de-&lt;a href="http://en.wikipedia.org/wiki/Hungarian_notation"&gt;Hungarianize&lt;/a&gt; the parameter names and PascalCase the enum names to make them much more friendly looking to people in .NET. It's optional since it might confuse people that use MSDN documentation and expecting the original names. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In a minute or so, I translated the definitions and gladly got rid of the Hungarian prefixes by converting parameter names of "pszQuery" to just "query." I also converted all the enums and removed their unnecessary prefixes. The end result was this:&lt;/p&gt;&lt;pre&gt;[&lt;span style="color:rgb(43, 145, 175)"&gt;ComImport&lt;/span&gt;]&lt;br&gt;[&lt;span style="color:rgb(43, 145, 175)"&gt;Guid&lt;/span&gt;(&lt;span style="color:rgb(163, 21, 21)"&gt;"4e530b0a-e611-4c77-a3ac-9031d022281b"&lt;/span&gt;)]&lt;br&gt;[&lt;span style="color:rgb(43, 145, 175)"&gt;InterfaceType&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;ComInterfaceType&lt;/span&gt;.InterfaceIsIUnknown)]&lt;br&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;internal&lt;/span&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;interface&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175)"&gt;IApplicationAssociationRegistration&lt;/span&gt;&lt;br&gt;{   &lt;br&gt; [&lt;span style="color:rgb(0, 0, 255)"&gt;return&lt;/span&gt;: &lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.LPWStr)]&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; QueryCurrentDefault( [&lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.LPWStr)] &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; query,&lt;br&gt;                           &lt;span style="color:rgb(43, 145, 175)"&gt;AssociationType&lt;/span&gt; queryType,&lt;br&gt;                           &lt;span style="color:rgb(43, 145, 175)"&gt;AssociationLevel&lt;/span&gt; queryLevel);&lt;br&gt; [&lt;span style="color:rgb(0, 0, 255)"&gt;return&lt;/span&gt;: &lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.Bool)]&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;bool&lt;/span&gt; QueryAppIsDefault([&lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.LPWStr)] &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; query,&lt;br&gt;                        &lt;span style="color:rgb(43, 145, 175)"&gt;AssociationType&lt;/span&gt; queryType,&lt;br&gt;                        &lt;span style="color:rgb(43, 145, 175)"&gt;AssociationLevel&lt;/span&gt; queryLevel,&lt;br&gt;                        [&lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.LPWStr)] &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; appRegistryName);&lt;br&gt; [&lt;span style="color:rgb(0, 0, 255)"&gt;return&lt;/span&gt;: &lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.Bool)]&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;bool&lt;/span&gt; QueryAppIsDefaultAll(&lt;span style="color:rgb(43, 145, 175)"&gt;AssociationLevel&lt;/span&gt; queryLevel,&lt;br&gt;                           [&lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.LPWStr)] &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; appRegistryName);&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;void&lt;/span&gt; SetAppAsDefault([&lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.LPWStr)] &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; appRegistryName,&lt;br&gt;                      [&lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.LPWStr)] &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; set,&lt;br&gt;                      &lt;span style="color:rgb(43, 145, 175)"&gt;AssociationType&lt;/span&gt; setType);&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;void&lt;/span&gt; SetAppAsDefaultAll([&lt;span style="color:rgb(43, 145, 175)"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:rgb(43, 145, 175)"&gt;UnmanagedType&lt;/span&gt;.LPWStr)] &lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; appRegistryName);&lt;br&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;void&lt;/span&gt; ClearUserAssociations();&lt;br&gt;}&lt;/pre&gt;&lt;p&gt;Importing the concrete class that implements the interface was just a matter of specifying its CLSID:&lt;/p&gt;&lt;pre&gt;[&lt;span style="color:rgb(43, 145, 175)"&gt;ComImport&lt;/span&gt;]&lt;br&gt;[&lt;span style="color:rgb(43, 145, 175)"&gt;Guid&lt;/span&gt;(&lt;span style="color:rgb(163, 21, 21)"&gt;"591209c7-767b-42b2-9fba-44ee4615f2c7"&lt;/span&gt;)]&lt;br&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;internal&lt;/span&gt; &lt;span style="color:rgb(0, 0, 255)"&gt;class&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175)"&gt;ApplicationAssociationRegistration&lt;/span&gt;&lt;br&gt;{&lt;br&gt; &lt;span style="color:rgb(0, 128, 0)"&gt;// coclass is implemented by the runtime callable wrapper&lt;/span&gt;&lt;br&gt;}&lt;/pre&gt;&lt;p&gt;With all of that goo out of the way, you can use the interface like a normal .NET type:&lt;/p&gt;&lt;pre&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;var&lt;/span&gt; aa = &lt;span style="color:rgb(0, 0, 255)"&gt;new&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175)"&gt;ApplicationAssociationRegistration&lt;/span&gt;();&lt;br&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;var&lt;/span&gt; iaar = (&lt;span style="color:rgb(43, 145, 175)"&gt;IApplicationAssociationRegistration&lt;/span&gt;)aa;&lt;br&gt;&lt;span style="color:rgb(0, 0, 255)"&gt;string&lt;/span&gt; myCurrentMp3Player = iaar.QueryCurrentDefault(".mp3", &lt;span style="color:rgb(43, 145, 175)"&gt;AssociationType&lt;/span&gt;.FileExtension, &lt;span style="color:rgb(43, 145, 175)"&gt;AssociationLevel&lt;/span&gt;.Effective);&lt;/pre&gt;&lt;p&gt;Behind the scenes, the &lt;a href="http://msdn.microsoft.com/en-us/library/8bwh56xe.aspx"&gt;runtime callable wrapper&lt;/a&gt; has to do something like this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Load in ole32.dll where COM functions reside.&lt;/li&gt;&lt;li&gt;Call &lt;a href="http://msdn.microsoft.com/en-us/library/ms678543.aspx"&gt;CoInitialize&lt;/a&gt; to initialize COM. &lt;/li&gt;&lt;li&gt;Look up your CLSID and IID in the registry under HKEY_CLASSES_ROOT and find their associated DLL (in our case, "shell32.dll") &lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms684007%28VS.85%29.aspx"&gt;Create a factory&lt;/a&gt; for your class. &lt;/li&gt;&lt;li&gt;Use the factory to &lt;a href="http://msdn.microsoft.com/en-us/library/ms682215%28VS.85%29.aspx"&gt;create an instance&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;Call &lt;a href="http://msdn.microsoft.com/en-us/library/ms682521%28VS.85%29.aspx"&gt;QueryInterface&lt;/a&gt; to get the specific interface we want (e.g. IApplicationAssociationRegistration) &lt;/li&gt;&lt;li&gt;Get a pointer to the function we want using the &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2004/02/05/68017.aspx"&gt;vtable&lt;/a&gt;. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;After all that, we &lt;em&gt;finally&lt;/em&gt; have a place to jump to like we did with P/Invoke.&lt;/p&gt;&lt;p&gt;Why bother with all of this? One reason is that Microsoft has a huge legacy investment in C and C++ in Windows. There's no compelling reason for them to rewrite things in .NET. A natural consequence is that the C++ code that implements their latest APIs will be exposed using COM for the foreseeable future. Recently, Microsoft has gone ahead and published .NET COM &lt;a href="http://code.msdn.microsoft.com/Windows7Taskbar/Release/ProjectReleases.aspx?ReleaseId=2246"&gt;wrappers&lt;/a&gt; for some of the popular new APIs like the &lt;a href="http://windowsteamblog.com/blogs/developers/archive/2009/04/23/consuming-the-contents-of-windows-7-libraries.aspx"&gt;Libraries feature&lt;/a&gt; in Windows 7. With just a little work, you don't have to wait on Microsoft to do this for you.&lt;/p&gt;&lt;p&gt;Given that .NET was designed as a successor to COM, it's no surprise that Microsoft has made interoperability with it very seamless. The &lt;a href="http://msdn.microsoft.com/en-us/library/8bwh56xe.aspx"&gt;runtime callable wrapper&lt;/a&gt; does a good job of hiding most of the messier details. The garbage collector handles much of the bookkeeping involved with memory management that used to be the bane of COM programming. The runtime is very aware of typical COM semantics of when to allocate and free memory. It's not always perfect. Sometimes you can be pre-emptive and force your COM object to be cleaned up via &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx"&gt;Marshal.ReleaseComObject&lt;/a&gt; so you don't have to wait on the garbage collector, but you should &lt;a href="http://blogs.msdn.com/cbrumme/archive/2003/04/16/51355.aspx"&gt;be careful&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I just presented the basics of what I learned to get my job done. There's a lot more out there for more advanced scenarios. I've found the &lt;a href="http://www.theserverside.net/tt/articles/showarticle.tss?id=ComAndDotNetInterop_Book"&gt;free book&lt;/a&gt; "COM and .NET Interop" by Andrew Troelsen to be helpful.&lt;/p&gt;&lt;p&gt;There's plenty of obscure Windows APIs out there for the taking. Enjoy!&lt;/p&gt;&lt;br&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.moserware.com%2f2009%2f04%2fusing-obscure-windows-com-apis-in-net.html"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.moserware.com%2f2009%2f04%2fusing-obscure-windows-com-apis-in-net.html" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6800934446457898793-7080898641294242243?l=www.moserware.com"&gt;&lt;/div&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=8Yd9XdKD4fg:4lcTGe9gLbE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=8Yd9XdKD4fg:4lcTGe9gLbE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=8Yd9XdKD4fg:4lcTGe9gLbE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?i=8Yd9XdKD4fg:4lcTGe9gLbE:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=8Yd9XdKD4fg:4lcTGe9gLbE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?i=8Yd9XdKD4fg:4lcTGe9gLbE:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=8Yd9XdKD4fg:4lcTGe9gLbE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?i=8Yd9XdKD4fg:4lcTGe9gLbE:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Moserware?a=8Yd9XdKD4fg:4lcTGe9gLbE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Moserware?i=8Yd9XdKD4fg:4lcTGe9gLbE:4cEx4HpKnUU" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Moserware/~4/8Yd9XdKD4fg" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/8rfKADnH_g0" height="1" width="1"/&gt;</content><author><name>Jeff Moser</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/Moserware"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/Moserware</id><title type="html">Moserware</title><link rel="alternate" href="http://www.moserware.com/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/Moserware/~3/8Yd9XdKD4fg/using-obscure-windows-com-apis-in-net.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1239829620746"><id gr:original-id="http://ilikeellipses.com/2009/04/15/migration-or-new-features/">tag:google.com,2005:reader/item/a8f40f499ab99501</id><category term="coding" /><category term="programming" /><title type="html">Migration or new features?</title><published>2009-04-15T21:04:25Z</published><updated>2009-04-15T21:04:25Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/HqtzE3x0xDE/" type="text/html" /><content xml:base="http://ilikeellipses.com/" type="html">&lt;p&gt;Migration is evil. It’s a pain in the butt. It’s difficult to test. It’s time consuming. And it only gets run by each user only once. &lt;span style="font-weight:bold"&gt;Is it really worth it?&lt;span style="font-weight:normal"&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt;
&lt;blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;border-width:initial;border-color:initial;border-style:none;padding:0px"&gt;&lt;p&gt;&lt;span style="font-style:italic"&gt;As soon as phrases such as “mapping the data,” “data transfer,” “data migration,” or “convert the legacy data” appear in the context of a project, a wise systems engineer or project manager should see red flags waving…&lt;/span&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;border-width:initial;border-color:initial;border-style:none;padding:0px"&gt;&lt;p&gt;&lt;span style="font-style:italic"&gt;&lt;/span&gt;&lt;a href="http://www.ertin.com/pr_legacydata.html"&gt;&lt;span style="font-size:9px"&gt;[Legacy Data and Software Project Planning]&lt;/span&gt; &lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt; All that time and effort put forth into migration could be used instead to implement new features instead. Users are always clammering for your application to do this or that, fix this bug, add that feature. Do they really care about migrating their old data? &lt;/p&gt;
&lt;p&gt; But looking at the total user experience of an application, is lost data really ever ok? Especially when it can be prevented? On the face of it, I want to say no, but if users really want the ability to install your application on a flash drive, they might not care that the upgrade forgot which views they had open. Maybe it’s &lt;span style="font-weight:bold"&gt;all a matter of impact&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;But then again, some users will really care either way. So maybe you’re just screwed… &lt;/p&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ILikeEllipses?a=7K4oCohLvVg:JXvnywBoNR0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ILikeEllipses?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ILikeEllipses?a=7K4oCohLvVg:JXvnywBoNR0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ILikeEllipses?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ILikeEllipses?a=7K4oCohLvVg:JXvnywBoNR0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ILikeEllipses?i=7K4oCohLvVg:JXvnywBoNR0:D7DqB2pKExk" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ILikeEllipses?a=7K4oCohLvVg:JXvnywBoNR0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ILikeEllipses?i=7K4oCohLvVg:JXvnywBoNR0:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ILikeEllipses?a=7K4oCohLvVg:JXvnywBoNR0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ILikeEllipses?i=7K4oCohLvVg:JXvnywBoNR0:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ILikeEllipses?a=7K4oCohLvVg:JXvnywBoNR0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ILikeEllipses?i=7K4oCohLvVg:JXvnywBoNR0:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/HqtzE3x0xDE" height="1" width="1"/&gt;</content><author><name>mike hall</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/ilikeellipses"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/ilikeellipses</id><title type="html">i like ellipses...</title><link rel="alternate" href="http://ilikeellipses.com" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/ILikeEllipses/~3/7K4oCohLvVg/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1239819443853"><id gr:original-id="d10481e0-d7e7-4234-9ab6-db53a9657b7e:8806">tag:google.com,2005:reader/item/aaf1249656996a82</id><category term="Tech" scheme="http://manicprogrammer.com/cs/blogs/willeke/archive/tags/Tech/default.aspx" /><category term="Job" scheme="http://manicprogrammer.com/cs/blogs/willeke/archive/tags/Job/default.aspx" /><category term="Linq" scheme="http://manicprogrammer.com/cs/blogs/willeke/archive/tags/Linq/default.aspx" /><title type="html">Linq OfType expression</title><published>2009-04-15T18:08:00Z</published><updated>2009-04-15T18:08:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/RGpv4prRLR0/linq-oftype-t-expression.aspx" type="text/html" /><summary xml:base="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="html">&lt;p&gt;I just discovered a function in Linq that will save me a bit of typing and allow me to better express myself.&lt;/p&gt;
&lt;p&gt;For a long while, I've written this:&lt;/p&gt;&lt;font size="3"&gt;&lt;/font&gt;
&lt;p&gt;&lt;font color="#2b91af" size="3"&gt;ColorWrapper&lt;/font&gt;&lt;font size="3"&gt; x = combo.Items.Where( obj =&amp;gt; obj &lt;/font&gt;&lt;font color="#0000ff" size="3"&gt;is&lt;/font&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="3"&gt;ColorWrapper&lt;/font&gt;&lt;font size="3"&gt; ).Cast&amp;lt; &lt;/font&gt;&lt;font color="#2b91af" size="3"&gt;ColorWrapper&lt;/font&gt;&lt;font size="3"&gt; &amp;gt;().FirstOrDefault(cw =&amp;gt; cw.Color == &lt;/font&gt;&lt;font color="#0000ff" size="3"&gt;value&lt;/font&gt;&lt;font size="3"&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Today, I realized that the framework designers were ahead of me, and provided OfType&amp;lt;T&amp;gt;, which does the same thing as follows;&lt;/p&gt;
&lt;p&gt;&lt;font color="#2b91af" size="3"&gt;ColorWrapper&lt;/font&gt;&lt;font size="3"&gt; y = combo.Items.OfType&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="3"&gt;ColorWrapper&lt;/font&gt;&lt;font size="3"&gt;&amp;gt;().FirstOrDefault(cw =&amp;gt; cw.Color == &lt;/font&gt;&lt;font color="#0000ff" size="3"&gt;value&lt;/font&gt;&lt;font size="3"&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; Lesson Learned: Pay more attention to ALL of the aspects offered by a new technology, they all have their appropriate uses.&lt;/p&gt;&lt;img src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=8806" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/RGpv4prRLR0" height="1" width="1"/&gt;</summary><author><name>willeke</name></author><source gr:stream-id="feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx"><id>tag:google.com,2005:reader/feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx</id><title type="html">Rediscovering the Obvious</title><link rel="alternate" href="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="text/html" /></source><feedburner:origLink>http://manicprogrammer.com/cs/blogs/willeke/archive/2009/04/15/linq-oftype-t-expression.aspx</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1239751348904"><id gr:original-id="http://www.danrigsby.com/blog/index.php/2009/04/14/new-webcast-developing-windows-services/">tag:google.com,2005:reader/item/49bdf8e2e5ba498d</id><category term="Webcast" /><title type="html">New Webcast: Developing Windows Services</title><published>2009-04-14T23:21:28Z</published><updated>2009-04-14T23:21:28Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/TNAi4rbf9KM/" type="text/html" /><content xml:base="http://www.danrigsby.com/blog" type="html">&lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/wp-content/uploads/2009/04/screencast1thumb.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px" title="screencast1-thumb" border="0" alt="screencast1-thumb" align="right" src="http://www.danrigsby.com/blog/wp-content/uploads/2009/04/screencast1thumb-thumb.png" width="128" height="128"&gt;&lt;/a&gt; I have a new 6 min 31 sec training webcast up over developing windows services.  This video looks at how to build widows services as well as an approach for easily developing them with “console application” support to help ease development.  It can be a pain to develop a windows service, if you have to constantly keep deploying it just to test it out.&lt;/p&gt;
&lt;p&gt;The video is available through &lt;a href="http://www.jupitermedia.com"&gt;JupiterMedia&lt;/a&gt; and can be viewed at &lt;a href="http://www.internet.com/video/"&gt;http://www.internet.com/video/&lt;/a&gt;. Just look for the &amp;quot;Developer Video&amp;quot; titled &amp;quot;Developing Windows Services&amp;quot;.&lt;/p&gt;
&lt;p&gt;Direct links are:    &lt;br&gt;&lt;a title="http://link.brightcove.com/services/link/bcpid1431564240/bclid1433966034/bctid10347017001" href="http://link.brightcove.com/services/link/bcpid1431564240/bclid1433966034/bctid10347017001"&gt;http://link.brightcove.com/services/link/bcpid1431564240/bclid1433966034/bctid10347017001&lt;/a&gt;&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://www.danrigsby.com/blog/index.php/2009/04/14/new-webcast-developing-windows-services/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://www.danrigsby.com/blog/index.php/2009/04/14/new-webcast-developing-windows-services/&amp;amp;bgcolor=FF8000&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=rsLjTAXzaBY:qNgYZYbWlNQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=rsLjTAXzaBY:qNgYZYbWlNQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=rsLjTAXzaBY:qNgYZYbWlNQ:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=rsLjTAXzaBY:qNgYZYbWlNQ:Chn0KnnqYy0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=Chn0KnnqYy0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=rsLjTAXzaBY:qNgYZYbWlNQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=rsLjTAXzaBY:qNgYZYbWlNQ:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=rsLjTAXzaBY:qNgYZYbWlNQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=rsLjTAXzaBY:qNgYZYbWlNQ:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=rsLjTAXzaBY:qNgYZYbWlNQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?d=dnMXMwOfBR0" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DanRigsby?a=rsLjTAXzaBY:qNgYZYbWlNQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DanRigsby?i=rsLjTAXzaBY:qNgYZYbWlNQ:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DanRigsby/~4/rsLjTAXzaBY" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/TNAi4rbf9KM" height="1" width="1"/&gt;</content><author><name>Dan Rigsby</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/DanRigsby"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/DanRigsby</id><title type="html">Dan Rigsby - Coding Up Style</title><link rel="alternate" href="http://www.danrigsby.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/DanRigsby/~3/rsLjTAXzaBY/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1238720428182"><id gr:original-id="http://www.aaronlerch.com/blog/2009/04/02/3/">tag:google.com,2005:reader/item/d21451c65f33f5d2</id><category term="Uncategorized" /><title type="html">#3!</title><published>2009-04-03T00:58:58Z</published><updated>2009-04-03T00:58:58Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/P-Kj5893ijc/" type="text/html" /><content xml:base="http://www.aaronlerch.com/blog" type="html">&lt;p&gt;No, that’s not a bash command or a regular expression. &lt;img src="http://www.aaronlerch.com/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)"&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src="http://s3.amazonaws.com:80/aaronlerch.com/images/ultrasound-3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;#3 will be joining &lt;a href="http://picasaweb.google.com/aaronlerch/FromHalloweenToThanksgiving#5275445275518695186"&gt;#2 and #1&lt;/a&gt;, and we are pumped.    &lt;br&gt;Well, I’m pumped, my wife is just trying not to feel too sick. She’ll be pumped later, like in 5 years. &lt;img src="http://www.aaronlerch.com/blog/wp-includes/images/smilies/icon_wink.gif" alt=";)"&gt; &lt;/p&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/aaronlerch?a=3Rxda__-84A:SkQzsGtWTpI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/aaronlerch?i=3Rxda__-84A:SkQzsGtWTpI:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/aaronlerch?a=3Rxda__-84A:SkQzsGtWTpI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/aaronlerch?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/aaronlerch?a=3Rxda__-84A:SkQzsGtWTpI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/aaronlerch?i=3Rxda__-84A:SkQzsGtWTpI:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/aaronlerch?a=3Rxda__-84A:SkQzsGtWTpI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/aaronlerch?i=3Rxda__-84A:SkQzsGtWTpI:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/aaronlerch/~4/3Rxda__-84A" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/P-Kj5893ijc" height="1" width="1"/&gt;</content><author><name>aaron</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/aaronlerch"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/aaronlerch</id><title type="html">Aaron Lerch</title><link rel="alternate" href="http://www.aaronlerch.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/aaronlerch/~3/3Rxda__-84A/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1238719916629"><id gr:original-id="http://www.aaronlerch.com/blog/2009/04/02/design-pattern-resources/">tag:google.com,2005:reader/item/14a969beb964e9a7</id><category term="programming" /><title type="html">Design Pattern Resources</title><published>2009-04-03T00:51:10Z</published><updated>2009-04-03T00:51:10Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/Iqnh36_rS5A/" type="text/html" /><content xml:base="http://www.aaronlerch.com/blog" type="html">&lt;p&gt;I’ve had a few people ask me for a recommendation of some resources to learn design patterns. There’s a lot of good stuff “out there”, of course, but my response usually says just three things:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;&lt;strong&gt;Read pretty much anything this guy writes&lt;/strong&gt;&lt;/a&gt;,    &lt;br&gt;&lt;strong&gt;Learn &lt;/strong&gt;&lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;&lt;strong&gt;SOLID&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, and lern it güd. &lt;/strong&gt;&lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx"&gt;&lt;strong&gt;I recommend starting here.&lt;/strong&gt;&lt;/a&gt;    &lt;br&gt;&lt;em&gt;and&lt;/em&gt;    &lt;br&gt;&lt;strong&gt;Let me know if you have any questions and let’s chat.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you’re anything like me, you’ll find yourself up until 4 AM reading, reading, and reading as you link from post to post and article to article. I swear one of these days I will find &lt;a href="http://www.shibumi.org/eoti.htm"&gt;the end of the internet&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/aaronlerch?a=7yKmcsAIcuo:UXIyKNoBpLQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/aaronlerch?i=7yKmcsAIcuo:UXIyKNoBpLQ:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/aaronlerch?a=7yKmcsAIcuo:UXIyKNoBpLQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/aaronlerch?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/aaronlerch?a=7yKmcsAIcuo:UXIyKNoBpLQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/aaronlerch?i=7yKmcsAIcuo:UXIyKNoBpLQ:F7zBnMyn0Lo" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/aaronlerch?a=7yKmcsAIcuo:UXIyKNoBpLQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/aaronlerch?i=7yKmcsAIcuo:UXIyKNoBpLQ:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/aaronlerch/~4/7yKmcsAIcuo" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/Iqnh36_rS5A" height="1" width="1"/&gt;</content><author><name>aaron</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/aaronlerch"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/aaronlerch</id><title type="html">Aaron Lerch</title><link rel="alternate" href="http://www.aaronlerch.com/blog" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/aaronlerch/~3/7yKmcsAIcuo/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1238719497517"><id gr:original-id="d10481e0-d7e7-4234-9ab6-db53a9657b7e:8622">tag:google.com,2005:reader/item/cfadee2ee3649110</id><category term="ProjectExecution" scheme="http://manicprogrammer.com/cs/blogs/willeke/archive/tags/ProjectExecution/default.aspx" /><category term="Job" scheme="http://manicprogrammer.com/cs/blogs/willeke/archive/tags/Job/default.aspx" /><category term="SemanticWeb" scheme="http://manicprogrammer.com/cs/blogs/willeke/archive/tags/SemanticWeb/default.aspx" /><category term="Kanban" scheme="http://manicprogrammer.com/cs/blogs/willeke/archive/tags/Kanban/default.aspx" /><title type="html">Incredibly generic procress description</title><published>2009-04-03T00:12:00Z</published><updated>2009-04-03T00:12:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/indyndabloggers/~3/x9Lfq0OigoY/incredibly-generic-procress-description.aspx" type="text/html" /><summary xml:base="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="html">&lt;p&gt;Excerpted from the first draft of my experience report for leankanbanconference.com:&lt;/p&gt;
&lt;p style="margin:0in 0in 0pt"&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;Somebody has an idea to add value. Somebody approves the idea has merit, requests that it be built. Somebody transforms the idea into a set of specific changes that need to be made to the application from a user’s perspective. Somebody identifies how those changes need to relate to the existing technical implementation. Somebody causes chose changes to occur to the system. Somebody confirms that those changes were indeed made. Finally, somebody agrees that the changes did indeed provide the desired value.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0in 0in 0pt"&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;&lt;/font&gt;&lt;/span&gt; &lt;/p&gt;
&lt;p style="margin:0in 0in 0pt"&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size:12pt;line-height:115%;font-family:Consolas"&gt;It may not stick, but for the moment the incredible level of generic writing has a purpose in the document.&lt;/span&gt;&lt;/p&gt;&lt;img src="http://manicprogrammer.com/cs/aggbug.aspx?PostID=8622" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/indyndabloggers/~4/x9Lfq0OigoY" height="1" width="1"/&gt;</summary><author><name>willeke</name></author><source gr:stream-id="feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx"><id>tag:google.com,2005:reader/feed/http://manicprogrammer.com/cs/blogs/willeke/rss.aspx</id><title type="html">Rediscovering the Obvious</title><link rel="alternate" href="http://manicprogrammer.com/cs/blogs/willeke/default.aspx" type="text/html" /></source><feedburner:origLink>http://manicprogrammer.com/cs/blogs/willeke/archive/2009/04/02/incredibly-generic-procress-description.aspx</feedburner:origLink></entry></feed>
