<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Bill&amp;#39;s House O Insomnia&lt;img src="http://www.williamgryan.com/images/werecuckoosmall.jpg" alt="Bill Ryan" /&gt;</title><subtitle type="html">Striking terror into the hearts of all Guitar Hero III Playaz.</subtitle><id>http://msmvps.com/blogs/williamryan/atom.aspx</id><link rel="alternate" type="text/html" href="http://msmvps.com/blogs/williamryan/default.aspx" /><link rel="self" type="application/atom+xml" href="http://msmvps.com/blogs/williamryan/atom.aspx" /><generator uri="http://communityserver.org" version="4.0.30619.63">Community Server</generator><updated>2008-05-16T14:48:58Z</updated><entry><title>And I thought model rockets were cool...</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/08/23/and-i-thought-model-rockets-were-cool.aspx" /><id>/blogs/williamryan/archive/2008/08/23/and-i-thought-model-rockets-were-cool.aspx</id><published>2008-08-23T18:11:13Z</published><updated>2008-08-23T18:11:13Z</updated><content type="html">&lt;p&gt;I came across &lt;a href="http://www.wnbc.com/news/17266645/detail.html"&gt;this piece on a home made drone and found it way cool&lt;/a&gt;. Well, except the part about it carrying hundreds of pounds of explosives.&amp;nbsp; Assuming this is just some random engineer with resources just like the rest of us, wouldn&amp;#39;t this be an awesome project to do on the weekends?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1645606" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author></entry><entry><title>And you thought I just some moron</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/08/13/and-you-thought-i-just-some-moron.aspx" /><id>/blogs/williamryan/archive/2008/08/13/and-you-thought-i-just-some-moron.aspx</id><published>2008-08-14T03:37:36Z</published><updated>2008-08-14T03:37:36Z</updated><content type="html">&lt;p&gt;Many folks north of Miami-Dade county have never heard of El Chupacabra. And if you try tipping them off to it, they laugh at you like your some kind of moron.&amp;nbsp; At least that&amp;#39;s what they did when I told them.&amp;nbsp; I&amp;#39;ve been warning people of the dangers posed by the old Chupa and I typically got responses like &amp;quot;Yah Bill, well, next time I get a pet goat, I&amp;#39;ll make really sure that I don&amp;#39;t accidentally let it outside at night.&amp;quot;&amp;nbsp; Because of how I was often treated, I can truly sympathize with our former vice president who was horribly mistreated for trying to warn the world about &lt;a href="http://en.wikipedia.org/wiki/ManBearPig"&gt;ManBearPig&lt;/a&gt;&amp;nbsp;&amp;nbsp; .&amp;nbsp; Well, for those of you that laughed at me, thought I was a moron, all of the above, &lt;a href="http://cosmos.bcst.yahoo.com/up/player/popup/indexFP.php?rn=3906861&amp;amp;cl=9263621&amp;amp;ch=4226726"&gt;Who is the moron now?&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1644600" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Humor" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Humor/default.aspx" /><category term="Life in General" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Life+in+General/default.aspx" /><category term="Me" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Me/default.aspx" /><category term="Chupacabra" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Chupacabra/default.aspx" /></entry><entry><title>Create a Mobile office with Windows Mobile</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/08/13/create-a-mobile-office-with-windows-mobile.aspx" /><id>/blogs/williamryan/archive/2008/08/13/create-a-mobile-office-with-windows-mobile.aspx</id><published>2008-08-13T12:23:20Z</published><updated>2008-08-13T12:23:20Z</updated><content type="html">&lt;p&gt;With such a compelling title, &lt;a href="http://www.microsoft.com/windowsmobile/en-us/totalaccess/columns/create-wireless-office.mspx"&gt;I figured the article would be quite intriguing&lt;/a&gt;.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I&amp;#39;ve had a lot of phone drama recently, dropping my WM 6.1 Dash and breaking it, leaving the replacement on the roof of my car and driving off, buying another imate but dropping it into a diet coke. So&amp;nbsp; I reverted back to my old beloved &lt;a href="http://images.google.com/imgres?imgurl=http://images.amazon.com/images/G/01/wireless/detail-page/voq2.jpg&amp;amp;imgrefurl=http://www.amazon.com/Sierra-Wireless-Professional-VoqMail-Unlocked/dp/B0002Z9AIQ&amp;amp;h=501&amp;amp;w=643&amp;amp;sz=101&amp;amp;hl=en&amp;amp;start=1&amp;amp;um=1&amp;amp;tbnid=IkLadeG2ON4gXM:&amp;amp;tbnh=107&amp;amp;tbnw=137&amp;amp;prev=/images%3Fq%3DVoq%26um%3D1%26hl%3Den%26rls%3Dcom.microsoft:*%26sa%3DN"&gt;Voq&lt;/a&gt;.&amp;nbsp; A coworker of mine got in &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; and hacked it up so it would play relatively nice with &lt;a href="http://www.t-mobile.com"&gt;T-Mobile&lt;/a&gt;.&amp;nbsp; He wanted to get rid of it though so I ended up buying it off of him (I can almost hear &lt;a href="http://blah.winsmarts.com/"&gt;Sahil gloating&lt;/a&gt; now).&amp;nbsp; Shortly afterward, I received a &lt;a href="http://www.youtube.com/watch?v=Lh660NlQvlY"&gt;Samsung i780&lt;/a&gt; as a gift so I&amp;#39;ve mainly been switching between the two (I still can&amp;#39;t get the iPhone to work with my T-Mobile data service which gets frustrating).&amp;nbsp; I mention this b/c while the Dash was a pretty nice phone, it really didn&amp;#39;t perform all that well.&amp;nbsp; In fact, it was often frustrating.&amp;nbsp; The 6.1 Flash made it a lot nicer but it still was rather slow compared to an iPhone.&amp;nbsp; I had gotten rid of my original iPhone before I really got a chance to use it b/c at first, i didn&amp;#39;t like it.&amp;nbsp; After using it regularly for a while though, I&amp;#39;ll admit that its usability is very impressive.&amp;nbsp; Its frozen up on my twice in about a month and&amp;nbsp; a half (with heavy usage) compared to the daily freezes I experienced with the Dash.&amp;nbsp; The comparison isn&amp;#39;t completely fair b/c hardware wise, the dash is a lot cheaper.&amp;nbsp; And so I guess I&amp;#39;ll just come out and concede that Sahil was right, with respect to consumer features, the iPhone provides a much better experience even when you factor in hardware differences.&amp;nbsp; 6.1 mitigates some of that, but there&amp;#39;s still a way to go.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Although the iPhone&amp;#39;s screen is quite responsive, I think I still prefer an actual keyboard.&amp;nbsp; Unless I&amp;#39;m extremely careful, I almost always spend more time correcting stuff then I do typing when what I&amp;#39;m working on is more than a sentence. Away from that though, there&amp;#39;s the Push with Exchange and Sharepoint integration (which surprisingly, I find myself using quite a bit).&amp;nbsp; B/c I don&amp;#39;t have wireless Internet on the iPhone, it might be a bigger deal than it should be but AFAIK, Push/Exchange isn&amp;#39;t available on iPhone yet.&amp;nbsp; Another really annoying thing w/ iPhone that makes Windows Mobile more &amp;#39;business friendly&amp;#39; is copy and paste.&amp;nbsp; I never realized how much I used it until I lost it.&amp;nbsp; And I guess I end up using copy/paste much more when I&amp;#39;m mobile then at work b/c typing is still not much fun but being able to quickly edit Excel sheets and paste stuff from word to Outlook and vice versa is huge. And I don&amp;#39;t know if it&amp;#39;s a true iPhone limitation again b/c I don&amp;#39;t have my gprs, but I don&amp;#39;t see any way to do internet sharing - from what I can tell, it&amp;#39;s not doable with standard USB or Bluetooth.&lt;/p&gt; &lt;p&gt;As far as development goes, well, I&amp;#39;ll give Apple some props for the iPhone SDK and I can&amp;#39;t say I&amp;#39;ve spent more than a grand total of 15 hours trying to build stuff with it, but all else being equal, I still think that if I had to build any sort of critical business application, the compact framework not only makes it an easier trip, but it opens up a lot more doors.&amp;nbsp; I don&amp;#39;t want to run my big mouth too loudly b/c some of what appear to be limitations may just be limitations with my familiarity of the SDK, but I&amp;#39;m pretty sure that WCF integration is off the table with the iPhone, as is MapPoint / LiveEarth.&amp;nbsp; Same seems to be the case for connecting w/ Sql Server or Oracle although the local db solution offered by Apple does the job pretty well.&lt;/p&gt; &lt;p&gt;At the end of the day, i can say I&amp;#39;ve really grown to like the iPhone and well, I already like Windows Mobile, even with some of the performance issues that would drive me nuts at times.&amp;nbsp; But I find myself using them for totally different purposes other than of course, to talk.&amp;nbsp; In the same way that I use my UMPC totally differently from my laptop, I find myself switching between these phones the same way. It&amp;#39;ll be interesting to see how things develop b/c there&amp;#39;s no doubt Microsoft is going to use Silverlight to greatly enhance user experience w/ Windows Mobile 7 and it&amp;#39;s a&amp;nbsp; similarly safe bet that Apple is going to try to make the iPhone better at business applications. For now, I&amp;#39;m just really glad I can swap out a SIM card and use whichever I want b/c having to make a firm choice between one or the other would be a real bummer.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1644519" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Me" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Me/default.aspx" /><category term="Mindless Babbling" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Mindless+Babbling/default.aspx" /><category term="Misc Technology" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx" /><category term="Mobility" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Mobility/default.aspx" /><category term="Windows Mobile" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Windows+Mobile/default.aspx" /><category term="iPhone" scheme="http://msmvps.com/blogs/williamryan/archive/tags/iPhone/default.aspx" /></entry><entry><title>Helping a Worthy Cause</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/08/12/helping-a-worthy-cause.aspx" /><id>/blogs/williamryan/archive/2008/08/12/helping-a-worthy-cause.aspx</id><published>2008-08-12T21:01:41Z</published><updated>2008-08-12T21:01:41Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://geekswithblogs.net/lvega"&gt;Lou Vega&lt;/a&gt;,&amp;nbsp; a good friend, fellow MVP and all around great guy just &lt;a href="http://geekswithblogs.net/lvega/archive/2008/08/12/124394.aspx"&gt;posted this on his blog today&lt;/a&gt; ... Lou is a &amp;#39;give you the shirt off of his back&amp;#39; type of guy (as you can see from his post, his very kindness is why he&amp;#39;s in need right now) and can use any help you can give. Even if it&amp;#39;s just posting this on your blog or website, anything you can do would be greatly appreciated.&lt;/p&gt; &lt;p&gt;&amp;lt;snip&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;As some of you may already know this has been a roller-coaster year for me starting with the hospitalization and near death of my son in February. Between the subsequent hospitalizations, (July marked the first calendar month he didn&amp;#39;t get admitted to the hospital at all!), a pretty bad car wreck that left me with a concussion and associated post-concussion problems, and then additional extended family issues (one sister-in-law nearly died of a mix-up with prescriptions she was given at the ER, another sister-in-law lost all 4 of her children to foster care but that&amp;#39;s an extended story below) it&amp;#39;s just gotten to the point where my wife and I are just trying to catch up and breathe to get everything sorted out and we&amp;#39;re rapidly running out of money ourselves.&lt;/font&gt;&lt;/em&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;The sister-in-law who&amp;#39;s children we took in, has at this point essentially abandoned them and us. We bought her a bus ticket to come down here from Scranton, PA after she took care of some things she needed to and were ready to welcome her into our house to get a new start down here. Her ex-husband had never been good at paying child support and she wasn&amp;#39;t getting any help up there so we stepped in to try and help her. That backfired on us the other night when she walked out of the house saying she was &amp;quot;going back to Scranton&amp;quot; and eventually she made her way to the bus station and caught a bus. Not sure how she paid because she left her purse, wallet, ID, everything in our house. None of us have heard from here since despite repeated attempts to reach her.&lt;/font&gt;&lt;/em&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;We were very fortunate that our local church donated bunk-beds for the 4 kids we took in. They also donated a lot of food. So now that their mom walked out we&amp;#39;re left asking South Carolina Children&amp;#39;s Services for any kind of help and their answer is simply &amp;quot;Send them back to PA&amp;quot;.&amp;nbsp; Not exactly the answer we were thinking we&amp;#39;d get from a place that is supposed to have children&amp;#39;s interest at heart.The PA Children&amp;#39;s services folks have been as helpful as they can be but they&amp;#39;re not technically responsible for those children anymore.&lt;/font&gt;&lt;/em&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Because of this I&amp;#39;m turning to the geek/dev community at large knowing that there are a ton of really great people out there who might just be able to get this family through this after all. All the money that&amp;#39;s donated is going to go towards paying down medical bills from my son&amp;#39;s hospital stays, paying down unpaid bills that were missed and run up with late charges during the hospital stays, more food since our family doubled in size from 4 to 8, new clothes for the kids (the 4 came down with basically a suitcase and not much else), and also to help pay for other costs associated with providing for such a large family on such short notice. Most of our prior emergency savings were wiped out during previous hospital stays due to increased fuel costs (driving back and forth between hospital, school when it was in session, and home) and food costs (eating out a lot since we weren&amp;#39;t home) and direct medical costs.&lt;/font&gt;&lt;/em&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;As for our part, we&amp;#39;ve contacted our bank to ask that they suspend our car payment for 6 months, and I&amp;#39;ve contacted my student loan company to ask them to do the same. We also took our 7 year old out of the private school she was in and put her in public school. Even with those changes we&amp;#39;re still running short of cash. If it so happens that all our needs are met and more we&amp;#39;re going to donate the excess to both the church which has so graciously helped us out and the children&amp;#39;s hospital playroom where my son has spent a good amount of time when he wasn&amp;#39;t on contact precautions at the hospital. In the event that my sister-in-law returns to us we&amp;#39;ll gladly give her the excess also towards her new start at life.&lt;/font&gt;&lt;/em&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;I couldn&amp;#39;t figure out how to get the PayPal donate button to integrate into the blog entry so I&amp;#39;ve posted it on my skeleton of a web site at &lt;/font&gt;&lt;/em&gt;&lt;a href="http://www.brainthump.com"&gt;&lt;em&gt;&lt;font size="1"&gt;http://www.brainthump.com&lt;/font&gt;&lt;/em&gt;&lt;/a&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;There&amp;#39;s basically just the &amp;quot;Donate&amp;quot; button there and it&amp;#39;s all handled through SSL on PayPal. I didn&amp;#39;t set a minimum amount because truthfully I&amp;#39;m grateful for any amount anyone can give.&lt;/font&gt;&lt;/em&gt; &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Thanks in advance to all who are able to help in any way.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1644440" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author></entry><entry><title>KeyPath for component: is a Directory: . The directory/component pair must be listed in the CreateFolders table</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/08/11/keypath-for-component-is-a-directory-the-directory-component-pair-must-be-listed-in-the-createfolders-table.aspx" /><id>/blogs/williamryan/archive/2008/08/11/keypath-for-component-is-a-directory-the-directory-component-pair-must-be-listed-in-the-createfolders-table.aspx</id><published>2008-08-12T00:19:35Z</published><updated>2008-08-12T00:19:35Z</updated><content type="html">&lt;p&gt;We&amp;#39;ve been finalizing one of our first new products in my company&amp;#39;s product line and we&amp;#39;re at the point where we are trying to just polish up any loose ends.&amp;nbsp; I had built some installers for QA to use but for some hard to understand reason, they didn&amp;#39;t realize the installers were not suitable for customers.&amp;nbsp; I&amp;#39;d been out the last week so when I got a bug report and saw that the majority of the outstanding bugs were related to the installers, I realized there was some misunderstanding.&amp;nbsp; When I pointed it out to them I got a typical &amp;quot;Yah, I knew that&amp;quot; response that I always get when they miss something really obvious (several coworkers read my blog so&amp;nbsp; my snark is for their amusement).&amp;nbsp; After explaining the app.config files don&amp;#39;t become part of the binaries and that there&amp;#39;s more to a WCF binding than an endpoint, I realized I had a problem.&amp;nbsp; You see, at this point no one disputed that the current installers couldn&amp;#39;t be used for the customer.&amp;nbsp; But no one in QA wanted to jump up and explain to the boss how this little oversight occurred. It quickly became evident that unless I dropped the issue, I was going to suffer through endless explanations of everything from &amp;quot;How it works in C++&amp;quot; to Installer theory whatever it took to get me to say &amp;quot;Ok, I&amp;#39;ll fix it.&amp;quot;&amp;nbsp; So off I went figuring what the heck, it&amp;#39;ll only take 20 minutes or so.&amp;nbsp; But as I was walking to my office, a little devil appeared on my shoulder and started making recommendations to me about how to handle it. I told him to go away but he was a persistent bugger. And after a few minutes, I gave in. I decided to handle it in a really mature manner &amp;quot;I know, I&amp;#39;ll write one huge installer for all 4 application components, including the database install, in WIX.&amp;nbsp; I&amp;#39;ll intentionally screw up a few of the icons or something and when it&amp;#39;s discovered I&amp;#39;ll just play dumb and say &amp;quot;Oh yah, I guess I missed that. You know, since I built the whole script and I&amp;#39;m really busy, I&amp;#39;m going to need *you* to go fix those icon issues.&amp;quot;&amp;nbsp; I realized I&amp;#39;d have to work really hard to keep a straight face as I said that, but it&amp;#39;d be worth it just to be able to listen to their response once they realized they&amp;#39;d have to edit it in WIX. Few things in the world make our QA folks more angry and upset than WIX.&amp;nbsp; The mere mention of the name from across the room can make them apoplectic.&amp;nbsp; Too bad I didn&amp;#39;t remember the old adage about digging two graves before seeking revenge.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I was sailing through it and in no time at all, I had a really awesome package.&amp;nbsp; It was really long and I did it in a hurry so I didn&amp;#39;t comment much and I knew it was going to be a *** if I missed anything early on, the package was just getting really big.&amp;nbsp; I had broken the 4 figure mark in lines of code and had plenty more to go.&amp;nbsp; Stopping every time I added a new component/fragment/action etc to verify it was correct thus far, I was getting pretty smug.&amp;nbsp; Not only was the install looking really good, but in under 30 an hour, I had created over 1,500 lines and used every cool feature I knew of in WIX (and cool features are endless).&amp;nbsp; But even better I thought, &amp;quot;Wait until QA sees this.&amp;nbsp; They&amp;#39;re going to be mad enough when they realize they agreed to a few simple things like icon changes and they find out its WIX, but when they see how long this thing is, hahahahahahahahahahaha&amp;quot;&lt;/p&gt; &lt;p&gt;Only one more thing to do here, the database. Ok, no problem, just write the component to handle clean installs and one for each of the upgrade paths (which was only one at the time).&amp;nbsp; All was going well and I was already mentally on my way home when I hit compile.&amp;nbsp; So after all the code that worked without a glitch, I&amp;#39;m down to the easy part and boom.&lt;/p&gt; &lt;p&gt;KeyPath for component: &lt;i&gt;XXXXXXXX&amp;nbsp;&amp;nbsp; &lt;/i&gt;is a Directory: &lt;i&gt;XXXXXXXX&lt;/i&gt;. The directory/component pair must be listed in the CreateFolders table.&lt;/p&gt; &lt;p&gt;Below isn&amp;#39;t the actual code but it&amp;#39;s pretty much the same as&amp;nbsp; the part that was throwing the problem.&amp;nbsp; After all I&amp;#39;ve gotten done, some tiny little component like this is going to bust my chops!&amp;nbsp; WTF? &lt;/p&gt; &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;Wix xmlns=&amp;quot;&lt;a href="http://schemas.microsoft.com/wix/2006/wi&amp;quot;"&gt;http://schemas.microsoft.com/wix/2006/wi&amp;quot;&lt;/a&gt; xmlns:util=&amp;quot;&lt;a href="http://schemas.microsoft.com/wix/UtilExtension&amp;quot;"&gt;http://schemas.microsoft.com/wix/UtilExtension&amp;quot;&lt;/a&gt; xmlns:sql=&amp;quot;&lt;a href="http://schemas.microsoft.com/wix/SqlExtension&amp;quot;"&gt;http://schemas.microsoft.com/wix/SqlExtension&amp;quot;&lt;/a&gt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Product Id=&amp;quot;5225f8c3-2eda-462a-80c1-398c463b39ce&amp;quot; Name=&amp;quot;XXXXX&amp;quot; Language=&amp;quot;1033&amp;quot; Version=&amp;quot;1.0.0.0&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer=&amp;quot;XXXXX&amp;quot; UpgradeCode=&amp;quot;3b3a2ab7-b013-4d0a-b3c6-410ccbb71083&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Package InstallerVersion=&amp;quot;200&amp;quot; Compressed=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Media Id=&amp;quot;1&amp;quot; Cabinet=&amp;quot;XXXXX.cab&amp;quot; EmbedCab=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Property Id=&amp;quot;DiskPrompt&amp;quot; Value=&amp;quot;HC Mass Notification Install Installation [1]&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;util:User Id=&amp;quot;SQLUser&amp;quot; Name=&amp;quot;[SQLUSER]&amp;quot; Password=&amp;quot;[SQLPASSWORD]&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Directory Id=&amp;quot;TARGETDIR&amp;quot; Name=&amp;quot;SourceDir&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Directory Id=&amp;quot;SQLDir&amp;quot; Name=&amp;quot;DB&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Component Id=&amp;quot;SqlComponent&amp;quot; Guid=&amp;quot;AC141F81-A0CF-4737-93C3-82CDA33DDA27&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sql:SqlDatabase Id=&amp;quot;SqlDatabase&amp;quot; Database=&amp;quot;XXXXX&amp;quot; User=&amp;quot;UserName&amp;quot; Server=&amp;quot;[DBName]&amp;quot; CreateOnInstall=&amp;quot;yes&amp;quot; DropOnUninstall=&amp;quot;yes&amp;quot; ContinueOnError=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sql:SqlScript Id=&amp;quot;CreateDB&amp;quot; BinaryKey=&amp;quot;create_db&amp;quot; ExecuteOnInstall=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/sql:SqlDatabase&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Component&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Directory&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Directory&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Binary Id=&amp;quot;create_db&amp;quot; SourceFile=&amp;quot;CreateMassNotifications.sql&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Feature Id=&amp;quot;SqlFeature&amp;quot; Title=&amp;quot;SqlFeature&amp;quot; Level=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ComponentRef Id=&amp;quot;SqlComponent&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Feature&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Property Id=&amp;quot;UserName&amp;quot;&amp;gt;username&amp;lt;/Property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Property Id=&amp;quot;UserPassword&amp;quot;&amp;gt;password&amp;lt;/Property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Property Id=&amp;quot;DBName&amp;quot;&amp;gt;server&amp;lt;/Property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Product&amp;gt;&lt;br /&gt;&amp;lt;/Wix&amp;gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;So I start double checking my GUIDs and tags and all the usual stuff in the checklist whenever I can&amp;#39;t build.&amp;nbsp; I&amp;#39;d embarrass myself thoroughly if I told you everything I did to try to get this to work.&amp;nbsp; I thought I had a similar problem a while back and that I just had to add an empty file to my directory tag.&amp;nbsp; So I attempted to do that and I still had the problem.&amp;nbsp; I started adding Components, ComponentGroups and well, every other stupid thing I could think of. Frustrated I thought &amp;quot;Ok , I&amp;#39;ve done this 100 times, I&amp;#39;ll just start over from scratch.&amp;quot;&amp;nbsp; Then I looked at the API documentation just to double check and nothing looked wrong.&amp;nbsp; Each new thing I tried just broke something else and I was way frustrated at this point.&amp;nbsp; But b/c adding a file didn&amp;#39;t work, I totally ignored anything related to the directory.&amp;nbsp; After 20 minutes I decided to give up and started googling.&amp;nbsp;&amp;nbsp; Quickly, I came across &lt;a href="http://dotnet.org.za/markn/archive/2006/10/07/64275.aspx"&gt;this guy who was having the same problem.&lt;/a&gt; Unfortunately it was long on people saying they had the same problem and short on solutions.&amp;nbsp; I noticed the piece by the guy recommending adding a file and I tried that again - to no avail (the real problem I was doing it incorrectly but that wasn&amp;#39;t a great solution anyway. Adding an erroneous file just so the app compiles isn&amp;#39;t very elegant although if it would have worked, I&amp;#39;d have called it a night and come back tomorrow).&amp;nbsp; I was into the 5th page of search results and still nothing.&amp;nbsp; Then I left for a few minutes and came back to it, and I tried searching again.&amp;nbsp; &lt;p&gt;Well, after going through the search results and hopping around, I found what &lt;a href="http://wix.mindcapers.com/wiki/ICE18"&gt;looked like an answer&lt;/a&gt;.&amp;nbsp; But, but I tried adding a file several times, that can&amp;#39;t be it.&amp;nbsp; And off I went making a mess of things again.&amp;nbsp; After another 40 minutes I was desperate (the little devil that originally appeared on my shoulder was nowhere to be found at this time) and thought, ok maybe it&amp;#39;s worth another try. &lt;p&gt;So using an approach on that link I had overlooked, I decided to add the following line to my component: &lt;p&gt;&lt;em&gt;&amp;lt;CreateFolder/&amp;gt;&lt;/em&gt; &lt;p&gt;I hit compile and it worked.&amp;nbsp; So I added it to each of the DB components I was building and viola, no errors.&amp;nbsp; Ran the setup, it worked and here I am.&amp;nbsp; So basically, for each component, I just needed to make the following modification: &lt;p&gt;&amp;lt;Component Id=&amp;quot;SqlComponent&amp;quot; Guid=&amp;quot;AC141F81-A0CF-4737-93C3-82CDA33DDA27&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sql:SqlDatabase Id=&amp;quot;SqlDatabase&amp;quot; Database=&amp;quot;HCMassNotifications&amp;quot; User=&amp;quot;SQLUser&amp;quot; Server=&amp;quot;[SQLSERVER]&amp;quot; CreateOnInstall=&amp;quot;yes&amp;quot; DropOnUninstall=&amp;quot;yes&amp;quot; ContinueOnError=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sql:SqlScript Id=&amp;quot;CreateDB&amp;quot; BinaryKey=&amp;quot;create_db&amp;quot; ExecuteOnInstall=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/sql:SqlDatabase&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;strong&gt;&lt;font size="3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CreateFolder/&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Component&amp;gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;And according to the explanation, which makes absolute sense, &amp;quot;Your component is in a directory which does not have any files in it, so the validation is worried that the directory may not be created.&amp;quot;&amp;nbsp; Afterward, I was in such a good mood I actually went back and added the correctly sized icons ;-) just to make sure there wasn&amp;#39;t anything intentionally wrong with the installer.&amp;nbsp; That&amp;#39;s what I get for trying to be a smart a55, everyone can laugh at me about how ignoring a single tag to each component blew up my wonderful install.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1644321" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="WIX" scheme="http://msmvps.com/blogs/williamryan/archive/tags/WIX/default.aspx" /></entry><entry><title>Hello, you either have JavaScript turned off or an old version of Macromedia's Flash</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/08/10/hello-you-either-have-javascript-turned-off-or-an-old-version-of-macromedia-s-flash.aspx" /><id>/blogs/williamryan/archive/2008/08/10/hello-you-either-have-javascript-turned-off-or-an-old-version-of-macromedia-s-flash.aspx</id><published>2008-08-10T18:28:35Z</published><updated>2008-08-10T18:28:35Z</updated><content type="html">&lt;p&gt;Seems like every time I&amp;#39;ve tried to watch a YouTube video recently, no matter what computer I was using, I got this error message.&amp;nbsp; So I&amp;#39;d click on the link to install the latest Flash player. And it would run through the install and confirm it was successful.&amp;nbsp; I&amp;#39;d go back to Youtube and nothing changed.&amp;nbsp; I verified Javascript was enabled, after all it&amp;#39;d be pretty hard *not* to notice Javascript being off these days.&amp;nbsp; So what&amp;#39;s up?&lt;/p&gt; &lt;p&gt;I run Windows Live Care on all my home machines so I thought maybe that was it. I granted exceptions to YouTube.com and tweaked every setting I could imagine.&amp;nbsp; After not getting anywhere, I tried just shutting it off. And of course, nothing.&amp;nbsp; I rebooted over and over, flipped off and on every setting I could think of, and none of them fixed the problem.&lt;/p&gt; &lt;p&gt;After searching around, I found that the problem is that the download link specified doesn&amp;#39;t install the Full version of Flash.&amp;nbsp; So you need to simply install the full version of Flash and viola.&amp;nbsp; Why that&amp;#39;s the case is beyond me.&amp;nbsp; Here&amp;#39;s the link &lt;a href="http://forums.techguy.org/multimedia/526305-hello-you-either-have-javascript.html"&gt;that tipped me off to the solution&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1644143" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author></entry><entry><title>WCF to the rescue</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/07/07/wcf-to-the-rescue.aspx" /><id>/blogs/williamryan/archive/2008/07/07/wcf-to-the-rescue.aspx</id><published>2008-07-07T23:41:23Z</published><updated>2008-07-07T23:41:23Z</updated><content type="html">&lt;p&gt;Although part of the idea below was mine, James Ashley was crucial to helping me figure this out.&lt;/p&gt; &lt;p&gt;Problem:&lt;/p&gt; &lt;p&gt;Without getting into the ghoury details, we have an application that allows users to send messages to large groups of people.&amp;nbsp; Anyone using a client application that is logged on will get a special notification which they can respond to once a message is sent. So far, Polling has been the bane of our existence.&amp;nbsp; We&amp;#39;re trying to fancy up the UI and Telerik&amp;#39;s Winforms controls have helped out a lot, but there&amp;#39;s simply no way I&amp;#39;ve been able to find to have a snappy UI with a lot of really cool looking effects - all the while polling every few seconds.&amp;nbsp; Until now, I just bit down, and took a walk through multi-threadedville.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I wanted to remove the polling.&amp;nbsp; We had experimented with a few different architectures, but all had the same problem, polling.&amp;nbsp; So let&amp;#39;s say you had 200 users logged on.&amp;nbsp; In the User&amp;#39;s bar, we wanted to show each user and their picture - much the same way IM does.&amp;nbsp; This app had to work across network boundaries and you couldn&amp;#39;t count on being able to use TCP so we had to at least make it work with http.&amp;nbsp; If you poll every three seconds, to get the latest info on who&amp;#39;s logged on and off, rebuilding the list of user&amp;#39;s was painful. We resorted to several tricks to determine if a user was already in the list, but all of it was putting lipstick on a pig.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Solution:&lt;/p&gt; &lt;p&gt;One of the big things you often hear about with WCF is self-hosting.&amp;nbsp; I had ignored it for the most part.&amp;nbsp; But today, I wanted to basically have a Winforms app host one service, and a Windows Service host the other part of the service, having the services talk to each other. The client winforms app would simply talk to the client service, it would never hit the Windows Service directly.&lt;/p&gt; &lt;p&gt;So we built a client service and server service, with a client winforms app hosting the client service and a mock Windows Service (which was simply another winforms app) that hosted the service.&lt;/p&gt; &lt;p&gt;The problem we kept running into is as each client signed on to the system, how could we tell the server svc that they were online?&amp;nbsp; Dynamically adding endpoints is child&amp;#39;s play, but with each winforms app, you could only interact with the ServiceHost - not the service.&lt;/p&gt; &lt;p&gt;We tried using traditional events to no avail - that wasn&amp;#39;t a surprise but we figured it&amp;#39;s worth a try.&amp;nbsp; Then James recommended a static event. I was completely skeptical, but alas it worked.&amp;nbsp; &lt;/p&gt; &lt;p&gt;After looking at Juval&amp;#39;s framework though, it became really clear. If we want the services to be able to interact with the hosts, then simply self-host the things.&lt;/p&gt; &lt;p&gt;So we had a method called ReceiveMessage which was called from the service (via a client proxy for the client service).&amp;nbsp; Here&amp;#39;s basically what the client looked like:&lt;/p&gt; &lt;p&gt;public partial class Form1 : Form, IClientService&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Form1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServiceHost currentHost = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void btnStartService_Click(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentHost = new ServiceHost(typeof(Form1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentHost.Open();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblServiceStatus.Text = &amp;quot;Started&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblServiceStatus.Text = ex.Message;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string ReceiveMessage(string msg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String myMessage = msg;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(myMessage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return msg;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;p&gt;.... &lt;p&gt;&amp;nbsp; &lt;p&gt;Now, from the Administrative application (which interacted with the service, you could Send a message by doing the following:) &lt;p&gt;private void btnSend_Click(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy = new ClientServiceClient(new NetNamedPipeBinding(), endpoint );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.ReceiveMessage(rtbMessageText.Text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (FaultException ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblServiceStatus.Text = ex.Message;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; } &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;ClientServiceClient is a stupid name for a client proxy class, but we were just experimenting - the main thing to note is that it&amp;#39;s simply a proxy class for the client service, the same service that&amp;#39;s effectively being hosted by the Winforms client.&amp;nbsp; There&amp;#39;s a server method called SendMessage(String msg) which you&amp;#39;d call on the service, which in turn would dynamically add endpoints for each active client , and then send the messages to them.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;You can easily store all the information for clients you want to send messages to in a List&amp;lt;&amp;gt; or similar structure - or if you need stronger persistence or have different needs, then you can use a database.&amp;nbsp; Either way the end result is the same - loop through all the clients, add an endpoint for each one, loop through each and call the method you want.&lt;/p&gt; &lt;p&gt;I&amp;#39;m having trouble getting to my ftp server from where i&amp;#39;m at, but I&amp;#39;ll post the code when I can. In the meantime, if you&amp;#39;re interested, just drop me a line.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639700" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Misc Technology" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx" /><category term="WCF" scheme="http://msmvps.com/blogs/williamryan/archive/tags/WCF/default.aspx" /><category term="WIndows Communication Foundation" scheme="http://msmvps.com/blogs/williamryan/archive/tags/WIndows+Communication+Foundation/default.aspx" /><category term=".NET 3.5 Framework" scheme="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.5+Framework/default.aspx" /><category term="ChannelFactory" scheme="http://msmvps.com/blogs/williamryan/archive/tags/ChannelFactory/default.aspx" /></entry><entry><title>Utter Coolness compliments of Roku</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/07/03/utter-coolness-compliments-of-roku.aspx" /><id>/blogs/williamryan/archive/2008/07/03/utter-coolness-compliments-of-roku.aspx</id><published>2008-07-03T20:01:14Z</published><updated>2008-07-03T20:01:14Z</updated><content type="html">&lt;p&gt;My first &lt;a href="http://www.roku.com/"&gt;Roku Soundbridge&lt;/a&gt; joined the family back in 2005. As far as wireless media players go, it was a bit pricey.&amp;nbsp; But it looked really cool and I got it through a special offer making it a lot more reasonable.&amp;nbsp; The form factor and styling was the main thing I attributed the cost to, but I quickly learned that it was all the cool features that were responsible for the cost.&amp;nbsp; That was pretty much the case with each Roku product I&amp;#39;ve owned, they looked really cool and had all sorts of unanticipated goodness brimming throughout.&amp;nbsp; With Windows Home Server, an XBox 360 as an extender and a few Media Center pc&amp;#39;s in the house, it&amp;#39;s been a while since I looked at any Roku products, mainly b/c I just didn&amp;#39;t really need them - one network media player is usually plenty, let alone several.&amp;nbsp; But when I saw &lt;a href="http://www.engadget.com/2008/07/02/roku-serves-up-netflix-player-source-code/"&gt;Endgadget&amp;#39;s latest post on the sheer coolness of Roku&lt;/a&gt;, it made me realize what I was missing.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;So at first glance, it looked like Roku came up with a streaming media player which served up content from Netflix.&amp;nbsp; I always found Netflix&amp;#39;s pre-addressed envelopes a really nice touch - and a convenient one at that.&amp;nbsp; But Every time I&amp;#39;ve signed up for Netflix, it ended up being a waste of money b/c I don&amp;#39;t typically get around to watching many movies in any given month.&amp;nbsp; So I&amp;#39;ve signed up a few times only to cancel my account b/c of lack of use (Kim and I just can&amp;#39;t seem to let go of paying for movie rental late fees ;-)&amp;nbsp; ).&amp;nbsp; After the third or fourth time, i just sort of gave up on the whole thing.&amp;nbsp;&amp;nbsp;&amp;nbsp; By the &lt;a href="http://www.engadget.com/2008/07/02/roku-serves-up-netflix-player-source-code/"&gt;second sentence in this paragraph&lt;/a&gt;, I realized it&amp;#39;s time to rethink that policy - and go enable my subscription.&lt;/p&gt; &lt;p&gt;Roku is a truly innovative company with nothing but cool products, but it looks like they might have just raised their own bar.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639274" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="News" scheme="http://msmvps.com/blogs/williamryan/archive/tags/News/default.aspx" /><category term="Roku" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Roku/default.aspx" /><category term="Mindless Babbling" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Mindless+Babbling/default.aspx" /><category term="Misc Technology" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx" /><category term="Open Source" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Open+Source/default.aspx" /></entry><entry><title>Speaking of Funny</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/07/01/speaking-of-funny.aspx" /><id>/blogs/williamryan/archive/2008/07/01/speaking-of-funny.aspx</id><published>2008-07-01T14:52:11Z</published><updated>2008-07-01T14:52:11Z</updated><content type="html">&lt;p&gt;On the drive to work this morning, Glenn Beck had even picked up on the whole &lt;a href="http://www.hotchickswithdouchebags.com/dimitri.mp3"&gt;Dimitri&lt;/a&gt; thing posted on &lt;a href="http://www.hotchickswithdouchebags.com/"&gt;HCwDB&lt;/a&gt;. It is definitely worth downloading!&amp;nbsp; &lt;a href="http://www.brains-n-brawn.com/"&gt;KC&lt;/a&gt; and &lt;a href="http://ryanolshan.com/technology/"&gt;Ryan&lt;/a&gt; turned me on to &lt;a href="http://www.hotchickswithdouchebags.com/"&gt;HCwDB&lt;/a&gt; when we were at the summit, and it&amp;#39;s just kick a55 beyond the ability of words to describe it.&amp;nbsp; And Dimitri&amp;#39;s message is as good as it gets.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639003" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author></entry><entry><title>Stuff White People Like - The Book  - On Sale Tomorrow</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/07/01/stuff-white-people-like-the-book-on-sale-tomorrow.aspx" /><id>/blogs/williamryan/archive/2008/07/01/stuff-white-people-like-the-book-on-sale-tomorrow.aspx</id><published>2008-07-01T14:48:37Z</published><updated>2008-07-01T14:48:37Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.stuffwhitepeoplelike.com"&gt;Stuff White People Like&lt;/a&gt; is just plain excellent and their book &lt;a href="http://shrinkster.com/zvh"&gt;goes on sale tomorrow&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639002" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author></entry><entry><title>Phishers still unaware of SpellCheck</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/06/22/phishers-still-unaware-of-spellcheck.aspx" /><id>/blogs/williamryan/archive/2008/06/22/phishers-still-unaware-of-spellcheck.aspx</id><published>2008-06-22T21:24:02Z</published><updated>2008-06-22T21:24:02Z</updated><content type="html">&lt;p&gt;I just got this email sent to my gmail account.&amp;nbsp; For all the effort they put into this, there&amp;#39;s a pretty serious giveaway that it&amp;#39;s shady: (I turned off links so no one accidentally falls for it).&lt;/p&gt; &lt;p&gt;Microsoft Cororation Inc. ® &amp;lt;update@microsoft.com&amp;gt;&lt;br /&gt;reply-to&amp;quot;Microsoft Cororation Inc. ®&amp;quot; &amp;lt;update@microsoft.com&amp;gt;  &lt;p&gt;&amp;nbsp; &lt;p&gt;dateSun, Jun 22, 2008 at 5:14 PM&lt;br /&gt;subjectWindows Update Critical Security Update for Microsoft Windows (KB946026)  &lt;p&gt;hide details 5:14 PM (7 minutes ago) Reply  &lt;p&gt;Images are not displayed.&lt;br /&gt;Display images below - Always display images from update@microsoft.com  &lt;p&gt;Critical Security Update for Microsoft Windows (KB946026)  &lt;p&gt;A critical security issue has been identified that could allow an attacker to compromise a computer running Windows and gain control over your system and files.This issue has been discussed in KB946026 Microsoft Knowledge Base. Microsoft Security Response Team recommends to protect your computer by installing this update from Microsoft.  &lt;p&gt;Patch Information: &lt;br /&gt;Type:Critical Security Update&lt;br /&gt;Vulnerability:High&lt;br /&gt;Vendor notified:March, 17, 2008&lt;br /&gt;Update Release Date:June, 22, 2008 &lt;br /&gt;Download Size:824 KB, &amp;lt; 2 minutes @ 56.6 modem&lt;br /&gt;File Name:WINDOWS-KB946026-X86-ENU&lt;br /&gt;Affected Versions:Microsoft Windows XP/2003  &lt;p&gt;To install this update, follow these instructions:&lt;br /&gt;1Download WINDOWS-KB946026-X86-ENU file from Windows Update site or open an attached file.  &lt;p&gt;2After you install this item, you may have to restart your computer, to ensure a full protection.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1636805" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author></entry><entry><title>Chris Craft's 30 Days of .NET for Windows Mobile</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/06/11/chris-craft-s-30-days-of-net-for-windows-mobile.aspx" /><id>/blogs/williamryan/archive/2008/06/11/chris-craft-s-30-days-of-net-for-windows-mobile.aspx</id><published>2008-06-11T15:01:00Z</published><updated>2008-06-11T15:01:00Z</updated><content type="html">&lt;p&gt;Chris sure is &lt;a href="http://www.cjcraft.com/blog/default.aspx"&gt;talking softly and carrying a big stick&lt;/a&gt;&amp;nbsp;.&amp;nbsp; The 30 days thing is a great concept and he&amp;#39;s doing a bang up job.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1634023" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Compact Framework" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Compact+Framework/default.aspx" /><category term="Windows Mobile" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Windows+Mobile/default.aspx" /></entry><entry><title>God I hate Ajax</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/06/08/god-i-hate-ajax.aspx" /><id>/blogs/williamryan/archive/2008/06/08/god-i-hate-ajax.aspx</id><published>2008-06-09T02:11:00Z</published><updated>2008-06-09T02:11:00Z</updated><content type="html">&lt;p&gt;I was typing up a blog post earlier today and after 15 or so complete 5-10 second freezes, my browser finally crashed.&amp;nbsp; That was using IE 7.&amp;nbsp; IE 8 is a whole different story (and so, not a very good one).&amp;nbsp; So I started to think about how frequently my mobile browsing experience sucks.&amp;nbsp; Every single day, several times, I&amp;#39;ll run into a huge browser hang or some other performance nightmare that just makes my blood boil. If it was just once a day, it&amp;#39;d be one thing. If it was just on the desktop or the mobile device, it&amp;#39;d be one thing.&amp;nbsp; But ever since the world decided that every single g-d page needs Ajax in it - the overall browsing experience sucks.&amp;nbsp; And as I think more and more about it, how nice it was at first not to deal with Postbacks, I started to think &amp;quot;Maybe there&amp;#39;s a GOOD reason Ajax didn&amp;#39;t take off .... 10 years ago when it first came out.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Think about it for a second, there could certainly be valid reasons it happened, but why is it that Ajax was pretty much totally overlooked years ago when it first came out - and then 10 years later, Jesse James whatever his name is dubs it Ajax and the whole world is shaken.&amp;nbsp; WTF?&amp;nbsp; If it was really that awesome, wouldn&amp;#39;t at least some significant portion of the market have realized it?&amp;nbsp; So here we are today - where you simply can&amp;#39;t escape Ajax.&amp;nbsp; I mean, how many Flash sites have &amp;quot;Skip Demo&amp;quot; or &amp;quot;Non-Flash Site&amp;quot; available?&amp;nbsp; Why can&amp;#39;t the same thing happen with Ajax?&lt;/p&gt;
&lt;p&gt;When i think about my daily browsing, Ajax saves me a few minutes a day.&amp;nbsp; The Intellisense in Gmail is pretty helpful and I use that a lot.&amp;nbsp; There are a few other places as well. But on the whole, when I look at how much time I lose to my browser hanging for seconds at a time, or from it crashing - there&amp;#39;s no doubt I&amp;#39;m at a net loss.&amp;nbsp; Now you might be thinking &amp;quot;But all those browser crashes aren&amp;#39;t specifically from Ajax, it&amp;#39;s not like browsers never crashed before&amp;quot;.&amp;nbsp; Ok, there&amp;#39;s definitely some validity to that.&amp;nbsp; But I know that I could count the number of times I got a &amp;quot;This script is running longer than expected&amp;quot; dialog box on my Pocket PC/Smartphone prior to Ajax.&amp;nbsp; And yep, I get it every single day now, several times. And in every case I&amp;#39;ve bothered to look into, it was Ajax.&amp;nbsp; I know on Community Server (one of the more frequent places), it&amp;#39;s due to the Ajax loading on a few specific pages.&amp;nbsp; And good lord, what happened to Gmail?&amp;nbsp; I remember when I used to be impressed with how fast it was, as opposed to now where I tolerate how slow it is b/c I use Gmail for everything.&amp;nbsp;&amp;nbsp; When I log in now, I&amp;#39;d fall over dead if I actually got gmail to fully load in under 10 seconds...&amp;nbsp; Thank God for the HTML only feature...something I wish a whole lot more sights would have.&amp;nbsp; Or at least a &amp;quot;This sight contains Ajax, hahahahahahahahahahahaha sucker&amp;quot; so I could be forewarned.&lt;/p&gt;
&lt;p&gt;And I know, it&amp;#39;s not Ajax&amp;#39;s fault. Since it became trendy to use, people are putting it everywhere.&amp;nbsp; I am so old I actually remember when dev meetings centered around how fast a page could load as opposed to what features could be replaced with Ajax, but I digress.&amp;nbsp; So it&amp;#39;s the overuse and lack of alternatives that&amp;#39;s causing the problem. And eventually it will work itself out.&amp;nbsp; When it gets here, it won&amp;#39;t be a second too soon.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1633111" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Rants" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Rants/default.aspx" /></entry><entry><title>Looking for some .NET Developers</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/06/06/looking-for-some-net-developers.aspx" /><id>/blogs/williamryan/archive/2008/06/06/looking-for-some-net-developers.aspx</id><published>2008-06-07T02:19:26Z</published><updated>2008-06-07T02:19:26Z</updated><content type="html">&lt;p&gt;A client of mine located in the Aiken/Columbia South Carolina Area has asked me if I had any friends who are .NET Developers and looking for a job. They are looking for at least one Junior Developer, on Mid-Level Developer and several Senior developers.&amp;nbsp; I know these folks quite well and I can vouch for the following:&amp;nbsp; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;They pay extremely well&lt;/li&gt; &lt;li&gt;Generous benefits package&lt;/li&gt; &lt;li&gt;There&amp;#39;s plenty of cool people on their staff&lt;/li&gt; &lt;li&gt;They are growing at an explosive rate so there&amp;#39;s plenty of room for upward mobility. There&amp;#39;s also a very strong focus on learning/teaching and career development.&lt;/li&gt; &lt;li&gt;They are an Agile/SCRUM shop&lt;/li&gt; &lt;li&gt;Currently developing with the following technologies:&lt;/li&gt; &lt;ul&gt; &lt;li&gt; Visual Studio Team System 2008 / .NET 3.5 Framework&lt;/li&gt; &lt;li&gt;Windows Communication Foundation&lt;/li&gt; &lt;li&gt;Windows Presentation Foundation&lt;/li&gt; &lt;li&gt;ASP.NET&lt;/li&gt; &lt;li&gt;LINQ&lt;/li&gt; &lt;li&gt;Silverlight&lt;/li&gt; &lt;li&gt;Windows Mobile 5/ Windows Mobile 6/ .NET Compact Framework&lt;/li&gt; &lt;li&gt;Sql Server 2005 / Sql Server 2008&lt;/li&gt; &lt;li&gt;Windows Installer for XML&lt;/li&gt; &lt;li&gt;Sandcastle&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;If you&amp;#39;re in the area and looking for a job... if you know someone who looking for a job.... or if you&amp;#39;re willing to move, please drop me a line using the Contact option on&amp;nbsp; my blog or emailing me directly at &lt;a href="mailto://WilliamRyan@gmail.com"&gt;WilliamRyan@gmail.com&lt;/a&gt; and I&amp;#39;ll put you in contact with them.&amp;nbsp; They are looking to hire folks immediately so I can probably get you an interview within a few days.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Junior Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ideal candidate will be a recent college graduate with a Computer Science of MIS degree.&amp;nbsp; No experience is necessary for this position. The main soft-skill qualifications for this position are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A true love for development&lt;/li&gt; &lt;li&gt;Strong desire to learn&lt;/li&gt; &lt;li&gt;A desire to stand out among one&amp;#39;s peers&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; The hard-skill qualifications include a good theoretical understanding of at least two of the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Object Oriented Design and Analysis&lt;/li&gt; &lt;li&gt;Relational Database theory&lt;/li&gt; &lt;li&gt;Design Patterns&lt;/li&gt; &lt;li&gt;Familiarity with at least two of the following:&amp;nbsp; C, C++, Java, C#, VB.NET&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;This is essentially a dream job for recent college grads b/c the job is being offered &amp;quot;no experience required&amp;quot;.&amp;nbsp; Since they are a SCRUM/Agile shop, you&amp;#39;ll get to work extensively with their Senior and Mid level devs via Pair Programming.&amp;nbsp;&amp;nbsp; You&amp;#39;ll be able to pick&amp;nbsp; an area to specialize in which you will decide on for yourself. Additionally, you&amp;#39;ll be using some of the most sought after Microsoft technologies available.&amp;nbsp; Go to Monster.com or Dice.com and see for yourself how much demand there is for the above technologies and how much those jobs pay.&amp;nbsp; You&amp;#39;ll get to work with these on day 1 and essentially carve out a path for yourself using whichever technologies you like the best.&amp;nbsp; If you want to be a &amp;quot;UI&amp;quot; expert, that&amp;#39;s where you&amp;#39;ll be put. If you want to be a Web Services dev, again, that&amp;#39;s what you can focus on.&amp;nbsp; If you want to be an expert buildmaster who specializes in installers, that&amp;#39;s what you&amp;#39;ll get to do.&amp;nbsp; The company is looking for some excellent candidates and willing to offer a really fun and great paying job with plenty of training and career development available.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Mid-Level Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The ideal candidate will have a computer science or MIS degree and 1-3 years of development experience.&amp;nbsp; The ideal candidate will have two or more the following abilities:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Solid command of OOP/OOD using C++, C#, Java or VB.NET&lt;/li&gt; &lt;li&gt;Test Driven Design&lt;/li&gt; &lt;li&gt;Service Oriented Architecture&lt;/li&gt; &lt;li&gt;Familiarity with MySql, Sql Server (T-SQL), Oracle (PL/SQL)&lt;/li&gt; &lt;li&gt;Basic understanding of both Winforms and ASP.NET&lt;/li&gt; &lt;li&gt;Basic familiarity with Web Services, MSMQ, Enterprise Services/COM+, .NET Remoting, DCOM, J2EE, Java Beans&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Just like the Junior development positions, these ones will provide a great deal of flexibility to learn and specialize the area of your choice.&amp;nbsp; These are considered &amp;#39;fast track&amp;#39; positions to move into the Senior Developer or Architect roles&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Senior Developer:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The ideal candidate will be someone with at least 4 years experience.&amp;nbsp; This person will love challenges and love coming up with solutions to problems that other people run from.&amp;nbsp; They will be people that love figuring out how to do things that everyone else said can&amp;#39;t be done.&amp;nbsp; They will be the stereotypical Alpha-Geek, Someone that spends their spare time &lt;a href="http://newtechusa.com/csharp-dotnet-quiz.asp"&gt;answering quiz questions like these&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;All of the requirements for the Mid-Level Developer as well as several of the following skills:&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Proficiency with T-Sql or PL/SQL.&amp;nbsp; You should be able to write a 5 table join on your own. You should have written several stored procedures that were &amp;gt; 100 lines long.&lt;/li&gt; &lt;li&gt;Strong command of query tuning and ability to easily spot design flaws&lt;/li&gt; &lt;li&gt;Ability to design &amp;#39;real&amp;#39; objects.&amp;nbsp; &lt;/li&gt; &lt;ul&gt; &lt;li&gt;Someone who pays meticulous attention to the scope modifiers of their classes/functions/properties&lt;/li&gt; &lt;li&gt;Someone who understands the problems associated with coupling and strives to avoid it.&lt;/li&gt; &lt;li&gt;Someone who can write and use events in their classes without thinking twice about it.&lt;/li&gt; &lt;li&gt;Someone with a solid understanding of thread safety and thread synchronization&lt;/li&gt; &lt;li&gt;Someone who is comfortable using several different design patterns&lt;/li&gt; &lt;li&gt;Someone who is comfortable implementing several different interfaces in one object, using combinations of interface implementation and inheritance and someone who can use inheritance responsibly&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Keeps up with technology, reads computer books regularly, has favorite blogs in multiple disciplines and/or blogs themselves, attends or speaks at user&amp;#39;s groups, is active in one or more online forum or newsgroup&lt;/li&gt; &lt;li&gt;Someone who answers &amp;quot;Which is better, C# or VB.NET?&amp;quot; with &amp;quot;Either can be better depending on the circumstances but I&amp;#39;m comfortable writing in either of them&amp;quot; and then &amp;quot;But I&amp;#39;ve been learning F# lately and it&amp;#39;s really been growing on me&amp;quot;&lt;/li&gt; &lt;li&gt;Experience with .NET Remoting, Web Services &amp;amp; Web Services Enhancements, MSMQ, Enterprise Services and/or WCF&lt;/li&gt; &lt;li&gt;Ability to create syntactically correct UML diagrams (meaning they can do more than write the letters &amp;quot;UML&amp;quot; on their resume) and if not, they are willing to learn to do this.&lt;/li&gt; &lt;li&gt;Understands data structures solidly and could easily implement their own HashTable or LinkedList &lt;/li&gt; &lt;li&gt;Someone who&amp;#39;s always looking to come up with a newer, cooler, faster, and more secure way to do implement something&lt;/li&gt; &lt;li&gt;Experienced with either Biztalk server or Sharepoint&lt;/li&gt; &lt;li&gt;Takes pride in their code without falling in love with it or getting all defensive about it.&amp;nbsp; Ability to acknowledge the fact that everyone makes mistakes and can talk about their mistakes/bugs without getting defensive.&lt;/li&gt; &lt;li&gt;Someone who is the first to raise their hand whenever the boss says &amp;quot;I need someone to learn ____________, do I have any volunteers&amp;quot;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;Basically, if you love development, love creating new cutting edge solutions all the while making a lot of money and having a lot of fun you definitely should talk to these folks.&amp;nbsp; If you&amp;#39;re interested...... Please drop me a line using the Contact option on&amp;nbsp; my blog or emailing me directly at &lt;a href="mailto://WilliamRyan@gmail.com"&gt;WilliamRyan@gmail.com&lt;/a&gt; and I&amp;#39;ll put you in contact with them.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1632527" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Compact Framework" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Compact+Framework/default.aspx" /><category term="Data Access" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Data+Access/default.aspx" /><category term="Web Services / WSE" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Web+Services+_2F00_+WSE/default.aspx" /><category term=".NET Basics" scheme="http://msmvps.com/blogs/williamryan/archive/tags/.NET+Basics/default.aspx" /><category term=".NET General" scheme="http://msmvps.com/blogs/williamryan/archive/tags/.NET+General/default.aspx" /><category term="Coding Techniques" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Coding+Techniques/default.aspx" /><category term="Misc Technology" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Misc+Technology/default.aspx" /><category term="Biztalk" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Biztalk/default.aspx" /><category term="WPF" scheme="http://msmvps.com/blogs/williamryan/archive/tags/WPF/default.aspx" /><category term="WCF" scheme="http://msmvps.com/blogs/williamryan/archive/tags/WCF/default.aspx" /><category term=".NET 3.0 Framework" scheme="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.0+Framework/default.aspx" /><category term="WIX" scheme="http://msmvps.com/blogs/williamryan/archive/tags/WIX/default.aspx" /><category term="Sql Server Integration Services" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server+Integration+Services/default.aspx" /><category term="SSIS" scheme="http://msmvps.com/blogs/williamryan/archive/tags/SSIS/default.aspx" /><category term="Silverlight" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Silverlight/default.aspx" /><category term="Sql Server" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server/default.aspx" /><category term="Sql Server 2008" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Sql+Server+2008/default.aspx" /><category term="Sharepoint" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Sharepoint/default.aspx" /><category term="LINQ To ADO.NET" scheme="http://msmvps.com/blogs/williamryan/archive/tags/LINQ+To+ADO.NET/default.aspx" /><category term=".NET 3.5 Framework" scheme="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.5+Framework/default.aspx" /><category term="LINQ" scheme="http://msmvps.com/blogs/williamryan/archive/tags/LINQ/default.aspx" /><category term="LINQ Training" scheme="http://msmvps.com/blogs/williamryan/archive/tags/LINQ+Training/default.aspx" /><category term="ADO.NET 3.5" scheme="http://msmvps.com/blogs/williamryan/archive/tags/ADO.NET+3.5/default.aspx" /><category term="C# 3.5" scheme="http://msmvps.com/blogs/williamryan/archive/tags/C_2300_+3.5/default.aspx" /><category term="Windows Mobile" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Windows+Mobile/default.aspx" /><category term="Job Stuff" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Job+Stuff/default.aspx" /></entry><entry><title>My first hours with my Amazon Kindle</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/05/29/my-first-hours-with-my-amazon-kindle.aspx" /><id>/blogs/williamryan/archive/2008/05/29/my-first-hours-with-my-amazon-kindle.aspx</id><published>2008-05-29T04:32:23Z</published><updated>2008-05-29T04:32:23Z</updated><content type="html">&lt;p&gt;I decided to order an &lt;a href="http://www.amazon.com/gp/product/B000FI73MA/ref=s9kin_c1_imgk?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-1&amp;amp;pf_rd_r=0X0YF4KED6EJEVF08YYB&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=398464101&amp;amp;pf_rd_i=507846"&gt;Amazon Kindle&lt;/a&gt;.&amp;nbsp; As patience is not something I am overly endowed with, I paid the extra money for the expedited shipping. Along with it I bought a backup battery, another case, a car charger, home charger and storage cards (wow are they cheap on Amazon). It arrived exactly at 3:00 PM today.&lt;/p&gt; &lt;p&gt;The packaging is quite elegant although it borders on overdone. It took me about 5 minutes to get it out of the box.&amp;nbsp; There&amp;#39;s a plastic sticker on the front of it telling you obvious things like &amp;quot;It needs charged&amp;quot; and the like.&amp;nbsp; I charged it and after 2 hours, couldn&amp;#39;t wait any longer.&lt;/p&gt; &lt;p&gt;I had already bought a few books, so I was waiting to see what it was going to be like pulling them down.&amp;nbsp; It&amp;#39;s noteworthy that as much as I love T-Mobile, I get no coverage in my office building.&amp;nbsp; The EVDO connection registers full strength irrespective of where I walked around.&amp;nbsp; In somewhere around 1 minute or two, I saw my books available. It probably took 5 minutes total to get all of them - there were 8 in total.&lt;/p&gt; &lt;p&gt;I was really worried about the screen.&amp;nbsp; At first &lt;a href="http://www.youtube.com/watch?v=XqTwhOyYWo0"&gt;Ann&lt;/a&gt; seemed to indicate the liked the overall experience but then she posted &lt;a href="http://althouse.blogspot.com/2008/05/real-problem-with-electronic-books.html"&gt;this rather harsh critique&lt;/a&gt; perfectly timed to make me worry it&amp;#39;d be a dud.&amp;nbsp; I don&amp;#39;t always agree with her on gadget issues so I hoped she was wrong. Besides, much of her critique seemed to be a cross between curmudgeonry and Book related Ludditeness (or whatever the adjective form of Luddite is).&amp;nbsp; And based on my heretofore experiences with e-books, i certainly understand where she&amp;#39;s coming from.&amp;nbsp; In short, her comments seemed to speak more to e-book readers in general than the Kindle, but she was speaking about the Kindle overall.&amp;nbsp; When i got mine, I quickly wanted to see what the screen was like and well, there&amp;#39;s plenty of contrast. It&amp;#39;s plenty bright and amazingly easy on the eyes. Compared to her iPhone the display might be a little lame, but it&amp;#39;s a heck of a lot easier to read IMHO than even her attempt at subtlety on her page ;-)&amp;nbsp; .&amp;nbsp; So the reviews are out. If you&amp;#39;re me you&amp;#39;ll find it great. But not everyone shares that viewpoint. The good news is that it&amp;#39;s all pretty much either love it or hate it so you&amp;#39;ve got a 50/50 chance.&lt;/p&gt; &lt;p&gt;I think there are two areas that no one can disagree with.&amp;nbsp; The speed/responsiveness is so impressive I almost started to yearn for the old DOS days and browsing with LINX.&amp;nbsp; Yes, it&amp;#39;s relatively plain (as Ann says, it&amp;#39;s very etch-a-sketch like) but it&amp;#39;s very fast.&amp;nbsp; There&amp;#39;s a tiny delay which is intentional when you flip pages, but there&amp;#39;s none of the painful annoying hangs that we&amp;#39;ve come to get used to ever since the world mandated that every web page should have Ajax in it somewhere and every UI form needs to pretend it&amp;#39;s a MAC.&amp;nbsp; Fast fast fast and responsive.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Ease of use is another are that it really excels in.&amp;nbsp; There are several ways to navigate and it lends itself well to left handed people (for instance, you can page forward or back with your left hand). It&amp;#39;s light as h3ll and you can easily hold it in one hand.&amp;nbsp; I often try to read while I&amp;#39;m on the elliptical machine and it&amp;#39;s a nightmare - it was wonderfully easy using the Kindle.&lt;/p&gt; &lt;p&gt;So far, I&amp;#39;ve logged about 3 hours of use on it and I have yet to see the power bar drop at all.&amp;nbsp; That alone makes it infinitely better than my UMPC for e-book reading.&lt;/p&gt; &lt;p&gt;I also tried to buy a few more books using the Kindle and bought a few blog feeds.&amp;nbsp; Once your account is set up, it&amp;#39;s about as easy as can be. you search for what you want, select it and buy it with one-click.&lt;/p&gt; &lt;p&gt;So the only thing that I&amp;#39;ve seen that could make the Kindle suck is if it was really fragile or if there weren&amp;#39;t many titles.&amp;nbsp; Every single non-programming book I looked for was available and 85% of the programming books I searched for were available.&amp;nbsp; I don&amp;#39;t plan on bouncing it off the ground but I&amp;#39;m sure I will (although I have to say the included carrying case is pretty clever and gets the job done well. I&amp;#39;m not sure I needed the other cover I bought).&lt;/p&gt; &lt;p&gt;Only having had it a day, I couldn&amp;#39;t be more pleased.&amp;nbsp; Let me use it some more and I&amp;#39;ll see if something comes out that I don&amp;#39;t like, there&amp;#39;s got to be something although I sure haven&amp;#39;t found it yet.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1628565" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Kindle" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Kindle/default.aspx" /><category term="Amazon Kindle" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Amazon+Kindle/default.aspx" /></entry><entry><title>Bill gets an Amazon Kindle</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/05/28/bill-gets-an-amazon-kindle.aspx" /><id>/blogs/williamryan/archive/2008/05/28/bill-gets-an-amazon-kindle.aspx</id><published>2008-05-28T14:19:27Z</published><updated>2008-05-28T14:19:27Z</updated><content type="html">&lt;p&gt;Well, almost. I bought it Sunday night and it&amp;#39;s almost here although it&amp;#39;s not in my hands yet.&amp;nbsp; I have been trying to find a good e-book solution for a long time now. I got the &lt;a href="http://www.sonystyle.com/webapp/wcs/stores/servlet/CategoryDisplay?catalogId=10551&amp;amp;storeId=10151&amp;amp;langId=-1&amp;amp;categoryId=16184&amp;amp;XID=O:sony_ebook_reader:dg_read_msnsrch"&gt;Sony.&lt;/a&gt; I&amp;#39;ve went through a few tablets (although they weren&amp;#39;t exclusively for e-books) and I broke down and got a &lt;a href="http://search.live.com/products/?q=Samsung%20Q1%20Ultra%20Premium%20UMPC%20U1500%201.33%20GHz%20-%207%22%20TFT&amp;amp;p1=%5bCommerceService+scenario%3d%22reviews%22+docid%3d%22A21186DD16DE234D7841%22+p%3d%2228bb1d1608a34e4ab66dfd1866517858%22%5d&amp;amp;wf=Commerce&amp;amp;FORM=CQRE"&gt;Samsung Q1 Ultra&lt;/a&gt; UMPC.&amp;nbsp; None of them cut it.&amp;nbsp; Although the problem was multi-faceted.&amp;nbsp; There weren&amp;#39;t many books for them so the hardware didn&amp;#39;t much matter.&amp;nbsp; Although the hardware was an issue. Most tablets I&amp;#39;ve had, even the UMPC can get 4-6 hours of battery life tops.&amp;nbsp; On&amp;nbsp; a typical flight to Seattle, I spend almost that much time in the air and power is at a premium and frequently unavailable.&amp;nbsp; So in short, the experience sucked. Now I see the &lt;a href="http://www.amazon.com/gp/product/B000FI73MA/ref=amb_link_6369712_3?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-1&amp;amp;pf_rd_r=19GK2E5VPK87AWGG8SE5&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=398464001&amp;amp;pf_rd_i=507846"&gt;Amazon Kindle&lt;/a&gt;.&amp;nbsp; I was worried b/c I mainly read computer books, so I searched around.&amp;nbsp; &lt;a href="http://www.amazon.com/s/ref=nb_ss_kinc?url=node%3D154606011&amp;amp;field-keywords=WCF"&gt;Here&amp;#39;s an example of what I found.&lt;/a&gt;&amp;nbsp; &lt;a href="http://www.amazon.com/s/ref=nb_ss_kinc?url=node%3D154606011&amp;amp;field-keywords=C%23"&gt;Here&amp;#39;s some more&lt;/a&gt;. &lt;a href="http://www.amazon.com/s/ref=nb_ss_kinc?url=node%3D154606011&amp;amp;field-keywords=Sql+Server"&gt;And here are a few more&lt;/a&gt;.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;So clearly the books are there.&amp;nbsp; the other feature I find pretty amazing is that you get a EVDO service which you use to pull down the books. you pay for it once and that&amp;#39;s it.&amp;nbsp; You don&amp;#39;t need monthly charges and you don&amp;#39;t have to worry about any other charges (unless I&amp;#39;ve read it all wrong and I don&amp;#39;t think I have).&amp;nbsp; &lt;a href="http://althouse.blogspot.com/2008/05/real-problem-with-electronic-books.html"&gt;The screen has a few complaints&lt;/a&gt; but there&amp;#39;s plenty of people saying it rocks.&lt;/p&gt; &lt;p&gt;At the moment, I can&amp;#39;t really tell although I&amp;#39;m optimistic.&amp;nbsp; In about 2 hours it will be here.&amp;nbsp; Even though I have many of the books I bought in hardback, I&amp;#39;m pretty stoked to see how they compare.&amp;nbsp; I&amp;#39;ll post details once I get it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1628342" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Kindle" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Kindle/default.aspx" /><category term="Amazon Kindle" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Amazon+Kindle/default.aspx" /></entry><entry><title>The Best of Grand Theft Auto IV</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/05/24/the-best-of-grand-theft-auto-iv.aspx" /><id>/blogs/williamryan/archive/2008/05/24/the-best-of-grand-theft-auto-iv.aspx</id><published>2008-05-24T04:33:58Z</published><updated>2008-05-24T04:33:58Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.theadoguy.com"&gt;Shawn&lt;/a&gt; posted a link to &lt;a href="http://www.gametrailers.com/player/34412.html?r=1&amp;amp;type=wmv"&gt;these awesome GTA IV Death Clips&lt;/a&gt;&amp;nbsp; on &lt;a href="http://twitter.com/TheADOGuy"&gt;Twitter&lt;/a&gt;.&amp;nbsp; Depending on where you work, it&amp;#39;s probably not the safest thing to get caught watching and I wouldn&amp;#39;t recommend watching it around young kids.&amp;nbsp; With that said, it really kicks a55.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1626730" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author></entry><entry><title>Two great folks are tying the knot!</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/05/23/two-great-folks-are-tying-the-knot.aspx" /><id>/blogs/williamryan/archive/2008/05/23/two-great-folks-are-tying-the-knot.aspx</id><published>2008-05-23T19:52:00Z</published><updated>2008-05-23T19:52:00Z</updated><content type="html">&lt;p&gt;This weekend,&amp;nbsp;&lt;a href="http://www.franksworld.com/"&gt;Frank&lt;/a&gt; &amp;nbsp;is &lt;a href="http://www.frankandroberta.com/index.cfm?fa=welcome"&gt;getting married &lt;/a&gt;to the lovely and charming Roberta.&amp;nbsp; Frank is a fellow MVP, although he&amp;#39;s in the Tablet PC group and does a lot of work with the .NET Community, particularly in the South East.&amp;nbsp; I got to first meet him at a code camp (you can tell the cool guys b/c they are the ones with a Tablet PC in their hands [although occassionally, &lt;a href="http://blah.winsmarts.com/"&gt;iPhone loving, Tablet hating Sharepoint Ninjas&lt;/a&gt;&amp;nbsp;can be cool too]) and have had the pleasure of hanging out with him at more than a few events.&amp;nbsp; I was lucky enough to get to meet not only&amp;nbsp;Roberta, but the two pups.&amp;nbsp; It&amp;#39;s impossible to know Frank and not really like him - so if you haven&amp;#39;t had a chance to do so, stop by &lt;a href="http://www.frankandroberta.com/index.cfm?fa=guestbook&amp;amp;gb=y"&gt;and wish them well&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1626575" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="Friends" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Friends/default.aspx" /></entry><entry><title>Cool Powershell script</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/05/20/cool-powershell-script.aspx" /><id>/blogs/williamryan/archive/2008/05/20/cool-powershell-script.aspx</id><published>2008-05-21T03:59:14Z</published><updated>2008-05-21T03:59:14Z</updated><content type="html">&lt;p&gt;I can&amp;#39;t take credit for this, I came across it in &lt;a href="http://www.amazon.com/Windows-Communication-Foundation-Unleashed-WCF/dp/0672329484"&gt;Windows Communication Foundation Unleashe&lt;/a&gt;d - but it&amp;#39;s very helpful for administering &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx"&gt;Windows Communication Foundation&lt;/a&gt;...&lt;/p&gt; &lt;p&gt;In the &amp;lt;diagnostics&amp;gt; tag of your service&amp;#39;s configuration, two available options are &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.configuration.diagnosticsection.wmiproviderenabled.aspx"&gt;wmiProviderEnabled&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.configuration.diagnosticsection.performancecounters.aspx"&gt;performanceCounters&lt;/a&gt;.&amp;nbsp; So ideally you&amp;#39;ll want to set both, but if you just need to identify the endpoint then only the first one is necessary:&lt;/p&gt; &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;lt;system.serviceModel&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;diagnostics &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wmiProviderEnabled=&amp;quot;true&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; performanceCounters=&amp;quot;ServiceOnly&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="1" face="Courier New"&gt;&amp;lt;/system.ServiceModel&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;After you have that in place for your service(s), you can use the following Powershell script&lt;/p&gt; &lt;p&gt;&lt;font size="1" face="Courier New"&gt;PS C:\Windows\System32&amp;gt; get-wmiobject endpoint -n root\ServiceModel | ft name&lt;/font&gt;&lt;/p&gt; &lt;p&gt;I don&amp;#39;t know if I love Powershell more than Windows Communication Foundation or WCF more than Powershell, but few things are cooler than using them together and this is one script you&amp;#39;ll undoubtedly find helpful.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1625389" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author><category term="WCF" scheme="http://msmvps.com/blogs/williamryan/archive/tags/WCF/default.aspx" /><category term="Visual Studio .NET Orcas" scheme="http://msmvps.com/blogs/williamryan/archive/tags/Visual+Studio+.NET+Orcas/default.aspx" /><category term="WIndows Communication Foundation" scheme="http://msmvps.com/blogs/williamryan/archive/tags/WIndows+Communication+Foundation/default.aspx" /><category term=".NET 3.5 Framework" scheme="http://msmvps.com/blogs/williamryan/archive/tags/.NET+3.5+Framework/default.aspx" /></entry><entry><title>Doing tiers with WCF</title><link rel="alternate" type="text/html" href="/blogs/williamryan/archive/2008/05/16/doing-tiers-with-wcf.aspx" /><id>/blogs/williamryan/archive/2008/05/16/doing-tiers-with-wcf.aspx</id><published>2008-05-16T18:48:58Z</published><updated>2008-05-16T18:48:58Z</updated><content type="html">&lt;p&gt;Because the nomenclature of &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx"&gt;WCF&lt;/a&gt; is often different then the technologies it consolidated, one of the problems you&amp;#39;ll likely encounter when moving to it is figuring out how to do the same things you were doing before.&amp;nbsp; That&amp;#39;s probably not the right way to phrase it, what i mean is, how do you implement the WCF equivalent?&lt;/p&gt; &lt;p&gt;With plain old web services, there&amp;#39;s more that&amp;#39;s similar than different so it&amp;#39;s not a big challenge. But architecturally, things aren&amp;#39;t as similar as they may appear. And if you try to create a similar architecture for &lt;a href="http://en.wikipedia.org/wiki/.NET_Remoting"&gt;Remoting&lt;/a&gt; (you know, that technology &lt;a href="http://www.learnasp.com/learnasp/"&gt;Counterfeit&lt;/a&gt;&amp;nbsp;&lt;a href="http://blog.charlescarroll.com/chazblog/"&gt;ASP.NET Gurus&lt;/a&gt; cower away from b/c it&amp;#39;s over their head) or &lt;a href="http://www.microsoft.com/windowsserver2003/technologies/msmq/default.mspx"&gt;MSMQ&lt;/a&gt;, things are more pronounced, at least they seem to be. &lt;/p&gt; &lt;p&gt;At the risk of sounding like a cheerleader for the new latest greatest technology from MS, I will say that once you get into &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx"&gt;WCF&lt;/a&gt;, you&amp;#39;d be hard pressed not to find it much simpler and intuitive than any of the older technologies.&amp;nbsp; I personally have a pretty big investment in &lt;a href="http://msdn.microsoft.com/en-us/library/kwdt6w2k(VS.71).aspx"&gt;Remoting&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/ms977317.aspx"&gt;WS and WSE 2.0 and 3.0&lt;/a&gt;.&amp;nbsp; Letting go of all of that and starting new is a little daunting. After all, while I know I can get there in &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx"&gt;WCF&lt;/a&gt;, it was hard at first coming up with time estimates and even harder making sure that what I was doing was the &amp;#39;same&amp;#39; as the &lt;a href="http://en.wikipedia.org/wiki/.NET_Remoting"&gt;Remoting&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/library/ms977317.aspx"&gt;WSE&lt;/a&gt; equivalent. You&amp;#39;ll likely find yourself in the same scenario but if you just stick it out for a little while, I can promise you&amp;#39;ll find yourself astounded at how much easier it is to do things.&lt;/p&gt; &lt;p&gt;I worked on a very large application for the state of South Carolina a few years ago. There was an ASP.NET Front end.&amp;nbsp; From there, it would call out to a Application Server which hosted the Business Layer. That Business layer in turn called a generic DAL. The DAL in turn called a provider specific DAL.&amp;nbsp; The provider specific DAl would then call the database.&amp;nbsp; There was also another facade implemented via WS that used &lt;a href="http://msdn.microsoft.com/en-us/library/ms996944.aspx"&gt;DIME&lt;/a&gt; and a few other WSE specific features (by virtue of saying it used &lt;a href="http://msdn.microsoft.com/en-us/library/ms996944.aspx"&gt;DIME&lt;/a&gt;, you can tell it was a while ago b/c &lt;a href="http://msdn.microsoft.com/en-us/library/aa529567.aspx"&gt;MTOM&lt;/a&gt; has been where it&amp;#39;s at for a while now).&lt;/p&gt; &lt;p&gt;All of the layers could be run on one machine or, you could move them out as needed. For scalability this was a great infrastructure. And it helped greatly with security.&amp;nbsp; Many of the apps that were built for the state were implemented with an ASP.NET Front end that talked directly to the database.&amp;nbsp; This forced the IT department to make many concessions with respect to the firewall and DMZ and if performance started suffering, the only solution was buying more server resources or getting a new server.&amp;nbsp; Well, that debate has been had and is over - for large scale applications that need to scale, the front end -&amp;gt; database model is lame.&lt;/p&gt; &lt;p&gt;Trying to implement this n-tier approach in &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx"&gt;WCF&lt;/a&gt; was so easy though it was really amazing.&amp;nbsp; I simply created a &lt;a href="http://msdn.microsoft.com/en-us/library/bb332338.aspx"&gt;WCF Service library&lt;/a&gt; for each tier.&amp;nbsp; There was a facade which is what the asp.net front end of Winforms front end would communicate with.&amp;nbsp; This was a service itself which in turn calls out to the Business tier/service.&amp;nbsp; The Business tier/service is another &lt;a href="http://msdn.microsoft.com/en-us/library/bb332338.aspx"&gt;WCF Service library&lt;/a&gt; which calls a Data Tier/service.&amp;nbsp; That tier is another &lt;a href="http://msdn.microsoft.com/en-us/library/bb332338.aspx"&gt;WCF Service library&lt;/a&gt; which can call out to any of the provider specific tiers. Each of those in turn can talk to the database directly. So, you can easily run this application in a manner that means the web server hosting the ASP.NET UI never talks to the db directly.&amp;nbsp; You can however, by simply changing a few configuration section values, run everything on the same machine (if you wanted).&lt;/p&gt; &lt;p&gt;WCF allows you to run all of the services InProcess (&lt;a href="http://www.idesign.net/idesign/DesktopDefault.aspx"&gt;Juval Lowy&lt;/a&gt; has an excellent discussion of this in his &lt;a href="http://www.amazon.com/Programming-WCF-Services-Juval-Lowy/dp/0596526997"&gt;Programming WCF Services&lt;/a&gt; book - which is as good of a book as you&amp;#39;ll find).&amp;nbsp; If they will all be run on the same machine, you can simply used the &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx"&gt;netNamedPipeBinding&lt;/a&gt;.&amp;nbsp; &lt;/p&gt; &lt;p&gt;So using the example I mentioned above, the Facade service(s) serves as the Server for the Winforms client or ASP.NET front&amp;nbsp; end. At the same time though, it is a client of the Business Tier (and you certainly could make this the business tier if you wanted to). I discuss handling it as a client &lt;a href="http://msmvps.com/blogs/williamryan/archive/2008/05/12/channelfactory-createchannel-goes-to-the-gentlemen-s-club.aspx"&gt;Here&lt;/a&gt;.&amp;nbsp; So the wcf library holding the business logic becomes a server to the facade service, but serves as a client to the generic data tier.&amp;nbsp; The generic data tier is a server to the business service, but is a client of the provider specific DAL.&amp;nbsp; The provider specific DAL&amp;#39;s are not clients to anything in the WCF sense, but technically they are for they call out to the db server.&lt;/p&gt; &lt;p&gt;B/c many of these tiers simply call other tiers, the interface/contract they use is the same. It could be different if you had reason for it to be, but by using the same contract, you can greatly simplify things. In this instance, I created a library which was shared with every single library, that hosted the contracts.&amp;nbsp; Looking at the code snippet from my previous article, you can see that the Interface implemented is the same throughout:&lt;/p&gt; &lt;p&gt;The article I pulled this from it &lt;a href="http://msmvps.com/blogs/williamryan/archive/2008/05/12/channelfactory-createchannel-goes-to-the-gentlemen-s-club.aspx"&gt;available here&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;code&gt;&lt;font color="#008080"&gt;ChannelFactory&lt;/font&gt;&amp;lt;&lt;font color="#008080"&gt;IStripper&lt;/font&gt;&amp;gt; stripperFactory = new &lt;font color="#008080"&gt;ChannelFactory&lt;/font&gt;&amp;lt;&lt;font color="#008080"&gt;IStripper&lt;/font&gt;&amp;gt;(&amp;quot;NamedPipe&amp;quot;);&lt;br /&gt;&lt;font color="#008080"&gt;IStripper&lt;/font&gt; serviceInstance = stripperFactory.CreateChannel();&lt;br /&gt;using (serviceInstance as IDisposable)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; Console.WriteLine(serviceInstance.Bounce(BounceLevel.Woot));&lt;br /&gt;&amp;nbsp;&amp;nbsp; Console.WriteLine(serviceInstance.SlideDownPoll(PoleManeuver.LookMaNoHands));&lt;br /&gt;&amp;nbsp;&amp;nbsp; Console.WriteLine(serviceInstance.MilkSuckerForCash(&amp;quot;Peter Griffin&amp;quot;)); &lt;br /&gt;}&lt;/code&gt; &lt;p&gt;Or where I was using the client proxy...&lt;/p&gt; &lt;p&gt;public partial class PurePlatinumServiceClient : ClientBase&amp;lt;IStripper&amp;gt;, IStripper&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {...} &lt;p&gt;So using that same methodology, the client configuration file looks like this (I&amp;#39;m leaving out everything unrelated to WCF): &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;client&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;net.pipe://localhost/StripperService&amp;quot; binding=&amp;quot;netNamedPipeBinding&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindingConfiguration=&amp;quot;&amp;quot; contract=&amp;quot;Cuckooz.Sample.WCFStripClub.IStripper&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;MainPipe&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/client&amp;gt;&lt;/font&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;No server configuration is needed b/c this is the client tier hence, it does no serving at all.&amp;nbsp; Now, look at the facade&amp;#39;s configuration (again, the code is identical at each tier for the most part. Each tier may do some of it&amp;#39;s own validation , but at the end of it, it&amp;#39;s using the return base.Channel.MethodName(Params) if I use the clientproxy or calling the method directly if I use the interface.&lt;/p&gt; &lt;p&gt;Now, let&amp;#39;s look at the configuration of the Services.&amp;nbsp; For the actual business implementation, I called each service a slightly different named, like ProductBusinessAPIService, ProductGenericDALService, ProductDALSpecificService and the like.&amp;nbsp; The interface remains the same in each case, only the name of the service that I&amp;#39;m exposing it as changes.&amp;nbsp; If I used different interfaces, then obviously those would need to change in the configuration, but little more than that would need to be changed (actually, nothing more). The thing to notice is that other than the client and the data service, each of them is functioning as both a client and a server.&amp;nbsp; They are clients to the next service in the chain and a server to the one before it. So the facade is a server to the ui client app, but a client of the business service. The business service is a client of the generic DAL but a server to the facade. The generic DALis a server to the business server but a client of the specific DAL.&amp;nbsp; &lt;/p&gt; &lt;p&gt;If you saw that say the specific DAL was eating a ton of resources, you could simply move it to another box. You&amp;#39;d need to change the bindings to a different mechanism b/c namedpipes won&amp;#39;t work across machines but you&amp;#39;d simply need to add a Endpoint that uses the &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.aspx"&gt;NetTcpBinding&lt;/a&gt; for instance, and other than the address, they&amp;#39;d look virtually identical to the existing named pipe equivalent. So without changing a line of code, you could move each piece to a different box (unless you consider config values &amp;#39;a line of code&amp;#39;.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;So here&amp;#39;s the Facade Service:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;client&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;net.pipe://localhost/StripClubBusinessService&amp;quot; binding=&amp;quot;netNamedPipeBinding&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindingConfiguration=&amp;quot;&amp;quot; contract=&amp;quot;Cuckooz.Sample.WCFStripClub.IStripper&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;ClientPipe&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/client&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;service behaviorConfiguration=&amp;quot;Cuckooz.Sample.WCFStripClub.StripServiceBehavior&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;Cuckooz.Sample.WCFStripClubs.StripperService&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; name=&amp;quot;MainMex&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contract=&amp;quot;IMetadataExchange&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;net.pipe://localhost/StripperService&amp;quot; binding=&amp;quot;netNamedPipeBinding&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindingConfiguration=&amp;quot;&amp;quot; name=&amp;quot;MainPipe&amp;quot; contract=&amp;quot;Cuckooz.Sample.WCFStripClub.IStripper&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;baseAddresses&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add baseAddress=&amp;quot;&lt;/font&gt;&lt;a href="http://localhost:8731/blahblah/facade/GenericService/&amp;quot;"&gt;&lt;font face="Courier New" size="2"&gt;http://localhost:8731/blahblah/facade/GenericService/&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font size="3"&gt;&lt;font face="Cordia New"&gt;&lt;font face="Courier New" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/baseAddresses&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/service&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behaviors&amp;gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt; &amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name=&amp;quot;Cuckooz.Sample.WCFStripClub.StripServiceBehavior&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Courier New" size="2"&gt; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;/font&gt; &lt;p&gt;&lt;font&gt;&lt;font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behaviors&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/system.serviceModel&amp;gt;&lt;/font&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;So here&amp;#39;s the BusinessService:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;client&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;net.pipe://localhost/StripClubDataService&amp;quot; binding=&amp;quot;netNamedPipeBinding&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindingConfiguration=&amp;quot;&amp;quot; contract=&amp;quot;Cuckooz.Sample.WCFStripClub.IStripper&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;DataPipe&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/client&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;service behaviorConfiguration=&amp;quot;Cuckooz.Sample.WCFStripClub.StripperServiceBehavior&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;Ger911.HCStandard.Core.API.StripClubBusinessService&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; name=&amp;quot;Mex&amp;quot; contract=&amp;quot;IMetadataExchange&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;net.pipe://localhost/StripClubBusinessService&amp;quot; binding=&amp;quot;netNamedPipeBinding&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindingConfiguration=&amp;quot;&amp;quot; name=&amp;quot;MainPipe&amp;quot; contract=&amp;quot;Cuckooz.Sample.WCFStripClub.IStripper&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;baseAddresses&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add baseAddress=&amp;quot;&lt;/font&gt;&lt;a href="http://localhost:8731/blahblahbalh/CuckoozStripClub/StripperService/&amp;quot;"&gt;&lt;font face="Courier New" size="2"&gt;http://localhost:8731/blahblahbalh/CuckoozStripClub/StripperService/&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/baseAddresses&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/service&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name=&amp;quot;Cuckooz.Sample.WCFStripClub.StripperServiceBehavior&amp;quot;&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behaviors&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/system.serviceModel&amp;gt;&lt;/font&gt; &lt;p&gt;&lt;strong&gt;Now here&amp;#39;s the Generic Data Service:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;service behaviorConfiguration=&amp;quot;Cuckooz.Sample.WCFStripClub.StripClubDataServiceBehavior&amp;quot; name=&amp;quot;Cuckooz.Sample.WCFStripClub.&lt;strong&gt;Strip&lt;/strong&gt;ClubDataService&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; name=&amp;quot;Mex&amp;quot; contract=&amp;quot;IMetadataExchange&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;net.pipe://localhost/StripClubDataService&amp;quot; binding=&amp;quot;netNamedPipeBinding&amp;quot; bindingConfiguration=&amp;quot;&amp;quot; name=&amp;quot;DataServicePipe&amp;quot; contract=&amp;quot;Cuckooz.Sample.WCFStripClub.IStripper&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;baseAddresses&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add baseAddress=&amp;quot;&lt;/font&gt;&lt;a href="http://localhost:8731/blahblah/CuckoozGenericDal/GenericDalService/&amp;quot;"&gt;&lt;font face="Courier New" size="2"&gt;http://localhost:8731/blahblah/CuckoozGenericDal/GenericDalService/&amp;quot;&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/baseAddresses&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/service&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/services&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;behaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name=&amp;quot;Cuckooz.Sample.WCFStripClub.StripClubDataServiceBehavior&amp;quot;&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;True&amp;quot; /&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/behaviors&amp;gt;&lt;br /&gt;&amp;lt;/system.serviceModel&amp;gt;&lt;/font&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;Finally, here&amp;#39;s the configuration for one of the provider specific (Sql Server) Data Service: &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;service behaviorConfiguration=&amp;quot;Cuckooz.Sample.WCFStripClub.StripClubSqlServerServiceBehavior&amp;quot; name=&amp;quot;Cuckooz.Sample.WCFStripClub.StripClubSqlServerService&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; name=&amp;quot;Mex&amp;quot; contract=&amp;quot;IMetadataExchange&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;net.pipe://localhost/StripClubSqlServerService&amp;quot; binding=&amp;quot;netNamedPipeBinding&amp;quot; bindingConfiguration=&amp;quot;&amp;quot; name=&amp;quot;DataServicePipe&amp;quot; contract=&amp;quot;Cuckooz.Sample.WCFStripClub.IStripper&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;baseAddresses&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add baseAddress=&lt;/font&gt;&lt;a href="http://localhost:8731/blahblah/CuckoozGenericDal/SqlServerDalService/"&gt;&lt;font face="Courier New" size="2"&gt;http://localhost:8731/blahblah/CuckoozGenericDal/SqlServerDalService/&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/baseAddresses&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/host&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/service&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/services&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;behaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name=&amp;quot;Cuckooz.Sample.WCFStripClub.StripClubSqlServerServiceBehavior&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/behaviors&amp;gt;&lt;br /&gt;&amp;lt;/system.serviceModel&amp;gt;&lt;/font&gt; &lt;p&gt;--------------------------------------------------------------- &lt;p&gt;In this case, I switched something I was doing in the real world to make it a little more entertaining (and thereby not divulging specifics of a client project).&amp;nbsp; The real application is a little more complex and includes some other services which are employed as well by each layer - for instance, a crypto service and one to serve up images and documents.&amp;nbsp; The Generic DAL service is one that we could probably easily do without, but the goal is that if the client wanted to change their DB to Oracle or something else, would could simply develop the service, deploy it, and add endpoints pointing to it.&amp;nbsp; In that case, we could change the whole mechanism without changing any code or causing any visible interruptions other than the initial switchover which would be miniscule.&amp;nbsp; By using an example where there are so many moving pieces, it really brings home home much flexibility you have using WCF and how easy it is to implement. Most applications one works on won&amp;#39;t have anywhere near the demands for scalability that are in place here (and there are a few other things that dictated this architecture which I don&amp;#39;t need to go into). The point is that if you only had one or two service tiers, it would be all that much easier.&amp;nbsp; Just configure each piece as either a client, a server or both. If you use a shared assembly to hold your client proxies and/or your interfaces (in most cases, I&amp;#39;ve found this to be beneficial b/c the size of these classes are typically pretty small, so you can get consistency without having to really worry about bloating the footprint by sharing the assembly over and over. And besides, you needed a contract anyway, so there&amp;#39;d only be bloat if you had additional items that you weren&amp;#39;t using. in this instance, I&amp;#39;m not introducing anything that I wouldn&amp;#39;t have needed anyway). &lt;p&gt;Oh yah, one other thing... I have a little pet peeve about string literals. They drive me nuts, especially in cases where they are used for session variables.&amp;nbsp; I&amp;#39;d highly recommend creating a constants class in your shared assemblies library.&amp;nbsp; For each Endpoint you plan on needing, create a string constant that you&amp;#39;ll use as the name of the endpoint. I started out calling it &amp;quot;... Pipe&amp;quot; but realized that was misleading b/c in many cases, I&amp;#39;d be using Tcp instead of Named pipes, so I just moved to something a little more generic.&amp;nbsp; The naming isn&amp;#39;t what really matters, it&amp;#39;s the consistency, but having clear and intuitive names doesn&amp;#39;t hurt ;-). So doing something old school like this (think back to session variables in ASP.NET): &lt;p&gt;&amp;nbsp; &lt;p&gt;public static class ConfigurationConstants&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String Localhost = &amp;quot;localhost&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String NamedPipeEndpointName = &amp;quot;MainPipe&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String ClientBusinessServiceEndpoint = &amp;quot;ClientBusinessPipe&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String ServerBusinessServiceEndpoint = &amp;quot;ServerBusinessPipe&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String ClientGenericDataServiceEndpoint = &amp;quot;ClientGenericDataPipe&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const string ServerGenericDataServiceEndpoint = &amp;quot;ServerGenericDataPipe&amp;quot;;&lt;br /&gt;} &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I&amp;#39;m trying to make this into a real demo app that&amp;#39;s documented and can be done in steps - basically trying to turn it into a full walk-through. So I&amp;#39;m documenting it as I go along. I&amp;#39;ve gotten it completed through here - but I&amp;#39;m going to add Security, support for &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Message_Queuing"&gt;MSMQ&lt;/a&gt; and a few others (just to show you don&amp;#39;t need to change the code you write in most cases) and use the Enterprise library for logging, security and data - if you want the code for this part up through here, just email me privately. I should have the whole thing done in a few weeks. So be advised, i can give you the code, but I don&amp;#39;t have much done in the way of explanations in the code - although I will shortly.&lt;/p&gt; &lt;p&gt;---------------------------&lt;/p&gt; &lt;p&gt;Also, if you&amp;#39;re interested in WCF, times are really good.&amp;nbsp; I&amp;#39;ve read every book except for Michelle&amp;#39;s (and that&amp;#39;s next on the list b/c I&amp;#39;m sure it&amp;#39;s going to be great) and I have to say, they are all good.&amp;nbsp; It&amp;#39;s really a case of &amp;quot;you can&amp;#39;t go wrong&amp;quot; whichever one you buy. I&amp;#39;d recommend all of the following - in no particular order:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/0596526997/ref=s9subs_c2_at1-2871_p?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-2&amp;amp;pf_rd_r=00H7FNAT0YHVENSGJE88&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=278240301&amp;amp;pf_rd_i=507846"&gt;Programming WCF - Juval Lowy&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Essential-Windows-Communication-Foundation-WCF/dp/0321440064/ref=pd_bbs_sr_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1210963529&amp;amp;sr=8-3"&gt;Essential Windows Communication Foundation (WCF): For .NET Framework 3.5&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Inside-Windows-Communication-Foundation-Developer/dp/0735623066/ref=pd_bbs_4?ie=UTF8&amp;amp;s=books&amp;amp;qid=1210963573&amp;amp;sr=8-4"&gt;Inside Windows Communication Foundation&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Pro-WCF-Practical-Microsoft-Implementation/dp/1590597028/ref=pd_bbs_sr_7?ie=UTF8&amp;amp;s=books&amp;amp;qid=1210963601&amp;amp;sr=8-7"&gt;Pro WCF - Practical Microsoft SOA Implementations&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Microsoft-Windows-Communication-Foundation-Developer/dp/0735623368/ref=pd_bbs_6?ie=UTF8&amp;amp;s=books&amp;amp;qid=1210963639&amp;amp;sr=8-6"&gt;Windows Communication Foundation Step by Step&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Professional-WCF-Programming-Development-Communication/dp/0470089849/ref=pd_bbs_sr_9?ie=UTF8&amp;amp;s=books&amp;amp;qid=1210963673&amp;amp;sr=8-9"&gt;Professional WCF Programming&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.amazon.com/Professional-WCF-Programming-Development-Communication/dp/0470089849/ref=pd_bbs_sr_9?ie=UTF8&amp;amp;s=books&amp;amp;qid=1210963673&amp;amp;sr=8-9"&gt;Windows Communication Foundation Unleashed&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1623469" width="1" height="1"&gt;</content><author><name>William</name><uri>http://msmvps.com/members/William/default.aspx</uri></author></entry></feed>