<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-31572207</id><updated>2011-04-21T11:32:31.375-07:00</updated><title type='text'>.NET Information Architecture and Web Development</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rhope.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-31572207.post-1746810319229026021</id><published>2009-03-31T16:13:00.001-07:00</published><updated>2009-03-31T17:04:11.928-07:00</updated><title type='text'>SLO .NET User Group is BizSpark's Local Network Partner, helping startup companies get access to Premium Microsoft Development tools</title><content type='html'>&lt;p&gt;What is BizSpark, you ask?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;BizSpark is an exciting new program from Microsoft that allows eligible startup companies access to the top of the line Microsoft development tools and platforms.   And the SLO .NET User Group is proud to be the local network partner, in charge of approving local startup companies for the program. &lt;/p&gt;&lt;p&gt;So if you're a startup company, and you meet the following criteria:&lt;/p&gt;&lt;p&gt;- Actively engaged in development of a software-based product or service that will form a core piece of its current or intended business, &lt;/p&gt;&lt;p&gt;- Privately held, &lt;p&gt;- In business for less than 3 years, &lt;p&gt;- Less than US $1 million in annual revenue, &lt;p&gt;- Headquarted in San Luis Obispo County or the Santa Maria area, and &lt;p&gt;- Willing to join and participate in the SLO .NET User Group &lt;p&gt;Feel free to contact the User Group at &lt;a href="mailto:info@slodotnet.org"&gt;info@slodotnet.org&lt;/a&gt; and get approved.   For more information you can check out &lt;a href="http://www.slodotnet.org/bizspark.aspx"&gt;http://www.slodotnet.org/bizspark.aspx&lt;/a&gt;. &lt;p&gt;&lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-1746810319229026021?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/1746810319229026021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/1746810319229026021'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2009/03/slo-net-user-group-is-bizspark-local.html' title='SLO .NET User Group is BizSpark&amp;#39;s Local Network Partner, helping startup companies get access to Premium Microsoft Development tools'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-2871264759214744448</id><published>2009-03-13T13:18:00.001-07:00</published><updated>2009-03-13T13:18:03.387-07:00</updated><title type='text'>Best of the PDC Comes to SLO</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Hello everyone!  &lt;p&gt;It's not every day that we can get speakers from outside the area to come and grace us with a visit. Every once and a while we get an INETA speaker to come to the .NET User Group meeting, and then we get a pretty good mix when the Central Coast Code Camp is in session.  &lt;p&gt;However, on March 12th, Developer Evangelists Daniel Egan and Bruno Terkaly of Microsoft came to San Luis Obispo to give a three-plus hour presentation on some of the new developments in the Microsoft world. The event, SLO MSDN Unleashed: Best of the PDC (Professional Developers Conference), was held at the Embassy Suites. Over 60 people attended, a great turnout for the event, and the presentations were great as well. I saw a lot of people I usually only see at Code Camp.  &lt;p&gt;Daniel started out by talking about some of the dynamic language features coming in C# 4.0. For those of you that don't know, C# is (in my opinion) the language of choice when developing applications on the Microsoft platform. He then followed up with some impressive enhancements in the Ajax world, including some sweet new extenders for the Ajax Control Toolkit. Personally I think the ToolKit has come a long way.  &lt;p&gt;&amp;nbsp;  &lt;p&gt;&lt;img src="http://www.sanluistech.com/images/degan.jpg"&gt;  &lt;p&gt;Daniel Egan talks about C# Dynamics.&amp;nbsp; (photo by Steve Evans)  &lt;p&gt;After a short break, Bruno took over to cover Windows Azure, the new Microsoft Cloud Computing system that rivals similar offerings from Google and Amazon. The discussion was thorough and at times contentious. I personally feel like there are a few too many assumptions in terms of data scalability, and it will be interesting to see how and what feature sets are provided on the new relational database platform. Until 2 days ago, Azure was only going to support simple table structures. Speaking as someone who has managed to scale up a fairly large data structure without sacrificing relational integrity, I have to hope that they will not shortchange the SQL Server featureset in the cloud.  &lt;p&gt;In addition, there was some talk about companies being able to host the Cloud locally on their local servers for a while to try it out, or program against, or even in theory to pull their applications back out of the Cloud should they need to for budgetary or proprietary reasons. I think this is very important myself.  &lt;p&gt;I would like to thank Daniel, Bruno, and .NET User Group member Steve Evans for putting this event on. We're hoping to try and do something like this maybe every 6 months or so as a public event that goes beyond the scope of the .NET User Group and involves everyone. This kind of thing is great for San Luis Obispo and the technology community.  &lt;p&gt;Thanks to all who attended!  &lt;p&gt;&amp;nbsp;  &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-2871264759214744448?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/2871264759214744448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/2871264759214744448'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2009/03/best-of-pdc-comes-to-slo_13.html' title='Best of the PDC Comes to SLO'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-8813492789483801485</id><published>2008-09-17T14:29:00.001-07:00</published><updated>2008-09-17T14:29:48.133-07:00</updated><title type='text'>Central Coast Code Camp Schedule Is Up, and don't forget about the Softec Symposium!</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;Hi everyone,&lt;/b&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;b&gt; &lt;p&gt;&lt;br&gt;The schedule has now been posted for Code Camp next Saturday and Sunday, September 27th and 28th. Be aware, it is subject to change prior to the event, but it's generally set to go. We have a great lineup this year, featuring 25% more content than last year. Thanks for all the speakers who stepped up! We've got everything from database technologies to agile methodologies to scalability to rich interactivity to legal advice to new exciting technologies, and much more! So please, if you haven't yet, register for this great event, and help us out by spreading the word and forwarding this to everyone you know who might be interested. Registrations help us get an accurate count of how many to expect.&lt;/p&gt; &lt;p&gt;&lt;br&gt;We're still looking for event sponsors, so if you or your company might be interested, please visit the website at &lt;a href="http://www.centralcoastcodecamp.com/Sponsor.aspx"&gt;http://www.centralcoastcodecamp.com/Sponsor.aspx&lt;/a&gt; and help us out! There are sponsorships of any level available, and every little bit helps. All donations go toward covering the great venues and events that occur at the camp.&lt;/p&gt; &lt;p&gt;&lt;br&gt;Don't forget our exciting special events! For starters, there's the Geek Dinner Saturday night at 6:30 pm at the Suites. This is a great way to meet your fellow campers and speakers and interact and network. It was a lot of fun last year and we're hoping for a great time this year. Also, this year we have our inaugural Programming Contest! At 3:45 pm on Saturday in the Los Osos South room, we'll be featuring a Java Programming Contest with prizes and the thrill of victory! More information can be found at &lt;a href="http://www.centralcoastcodecamp.com/Competition.aspx"&gt;http://www.centralcoastcodecamp.com/Competition.aspx&lt;/a&gt;. Finally, there's our end of Camp raffle, featuring a ton of books, software, and our Zune grand prize! You must be present to win!&lt;/p&gt; &lt;p&gt;&lt;br&gt;Lastly, we would like to make you aware of our sister event, the Softec Symposium. This exciting business technology event is occurring on Friday, September 26th, at the Embassy Suites. It will feature a keynote by Citrix (of GoToMeeting and GoToMyPc) and concentrate on Remote Technologies. More information can be found at &lt;a href="http://www.softec.org/"&gt;http://www.softec.org/&lt;/a&gt;. There will be the keynote, several panels, and a trade show. Please pass this information on to anyone who you think might be interested or to any companies who might be interested in getting a booth at the trade show. It's a great way to introduce yourselves to the local technology community business leaders.&lt;br&gt;&lt;/p&gt; &lt;p&gt;See you at Camp!&lt;/p&gt; &lt;p&gt;Rob and &lt;b&gt;The Central Coast Code Camp Team&lt;/b&gt;&lt;b&gt;&lt;br&gt;&lt;a href="http://www.centralcoastcodecamp.com"&gt;http://centralcoastcodecamp.com&lt;/a&gt;&lt;br&gt;&lt;a href="mailto:info@centralcoastcodecamp.com"&gt;info@centralcoastcodecamp.com&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-8813492789483801485?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/8813492789483801485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/8813492789483801485'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2008/09/central-coast-code-camp-schedule-is-up.html' title='Central Coast Code Camp Schedule Is Up, and don&amp;#39;t forget about the Softec Symposium!'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-6688145474119638642</id><published>2008-06-14T06:48:00.001-07:00</published><updated>2008-06-14T06:48:44.668-07:00</updated><title type='text'>Central Coast Code Camp Returns!</title><content type='html'>&lt;p&gt;Hey all,&lt;/p&gt; &lt;p&gt;I'm not sure how many of you attending our stunningly successful first code camp last year, but if you did, then you know we had 32 presentations by 20 presenters from as far away as Texas, that we had a fabulous "Geek" dinner, that we gave away prizes and swag, including two Zunes, that we had over 120 people show up from as far away as Ventura and Bakersfield, and that it was all FREE to everyone who attended!&amp;nbsp;&amp;nbsp; A fantastic time was had by all!&lt;/p&gt; &lt;p&gt;So fantastic, in fact, that we are going for v2.0 this September, on the 27th and 28th, the Central Coast Code Camp Returns to the Embassy Suites in San Luis Obispo!&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.centralcoastcodecamp.com"&gt;http://www.centralcoastcodecamp.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We've already got 28 registrants signed up and are looking for presenters and topics.&amp;nbsp; There are so, so many new technologies out there this year that are coming to the forefront and we want them all properly represented.&amp;nbsp;&amp;nbsp; So sign up to speak, but just as importantly, sign up to attend!&lt;/p&gt; &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-6688145474119638642?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/6688145474119638642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/6688145474119638642'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2008/06/central-coast-code-camp-returns.html' title='Central Coast Code Camp Returns!'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-4029690157869683690</id><published>2008-04-04T12:06:00.001-07:00</published><updated>2008-04-04T12:06:12.670-07:00</updated><title type='text'>User Groups Attract Visitors...and how technology saved my shoulder...</title><content type='html'>&lt;p&gt;So in past blogs I've mentioned the possibilities of creating your own special interest groups, or user groups.&amp;nbsp; I've done so with the San Luis Obispo .NET User Group.&amp;nbsp;&amp;nbsp;&amp;nbsp; One of the byproducts of that is an ability to use your group's contacts for a chance to do some good for the community.&amp;nbsp;&amp;nbsp; I had this opportunity recently when the Code Trip, Microsoft's bus trip featuring its new technologies, tried to come to town.&amp;nbsp; When a visit to CalPoly fell through due to scheduling issues, Woody Pewitt from Microsoft contacted me seeking help with a place to park the bus.&amp;nbsp;&amp;nbsp; I put him in touch with Randy Scovial and Cuesta College, and the Code Trip stopped in for a successful visit this past Monday, with two sessions for students and a general session that night that attracted over 40 local technology professionals.&amp;nbsp; You can read more about the trip, including its visit to SLO, at its website.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.thecodetrip.com"&gt;The Code Trip&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.slodotnet.org/images/cuesta-code-trip.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="202" src="http://www.slodotnet.org/images/cuesta-code-trip.jpg" width="492" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.slodotnet.org/images/Code-Trip-Logo.gif" atomicselection="true"&gt;&lt;img height="200" src="http://www.slodotnet.org/images/Code-Trip-Logo.gif" width="238"&gt;&lt;/a&gt; &amp;nbsp;&lt;a href="http://www.slodotnet.org/images/the-bus-from-moscone.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="200" src="http://www.slodotnet.org/images/the-bus-from-moscone.jpg" width="194" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The picture of the bus is from outside the Moscone Center in San Francisco, where I went this week for VSLive, a technology conference.&amp;nbsp;&amp;nbsp; I caught up with the Code Trippers there, and they interviewed me along with a bunch of other technology people, asking if they knew about the Code Trip.&lt;/p&gt; &lt;p&gt;They also asked me about my ultra mobile PC, my new toy that I got for just this reason.&amp;nbsp; I spend a bit of time at conferences, and I am sick to death of carrying around the 40 lb deadweight that is my Laptop and its accompanying bag.&amp;nbsp; So I picked up one of these:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.slodotnet.org/images/cdw-umpc.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" src="http://www.slodotnet.org/images/cdw-umpc.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;An Ultra Mobile PC.&amp;nbsp;&amp;nbsp; It is hand held, has a 7" screen, runs Windows XP Tablet, and has built in wireless capabilities.&amp;nbsp;&amp;nbsp; And most importantly, it weights only a couple of lbs.&amp;nbsp; It was heaven!&amp;nbsp;&amp;nbsp; I picked up some accessories so that when I had table space I could set it up almost like a regular PC:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.slodotnet.org/images/umpc.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" src="http://www.slodotnet.org/images/umpc.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;including a folding keyboard like you would use for a PDA.&amp;nbsp;&amp;nbsp; But it works perfectly fine on its own, with a stylus for its touchpad and a fairly easy to use thumb keyboard split on either side of the unit.&amp;nbsp;&amp;nbsp; I got a lot of inquiries about this neat little toy.&amp;nbsp; I even held a meeting in my car, over the phone, using this on my Verizon Broadband connection!&lt;/p&gt; &lt;p&gt;If you do a lot of traveling this is the toy for you.&lt;/p&gt; &lt;p&gt;Robert Hope, founder&lt;/p&gt; &lt;p&gt;San Luis Obispo .NET User Group&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-4029690157869683690?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/4029690157869683690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/4029690157869683690'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2008/04/user-groups-attract-visitorsand-how.html' title='User Groups Attract Visitors...and how technology saved my shoulder...'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-7382491900280477434</id><published>2008-03-21T11:31:00.001-07:00</published><updated>2008-03-21T11:31:47.246-07:00</updated><title type='text'>Past and Present Events</title><content type='html'>&lt;p&gt;So as my involvement in the community has grown I get to attend some pretty cool events.&amp;nbsp;&amp;nbsp; The latest was the EVC Venture Capital Event this past Tuesday, March 19th, at the Madonna Expo Center.&amp;nbsp; I've got this neat idea that I don't want to put out there in public too too much, but if you know my background you wouldn't be surprised to find that it is a new web site idea.&amp;nbsp;&amp;nbsp;&amp;nbsp; But it's only an idea, so I went with my little placard of mockups, some business cards, and a fact sheet, and crossed my fingers that some angel investor might write me a check.&lt;/p&gt; &lt;p&gt;That went ok.&amp;nbsp; What was interesting, however, was the level of technology that is being developed here on the Central Coast.&amp;nbsp;&amp;nbsp; Aeromech, who will be presenting at the next Softec meeting, builds Unmanned Aerial Vehicles (UAV) for both commercial and military applications.&amp;nbsp;&amp;nbsp;&amp;nbsp; They were in the booth on my left.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Phoenix is looking to upgrade the Kit airplane to a "sexy" two seater plane that actually kneels so you can get in like a car.&amp;nbsp;&amp;nbsp;&amp;nbsp; They were in the booth on my right.&amp;nbsp;&amp;nbsp;&amp;nbsp; Fleet Management Solutions, who does asset tracking via GPS, a company that is building the next electric car, and New Image Technologies' Elements, a custom networking website platform, and another company doing specialized wireless video,&amp;nbsp;were all there.&amp;nbsp;&amp;nbsp; And while I was personally outclassed, I was also amazed and proud to be part of the tech industry here in SLO County and beyond.&amp;nbsp;&amp;nbsp; There's a lot of great stuff going on around here if you know where to look.&amp;nbsp;&amp;nbsp; Hopefully you will all come to the Softec meeting and see Aeromech in person.&amp;nbsp;&amp;nbsp; It's well worth the visit.&lt;/p&gt; &lt;p&gt;In addition, Microsoft's CodeTrip will be coming to Cuesta College on March 31st.&amp;nbsp;&amp;nbsp; CodeTrip is basically a bunch of code geeks on a bus, touring the West Coast in support of some new, really cool Microsoft technologies.&amp;nbsp;&amp;nbsp; Through my contacts via the San Luis Obispo .NET User Group, we were able to get them to visit us here in SLO on their way from LA to SF, where they will be stopping by VSLive the first week of April.&lt;/p&gt; &lt;p&gt;&lt;a title="Code Trip at Cuesta" href="http://thecodetrip.com/1/cuesta-college"&gt;Code Trip at Cuesta&lt;/a&gt;&lt;/p&gt; &lt;p&gt;They will be giving presentations to student classes and then holding a general session at 6 pm at the school.&amp;nbsp;&amp;nbsp; Another great opportunity to expose yourself to the great technologies available to you.&lt;/p&gt; &lt;p&gt;Hope to see you there,&lt;/p&gt; &lt;p&gt;&lt;br&gt;Robert Hope&lt;/p&gt; &lt;p&gt;Founder, San Luis Obispo .NET User Group&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-7382491900280477434?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/7382491900280477434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/7382491900280477434'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2008/03/past-and-present-events.html' title='Past and Present Events'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-716150488816526949</id><published>2008-02-29T11:00:00.001-08:00</published><updated>2008-02-29T11:00:41.896-08:00</updated><title type='text'>Tom Brokaw at the Microsoft 2008 Launch Event Celebrates Technology Heroes</title><content type='html'>&lt;p&gt;It's not often that you hear people who are involved in technology referred to as "heroes".&amp;nbsp;&amp;nbsp; Most of us are just techno-geeks trying to do the best we can.&amp;nbsp;&amp;nbsp;&amp;nbsp;And while I don't necessarily drink the kool-aid as far as those of us who are using the newer Microsoft technologies&amp;nbsp;being called&amp;nbsp;heroes, I have to say I was struck by Tom Brokaw's opinion of what technology has meant to our world and our society.&lt;/p&gt; &lt;p&gt;I went to Microsoft's Los Angeles Launch Event 2008 this past week in celebration of the release of their three new products, Windows Server 2008, Sql Server 2008, and Visual Studio 2008.&amp;nbsp;&amp;nbsp; Lots of great advances, lots of awesome stuff, and their theme was "Heroes Happen Here".&amp;nbsp;&amp;nbsp; By that, they mean that the people who are using these new technologies are the heroes of technology.&lt;/p&gt; &lt;p&gt;But Tom's keynote speech (I was actually surprised when he came out on the stage at the Nokia Theater) revolved around what technology has meant to people in other parts of the world.&amp;nbsp;&amp;nbsp; He admitted to not being very computer savvy...and admitted he would probably never write a line of code with Visual Studio, or manage a Hyper-V Virtual Server Farm...but he did recall the importance of technology in making our world smaller, and hopefully better.&amp;nbsp;&amp;nbsp; He talked about the people who went to Pakistan to help during their last devastating earthquake, and how that when they came down from hiking into the deep mountains they were able to put fingers to keyboard and let the world know what had happened.&amp;nbsp;&amp;nbsp; He talked about how technology was helping to improve farming, and irrigation, and what that meant to the lives of people living in Africa.&amp;nbsp; He talked about surgeries being led remotely by doctors via videoconferencing.&amp;nbsp; I can't recall all the stories he told, but they all held essentially the same meaning:&amp;nbsp; that the people, the programmers, the administrators, all of us who help make technology what it is, and make it available to the true heroes of the world, we all have a stake and a helping hand in that heroism, and he wanted to thank us.&lt;/p&gt; &lt;p&gt;Steve Ballmer, Microsoft's CEO,&amp;nbsp;gave the rest of the keynote address as the event moved from true heroism into our own personal versions of "code heroes"...but what Tom Brokaw said does ring true.&amp;nbsp;&amp;nbsp; Technology helps in ways that sometimes we never know about, and our role in that is crucial, and we shouldn't take for granted what we do with it.&amp;nbsp;&amp;nbsp; We're all heroes.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-716150488816526949?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/716150488816526949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/716150488816526949'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2008/02/tom-brokaw-at-microsoft-2008-launch.html' title='Tom Brokaw at the Microsoft 2008 Launch Event Celebrates Technology Heroes'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-7736273445080884702</id><published>2008-02-13T16:29:00.001-08:00</published><updated>2008-02-13T16:29:25.494-08:00</updated><title type='text'>So you are looking to connect with people like you...</title><content type='html'>&lt;p&gt;Maybe the best way is to start your own group.&amp;nbsp;&amp;nbsp;&amp;nbsp; And no, I don't mean therapy group!&lt;/p&gt; &lt;p&gt;When I relocated to the Central Coast, I wanted to see how many .NET developers there were here because that was my specialty and something I was interested in.&amp;nbsp;&amp;nbsp; In Los Angeles where I had lived before, it was not uncommon to find several "User Groups"...groups of people who shared a common interest that got together once a month to talk about what they are interested in.&amp;nbsp;&amp;nbsp; So I started hunting around for a User Group here.&lt;/p&gt; &lt;p&gt;I couldn't find one, although certainly there is SLOCAMA, and SLOBytes, there was no .NET or even a general "programming" User Group.&amp;nbsp;&amp;nbsp; So I started asking around, and it was hard for me to explain to people what exactly it was I was trying to accomplish.&lt;/p&gt; &lt;p&gt;So I started my own.&amp;nbsp;&amp;nbsp; In November of 2006, I founded the San Luis Obispo .NET User Group.&amp;nbsp; Now we are 40+ members strong and meet once a month.&amp;nbsp;&amp;nbsp; A typical meeting will generally consist of pizza or pasta or panda express, a 90 minute to 2 hour presentation by a member or an outside speaker on a topic we are interested in, and then everyone hangs around to chat.&amp;nbsp;&amp;nbsp; It's a great way for all of us to expand our knowledge and share our ideas.&lt;/p&gt; &lt;p&gt;And the reality is, it wasn't that hard to get it started.&amp;nbsp; You basically need two things:&amp;nbsp; a conference room, and a projector.&amp;nbsp;&amp;nbsp; In most cases, you can find conference rooms at banks, accounting firms, there are many local places that you can get one.&amp;nbsp;&amp;nbsp; In fact, the San Luis Business Center will rent one to you, and KCBX.NET will rent you one with a projector!&amp;nbsp;&amp;nbsp; Granted, you might spend $80 a meeting, but the benefits far outweigh the cost.&amp;nbsp;&amp;nbsp; If you're lucky like we are, you have someone in the group with access to a room and then you don't have that cost either.&lt;/p&gt; &lt;p&gt;Then you need a vision, a purpose.&amp;nbsp; In our meetings, it's .NET programming.&amp;nbsp;&amp;nbsp; Yours might be databases, or design, or even electrical engineering.&amp;nbsp; The topic and vision don't matter as long as you have one.&amp;nbsp; And if you have one, I guarantee that there are others out there who share it.&lt;/p&gt; &lt;p&gt;Finally, you need speakers.&amp;nbsp; Our group has only had two or three people from outside come in and speak.&amp;nbsp; For the most part, our own members have been willing to step up and investigate something and come back with their findings.&amp;nbsp;&amp;nbsp; None of us are professional speakers, and it's very laid back and low key and about the sharing of ideas.&lt;/p&gt; &lt;p&gt;I placed a single comment in the Tribune with the weekly Central Coast Technology article written by Dan Logan and set up my first meeting.&amp;nbsp;&amp;nbsp; Fourteen people attended, and we've just grown from there.&amp;nbsp; Dan continues to be supportive, and groups like Softec have stepped up to offer their support as well in the interest of "Community Education".&lt;/p&gt; &lt;p&gt;It's really that easy to start a group.&amp;nbsp;&amp;nbsp; Get a room, a topic, a projector if you need it, a speaker (even if it's you), some food, and set up shop.&amp;nbsp; Even if only two people show up the first time, word will spread and your group will grow.&lt;/p&gt; &lt;p&gt;It's definitely worth your time and effort.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Robert Hope, Founder&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.slodotnet.org"&gt;San Luis Obispo .NET User Group&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-7736273445080884702?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/7736273445080884702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/7736273445080884702'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2008/02/so-you-are-looking-to-connect-with.html' title='So you are looking to connect with people like you...'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-5435158933610193864</id><published>2007-05-27T08:58:00.001-07:00</published><updated>2007-05-27T08:58:47.421-07:00</updated><title type='text'>Central Coast Code Camp is a Reality!</title><content type='html'>&lt;p&gt;Hi all,&lt;/p&gt; &lt;p&gt;We've confirmed our location for the Central Coast Code Camp (&lt;a href="http://www.centralcoastcodecamp.com"&gt;http://www.centralcoastcodecamp.com&lt;/a&gt;) and the date as well!&amp;nbsp; We had to move the date because of some facility issues, but the date is now 9-22-07 and 9-23-07 at the Embassy Suites in San Luis Obispo, CA.&lt;/p&gt; &lt;p&gt;Also, the old site at bostondotnet that used to list all the code camps is gone, so I've thrown one up that hopefully people will start using at the Code Camp List (&lt;a href="http://www.codecamplist.com"&gt;http://www.codecamplist.com&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Please register for our code camp and come give a talk!&lt;/p&gt; &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-5435158933610193864?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/5435158933610193864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/5435158933610193864'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/05/central-coast-code-camp-is-reality.html' title='Central Coast Code Camp is a Reality!'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-7368667548927403106</id><published>2007-05-09T16:15:00.001-07:00</published><updated>2007-05-09T16:15:57.544-07:00</updated><title type='text'>Making Your LinkButton look (and work) like an ImageButton</title><content type='html'>&lt;p&gt;Hey there,&lt;/p&gt; &lt;p&gt;I don't know if you've noticed, but style sheets tend to handle an &amp;lt;input type=image/&amp;gt; a lot differently than an &amp;lt;img/&amp;gt; tag.&amp;nbsp;&amp;nbsp; And that becomes a problem in .NET&amp;nbsp;if you've built a webform that depends on a link to be an image.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;The LinkButton control doesn't support an ImageUrl.&amp;nbsp;&amp;nbsp; It renders like you'd expect, with an &amp;lt;a/&amp;gt; tag surrounding some text, and the Href on that &amp;lt;a/&amp;gt; tag pointed at a __doPostBack function of some type.&amp;nbsp; But there's no way to tell it to use an image as the text, without setting the text manually through the designer or maybe with some code.&amp;nbsp; &lt;/p&gt; &lt;p&gt;On the other hand, the ImageButton control only supports images.&amp;nbsp;&amp;nbsp; It renders differently as well, using an &amp;lt;input type=image/&amp;gt; tag as opposed to an &amp;lt;a/&amp;gt; tag.&amp;nbsp; If you've styled expecting that &amp;lt;input/&amp;gt; to be an &amp;lt;a/&amp;gt;, you could be in for some time-wasting CSS fun.&lt;/p&gt; &lt;p&gt;In addition, you can't just easily switch between the two on the page if you want to go from an ImageButton to a LinkButton, because the attributes aren't consistent regarding the use of images.&lt;/p&gt; &lt;p&gt;My solution to this was to create my own extended LinKButton that supports an ImageUrl.&amp;nbsp;&amp;nbsp; Here's how I did it.&lt;/p&gt; &lt;p&gt;First, I added an ImageUrl property to my derived LinkButton:&amp;nbsp;&lt;/p&gt; &lt;p&gt;public class MyImageButton : LinkButton&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;private string _imageUrl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultValue("")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[UrlProperty]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Bindable(true)] &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string ImageUrl&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;&amp;nbsp;get { return _imageUrl; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _imageUrl = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;Notice a couple of things:&amp;nbsp; I set the editor and the designer attributes such that my ImageUrl will behave in the Studio the same way that the ImageUrl on an ImageButton would work.&amp;nbsp; This helps to make switching back and forth easier (although with this in place I'd never use an ImageButton again; for me there's simply no need).&lt;/p&gt; &lt;p&gt;Once I have that, I am going to override OnPreRender:&amp;nbsp;&lt;/p&gt; &lt;p&gt;public class MyImageButton : LinkButton&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;private string _imageUrl;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Editor("System.Web.UI.Design.ImageUrlEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultValue("")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[UrlProperty]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Bindable(true)] &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string ImageUrl&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;&amp;nbsp;get { return _imageUrl; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _imageUrl = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt; &lt;p&gt;protected override void OnPreRender(EventArgs e)&lt;br&gt;{&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!string.IsNullOrEmpty(this.ImageUrl))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (this.ImageUrl.Trim().Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string cssClass = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!string.IsNullOrEmpty(CssClass))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cssClass = " class=\"" + CssClass + "\""&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Text = "&amp;lt;img src=\"" + this.ImageUrl + "\" " + cssClass + "/&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.ImageUrl = string.Empty;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnPreRender(e);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;In this step, if I have an ImageUrl, I am using code to set the Text property of my LinkButton, and then erasing the ImageUrl so that it will render with an &amp;lt;img/&amp;gt; tag in the text of the &amp;lt;a/&amp;gt;.&amp;nbsp;&amp;nbsp; I'm also taking care to apply the CssClass appropriately to the &amp;lt;img/&amp;gt; tag so that styles will work as expected, the way they would on an ImageButton (assuming the ImageButton was able to output an &amp;lt;img/&amp;gt; instead of an &amp;lt;input/&amp;gt;).&amp;nbsp;&amp;nbsp; With a little more care I could even bring over things like AlternateText if I chose.&lt;/p&gt; &lt;p&gt;With this in place, now I can style consistently between my Text-based and my Image-based buttons without having to worry about inconsistencies in the rendering of the control.&lt;/p&gt; &lt;p&gt;Have fun,&lt;/p&gt; &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-7368667548927403106?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/7368667548927403106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/7368667548927403106'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/05/making-your-linkbutton-look-and-work.html' title='Making Your LinkButton look (and work) like an ImageButton'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-6081661073191988980</id><published>2007-05-03T16:37:00.001-07:00</published><updated>2007-05-03T16:37:44.131-07:00</updated><title type='text'>A generic cloning method</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Hey all,  &lt;p&gt;As you know I'm big on Reflection, and big on Generics...now, here's a method that combines the two for a neat little cloning tool.  &lt;p&gt;Let's assume we have a base object we use for objects, and let's call it DataObject.&amp;nbsp; Anything can derive from this object, and in addition, I'm going to add the following method to allow me to "clone" the properties of my current object onto the properties of any other object, provided the Name and Type of the property match.  &lt;p&gt;Notice that I am using the generic &lt;em&gt;t&lt;/em&gt; notation for a generic object, and this becomes a generic method.  &lt;p&gt;&lt;font color="#0000a0"&gt;public class DataObject &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;{ &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;public t Clone&amp;lt;t&amp;gt;()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //reflection based clone&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type tType = typeof(t); &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t item = (t) Activator.CreateInstance(tType); &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PropertyInfo[] props = tType.GetProperties(); &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (PropertyInfo prop in props)&lt;br&gt;&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; try&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prop.SetValue(item, prop.GetValue(this, null), null);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch { }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;nbsp; &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return item;&lt;br&gt;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;}&lt;/font&gt;  &lt;p&gt;&amp;nbsp;  &lt;p&gt;Ok, now that that's done, let's create two more classes, a Dog, and a Cat.  &lt;p&gt;&amp;nbsp;  &lt;p&gt;&lt;font color="#0000a0"&gt;public class Cat : DataObject &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;{ &lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;private string _name; &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;public string Name &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;{ &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _name;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _name&amp;nbsp;= value;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;private string _color; &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;public string Color &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;{ &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _color;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _color= value;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;public class Dog : DataObject &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;{ &lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;private string _name; &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;public string Name &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;{ &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _name;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _name&amp;nbsp;= value;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;private string _color; &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;public string Color &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;{ &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _color;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _color= value;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;} &lt;/font&gt; &lt;p&gt;&amp;nbsp;  &lt;p&gt;Ok, let's create a Cat.  &lt;p&gt;&lt;font color="#0000a0"&gt;Cat cat = new Cat(); &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;cat.Name = "Fluffy"; &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;cat.Color = "Orange"; &lt;/font&gt; &lt;p&gt;Now that we have that, we can create a Dog from the Cat:  &lt;p&gt;&lt;font color="#0000a0"&gt;Dog dog = cat.Clone&amp;lt;Dog&amp;gt;();&lt;/font&gt;  &lt;p&gt;Once this method is called, the dog will have the exact same properties as the cat...this is useful in particular if you are adjusting properties on objects that are similar enough while in a loop (for example, you are looping on creating email objects that you are placing in a list) and you find yourself in a position where just overriding the properties on the current object won't work.  &lt;p&gt;Happy cloning!  &lt;p&gt;&amp;nbsp;  &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-6081661073191988980?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/6081661073191988980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/6081661073191988980'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/05/generic-cloning-method.html' title='A generic cloning method'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-393625887888359022</id><published>2007-04-29T23:20:00.001-07:00</published><updated>2007-04-29T23:20:07.111-07:00</updated><title type='text'>Jekyll and Hyde Code Camp Experience</title><content type='html'>&lt;p&gt;So I went to the Deer In The Headlights Code Camp in Waltham, Mass at the end of March.&amp;nbsp; I'm originally from New England so I thought I would take a long weekend, see my parents and a few friends, then give a talk or two at the Code Camp, stop in to see my twin neice and nephew, and then head home.&amp;nbsp; Coming out of this I've decided something for sure at Code Camps in the future:&amp;nbsp; I am never again giving more than one talk at a a code camp.&lt;/p&gt; &lt;p&gt;For starters, the car I rented decided to blow a tire just after all the businesses closed on Saturday afternoon.&amp;nbsp; Now, I'm scheduled to give two talks in succession the next morning at 9 am, two hours away.&amp;nbsp; I considered driving down to Waltham on the spare donut, but I've done that in the past with disastrous results.&amp;nbsp; Which leads me to being up all night worrying and finally deciding to borrow my dad's Impala, drive the two hours to Waltham, give my two talks, drive the two hours back to my parents, get the tire repaired, the drive the two hours &lt;em&gt;back &lt;/em&gt;to Boston to spend the night with my sister and the twins before flying home to California the next day.&lt;/p&gt; &lt;p&gt;In addition, I hadn't given either talk in months and I realized looking at the schedule that while my talks were built around 60 minutes speaking and 15 minutes questions, the schedule indicated I would need to speak for closer to 90 minutes...and now with a flat tire I had little time to prepare and adjust.&lt;/p&gt; &lt;p&gt;In any event, the first talk I gave was on Generics and I decided to scrap my entire powerpoint and just do code samples, and it went fantastic.&amp;nbsp; Even though I was on 4 hours' sleep it had to be the best talk I ever gave.&amp;nbsp; People afterward were even coming up and telling me it was the best review of Generics they had ever seen.&amp;nbsp; I was very satisfied.&lt;/p&gt; &lt;p&gt;And then I followed it up with the worst talk I had ever given.&amp;nbsp; My talk on Reflection is very dry and hard to do code samples because you either get it or you don't.&amp;nbsp; You either understand the situations where you would use Reflection or you don't.&amp;nbsp; Reflection can be a very powerful tool if you can recognize it.&amp;nbsp; In the past I've had audiences who had enough people in the crowd who understand that enough dialogue was generated to demonstrate effectively.&amp;nbsp; However, I felt that I was not communicating well enough this time to draw out the group, and I had not had the time I had put into my Generics talk because of my tire issues.&amp;nbsp; I felt like no one really got anything out of the talk, and because of the lack of dialogue, the talk ran well short.&amp;nbsp; Basically a disaster and I owe everyone who saw that talk an apology.&lt;/p&gt; &lt;p&gt;So the moral of the story is, don't do more than one talk unless you know they are both crisp and ready to go!&lt;/p&gt; &lt;p&gt;I've attached links to the Generics code samples and the Reflection demo.&amp;nbsp; Someone asked me to port the Generics code over to VB.NET but 80% of my demo was based around leverage anonymous methods and VB.NET doesn't support them, so it didn't make much sense to do the porting.&lt;/p&gt; &lt;p&gt;Also, sorry about the delay in getting these to you...it's been a hectic month.&amp;nbsp; My wife is due in 8 weeks and my company is about to put its first major project into QA and I've just been swamped, but in a good way :)&lt;/p&gt; &lt;p&gt;Thanks for your patience!&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.sanluistech.com/samples/genericsintheheadlights.zip"&gt;Generics Code Sample&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.sanluistech.com/samples/reflectiondemo.zip"&gt;ReflectionDemo&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-393625887888359022?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/393625887888359022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/393625887888359022'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/04/jekyll-and-hyde-code-camp-experience.html' title='Jekyll and Hyde Code Camp Experience'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-4845180502481378635</id><published>2007-04-26T12:21:00.001-07:00</published><updated>2007-04-26T12:21:16.564-07:00</updated><title type='text'>Back to the Blog</title><content type='html'>&lt;p&gt;Ok, so I know I've neglected this thing for a while now...and I'm due to post several things here from past code camp talks (one of which went extremely well, the other of which was a completely and utter disaster), but the business has completely taken off the last few months and I haven't had time to devote to this...however, last night at the Softec meeting (&lt;a href="http://www.softec.org"&gt;www.softec.org&lt;/a&gt;) Roberto Monge did a presentation on Web 2.0 that was very intriguing and got me motivated to try and get back to posting things here.&lt;/p&gt; &lt;p&gt;This video on YouTube sums up the presentation Roberto gave very well:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.youtube.com/watch?v=6gmP4nk0EOE" href="http://www.youtube.com/watch?v=6gmP4nk0EOE"&gt;http://www.youtube.com/watch?v=6gmP4nk0EOE&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Roberto highlighted a lot of what Web 2.0 is really about:&amp;nbsp; the ability to collaborate on content, to teach and alter how the web works through tagging and ratings of content and so forth, and how Web 2.0 is not really anything more than a living platform for web content...the presentation was great in that it was the first one in a while where the group hung around to talk after the fact thanks to all the good questions and the timeliness of the topic.&lt;/p&gt; &lt;p&gt;So now, I'm motivated :)&amp;nbsp; Let's see how long it lasts!&lt;/p&gt; &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-4845180502481378635?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/4845180502481378635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/4845180502481378635'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/04/back-to-blog.html' title='Back to the Blog'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-4742925479996754431</id><published>2007-02-28T20:51:00.001-08:00</published><updated>2007-03-01T10:24:50.569-08:00</updated><title type='text'>Central Coast Code Camp</title><content type='html'>&lt;p&gt;Ok so the site is ugly so far since I don't have time to get a graphic designer to help out...but I've got this grand vision of bringing the code camp concept to the California Central Coast so that we don't have to drive forever to go to conferences or catch up on new technology or pay bunches of bucks...with that in mind:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.centralcoastcodecamp.com"&gt;http://www.centralcoastcodecamp.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I've started preliminary work on finding a facility, and you can see from the Manifesto that there will be a lot of legwork to get enough volunteers and support from local companies to make this happen.  But you've got to start somewhere and one thing I learned when I started the San Luis Obispo .NET User Group was sometimes you have to draw your line in the sand and just have a meeting to get things started.&lt;/p&gt;&lt;p&gt;This is going to be open to technologies of all types so this will be a good way for me to reach out to my development brethren amongst the heavy Java/PHP developers in the area and try to get us all together.&lt;/p&gt;&lt;p&gt;It's either going to be great fun or a great disaster!   But either way it's going to be great.&lt;/p&gt;&lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-4742925479996754431?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/4742925479996754431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/4742925479996754431'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/02/central-coast-code-camp.html' title='Central Coast Code Camp'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-7953254333247437691</id><published>2007-02-21T09:25:00.001-08:00</published><updated>2007-02-21T09:25:10.607-08:00</updated><title type='text'>Sorting Generic Lists</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;One of the things I like best about the use of Generics is the ability to define your own sorting functionality and apply it to a List. Much in the same way you can predefine your own Find mechanism using predicates, you can establish a way to sort your list of Generics when they don't contain native datatypes such as int or string.  &lt;p&gt;In this example we'll take a look at how to sort a Generic list using the IComparer interface.  &lt;p&gt;First of all, let's establish a class of type Dog, and give it three properties. The first property we'll call Species, and the next property we'll call Age. The final property we'll call Name.  &lt;p&gt;&lt;font color="#0000ff"&gt;public class Dog&lt;br&gt;{&lt;br&gt;private int _age;&lt;br&gt;private string _species;&lt;br&gt;private string _name; &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;public string Name&lt;br&gt;{&lt;br&gt;get{ return _name; }&lt;br&gt;set{ _name = value; }&lt;br&gt;}&lt;br&gt;public int Age&lt;br&gt;{&lt;br&gt;get{ return _age; }&lt;br&gt;set{ _age = value; }&lt;br&gt;}&lt;br&gt;public string Species&lt;br&gt;{ &lt;br&gt;get{ return _species; }&lt;br&gt;set{ _species = value; }&lt;br&gt;}&lt;br&gt;} &lt;/font&gt; &lt;p&gt;Now that we have that we can create a list of four dogs like so:  &lt;p&gt;&lt;font color="#0000ff"&gt;Dog max = new Dog();&lt;br&gt;max.Age = 8;&lt;br&gt;max.Species = "Labrador"&lt;br&gt;max.Name = "Max" &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Dog spike = new Dog();&lt;br&gt;spike.Age = 3;&lt;br&gt;spike.Species = "Rottweiler"&lt;br&gt;spike.Name = "Spike" &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Dog princess = new Dog();&lt;br&gt;princess.Age = 5;&lt;br&gt;princess.Species = "Poodle"&lt;br&gt;princess.Name = "Princess" &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Dog wolfy = new Dog();&lt;br&gt;wolfy.Age = 10;&lt;br&gt;wolfy.Species = "Husky"&lt;br&gt;wolfy.Name = "Wolfy" &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;List&amp;lt;Dog&amp;gt; dogs = new List&amp;lt;Dog&amp;gt;(); &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;dogs.Add(max);&lt;br&gt;dogs.Add(spike);&lt;br&gt;dogs.Add(princess);&lt;br&gt;dogs.Add(wolfy); &lt;/font&gt; &lt;p&gt;Now I'd like to be able to sort a few different ways, and I can do this by providing an object that implements an IComparer interface of type Dog, like so:  &lt;p&gt;&lt;font color="#0000ff"&gt;public class DogAgeComparer : IComparer&amp;lt;Dog&amp;gt;&lt;br&gt;{ &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;} &lt;/font&gt; &lt;p&gt;Now that I have my class, let's implement the interface:  &lt;p&gt;&lt;font color="#0000ff"&gt;public class DogAgeComparer : IComparer&amp;lt;Dog&amp;gt;&lt;br&gt;{&lt;br&gt;#region IComparer&amp;lt;Dog&amp;gt; Members &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;public int Compare(Dog x, Dog y)&lt;br&gt;{&lt;br&gt;return x.Age.CompareTo(y.Age);&lt;br&gt;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;#endregion&lt;br&gt;} &lt;/font&gt; &lt;p&gt;Now that we have that, we can sort our list based on the dog's age:  &lt;p&gt;&lt;font color="#0000ff"&gt;dogs.Sort(new DogAgeComparer());&lt;/font&gt;  &lt;p&gt;This will sort the list in the appropriate order of age.  &lt;p&gt;Similarly, we can use a different object for Name and have that available as well.  &lt;p&gt;&lt;font color="#0000ff"&gt;public class DogNameComparer : IComparer&amp;lt;Dog&amp;gt;&lt;br&gt;{&lt;br&gt;#region IComparer&amp;lt;Dog&amp;gt; Members &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;public int Compare(Dog x, Dog y)&lt;br&gt;{&lt;br&gt;return x.Name.CompareTo(y.Name);&lt;br&gt;} &lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;#endregion&lt;br&gt;} &lt;/font&gt; &lt;p&gt;Now sort the list:  &lt;p&gt;&lt;font color="#0000ff"&gt;dogs.Sort(new DogNameComparer());&lt;/font&gt;  &lt;p&gt;And there you have it! Quick and easy sorting of your objects.  &lt;p&gt;Happy sorting!  &lt;p&gt;&amp;nbsp;  &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-7953254333247437691?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/7953254333247437691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/7953254333247437691'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/02/sorting-generic-lists.html' title='Sorting Generic Lists'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-2553553472501261408</id><published>2007-02-09T16:53:00.001-08:00</published><updated>2007-02-05T20:09:22.679-08:00</updated><title type='text'>Dynamically Controlling Windows Services Using SC.exe</title><content type='html'>&lt;p&gt;There are many instances where you would like to have remote control over Windows Services.&amp;nbsp; In fact, during deployments, you might want to even have the ability to remove and reinstall Windows Services on the fly, or even go so far as to install multiple copies of the same service under different names and/or configurations.&lt;/p&gt; &lt;p&gt;These requirements go beyond the ability of the native installation procedures that are included with Visual Studio or the framework (such as InstallUtil.exe).&amp;nbsp; However, with SC.exe, you can have complete control over Windows Services, and even install them with different names and so forth.&lt;/p&gt; &lt;p&gt;SC.exe comes with the Resource Kit and runs from the command line.&amp;nbsp; It takes a variety of arguments, including a command,&amp;nbsp;the service name, the path to the file, the display name, and the machine to execute against.&lt;/p&gt; &lt;p&gt;sc [Servername] Command Servicename [Optionname= Optionvalue...]&lt;/p&gt; &lt;p&gt;It's important to note that the space after the "=" in the Optionname key value pair DOES exist and is not a typo!&amp;nbsp; You'll see that in the examples below.&amp;nbsp; Most of us have a tendency (myself included) to look at that and assume there's no way that the space should be there, but it is.&lt;/p&gt; &lt;p&gt;The servername is optional;&amp;nbsp; if not provided this will run against the local machine.&lt;/p&gt; &lt;p&gt;There are many commands you can give, but the important ones are:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Start&lt;/b&gt;&lt;br&gt;Starts a service &lt;br&gt;&lt;b&gt;Stop&lt;/b&gt;&lt;br&gt;Sends a Stop request to a service.  &lt;p&gt;&lt;b&gt;Create&lt;/b&gt;&lt;br&gt;Creates a service (adds it to the registry). &lt;br&gt;&lt;b&gt;Delete&lt;/b&gt;&lt;br&gt;Deletes a service (from the registry). &lt;/p&gt; &lt;p&gt;It's important to note that the ServiceName here is the actual ServiceName, NOT the Display Name, which is generally what you use when issuing Net Start commands.&lt;/p&gt; &lt;p&gt;So, if we wanted to stop the BlogReaderService on BlogBox1 from BlogBox2, at the command line on BlogBox2 we would enter:&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;sc BlogBox1 Stop BlogReaderService&lt;/font&gt;&lt;/p&gt; &lt;p&gt;There are several options available as well for the executable.&amp;nbsp; Here are a few of the important ones.&lt;/p&gt; &lt;p&gt;&lt;b&gt;start=&lt;/b&gt;boot, system, auto, demand, disabled&lt;br&gt;Start type for the service. Option values include types used by drivers.&lt;br&gt;(default = demand) &lt;br&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;binPath=&lt;/b&gt;(string)&lt;br&gt;Path name to the service binary file. There is no default for this parameter. This string must be supplied. &lt;br&gt;&lt;/p&gt;&lt;b&gt;&lt;/b&gt; &lt;p&gt;&lt;b&gt;DisplayName=&lt;/b&gt;(string)&lt;br&gt;A string that can be used by user-interface programs to identify the service. &lt;/p&gt; &lt;p&gt;So let's assume that during deployment I want to stop, delete, create, and start my BlogReaderService.&amp;nbsp; My BlogReaderService.exe sits in my c:\temp folder.&amp;nbsp; I want the BlogReaderService to start automatically, and want its DisplayName to be MyBlogReaderService.&amp;nbsp; Assuming I am on BlogBox2 and I want this to occur on BlogBox1, the four commands would look like this:&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;sc BlogBox1 Stop BlogReaderService&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;sc BlogBox1&amp;nbsp;Delete BlogReaderService&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;sc BlogBox1 Create BlogReaderService start= auto binPath= c:\temp\blogreaderservice.exe DisplayName= MyBlogReaderSerivce&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;sc BlogBox1 Start BlogReaderService&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Note the spaces after the "=" in the command line...&lt;/p&gt; &lt;p&gt;Now that I have that, let's assume I have a second copy of blogreaderservice.exe sitting in c:\temp2 with it's own&amp;nbsp;blogreaderservice.exe.config pointed a different datasource.&amp;nbsp; Now&amp;nbsp;I want to install it, but I need a different service name and display name and start it because the service is already there from the exe in c:\temp.&amp;nbsp; That command line&amp;nbsp;would look like this.&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;sc BlogBox1 Create SecondBlogReaderService start= auto binPath= c:\temp2\blogreaderservice.exe DisplayName= MySecondBlogReaderSerivce&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;sc BlogBox1 Start SecondBlogReaderService&lt;/font&gt;&lt;/p&gt; &lt;p&gt;And there you are...two copies of the service installed under different names.&lt;/p&gt; &lt;p&gt;Have fun!&lt;/p&gt; &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-2553553472501261408?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/2553553472501261408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/2553553472501261408'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/02/dynamically-controlling-windows.html' title='Dynamically Controlling Windows Services Using SC.exe'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-5210406494249921820</id><published>2007-02-05T17:22:00.000-08:00</published><updated>2007-02-05T20:09:22.965-08:00</updated><title type='text'>Stack Reflections</title><content type='html'>If you haven't noticed by my choice of presentation topics, I'm a big fan of Reflection. I like the flexibility and scalability it allows me to build into my applications. There are also some neat little tricks you can use with it, in conjunction with the stack trace, to better track your errors and debugging statements.&lt;br /&gt;&lt;br /&gt;First of all, how would you like to be able to write a trace statement that shows your methods called without having to remember to code the method names? This can be accomplished by "walking the stack trace" during a method call and using the reflected method information from the stack to determine what method called your function. It works something like this:&lt;br /&gt;&lt;br /&gt;I'm going to write a method called TraceMethodStart with no parameters. This method will load up the stack trace, walk the stack frame back one level, and then write out to Trace the method name and module name of the method that called the TraceMethodStart function.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public void TraceMethodStart()&lt;br /&gt;{&lt;br /&gt;System.Diagnostics.StackTrace currentStack = new System.Diagnostics.StackTrace();&lt;br /&gt;string sMethod = "Unknown method";&lt;br /&gt;string sClass = "Unknown type";&lt;br /&gt;&lt;br /&gt;//make sure I have frames&lt;br /&gt;if (currentStack.FrameCount &gt; 0)&lt;br /&gt;{&lt;br /&gt;//get the method of the frame one up from me&lt;br /&gt;&lt;br /&gt;System.Reflection.MethodBase oBase = currentStack.GetFrame(1).GetMethod();&lt;br /&gt;sMethod = oBase.Name;&lt;br /&gt;sClass = oBase.DeclaringType.ToString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (System.Web.HttpContext.Current != null)&lt;br /&gt;System.Web.HttpContext.Current.Trace.Write("Starting: " + sClass + " " + sMethod);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Now in my GetRob() function I do this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;namespace Sltc&lt;br /&gt;{&lt;br /&gt;public class Rob&lt;br /&gt;{&lt;br /&gt;public void GetRob()&lt;br /&gt;{&lt;br /&gt;TraceMethodStart();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;And a "Starting: Sltc.Rob GetRob" will appear in our trace statements.&lt;br /&gt;&lt;br /&gt;Now that's useful. But it would be even more useful if we knew what was being passed to the function for parameters. Using the params keyword we can extend this function to accept a variable list of arguments so that we can call it from anywhere in our code and get passed any number of arguments. This will allow us to include the variables the function was given when it was called.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public void TraceMethodStart(params object[] oParms)&lt;br /&gt;{&lt;br /&gt;System.Diagnostics.StackTrace currentStack = new System.Diagnostics.StackTrace();&lt;br /&gt;string sMethod = "Unknown method";&lt;br /&gt;string sClass = "Unknown type";&lt;br /&gt;&lt;br /&gt;//make sure I have frames&lt;br /&gt;if (currentStack.FrameCount &gt; 0)&lt;br /&gt;{&lt;br /&gt;//get the method of the frame one up from me&lt;br /&gt;&lt;br /&gt;System.Reflection.MethodBase oBase = currentStack.GetFrame(1).GetMethod();&lt;br /&gt;sMethod = oBase.Name;&lt;br /&gt;sClass = oBase.DeclaringType.ToString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (System.Web.HttpContext.Current != null)&lt;br /&gt;System.Web.HttpContext.Current.Trace.Write("Starting: " + sClass + " " + sMethod);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;foreach(object obj in oParms)&lt;br /&gt;{&lt;br /&gt;if (System.Web.HttpContext.Current != null)&lt;br /&gt;System.Web.HttpContext.Current.Trace.Write("Parm: " + oParm.ToString());&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Now if you are in a method like so, you can do this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;function MyMethod(string s, int i)&lt;br /&gt;{&lt;br /&gt;TraceMethodStart(s, i);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Another handy thing you can do with this is to grab the cause for exceptions. A lot of times the stack trace is huge and it's difficult to track down or even remember to write code to track where your exceptions are occuring. However, if you were to create your own exception, you could use a similar code sequence to grab the cause of the trouble:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public class SLTCException : System.Exception&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;private string _sClass = "Unknown";&lt;br /&gt;private string _sMethod = "Unknown";&lt;br /&gt;&lt;br /&gt;public SLTCException() : base()&lt;br /&gt;{&lt;br /&gt;System.Diagnostics.StackTrace currentStack = new System.Diagnostics.StackTrace();&lt;br /&gt;if (currentStack.FrameCount &gt; 0)&lt;br /&gt;{&lt;br /&gt;System.Reflection.MethodBase oBase = currentStack.GetFrame(1).GetMethod();&lt;br /&gt;_sMethod = oBase.Name;&lt;br /&gt;_sClass = oBase.DeclaringType.ToString();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Happy stacking!&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-5210406494249921820?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/5210406494249921820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/5210406494249921820'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/02/stack-reflections.html' title='Stack Reflections'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-3073075220074852507</id><published>2007-02-01T23:43:00.000-08:00</published><updated>2007-02-01T23:46:38.498-08:00</updated><title type='text'>Rock n Roll Code Camp Presentations</title><content type='html'>Hey all,&lt;br /&gt;&lt;br /&gt;I spoke at the Rock n Roll Code Camp (&lt;a href="http://www.socalcodecamp.com"&gt;http://www.socalcodecamp.com&lt;/a&gt;) this past weekend and it went very well.  I'm considering giving the same talk / pair of talks in San Diego later this year, or I might come up with a new couple of talks, not sure yet.  Always tough when the big hitters take the most common topics.   Maybe I'll flesh out the Generics talk I gave to the User Group a few months ago so that it's a full hour and give that if no one else pipes in on it!&lt;br /&gt;&lt;br /&gt;Anyway, here are links to the ppt and code for the two talks I gave:&lt;br /&gt;&lt;br /&gt;Packaging in .NET 3.0:  &lt;a href="http://www.sanluistech.com/samples/packaging1.zip"&gt;http://www.sanluistech.com/samples/packaging1.zip&lt;/a&gt;&lt;br /&gt;Reflection in .NET:  &lt;a href="http://www.sanluistech.com/samples/reflectiondemo.zip"&gt;http://www.sanluistech.com/samples/reflectiondemo.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have at them, and send me any questions you might have...&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-3073075220074852507?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/3073075220074852507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/3073075220074852507'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/02/rock-n-roll-code-camp-presentations.html' title='Rock n Roll Code Camp Presentations'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-117027750176124887</id><published>2007-01-31T13:05:00.000-08:00</published><updated>2007-01-31T13:05:01.946-08:00</updated><title type='text'>Querying Profile Values from default Profile Provider</title><content type='html'>&lt;p&gt;Hey all,&lt;/p&gt; &lt;p&gt;As most of you know if you've been involved with the new Membership features of .NET 2.0, there's a handy way to store user specific settings called the Profile.&amp;nbsp;&amp;nbsp; This allows you to specify in your config files certain attributes you wish to store on a per user basis.&amp;nbsp;&amp;nbsp; At compile time, the .NET compiler will adjust its native profile object to account for the profile properties you configure so that you can access them directly with code.&lt;/p&gt; &lt;p&gt;Let's assume that you are going to store First Name and Last Name on the user profile.&amp;nbsp; Your configuration would look like this:&lt;/p&gt; &lt;p&gt;&amp;lt;system.web&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;profile&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;properties&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add name="FirstName" type="System.String"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;add name="LastName" type="System.String"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/properties&amp;gt;&lt;br&gt;&amp;lt;/system.web&amp;gt;&lt;/p&gt; &lt;p&gt;Once that was done, you could reference those properties directly off of your code:&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;protected void Page_Load(object sender, EventArgs e)&lt;br&gt;{&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile.FirstName = 'John';&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile.LastName = 'Smith';&lt;br&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;However, there's a small problem with doing this, and it's in how the values are stored in the data store that you are using for your Membership and Profile providers.&amp;nbsp;&amp;nbsp; The names and values of the profile properties are stored in a formatted string format like so:&lt;/p&gt; &lt;p&gt;&amp;nbsp;The propertynames field:&lt;/p&gt; &lt;p&gt;FirstName:S:0:4:LastName:S:4:5&lt;/p&gt; &lt;p&gt;The propertyvalues field:&lt;/p&gt; &lt;p&gt;JohnSmith&lt;/p&gt; &lt;p&gt;In essence, the propertynames field contains the field name, the datatype, the index, and the length of each field as it exists in the propertyvalues field.&lt;/p&gt; &lt;p&gt;This makes it very difficult to pull data out with simple Sql.&lt;/p&gt; &lt;p&gt;There are several alternatives, including using a SqlTableProvider (found at &lt;a title="http://www.asp.net/sandbox/samp_profiles.aspx?tabindex=0&amp;amp;tabid=1" href="http://www.asp.net/sandbox/samp_profiles.aspx?tabindex=0&amp;amp;tabid=1"&gt;http://www.asp.net/sandbox/samp_profiles.aspx?tabindex=0&amp;amp;tabid=1&lt;/a&gt;), and those are useful if you are looking to do a full blown search mechanism.&amp;nbsp; But what if you don't want to replace your entire provider model and do a conversion, and only want to see what data you have?&lt;/p&gt; &lt;p&gt;One thing you can do is construct a user-defined Sql function to parse the propertynames field, and then use that parsing to do an appropriate substring on the propertyvalues field.&amp;nbsp; Here's an example.&lt;/p&gt; &lt;p&gt;I'm going to build a user-defined function that takes the text I wish to parse, the field name I am looking for, and the indexed value I am after.&amp;nbsp; In this example, if I pass in an indexed value of '2' I will get the datatype, '3' will return me the start position, and '4' will get the field length.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;CREATE FUNCTION [dbo].[GetProfileParameters](@text varchar(8000), @searchKey varchar(8000), @returnIndex int)&lt;br&gt;RETURNS varchar(8000)&lt;br&gt;AS&lt;br&gt;BEGIN &lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;declare @keyfound bit &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;set @keyfound = 0 &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;DECLARE @pos smallint,&lt;br&gt;@index smallint,&lt;br&gt;@i smallint,&lt;br&gt;@j smallint,&lt;br&gt;@s varchar(8000) &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;SET @pos = 1&lt;br&gt;set @index = 1 &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;WHILE @pos &amp;lt;= LEN(@text)&lt;br&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;BEGIN &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @i = CHARINDEX(' ', @text, @pos)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @j = CHARINDEX(':', @text, @pos) &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @i &amp;gt; 0 OR @j &amp;gt; 0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @i = 0 OR (@j &amp;gt; 0 AND @j &amp;lt; @i)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @i = @j &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @i &amp;gt; @pos&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- @i now holds the earliest delimiter in the string&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @s = SUBSTRING(@text, @pos, @i - @pos)&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (@s = @searchKey)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --found the key&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @keyfound = 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@keyfound = 1 and @index = @returnIndex)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; RETURN @s&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;&lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @index = @index + 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@index &amp;gt; 4)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @index = 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @pos = @i + 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHILE @pos &amp;lt; LEN(@text) AND SUBSTRING(@text, @pos, 1) IN (' ', ':')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @pos = @pos + 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; if (@s = @searchKey)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;--found the key&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @keyfound = 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (@keyfound = 1 and @index = @returnIndex)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN @s&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @index = @index + 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (@index &amp;gt; 4)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @index = 1 &lt;/font&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @pos = LEN(@text) + 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN ''&lt;br&gt;end&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Now that we have that, we can get the start index and length of the field we want and get it out of the table by using a substring:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;select &lt;font color="#ff8080"&gt;substring&lt;/font&gt;(&lt;font color="#000000"&gt;propertyvaluesstring&lt;/font&gt;, &lt;font color="#ff8080"&gt;convert&lt;/font&gt;(int, dbo.getprofileparameters(&lt;font color="#000000"&gt;propertynames&lt;/font&gt;, 'FirstName', 3)) + 1, &lt;font color="#ff8080"&gt;convert&lt;/font&gt;(int, dbo.getprofileparameters(&lt;font color="#000000"&gt;propertynames&lt;/font&gt;, 'FirstName', 4))) as FieldValue from aspnet_Profile&lt;/font&gt;&lt;/p&gt; &lt;p&gt;That will give us all of the first names in the user profiles by doing an appropriate substring on the propertyvalues field, using the data provided in the propertynames field.&lt;/p&gt; &lt;p&gt;Happy querying!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-117027750176124887?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/117027750176124887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/117027750176124887'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/01/querying-profile-values-from-default.html' title='Querying Profile Values from default Profile Provider'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-117020039167706239</id><published>2007-01-30T15:39:00.000-08:00</published><updated>2007-01-31T01:38:21.263-08:00</updated><title type='text'>SqlBulkCopy</title><content type='html'>&lt;p&gt;If you are ever in a scenario where you are going to be doing tons of repetitive inserts, consider using the new SqlBulkCopy command that's found in .NET 2.0.&amp;nbsp;&amp;nbsp; It uses an insert bulk to do all of your inserts in a single round trip, and has settings which you can use to batch up or break up the inserts if needed, and a timeout setting as well.&amp;nbsp; The potential performance savings are huge, especially if you are doing things like importing data from outside vendors or processing data submissions from third parties via FTP or web services.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Here's an example of how it's used.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;First you would create a bulk copy object given the connection string.&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;SqlBulkCopy oBulk = new SqlBulkCopy(&lt;em&gt;yourconnectionstring&lt;/em&gt;);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Then you would create a datatable to import...in this case I'll call some DB method&lt;br&gt;&lt;font color="#0000a0"&gt;DataTable dtBulk = GetAllZipsOutMyDatabase();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Next set the destination table name where you want the bulk copy to go:&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;oBulk.DestinationTableName = "MyDestinationTable"&lt;/font&gt;  &lt;p&gt;&amp;nbsp;  &lt;p&gt;Now this next step is important, IF the columns in your datatable do not exactly match the column structure in the destination table.&amp;nbsp; If your local datatable is structured exactly like the destination table, meaning all of the columns are represented and they are the correct datatype, you can do without this step.&amp;nbsp; However, if your table has an identity column, or some columns are not represented, you MUST map your columns to the destination table.&amp;nbsp; In this example I am using the names of the local datatable columns and mapping them onto the destination table, since I named my local datatable columns the same as they are in the destination table.  &lt;p&gt;&lt;font color="#0000a0"&gt;oBulk.ColumnMappings.Clear();&lt;br&gt;foreach(DataColumn oCol in dtBulk.Columns)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oBulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping(oCol.ColumnName, oCol.ColumnName));&lt;/font&gt; &lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;Now that that's done I can set the batch size and the timeout:&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;oBulk.BatchSize = 1000;&lt;br&gt;oBulk.BulkCopyTimeout = 6000;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Now I'm all set up and I can write to the server.&lt;/p&gt; &lt;p&gt;&lt;font color="#0000a0"&gt;oBulk.WriteToServer(dtBulk);&lt;/font&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;And that's it.&amp;nbsp; Rather than looping on a bunch of inserts, I can do all of the inserts in a single round trip.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Happy bulk copying,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Rob&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-117020039167706239?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/117020039167706239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/117020039167706239'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2007/01/sqlbulkcopy.html' title='SqlBulkCopy'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-116365158537004957</id><published>2006-11-15T20:27:00.000-08:00</published><updated>2007-01-30T09:55:06.786-08:00</updated><title type='text'>SLO .NET User Group has first meeting...and gets recognized by INETA</title><content type='html'>Hi everyone,&lt;br /&gt;&lt;br /&gt;Sorry I've been a bit silent lately, but I went to VSLive! in Boston the last week in October and spent some time on either side of the conference visiting my family up in New Hampshire.  Then I came back and it took me a bit to catch up with everything.  One of the things I had to catch up on was my first User Group meeting.&lt;br /&gt;&lt;br /&gt;Last night the first meeting was held and by all accounts is was a great success.  10 people showed up for pizza, lively discussion, and networking.  I wasn't sure what to expect, but I was very pleased with the turnout and everyone's interaction.&lt;br /&gt;&lt;br /&gt;I give myself a B on my presentation.  I tried to pick an interesting topic, but I didn't have a whole lot of time to prepare and so I was a bit slow during the code samples.   But it was my first time through the talk so I already know what I need to do to improve on it.  Plus I got some good feedback on the talk from the group.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On top of that, today &lt;a href="http://www.ineta.org"&gt;INETA&lt;/a&gt;, the International .NET Association,  marked our group as Active and now it can be found on their site.  Plus we get access to speakers and I get to put the logo on the UG website.  Needless to say, I'm very excited about this turn of events.&lt;br /&gt;&lt;br /&gt;I hope to get back to my blog topics pretty soon...going to try and get a synopsis of my last talk up here pretty quickly.&lt;br /&gt;&lt;br /&gt;Talk to you later!&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-116365158537004957?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116365158537004957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116365158537004957'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/11/slo-net-user-group-has-first.html' title='SLO .NET User Group has first meeting...and gets recognized by INETA'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-116129028998671181</id><published>2006-10-19T13:12:00.000-07:00</published><updated>2006-10-19T13:50:04.123-07:00</updated><title type='text'>Custom Control Selection At Design Time</title><content type='html'>So I found this going through some old code this past week.  I had built a custom header to interact with a Wizard control.  I don't particularly care for the sidebar and I wanted navigation tabs floating above the Wizard.   That was relatively easy to put together.  It uses the ActiveStepIndex on the Wizard to determine its tab appearance, so when I dropped it into the Designer, I wanted to be able to select the Wizard1 control as the Wizard for my header to interact with.  How you do that is with a TypeConverter.&lt;br /&gt;&lt;br /&gt;A TypeConverter allows you to specify, at design time, the controls you would like your property to interact with.  In this example, I have a string property on my WizardHeader control that I would like to set to "Wizard1", the ID of the Wizard on my WebForm.  Now I could type that in, but I could also type in any number of other things that would not be the type of control I wish to use and would break when I went after the ActiveStepIndex property during execution.&lt;br /&gt;&lt;br /&gt;So I built a custom TypeConverter that would return to me the IDs for the controls on the page that were of type Wizard.  Here's how it's done:&lt;br /&gt;&lt;br /&gt;First, I will inherit from StringConverter, which is the base Converter for capturing properties of type string.  There are a couple of overrides.  The most important is GetStandardValues.  This allows you to customize how you want to acquire the values that are available through your converter.&lt;br /&gt;&lt;br /&gt;By looping through the controls that are available in the component context container, I can check for their control type, and if they match the type I am looking for (in this case System.Web.UI.WebControls.Wizard), I add those IDs to a collection.  At the end I build a string list and hand back a StandardValuesCollection based on that list.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Collections;&lt;br /&gt;&lt;br /&gt;namespace WebControls.Wizards&lt;br /&gt;{&lt;br /&gt;  public class WizardListConverter : StringConverter&lt;br /&gt;  {&lt;br /&gt;    private static &lt;br /&gt;       TypeConverter.StandardValuesCollection myReferences;&lt;br /&gt;&lt;br /&gt;    public WizardListConverter()&lt;br /&gt;    {&lt;br /&gt;            &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public override bool &lt;br /&gt;      GetStandardValuesSupported(ITypeDescriptorContext context)&lt;br /&gt;    {&lt;br /&gt;      return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public override bool &lt;br /&gt;      GetStandardValuesExclusive(ITypeDescriptorContext context)&lt;br /&gt;    {&lt;br /&gt;      return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public override TypeConverter.StandardValuesCollection &lt;br /&gt;       GetStandardValues(ITypeDescriptorContext context)&lt;br /&gt;    {&lt;br /&gt;      ArrayList matchingReferences = new ArrayList();&lt;br /&gt;&lt;br /&gt;      for (int i = 0; i &lt; context.Container.Components.Count; i++)&lt;br /&gt;      {&lt;br /&gt;        if (context.Container.Components[i] &lt;br /&gt;             is System.Web.UI.WebControls.Wizard)&lt;br /&gt;        {&lt;br /&gt;          System.Web.UI.Control contr = &lt;br /&gt;            (System.Web.UI.Control)context.Container.Components[i];&lt;br /&gt;          &lt;br /&gt;          matchingReferences.Add(contr.ID);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      matchingReferences.Sort(0, matchingReferences.Count, null);&lt;br /&gt;&lt;br /&gt;     if (context.Container.Components.Count &gt; 0)&lt;br /&gt;     {&lt;br /&gt;       string sSplitReferences = "";&lt;br /&gt;&lt;br /&gt;       for (int j = 0; j &lt; matchingReferences.Count; j++)&lt;br /&gt;       {&lt;br /&gt;         if (matchingReferences[j] + "" != "")&lt;br /&gt;         {&lt;br /&gt;           sSplitReferences += "," + matchingReferences[j];&lt;br /&gt;         }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       string[] references = sSplitReferences.Split(',');&lt;br /&gt;&lt;br /&gt;       myReferences = new &lt;br /&gt;           TypeConverter.StandardValuesCollection(references);&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;        myReferences = new &lt;br /&gt;         TypeConverter.StandardValuesCollection(new string[] { "" });&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     return myReferences;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now that that is done, I need to go back to my WizardHeader control and add the WizardListConverter as an attribute:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;&lt;br /&gt;namespace WebControls.Wizards&lt;br /&gt;{&lt;br /&gt;  public class WizardHeader : System.Web.UI.Control&lt;br /&gt;  {&lt;br /&gt;    //the id of the control I wish to interact with&lt;br /&gt;    private string m_sWizardControl;&lt;br /&gt;&lt;br /&gt;    [TypeConverter(typeof(WizardListConverter))]&lt;br /&gt;    public string WizardControl&lt;br /&gt;    {&lt;br /&gt;      get { return m_sWizardControl; }&lt;br /&gt;      set { m_sWizardControl = value; }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now when I drop the WizardHeader onto a WebForm, I can simply select the appropriate wizard in the property list.&lt;br /&gt;&lt;br /&gt;&lt;img border="0" src="http://www.sanluistech.com/images/blog/blog_typeconverter.jpg"&gt;&lt;br /&gt;&lt;br /&gt;So now I can make it a lot easier to control the interaction between my custom controls at design time to make sure I am only interacting with the types of controls I want.&lt;br /&gt;&lt;br /&gt;Talk to you later!&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-116129028998671181?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116129028998671181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116129028998671181'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/10/custom-control-selection-at-design.html' title='Custom Control Selection At Design Time'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-116096578019778860</id><published>2006-10-15T19:17:00.000-07:00</published><updated>2006-10-15T19:45:25.356-07:00</updated><title type='text'>.NET 2.0 Fun With Generics</title><content type='html'>So I spent this past weekend playing with Generics. For those of you who haven't used them yet, they are a way to "generalize" your code while still maintaining type safety in .NET 2.0. You can do some very powerful things with them, and some of the native implementations can save you a ton of work.&lt;br /&gt;&lt;br /&gt;First of all, there's the List object in the new namespace System.Collections.Generic. This namespace is added by default to all of your class files when you create them in Visual Studio. This allows you to create lists of objects while telling the list the type of object you want to add, whereas in the past with Arrays or Dictionaries you had to check for the type or cast it correctly to make sure the list contained objects of the same type. For example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;List&amp;lt;int&amp;gt; oIntegers = new List&amp;lt;int&amp;gt;();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;This will create a new list that will only allow ints to be added to it. In addition, you get type safety when enumerating or using for loops on the List:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;foreach(int i in oIntegers)&lt;br /&gt;{&lt;br /&gt;  i++;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;In the past you would have had to cast this to int or check the type to make sure it would not break during the loop, but now because you've told the List what object type to expect, you have type safety. This also works when accessing an object by index:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int iFirst = oIntegers[0];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;This will not require casting because the List already knows that any object within its collection will be an int. This is a great improvement over the collection objects in .NET 1.1.&lt;br /&gt;&lt;br /&gt;That's not the only thing you can do with Generics. You can also create classes that will contain and interact with various types of objects as well. One of the things that I've always been upset about is the inability to list the members of an Enum. If you've tried this you know what I mean...you want to be able to take an Enum and bind it to a dropdownlist or some other control so users can choose from each of the types and set it on an object. Well now, with a simple Generics based class that derives from List, you can do that:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class EnumList&amp;lt;t&amp;gt; : List&amp;lt;t&amp;gt;&lt;br /&gt;{&lt;br /&gt;  public EnumList()&lt;br /&gt;  {&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;      string[] sNames = Enum.GetNames(typeof(t));&lt;br /&gt;      foreach (string sName in sNames)&lt;br /&gt;      {&lt;br /&gt;        base.Add((t)Enum.Parse(typeof(t), sName));&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    catch(Exception e)&lt;br /&gt;    {&lt;br /&gt;      throw new Exception("Not an enum type", e);&lt;br /&gt;    }           &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;By placing a &amp;lt;t&amp;gt; behind your class definition (or "(Of T)" in VB.NET) you can hand your class a type to interact with, and use that to strongly type items added to your object. In this case, I am going to pass an Enum in as &lt;t&gt;when creating the object, and in the body of the constructor, I will grab the GetNames() method off the Enum class and pass it the type of the object I was handed. Then I can loop through the items in the Enum and add it to the List I've derived from. Once that is done, I now have an object I can use for DataBinding to any bindable control, including DropDownLists on Web Forms.&lt;br /&gt;&lt;br /&gt;Here's how you would instantiate it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public enum enLocomotion&lt;br /&gt;{&lt;br /&gt;  Fly,&lt;br /&gt;  Walk,&lt;br /&gt;  Slither,&lt;br /&gt;  Swim&lt;br /&gt;}&lt;br /&gt;public class Animal&lt;br /&gt;{&lt;br /&gt;  public List&amp;lt;enLocomotion&amp;gt; Locomotions&lt;br /&gt;  {&lt;br /&gt;    get&lt;br /&gt;    {&lt;br /&gt;      return new EnumList&amp;lt;enLocomotion&amp;gt;();&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;By telling the EnumList you wish it to use the enLocomotion, &lt;br /&gt;the List that the class derives from will populate with &lt;br /&gt;"Fly", "Walk", "Slither", and "Swim" on the fly. This way, &lt;br /&gt;if you add a new item to the Enum, it will automatically &lt;br /&gt;get picked up without any code changes.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Animal oAnimal = new Animal();&lt;br /&gt;this.DropDownList1.DataSource = oAnimal.Locomotions;&lt;br /&gt;this.DropDownList1.DataBind();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;select&gt; &lt;option value="Fly"&gt;Fly&lt;/option&gt; &lt;option value="Walk"&gt;Walk&lt;/option&gt; &lt;option value="Slither"&gt;Slither&lt;/option&gt; &lt;option value="Swim"&gt;Swim&lt;/option&gt;&lt;/select&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Have fun with Generics! I know I will.&lt;br /&gt;&lt;br /&gt;Talk to you later,&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-116096578019778860?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116096578019778860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116096578019778860'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/10/net-20-fun-with-generics.html' title='.NET 2.0 Fun With Generics'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-116088878265109813</id><published>2006-10-14T22:00:00.000-07:00</published><updated>2006-10-15T23:18:13.893-07:00</updated><title type='text'>Splash!</title><content type='html'>So I don't usually work in VB.NET, I'll admit it.  When we made the jump to the .NET Framework I started programming in C# and absolutely fell in love with the language.  I think in C# now when I code and nothing is more painful than going back to VB6 or legacy ASP code.  However, at Code Camp, I did pick up something in VB.NET Windows Application programming that I really like and wish they had included in C#:  Automatic Splash Screens!&lt;br /&gt;&lt;br /&gt;It turns out that with one new form and a couple of setting changes in the IDE, you can have a professional looking splash screen on your VB.NET App.  It's really this simple.   First of all you add a WindowsForm of type SplashScreen:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sanluistech.com/images/blog/blog_splash_1.jpg" target="_blank"&gt;Image 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then you change the properties for the Assembly to set the Application Title:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sanluistech.com/images/blog/blog_splash_2.jpg" target="_blank"&gt;Image 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And then you go into the project properties and add that as your splashscreen:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sanluistech.com/images/blog/blog_splash_3.jpg" target="_blank"&gt;Image 3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And Viola!  Instant, professional splash!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sanluistech.com/images/blog/blog_splash_4.jpg" target="_blank"&gt;Image 4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now when are we going to get that in C#?&lt;br /&gt;&lt;br /&gt;Later,&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-116088878265109813?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116088878265109813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116088878265109813'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/10/splash.html' title='Splash!'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-116051175881294198</id><published>2006-10-10T13:17:00.000-07:00</published><updated>2006-10-10T13:23:15.173-07:00</updated><title type='text'>First SLO .NET User Group Meeting Scheduled</title><content type='html'>Hey all,&lt;br /&gt;&lt;br /&gt;The first meeting of the San Luis Obispo .NET User Group has been scheduled for November 14th at 5:30. We'll be holding it in one of KBCX.NET's training rooms, which even has computers along with its projector, which is what I am really after. We already have a few people confirmed and I am going to start spreading the word.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slodotnet.org/meeting.aspx"&gt;http://www.slodotnet.org/meeting.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wish us luck!&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-116051175881294198?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116051175881294198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116051175881294198'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/10/first-slo-net-user-group-meeting.html' title='First SLO .NET User Group Meeting Scheduled'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-116045118469074709</id><published>2006-10-09T20:32:00.000-07:00</published><updated>2006-10-09T20:33:04.706-07:00</updated><title type='text'>Code Camp Recap</title><content type='html'>So I think the CodeCamp presentations went well.   I had my Reflection one on Saturday, which went good, but it ran a little bit short because I was nervous and talked too fast.  I also decided at the end of that the reason why it felt awkward to me was that it was constructed more like a sales pitch for my way of doing things rather than a demonstration of the technology.  I've decided I'm going to rip it up and redo it at some point.  Certainly at the end of the presentation my argument that being able to leverage Reflection made things easier didn't feel right.  I think the presentation can be improved dramatically.&lt;br /&gt;&lt;br /&gt;On the flip side, I felt that the MSMQ presentation on Sunday went a lot better.  The demo was much more straightforward, I finished the presentation essentially on time, and had 3 or 4 people stay after to ask me questions...and I got some applause too.  I think the primary difference again was structure.   &lt;br /&gt;&lt;br /&gt;Overall I got great positive feedback on my first speaking engagements.&lt;br /&gt;&lt;br /&gt;I also gave Peter Kellner a hand with an issue he was having with a Server Control of his.  Peter organized Code Camp and did an outstanding job.  I was surprised when he asked me for my opinion (maybe I shouldn't have been, but I'm generally a humble guy...until you get to know me anyway), but I think I gave him a couple of good options for his problem.  That's all I can really say because it was something he was doing that's proprietary, but it felt good to have someone think my opinion mattered!&lt;br /&gt;&lt;br /&gt;I spent some time talking to Nima Dilmaghani, my Developer Envangelist, about what I need to do to become a Microsoft MVP. He said that I need to blog more, which I've been trying to do, so I am going to start putting up short versions of my presentations as I prepare them.  I also volunteered to go present at the Santa Barbara .NET User Group if they need presenters, and I am considering volunteering for others as well.  We'll see how it goes.&lt;br /&gt;&lt;br /&gt;I'll have some entries up here shortly about the sessions I saw at CodeCamp, with versions of my presentations to follow.&lt;br /&gt;&lt;br /&gt;Talk to you soon,&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-116045118469074709?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116045118469074709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/116045118469074709'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/10/code-camp-recap.html' title='Code Camp Recap'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-115938177965098721</id><published>2006-09-27T11:26:00.000-07:00</published><updated>2006-09-27T11:29:39.686-07:00</updated><title type='text'>Second Session At Code Camp</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;I've signed up to do a second session at the Silicon Valley Code Camp October 7th and 8th.  In addition to my talk on Reflection, I'll also be giving a talk on Microsoft Message Queueing and how it can be used to offload work on your application and do that work asynchronously.   It's a lot of work getting these talks together but I'm hoping this turns out to be fun!&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Here's a link to my sessions:&lt;br /&gt;&lt;a href="http://www.siliconvalley-codecamp.com/Sessions.aspx?id=c97ff760-0c11-48eb-bd41-493aab31f233"&gt;http://www.siliconvalley-codecamp.com/Sessions.aspx?id=c97ff760-0c11-48eb-bd41-493aab31f233&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://www.SiliconValley-Codecamp.com/Home.aspx?Referral=c97ff760-0c11-48eb-bd41-493aab31f233"&gt;&lt;img alt="CodeCamp at FootHill College.  Click Here for Details and Registration" hspace="10" src="http://www.siliconvalley-codecamp.com/DisplayAd.ashx?ImageType=1" vspace="10" border="0" longdesc="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Talk to you later!&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-115938177965098721?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115938177965098721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115938177965098721'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/09/second-session-at-code-camp.html' title='Second Session At Code Camp'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-115930830694990184</id><published>2006-09-26T15:04:00.000-07:00</published><updated>2006-10-23T20:57:19.146-07:00</updated><title type='text'>SoCal Tech Summit</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;Spent this last Saturday at the SoCal Tech Summit ( http://www.socaltechsummit.com ) seeing some presentations and visiting with friends.  It was time well spent as I saw two excellent presentations, one on the object modeling in Visual Studio 2005, and the other on the new Atlas features.  The third presentation wasn't nearly as interesting, and that had to do with the speaker.  I have to tell you, folks, if you're going to give a presentation on a technology, at least have the courtesy to act like you support it or like it.  There's nothing worse than sitting through a powerpoint listening to how stupid some company is, how dumb their developers are, and how idiotic what the presenter is about to show you is, and how unlikely it is that you would use it because of the risks involved.  Why bother?&lt;br /&gt;&lt;br /&gt;In any event, if you haven't added a class diagram yet through Visual Studio 2005, go do it today! Just right click on your project and select "Add Class Diagram" to see what I mean.  It appears to be every bit as powerful as the Rational stuff from way back, but completely integrated.  It even updates itself as your code changes, and can track what objects are derived from what for faster and more thorough model review.  I came away very impressed as an architect, in that you can sit there and model out the entire system's roles and responsibilities, and when you are done, save it and hand it off to a development team with the code shell already in place and ready to go.  And if you change your code, including methods or properties or inheritance, the diagrams update themselves, leaving you with a consistent model for your software.  I was extremely excited about it, although I was not quite in tears, as the presenter suggested I should be.&lt;br /&gt;&lt;br /&gt;The Atlas presentation was nearly as interesting, although not quite as exciting.  Having built a full Ajax support system myself for past web sites, I understand the theory behind Atlas as well as anyone, so that part of it was a simple review.  But the ease with which the presenter was able to implement and interact with Web Services was nice.  Certainly usable in place of building your own Ajax application.  I hope it ends up better in the end than the full-on WebForm callback system that is in place for a lot of current applications.  Personally I hate the overhead of doing a full page refresh for what is really a partial callback.  My intent is largely going to be calling web services directly with it and staying away from the partial page refresh as much as I can.&lt;br /&gt;&lt;br /&gt;Talk to you soon,&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-115930830694990184?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115930830694990184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115930830694990184'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/09/socal-tech-summit.html' title='SoCal Tech Summit'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-115816359155326409</id><published>2006-09-13T09:04:00.000-07:00</published><updated>2006-09-13T09:06:31.570-07:00</updated><title type='text'>Grid Computing at the Santa Barbara .NET User Group</title><content type='html'>Hi All,&lt;br /&gt;&lt;br /&gt;Went down to the Santa Barbara .NET Users Group last night for pointers on how to get the SLO .NET User Group up and running and to introduce myself.  Everyone down there was very nice and seemed definitely into the idea.  Now hopefully I can start getting members here, I have some announcements going out in the local newsletters for the Chamber Of Commerce and the Society Of Technical Communications.  We'll see how it goes.&lt;br /&gt;&lt;br /&gt;Saw a pretty intriguing presentation by Kim Greenlee ( http://krgreenlee.blogspot.com ) of Digipede ( http://www.digipede.net/ ).  Digipede has built this pretty interesting Grid based computing system that essentially allows a system to offload its work to a large network of nodes that can even include the receptionist's computer at the front desk.  Processing "agents" are dropped onto each machine that you want to participate in your grid.  Each machine also can participate in a "pool" of functionality so that it only asks for work that it can handle.   In this way it's slightly different than a cluster because the machines themselves are responsible for controlling how much and what type of work they take on during their down time, so you don't have to know exactly how many or what types of machines you are distributing work to.&lt;br /&gt;&lt;br /&gt;They've also come up with a fairly straightforward SDK that allows you to create "Grid Objects" in your code to hand your processes off, assembly and all, to the processing grid.  Your code strategies will have to shift slightly to account for such things as configuration variables (you'll have to set them as properties internally in your grid object because there is no guarantee the processing agent has access to the same config) and your assembly dependencies (if the grid object can't figure out all the DLLs to send over, you have to tell it where to find them), but other than that it seems a pretty decent way to distribute work and the performance gains were most impressive.   In some instances Kim was able to achieve a 90% reduction in processing time on a distribution network of 9 nodes.  &lt;br /&gt;&lt;br /&gt;I have only two real concerns about this approach which I did not have time to broach with Kim in detail; one is that the distribution of work is Web Services based which immediately removes the ability to have transaction control.  One of the places this would come in handy would be on large scale database inserts or bulk imports of data but you would have to be careful not to step out of the transaction scope when assigning jobs and tasks to the distribution grid.  The other is that it is possible for the grid to get bogged down on one large high priority task and leave the others waiting.  This means that if you implement this in a Web Server environment, where web servers are waiting on your distribution network, you have to be really sure your web servers are getting the highest priority attention so that your users aren't held waiting, or that you've set up a specific "pool" devoted to web server task processing.  Otherwise, the possible logjam would defeat the purpose of offloading the work in the first place.&lt;br /&gt;&lt;br /&gt;Kim is also presenting at Code Camp in October and I recommend checking out the presentation!&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-115816359155326409?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115816359155326409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115816359155326409'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/09/grid-computing-at-santa-barbara-net.html' title='Grid Computing at the Santa Barbara .NET User Group'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-115778186740881411</id><published>2006-09-08T23:03:00.000-07:00</published><updated>2006-09-08T23:04:27.416-07:00</updated><title type='text'>Presenting at Code Camp</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;Looks like I'll be one of the presenters at this year's Silicon Valley Code Camp (see previous post below).&lt;br /&gt;&lt;br /&gt;This will be my first speaking engagement, and I will be covering a topic dear to my heart:  Creating an Agile Base Architecture with Reflection in .NET&lt;br /&gt;&lt;br /&gt;Wish me luck!  I hope this is the first of many speaking engagements.&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-115778186740881411?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115778186740881411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115778186740881411'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/09/presenting-at-code-camp.html' title='Presenting at Code Camp'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-115776355371740191</id><published>2006-09-08T17:57:00.000-07:00</published><updated>2006-09-12T13:37:57.493-07:00</updated><title type='text'>Code Camp is here!</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;The Silicon Valley Code Camp is coming next month...I am looking to attend and hope that you will too if you are interested or in the area. Click below for details!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.SiliconValley-Codecamp.com/Home.aspx?Referral=c97ff760-0c11-48eb-bd41-493aab31f233"&gt;&lt;img alt="CodeCamp at FootHill College.  Click Here for Details and Registration" hspace="10" src="http://www.siliconvalley-codecamp.com/DisplayAd.ashx?ImageType=1" vspace="10" border="0" longdesc="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-115776355371740191?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115776355371740191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115776355371740191'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/09/code-camp-is-here.html' title='Code Camp is here!'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-115774058032667720</id><published>2006-09-08T11:34:00.000-07:00</published><updated>2006-09-08T11:38:36.386-07:00</updated><title type='text'>San Luis Obispo .NET User Group</title><content type='html'>Hi Everyone,&lt;br /&gt;&lt;br /&gt;Wanted to let you know that I am starting a new Microsoft .NET User Group in the San Luis Obispo area. I've already gotten decent support from Microsoft and am working on getting involved with the Santa Barbara user group as well.&lt;br /&gt;&lt;br /&gt;We've put up a web site at &lt;a href="http://www.slodotnet.org/"&gt;http://www.slodotnet.org/&lt;/a&gt; and we're hoping to start with meetings in the fall. I am currently contacting area businesses to try and gauge interest.&lt;br /&gt;&lt;br /&gt;Wish me luck!&lt;br /&gt;&lt;br /&gt;Rob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-115774058032667720?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115774058032667720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115774058032667720'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/09/san-luis-obispo-net-user-group.html' title='San Luis Obispo .NET User Group'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-31572207.post-115372928078864933</id><published>2006-07-24T01:18:00.000-07:00</published><updated>2006-07-24T09:27:24.676-07:00</updated><title type='text'>Welcome!</title><content type='html'>Welcome to my development blog. As questions arise during the course of business, I will post the answers that we came up with here for public use and commentary.&lt;br /&gt;&lt;br /&gt;Please be polite and professional!&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;&lt;br /&gt;Rob&lt;br /&gt;&lt;br /&gt;Robert Hope&lt;br /&gt;San Luis Technology Consultants&lt;br /&gt;4251 S. Higuera St. Suite 800&lt;br /&gt;San Luis Obispo, CA 93401&lt;br /&gt;office: (805) 540-5254&lt;br /&gt;fax: (805) 413-2010&lt;br /&gt;email: &lt;a title="mailto:rhope@sanluistech.com" href="mailto:rhope@sanluistech.com"&gt;rhope@sanluistech.com&lt;/a&gt;&lt;br /&gt;web: &lt;a title="http://www.sanluistech.com/" href="http://www.sanluistech.com/"&gt;http://www.sanluistech.com/&lt;/a&gt;&lt;br /&gt;AOL IM: sltcrhope&lt;br /&gt;Skype: sltc.rhope&lt;br /&gt;blog: &lt;a title="http://rhope.blogspot.com/" href="http://rhope.blogspot.com/"&gt;http://rhope.blogspot.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31572207-115372928078864933?l=rhope.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115372928078864933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31572207/posts/default/115372928078864933'/><link rel='alternate' type='text/html' href='http://rhope.blogspot.com/2006/07/welcome.html' title='Welcome!'/><author><name>Robert Hope</name><uri>http://www.blogger.com/profile/12890448331744809412</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.roberthope.com/images/rob_bw.jpg'/></author></entry></feed>
