<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Andrew Hay</title>
    <link>http://www.andrewdothay.net/blog/</link>
    <description>Thinking way too long about the subtitle</description>
    <language>en-us</language>
    <copyright>Andrew Hay</copyright>
    <lastBuildDate>Mon, 04 Jan 2010 20:23:12 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>andrewcameronhay@hotmail.com</managingEditor>
    <webMaster>andrewcameronhay@hotmail.com</webMaster>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=d1b5b531-b85f-47f0-85c4-642877bdd0ec</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,d1b5b531-b85f-47f0-85c4-642877bdd0ec.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,d1b5b531-b85f-47f0-85c4-642877bdd0ec.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d1b5b531-b85f-47f0-85c4-642877bdd0ec</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Sweet! I'm only two years late to the party! I just upgraded the server that hosts
my site.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d1b5b531-b85f-47f0-85c4-642877bdd0ec" />
      </body>
      <title>Upgraded to Windows 2008</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,d1b5b531-b85f-47f0-85c4-642877bdd0ec.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2010/01/04/UpgradedToWindows2008.aspx</link>
      <pubDate>Mon, 04 Jan 2010 20:23:12 GMT</pubDate>
      <description>&lt;p&gt;
Sweet! I'm only two years late to the party! I just upgraded the server that hosts
my site.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=d1b5b531-b85f-47f0-85c4-642877bdd0ec" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,d1b5b531-b85f-47f0-85c4-642877bdd0ec.aspx</comments>
      <category>dasBlog</category>
      <category>IIS7</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=c98c6a3b-380b-49e1-b3e7-14a8bd475500</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,c98c6a3b-380b-49e1-b3e7-14a8bd475500.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,c98c6a3b-380b-49e1-b3e7-14a8bd475500.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=c98c6a3b-380b-49e1-b3e7-14a8bd475500</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.greghughes.net">Greg Hughes</a>, one of the rock stars I had the
pleasure of working with on a gig has a nice phrase that he likes to whip out from
time to time: trust, but verify. 
</p>
        <p>
Greg didn't coin the term. <a href="http://en.wikipedia.org/wiki/Trust,_but_Verify">Wikipedia
says Ronald Regan used it</a> and others before him. The term indicates you should
trust what people are doing or saying, but verify it nonetheless. I had one such opportunity
recently and I'm sorry to say that I failed miserably. 
</p>
        <p>
The check-engine light went on in my car last Friday. I took it to a repair shop early
Saturday morning and left it there. They called back in a couple of hours with an
estimate to fix this, that, and the other thing. I winced, but said sure, go ahead.
This is over the phone, mind you. 
</p>
        <p>
They called back a few hours after that and said there's one more thing. I asked for
the total, winced again, and said sure, go ahead. Again, on the phone. This time,
the part was offsite and the delivery truck couldn't arrive until Monday. No worries,
we had the spare car thing worked out. 
</p>
        <p>
I get a call on Monday. The truck arrived, but not the part; weird. Apologies were
offered by the repair shop, but I say, no problem, I’ll get the car on Tuesday. 
</p>
        <p>
Tuesday arrives and I get a call in the late afternoon. The car is ready, please come
and get it. I was in a meeting, so I learned this by listening to the voice-mail the
kind man left on my phone. I leave work, pick up the H-man from daycare, drive home
to get the wife and drive over to the dealership. 
</p>
        <p>
We're less than a mile from the repair shop when I notice I have another voice-mail
from them. In this one, the kind man explains that they close at 6pm, but I have until
8pm to pick up the car before the gates close. He explained that I can call him back
and pay over the phone if I plan on picking up the car between 6pm and 8pm tonight.
He also says the amount on the call. It's two times the amount he quoted me on Saturday.
I'm instantly furious. 
</p>
        <p>
I park and walk into the repair shop, the service desk directs me to the cashier.
The cashier grabs my file and asks for the 2X amount. I respond politely with "I can't
pay that amount". She furrows her brow, understandably at 15 minutes to closing time,
and returns with the service desk representative. 
</p>
        <p>
I ask for the amount he quoted me over the phone and he points to the 2X amount. Again,
with all the politeness I can muster, as if I'm speaking to my grandma, I ask if he
quoted me the 1X amount. He scratches his head and explains, it's all right there.
His document identifies who called, when they called, who they talked to, and the
amount of the estimate. 
</p>
        <p>
I'm baffled and I begin to doubt myself. But I'm also resilient and tell myself that
if the man estimated 2X for the repairs, I surely would have declined and pursued
other options. It's an old car and we're thinking of trading it soon. I was very sure,
even now, that I asked him for the full amount. I was also sure that he never said
anything resembling 2X in response to my question about the full amount. Under no
circumstances could 1X be mistaken for 2X, even on a bad phone connection. 
</p>
        <p>
He explains that he'll have to get the manager, so he's off and I stand around for
a few minutes perusing the repair sheets he left on the desk. It's all right there
on the documents, how could two parties be so far apart on an essential matter? 
</p>
        <p>
A large burly man in a nice looking suit emerges from the back offices, introduces
himself and asks me about my problem. I explain the situation and he takes it all
in. Then he turns to the service representative and repeats what I said. Then he turns
to me and repeats what the service manager said. Then, he repeated what the service
manager said two more times, then he repeated what I said one more time followed by
repeating what the service manager said and ending with a finale of "in all of my
20 years here...", you get the idea. 
</p>
        <p>
Those of you who have met me will know that I have a pretty good face for these types
of things. I'm not too pretty, it's hard to tell what I'm thinking if I don’t let
you and the whiskers don't hurt either. Plus, for whatever reason, I decided to wear
a nice button-down blue shirt and dockers today. I looked professional and not like
some punkass kid trying to skip out on part of the bill. Plus, I sincerely felt that
I was right. 
</p>
        <p>
In any case, 2X is a lot of money to screw up. 
</p>
        <p>
The manager explains that the documents with the who-what-when-and-how-much are legal
documents in the state of Oregon. I don't bite. I'm not in any mood to debate the
matter. My position is clear and so is his. No quick, witty comment or sly argument
from me is going to win him over. My only rebuttal is that estimates over the phone
are inherently prone to these types of mistakes. He picks up on this nibble of an
argument and thoroughly explains that in all his years, they've never had a problem
like this. Again, I refuse to argue the point. It's futile to do so.  
</p>
        <p>
So, he explains that he has to go to the general manager of the repair shop. Again,
I’m left alone near the cashier's desk. This time for about 15 minutes, the standard
time one would sit in an office of a car dealership, waiting to see if the manager
would accept your offer on the car. The old wear-you-down trick. 
</p>
        <p>
In the mean time, I think about what to do. I really do like jury duty. It's a lot
of fun. I wonder of small claims court would be as much fun. There's the anxiety of
getting over the problem, the possibility of losing my first case (I was a business
law major until I took my first computer science course in college) and just the general
hassle. Plus, I'm beginning to doubt myself. Did that guy really tell me the full
amount on the phone and I just wasn't paying attention? I decided that they would
offer to split the difference and I'd accept it. 
</p>
        <p>
Damn! 
</p>
        <p>
So, the manager returns, right on time. He repeats what I told him; then he repeats
what the service representative said one more time. Finally, the manager then says
the general manager offered to split the cost with me. I asked if he was offering
me 1.5X and I’m corrected. The general manager is offering it and the manager is merely
saying it to me. 
</p>
        <p>
Whatever. 
</p>
        <p>
I put up the stop hand and said, I think this is the best solution for both of us.
The manager knows to stop selling when the sale is over, so he turns to the cashier
and firmly states that this customer is going to only pay 1.5X of the amount on the
bill. 
</p>
        <p>
I'm relieved that the issue resolved, yet still disappointed that it happened at all.
I'm out 0.5X, but I do have a few extra repairs on the car. Upon further review, I
think some of the repairs are a little suspect. For example, my car is perfect on
oil. It doesn't burn oil and my drive way is void of any oil spots. Why didn't I think
of that when the guy said the oil pan gasket was leaking on the phone? Arrrgg!! 
</p>
        <p>
This is when Greg's term "trust, but verify" really became clear to me. My super smart
wife pointed out that I could have asked him to e-mail me the estimate. I also could
have asked him to call me back and leave the full estimate as a voice-mail on my phone
if they were email-impaired. The amount of money is large enough and use of my car
is important enough that I really should have been more diligent. I should have verified
the estimate instead of just trusting what I heard on the phone. 
</p>
        <p>
Rats. Well, they say the awesome people can tell you all about their mistakes and
the incompetent never see their own mistakes. Here's one more thing on the pile that
I can learn from. I'm going to be riding the "trust, but verify" horse into the ground
for the next couple of weeks. Apologies, in advance, to all my teammates. 
</p>
        <p>
I don't explain the identity of the repair shop or the amount here because you're
going to trust, but verify next time right? So, in that case, it doesn't matter who
I dealt with.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=c98c6a3b-380b-49e1-b3e7-14a8bd475500" />
      </body>
      <title>Trust, but Verify</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,c98c6a3b-380b-49e1-b3e7-14a8bd475500.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2009/09/17/TrustButVerify.aspx</link>
      <pubDate>Thu, 17 Sep 2009 16:34:56 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.greghughes.net"&gt;Greg Hughes&lt;/a&gt;, one of the rock stars I had the
pleasure of working with on a gig has a nice phrase that he likes to whip out from
time to time: trust, but verify. 
&lt;p&gt;
Greg didn't coin the term. &lt;a href="http://en.wikipedia.org/wiki/Trust,_but_Verify"&gt;Wikipedia
says Ronald Regan used it&lt;/a&gt; and others before him. The term indicates you should
trust what people are doing or saying, but verify it nonetheless. I had one such opportunity
recently and I'm sorry to say that I failed miserably. 
&lt;p&gt;
The check-engine light went on in my car last Friday. I took it to a repair shop early
Saturday morning and left it there. They called back in a couple of hours with an
estimate to fix this, that, and the other thing. I winced, but said sure, go ahead.
This is over the phone, mind you. 
&lt;p&gt;
They called back a few hours after that and said there's one more thing. I asked for
the total, winced again, and said sure, go ahead. Again, on the phone. This time,
the part was offsite and the delivery truck couldn't arrive until Monday. No worries,
we had the spare car thing worked out. 
&lt;p&gt;
I get a call on Monday. The truck arrived, but not the part; weird. Apologies were
offered by the repair shop, but I say, no problem, I’ll get the car on Tuesday. 
&lt;p&gt;
Tuesday arrives and I get a call in the late afternoon. The car is ready, please come
and get it. I was in a meeting, so I learned this by listening to the voice-mail the
kind man left on my phone. I leave work, pick up the H-man from daycare, drive home
to get the wife and drive over to the dealership. 
&lt;p&gt;
We're less than a mile from the repair shop when I notice I have another voice-mail
from them. In this one, the kind man explains that they close at 6pm, but I have until
8pm to pick up the car before the gates close. He explained that I can call him back
and pay over the phone if I plan on picking up the car between 6pm and 8pm tonight.
He also says the amount on the call. It's two times the amount he quoted me on Saturday.
I'm instantly furious. 
&lt;p&gt;
I park and walk into the repair shop, the service desk directs me to the cashier.
The cashier grabs my file and asks for the 2X amount. I respond politely with "I can't
pay that amount". She furrows her brow, understandably at 15 minutes to closing time,
and returns with the service desk representative. 
&lt;p&gt;
I ask for the amount he quoted me over the phone and he points to the 2X amount. Again,
with all the politeness I can muster, as if I'm speaking to my grandma, I ask if he
quoted me the 1X amount. He scratches his head and explains, it's all right there.
His document identifies who called, when they called, who they talked to, and the
amount of the estimate. 
&lt;p&gt;
I'm baffled and I begin to doubt myself. But I'm also resilient and tell myself that
if the man estimated 2X for the repairs, I surely would have declined and pursued
other options. It's an old car and we're thinking of trading it soon. I was very sure,
even now, that I asked him for the full amount. I was also sure that he never said
anything resembling 2X in response to my question about the full amount. Under no
circumstances could 1X be mistaken for 2X, even on a bad phone connection. 
&lt;p&gt;
He explains that he'll have to get the manager, so he's off and I stand around for
a few minutes perusing the repair sheets he left on the desk. It's all right there
on the documents, how could two parties be so far apart on an essential matter? 
&lt;p&gt;
A large burly man in a nice looking suit emerges from the back offices, introduces
himself and asks me about my problem. I explain the situation and he takes it all
in. Then he turns to the service representative and repeats what I said. Then he turns
to me and repeats what the service manager said. Then, he repeated what the service
manager said two more times, then he repeated what I said one more time followed by
repeating what the service manager said and ending with a finale of "in all of my
20 years here...", you get the idea. 
&lt;p&gt;
Those of you who have met me will know that I have a pretty good face for these types
of things. I'm not too pretty, it's hard to tell what I'm thinking if I don’t let
you and the whiskers don't hurt either. Plus, for whatever reason, I decided to wear
a nice button-down blue shirt and dockers today. I looked professional and not like
some punkass kid trying to skip out on part of the bill. Plus, I sincerely felt that
I was right. 
&lt;p&gt;
In any case, 2X is a lot of money to screw up. 
&lt;p&gt;
The manager explains that the documents with the who-what-when-and-how-much are legal
documents in the state of Oregon. I don't bite. I'm not in any mood to debate the
matter. My position is clear and so is his. No quick, witty comment or sly argument
from me is going to win him over. My only rebuttal is that estimates over the phone
are inherently prone to these types of mistakes. He picks up on this nibble of an
argument and thoroughly explains that in all his years, they've never had a problem
like this. Again, I refuse to argue the point. It's futile to do so.&amp;nbsp; 
&lt;p&gt;
So, he explains that he has to go to the general manager of the repair shop. Again,
I’m left alone near the cashier's desk. This time for about 15 minutes, the standard
time one would sit in an office of a car dealership, waiting to see if the manager
would accept your offer on the car. The old wear-you-down trick. 
&lt;p&gt;
In the mean time, I think about what to do. I really do like jury duty. It's a lot
of fun. I wonder of small claims court would be as much fun. There's the anxiety of
getting over the problem, the possibility of losing my first case (I was a business
law major until I took my first computer science course in college) and just the general
hassle. Plus, I'm beginning to doubt myself. Did that guy really tell me the full
amount on the phone and I just wasn't paying attention? I decided that they would
offer to split the difference and I'd accept it. 
&lt;p&gt;
Damn! 
&lt;p&gt;
So, the manager returns, right on time. He repeats what I told him; then he repeats
what the service representative said one more time. Finally, the manager then says
the general manager offered to split the cost with me. I asked if he was offering
me 1.5X and I’m corrected. The general manager is offering it and the manager is merely
saying it to me. 
&lt;p&gt;
Whatever. 
&lt;p&gt;
I put up the stop hand and said, I think this is the best solution for both of us.
The manager knows to stop selling when the sale is over, so he turns to the cashier
and firmly states that this customer is going to only pay 1.5X of the amount on the
bill. 
&lt;p&gt;
I'm relieved that the issue resolved, yet still disappointed that it happened at all.
I'm out 0.5X, but I do have a few extra repairs on the car. Upon further review, I
think some of the repairs are a little suspect. For example, my car is perfect on
oil. It doesn't burn oil and my drive way is void of any oil spots. Why didn't I think
of that when the guy said the oil pan gasket was leaking on the phone? Arrrgg!! 
&lt;p&gt;
This is when Greg's term "trust, but verify" really became clear to me. My super smart
wife pointed out that I could have asked him to e-mail me the estimate. I also could
have asked him to call me back and leave the full estimate as a voice-mail on my phone
if they were email-impaired. The amount of money is large enough and use of my car
is important enough that I really should have been more diligent. I should have verified
the estimate instead of just trusting what I heard on the phone. 
&lt;p&gt;
Rats. Well, they say the awesome people can tell you all about their mistakes and
the incompetent never see their own mistakes. Here's one more thing on the pile that
I can learn from. I'm going to be riding the "trust, but verify" horse into the ground
for the next couple of weeks. Apologies, in advance, to all my teammates. 
&lt;p&gt;
I don't explain the identity of the repair shop or the amount here because you're
going to trust, but verify next time right? So, in that case, it doesn't matter who
I dealt with.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=c98c6a3b-380b-49e1-b3e7-14a8bd475500" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,c98c6a3b-380b-49e1-b3e7-14a8bd475500.aspx</comments>
      <category>learning</category>
      <category>observations</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=28ebd461-5445-4d7e-bf9c-31b33e0d8b52</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,28ebd461-5445-4d7e-bf9c-31b33e0d8b52.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,28ebd461-5445-4d7e-bf9c-31b33e0d8b52.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=28ebd461-5445-4d7e-bf9c-31b33e0d8b52</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I was crawling around the CodePlex site and discovered <a href="http://www.codeplex.com/GoogleBookDownloader">a
cool utility</a>:
</p>
        <p>
"Google Book Downloader is small utility which allows you to save book as PDF
from google to your local filesystem."
</p>
        <p>
Google has made public domain books accessible online and this .Net app can make them
accessible on a plane. What will they think of next?
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=28ebd461-5445-4d7e-bf9c-31b33e0d8b52" />
      </body>
      <title>Google Book Downloader</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,28ebd461-5445-4d7e-bf9c-31b33e0d8b52.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2009/02/18/GoogleBookDownloader.aspx</link>
      <pubDate>Wed, 18 Feb 2009 05:30:52 GMT</pubDate>
      <description>&lt;p&gt;
I was crawling around the CodePlex site and discovered &lt;a href="http://www.codeplex.com/GoogleBookDownloader"&gt;a
cool utility&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
&amp;quot;Google Book Downloader is small utility which allows you to save book as PDF
from google to your local filesystem.&amp;quot;
&lt;/p&gt;
&lt;p&gt;
Google has made public domain books accessible online and this .Net app can make them
accessible on a plane. What will they think of next?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=28ebd461-5445-4d7e-bf9c-31b33e0d8b52" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,28ebd461-5445-4d7e-bf9c-31b33e0d8b52.aspx</comments>
      <category>books</category>
      <category>fun</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=b191edc1-c409-4467-978e-ba58adab6d1d</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,b191edc1-c409-4467-978e-ba58adab6d1d.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,b191edc1-c409-4467-978e-ba58adab6d1d.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=b191edc1-c409-4467-978e-ba58adab6d1d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When I've needed to invoke a cache mechanism for data on a web site, I've happily
used the ASP.Net Cache object over the past few years. It's a nice model for storing
a chunk of data under a key until a specific time or for a given duration, providing
the application domain doesn't recycle.
</p>
        <p>
I've even hooked up some systems that resemble a Rube Goldberg apparatus to get the
same features as a job scheduler, but I don't like to talk about them. ASP.Net will
fire an event that you can use when something expires from the cache and therefore
give you the "Cache, Wait, Expire, Do Something, Repeat" model for solving
a job scheduling problem.
</p>
        <p>
.Net 2.0 and up supported the <a href="http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx">SqlCacheDependency</a> class.
One of its talents is the ability to expire a cached object when the underlying database
changes. Before this feature was available, you might wire up specific cache expiration
logic in relevant insert, update or delete functions of your app. However, that falls
short when the database is updated outside of the trip wires you set in your own code.
Another application might update that database, or someone might edit the database
through Query Analyzer.
</p>
        <p>
Way back in the day, my team set out to bag the big beast by writing a trigger in
SQL Server that would reach out an edit a text file whenever a specific table was
modified. This event would be observed by the cache dependency object that was good
at watching physical files for changes and ska-doosh! We've got our SQL Server cache
dependency working.
</p>
        <p>
Nowadays, those long, verbose methods aren't required. We've got a set of fancy new
tools, namely, the SqlCacheDependency object. Or so I thought.
</p>
        <p>
Its great that support goes all the way back to SQL Server 7, albeit via a costly
polling mechanism. SQL Server 2005 gave us a direct feedback loop that avoided the
polling system. I've know about this feature, as a concept, since it came out but
only in the past few weeks have I really looked at the code to use it and I'm honestly
a little shocked at the site. 
</p>
        <p>
I was really expecting something akin to the familiar practice of checking the cache
for the existence of the object, and if necessary, repopulation of the cache. It turns
out there's a few more steps, and a little craziness if you want to use LINQ to access
your database. 
</p>
        <p>
I'll always leave the door open and hope that some day I'll learn the super easy way
of doing this, but today, so much of this is in the non-trivial bucket that I'm really
tempted to leave it alone and continue my current caching practices.
</p>
        <p>
A year or more ago, I would reach for the data access block inside the <a href="http://www.codeplex.com/entlib">Enterprise
Library</a> as a default choice. It's a great data access layer and sure beats writing
all that goo on my own. Today, I'll reach for LINQ as my default choice. As I understand
it, Microsoft is touting the Entity Framework as the future of data access, but today,
I'm still sitting contently in the LINQ boat. Who knows what the future holds for
me.
</p>
        <p>
To be fair, the example code in MSDN that shows how to implement the SqlCacheDependency
actually looks pretty good when you're creating your own Command objects. Not much
to talk about there. But I was disappointed when I looked at the LINQ story. Perhaps
LINQ just got out ahead too far from the pack and better things are coming. 
</p>
        <p>
          <a href="http://code.msdn.microsoft.com/linqtosqlcache">One of the cleaner approaches
to caching LINQ data</a> I've seen was on the MSDN Code Gallery web site. Here, the
developer created a sweet extension method that creates the Command object on the
fly, executes the query and caches it all inside a generic method. It bears a little
more review on my part, but its neat enough that I thought I'd share it. Its less
than 50 lines of actual code, but they comment the crap out of it.
</p>
        <p>
The whole idea of having SQL Server notify ASP.Net involves more considerations than
the simplistic approach that served me well for years. For example, I can have SQL
Server watch a specific table, a set of tables, or a specific query (this last options
requires SQL Server 2005 or better). In addition, you'll need to start and stop the
entire process when the application domain comes up and gets recycled respectively.
You probably with a few lines of code in Global.asax. Finally, you're going to need
a few more elements inside your config file that describe a few more details of the
cache behavior. All in all, I like the direction, but I'll be happier when/if the
LINQ story improves.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=b191edc1-c409-4467-978e-ba58adab6d1d" />
      </body>
      <title>LINQ and the SqlCacheDependency</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,b191edc1-c409-4467-978e-ba58adab6d1d.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2009/01/28/LINQAndTheSqlCacheDependency.aspx</link>
      <pubDate>Wed, 28 Jan 2009 02:57:42 GMT</pubDate>
      <description>&lt;p&gt;
When I've needed to invoke a cache mechanism for data on a web site, I've happily
used the ASP.Net Cache object over the past few years. It's a nice model for storing
a chunk of data under a key until a specific time or for a given duration, providing
the application domain doesn't recycle.
&lt;/p&gt;
&lt;p&gt;
I've even hooked up some systems that resemble a Rube Goldberg apparatus to get the
same features as a job scheduler, but I don't like to talk about them. ASP.Net will
fire an event that you can use when something expires from the cache and therefore
give you the &amp;quot;Cache, Wait, Expire, Do Something, Repeat&amp;quot; model for solving
a job scheduling problem.
&lt;/p&gt;
&lt;p&gt;
.Net 2.0 and up supported the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx"&gt;SqlCacheDependency&lt;/a&gt; class.
One of its talents is the ability to expire a cached object when the underlying database
changes. Before this feature was available, you might wire up specific cache expiration
logic in relevant insert, update or delete functions of your app. However, that falls
short when the database is updated outside of the trip wires you set in your own code.
Another application might update that database, or someone might edit the database
through Query Analyzer.
&lt;/p&gt;
&lt;p&gt;
Way back in the day, my team set out to bag the big beast by writing a trigger in
SQL Server that would reach out an edit a text file whenever a specific table was
modified. This event would be observed by the cache dependency object that was good
at watching physical files for changes and ska-doosh! We've got our SQL Server cache
dependency working.
&lt;/p&gt;
&lt;p&gt;
Nowadays, those long, verbose methods aren't required. We've got a set of fancy new
tools, namely, the SqlCacheDependency object. Or so I thought.
&lt;/p&gt;
&lt;p&gt;
Its great that support goes all the way back to SQL Server 7, albeit via a costly
polling mechanism. SQL Server 2005 gave us a direct feedback loop that avoided the
polling system. I've know about this feature, as a concept, since it came out but
only in the past few weeks have I really looked at the code to use it and I'm honestly
a little shocked at the site. 
&lt;/p&gt;
&lt;p&gt;
I was really expecting something akin to the familiar practice of checking the cache
for the existence of the object, and if necessary, repopulation of the cache. It turns
out there's a few more steps, and a little craziness if you want to use LINQ to access
your database. 
&lt;/p&gt;
&lt;p&gt;
I'll always leave the door open and hope that some day I'll learn the super easy way
of doing this, but today, so much of this is in the non-trivial bucket that I'm really
tempted to leave it alone and continue my current caching practices.
&lt;/p&gt;
&lt;p&gt;
A year or more ago, I would reach for the data access block inside the &lt;a href="http://www.codeplex.com/entlib"&gt;Enterprise
Library&lt;/a&gt; as a default choice. It's a great data access layer and sure beats writing
all that goo on my own. Today, I'll reach for LINQ as my default choice. As I understand
it, Microsoft is touting the Entity Framework as the future of data access, but today,
I'm still sitting contently in the LINQ boat. Who knows what the future holds for
me.
&lt;/p&gt;
&lt;p&gt;
To be fair, the example code in MSDN that shows how to implement the SqlCacheDependency
actually looks pretty good when you're creating your own Command objects. Not much
to talk about there. But I was disappointed when I looked at the LINQ story. Perhaps
LINQ just got out ahead too far from the pack and better things are coming. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://code.msdn.microsoft.com/linqtosqlcache"&gt;One of the cleaner approaches
to caching LINQ data&lt;/a&gt; I've seen was on the MSDN Code Gallery web site. Here, the
developer created a sweet extension method that creates the Command object on the
fly, executes the query and caches it all inside a generic method. It bears a little
more review on my part, but its neat enough that I thought I'd share it. Its less
than 50 lines of actual code, but they comment the crap out of it.
&lt;/p&gt;
&lt;p&gt;
The whole idea of having SQL Server notify ASP.Net involves more considerations than
the simplistic approach that served me well for years. For example, I can have SQL
Server watch a specific table, a set of tables, or a specific query (this last options
requires SQL Server 2005 or better). In addition, you'll need to start and stop the
entire process when the application domain comes up and gets recycled respectively.
You probably with a few lines of code in Global.asax. Finally, you're going to need
a few more elements inside your config file that describe a few more details of the
cache behavior. All in all, I like the direction, but I'll be happier when/if the
LINQ story improves.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=b191edc1-c409-4467-978e-ba58adab6d1d" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,b191edc1-c409-4467-978e-ba58adab6d1d.aspx</comments>
      <category>asp.net</category>
      <category>LINQ</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=016fc5cd-09f7-4123-bb5f-0919d75883fd</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,016fc5cd-09f7-4123-bb5f-0919d75883fd.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,016fc5cd-09f7-4123-bb5f-0919d75883fd.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=016fc5cd-09f7-4123-bb5f-0919d75883fd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm digging the <a href="http://www.nbcolympics.com">http://www.nbcolympics.com</a> site
in Silverlight. I can see sports and interviews that I'm interested in and review
close plays as much as I like. I've shown this to the wife and the extended family
over the weekend.
</p>
        <p>
One thing that really keeping this from being the best thing ever is the user experience.
For example, the Control Room is a place where I can select up to four videos to watch
at once; one large and three side videos. That's really cool. However, the extended
family was the real test; and they were a little frustrated.
</p>
        <p>
The sucky part of the Control Room is the search interface. Here, I'm given
a tiny up/down arrow at the bottom of the thumbnail stack. This is something
visitors will do many times, every time they visit the site to see the next six or
previous six videos in the stack. Why not make this click experience really easy to
hit with big, phat arrow overlay icons? Maybe even advertise key strokes that do this.
Its just really frustrating for non-technical people to use.
</p>
        <p>
There's too many obfuscated clicks like this in the app. Just a few slight
UX improvements would have gone a long way here. NBC Silverlight team, I give you
a straight B here. Good job on the insight to give us what we want (choice in viewing
Olympic events), but a "meh" job in giving me to the tools to make that choice.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=016fc5cd-09f7-4123-bb5f-0919d75883fd" />
      </body>
      <title>nbcolympics.com</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,016fc5cd-09f7-4123-bb5f-0919d75883fd.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2008/08/11/nbcolympicscom.aspx</link>
      <pubDate>Mon, 11 Aug 2008 06:00:47 GMT</pubDate>
      <description>&lt;p&gt;
I'm digging the &lt;a href="http://www.nbcolympics.com"&gt;http://www.nbcolympics.com&lt;/a&gt;&amp;nbsp;site
in Silverlight. I can see sports and interviews that I'm interested in and review
close plays as much as I like. I've shown this to the wife and the extended family
over the weekend.
&lt;/p&gt;
&lt;p&gt;
One thing that really keeping this from being the best thing ever is the user experience.
For example, the Control Room is a place where I can select up to four videos to watch
at once; one large and three side videos. That's really cool. However, the extended
family was the real test; and they were a little frustrated.
&lt;/p&gt;
&lt;p&gt;
The sucky part of the Control Room&amp;nbsp;is the search interface.&amp;nbsp;Here, I'm given
a&amp;nbsp;tiny up/down arrow at the bottom of the thumbnail stack. This is something
visitors will do many times, every time they visit the site to see the next six or
previous six videos in the stack. Why not make this click experience&amp;nbsp;really easy&amp;nbsp;to
hit with big, phat arrow overlay icons? Maybe even advertise key strokes that do this.
Its just really frustrating for non-technical people to use.
&lt;/p&gt;
&lt;p&gt;
There's too many obfuscated clicks like&amp;nbsp;this&amp;nbsp;in the app. Just a few slight
UX improvements would have gone a long way here. NBC Silverlight team, I give you
a straight B here. Good job on the insight to give us what we want (choice in viewing
Olympic events), but a "meh" job in giving me to the tools to make that choice.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=016fc5cd-09f7-4123-bb5f-0919d75883fd" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,016fc5cd-09f7-4123-bb5f-0919d75883fd.aspx</comments>
      <category>events</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=35ffe8e7-0e42-4d41-b896-fbe20e027084</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,35ffe8e7-0e42-4d41-b896-fbe20e027084.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,35ffe8e7-0e42-4d41-b896-fbe20e027084.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=35ffe8e7-0e42-4d41-b896-fbe20e027084</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There's a really cuil set of <a href="http://www.boston.com/bigpicture/2008/08/the_large_hadron_collider.html">photos
showing the Large Hadron Collider</a> being setup in Europe. Very high tech stuff. 
</p>
        <p>
Just a little bit down from the top of the photo stack is an image of someone way
down the aisle in the server room. You get the idea that there are just racks and
racks and racks of servers with a mind for effective use of power consumption, space
utilization, heat and all the other green elements.
</p>
        <p>
The person at the end of the aisle is working on a server. They're sitting at a workstation,
typing on a keyboard... looking at a monitor. Not a slick flat screen, but a huge
honking cathode ray tube monitor from 1994! Hah! That thing probably takes up the
space of three or four servers and gives off as much heat!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=35ffe8e7-0e42-4d41-b896-fbe20e027084" />
      </body>
      <title>Which one of these things doesn't belong?</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,35ffe8e7-0e42-4d41-b896-fbe20e027084.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2008/08/09/WhichOneOfTheseThingsDoesntBelong.aspx</link>
      <pubDate>Sat, 09 Aug 2008 17:32:43 GMT</pubDate>
      <description>&lt;p&gt;
There's a really cuil set of &lt;a href="http://www.boston.com/bigpicture/2008/08/the_large_hadron_collider.html"&gt;photos
showing the Large Hadron Collider&lt;/a&gt; being setup in Europe. Very high tech stuff. 
&lt;/p&gt;
&lt;p&gt;
Just a little bit down from the top of the photo stack is an image of someone way
down the aisle in the server room. You get the idea that there are just racks and
racks and racks of servers with a mind for effective use of power consumption, space
utilization, heat and all the other green elements.
&lt;/p&gt;
&lt;p&gt;
The person at the end of the aisle is working on a server. They're sitting at a workstation,
typing on a keyboard... looking at a monitor. Not a slick flat screen, but a huge
honking cathode ray tube monitor from 1994! Hah! That thing probably takes up the
space of three or four servers and gives off as much heat!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=35ffe8e7-0e42-4d41-b896-fbe20e027084" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,35ffe8e7-0e42-4d41-b896-fbe20e027084.aspx</comments>
      <category>hardware</category>
      <category>observations</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=1a932d00-9118-4880-836d-1f88e95f4bec</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,1a932d00-9118-4880-836d-1f88e95f4bec.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,1a932d00-9118-4880-836d-1f88e95f4bec.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1a932d00-9118-4880-836d-1f88e95f4bec</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just had a Pwop moment (<a href="http://franklins.net/carl.aspx">the sound of a
forehead slap</a>) with LINQ:
</p>
        <p>
I needed to retrieve a distinct list of years contained in a collection of objects.
The data was in the form of an generic List&lt;T&gt;, already loaded into memory.
So without thinking too much about it, I sat down and wrote a quick LINQ expression
that included the Distinct() operator and since the years were actually properties
on the objects, I wrote my own implementation of IEqualityComparer. 
</p>
        <p>
It had some problems because the resulting data was not really all that distinct,
and then it happened: PWOP!
</p>
        <p>
I don't need to implement an interface. I can simply use the default equality comparer
for a List&lt;int&gt; like so.
</p>
        <p>
          <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="177" alt="LINQ Distinct() Operator" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/PwopMomentswithLINQ_9902/GetDistinctYearList_3.png" width="390" border="0" />
        </p>
        <p>
Gah!
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=1a932d00-9118-4880-836d-1f88e95f4bec" />
      </body>
      <title>Pwop Moments with LINQ</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,1a932d00-9118-4880-836d-1f88e95f4bec.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2008/07/31/PwopMomentsWithLINQ.aspx</link>
      <pubDate>Thu, 31 Jul 2008 17:52:54 GMT</pubDate>
      <description>&lt;p&gt;
I just had a Pwop moment (&lt;a href="http://franklins.net/carl.aspx"&gt;the sound of a
forehead slap&lt;/a&gt;) with LINQ:
&lt;/p&gt;
&lt;p&gt;
I needed to retrieve a distinct list of years contained in a collection of objects.
The data was in the form of an generic List&amp;lt;T&amp;gt;, already loaded into memory.
So without thinking too much about it, I sat down and wrote a quick LINQ expression
that included the Distinct() operator and since the years were actually properties
on the objects, I wrote my own implementation of IEqualityComparer. 
&lt;/p&gt;
&lt;p&gt;
It had some problems because the resulting data was not really all that distinct,
and then it happened: PWOP!
&lt;/p&gt;
&lt;p&gt;
I don't need to implement an interface. I can simply use the default equality comparer
for a List&amp;lt;int&amp;gt; like so.
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="177" alt="LINQ Distinct() Operator" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/PwopMomentswithLINQ_9902/GetDistinctYearList_3.png" width="390" border="0" /&gt;
&lt;/p&gt;
&lt;p&gt;
Gah!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=1a932d00-9118-4880-836d-1f88e95f4bec" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,1a932d00-9118-4880-836d-1f88e95f4bec.aspx</comments>
      <category>LINQ</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=0da8418b-fa06-4646-95e4-539ca754d570</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,0da8418b-fa06-4646-95e4-539ca754d570.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,0da8418b-fa06-4646-95e4-539ca754d570.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0da8418b-fa06-4646-95e4-539ca754d570</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Behind the scenes, I see a lot of companies run on Excel and duct tape. So it's common
for clients to hand me a slab of data organized into neat little rows and columns.
Excel is just a handy way to throw some data over the wall and get things done. This
might be a list of dealers, a collection of user profiles, product information, or
anything that just needs to get somewhere else.
</p>
        <p>
Depending on the scenario, I'll might massage this data and slide it into a SQL Server
database or an XML file. I'm a web developer so I use the ADO.Net stack on a regular
basis. If I were a Windows client developer, I might prefer to solve this problem
with the Excel object model, but that really looks like more code to me, so here's
how I like to roll:
</p>
        <p>
The following code block accepts an Excel file path and returns an ordinary DataTable
object, which can be manipulated easily by the code that calls this method. The first
row of the Excel document becomes the columns in the DataTable object and each row
thereafter are DataRow objects.
</p>
        <p>
          <a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ImportingDataFromExcelwithC_7CBC/ImportDataFromExcel_2.png">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="148" alt="ImportDataFromExcel" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ImportingDataFromExcelwithC_7CBC/ImportDataFromExcel_thumb.png" width="244" border="0" />
          </a>
          <br />
(Click to enlarge)
</p>
        <p>
If you like, <a href="http://support.microsoft.com/kb/306023">take a look at both
techniques for working with Excel data</a> and see what one speaks to you. With this
block of code, I can happily accept large chunks of data from a client without spending
precious time fiddling with administrivia.
</p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=0da8418b-fa06-4646-95e4-539ca754d570" />
      </body>
      <title>Importing Data From Excel In C#</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,0da8418b-fa06-4646-95e4-539ca754d570.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2008/07/31/ImportingDataFromExcelInC.aspx</link>
      <pubDate>Thu, 31 Jul 2008 16:00:16 GMT</pubDate>
      <description>&lt;p&gt;
Behind the scenes, I see a lot of companies run on Excel and duct tape. So it's common
for clients to hand me a slab of data organized into neat little rows and columns.
Excel is just a handy way to throw some data over the wall and get things done. This
might be a list of dealers, a collection of user profiles, product information, or
anything that just needs to get somewhere else.
&lt;/p&gt;
&lt;p&gt;
Depending on the scenario, I'll might massage this data and slide it into a SQL Server
database or an XML file. I'm a web developer so I use the ADO.Net stack on a regular
basis. If I were a Windows client developer, I might prefer to solve this problem
with the Excel object model, but that really looks like more code to me, so here's
how I like to roll:
&lt;/p&gt;
&lt;p&gt;
The following code block accepts an Excel file path and returns an ordinary DataTable
object, which can be manipulated easily by the code that calls this method. The first
row of the Excel document becomes the columns in the DataTable object and each row
thereafter are DataRow objects.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ImportingDataFromExcelwithC_7CBC/ImportDataFromExcel_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="148" alt="ImportDataFromExcel" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/ImportingDataFromExcelwithC_7CBC/ImportDataFromExcel_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; 
&lt;br /&gt;
(Click to enlarge)
&lt;/p&gt;
&lt;p&gt;
If you like, &lt;a href="http://support.microsoft.com/kb/306023"&gt;take a look at both
techniques for working with Excel data&lt;/a&gt; and see what one speaks to you. With this
block of code, I can happily accept large chunks of data from a client without spending
precious time fiddling with administrivia.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=0da8418b-fa06-4646-95e4-539ca754d570" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,0da8418b-fa06-4646-95e4-539ca754d570.aspx</comments>
      <category>asp.net</category>
      <category>software</category>
      <category>SQL Server</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=e950a55d-fffd-41dd-9155-f68ba128225c</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,e950a55d-fffd-41dd-9155-f68ba128225c.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,e950a55d-fffd-41dd-9155-f68ba128225c.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=e950a55d-fffd-41dd-9155-f68ba128225c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
What's the deal with these online social networking sites? After you sign up, they
casually ask for your credentials to other locations so they can provide some handy
service. <a href="http://www.codinghorror.com/blog/archives/001128.html">Jeff Atwood
noted it recently</a>, and I've just experienced it on <a href="http://pulse.plaxo.com">Plaxo</a>.
Huh... That's nice, but no thank you, and please don't ask any of my friends either.
</p>
        <p>
          <a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/Wewontstoreyourpassword_9704/plaxo_2.jpg">
            <img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="500" alt="plaxo" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/Wewontstoreyourpassword_9704/plaxo_thumb.jpg" width="583" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=e950a55d-fffd-41dd-9155-f68ba128225c" />
      </body>
      <title>We won't store your password</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,e950a55d-fffd-41dd-9155-f68ba128225c.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2008/06/17/WeWontStoreYourPassword.aspx</link>
      <pubDate>Tue, 17 Jun 2008 17:44:21 GMT</pubDate>
      <description>&lt;p&gt;
What's the deal with these online social networking sites? After you sign up, they
casually ask for your credentials to other locations so they can provide some handy
service. &lt;a href="http://www.codinghorror.com/blog/archives/001128.html"&gt;Jeff Atwood
noted it recently&lt;/a&gt;, and I've just experienced it on &lt;a href="http://pulse.plaxo.com"&gt;Plaxo&lt;/a&gt;.
Huh... That's nice, but no thank you, and please don't ask any of my friends either.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/Wewontstoreyourpassword_9704/plaxo_2.jpg"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=500 alt=plaxo src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/Wewontstoreyourpassword_9704/plaxo_thumb.jpg" width=583 border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=e950a55d-fffd-41dd-9155-f68ba128225c" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,e950a55d-fffd-41dd-9155-f68ba128225c.aspx</comments>
      <category>security</category>
    </item>
    <item>
      <trackback:ping>http://www.andrewdothay.net/blog/Trackback.aspx?guid=7db8d778-014d-4673-a147-8f2de6b5f712</trackback:ping>
      <pingback:server>http://www.andrewdothay.net/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.andrewdothay.net/blog/PermaLink,guid,7db8d778-014d-4673-a147-8f2de6b5f712.aspx</pingback:target>
      <dc:creator>Andrew Hay</dc:creator>
      <wfw:comment>http://www.andrewdothay.net/blog/CommentView,guid,7db8d778-014d-4673-a147-8f2de6b5f712.aspx</wfw:comment>
      <wfw:commentRss>http://www.andrewdothay.net/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=7db8d778-014d-4673-a147-8f2de6b5f712</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I noticed this when I left the house this morning. Le Wife dislikes the roses due
to the maintenance they require and this isn't helping matters at all.<a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/DangRoses_EAC0/mean-roses_2.jpg"></a></p>
        <p>
          <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="304" alt="mean-roses" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/DangRoses_EAC0/mean-roses_3.jpg" width="404" border="0" />
        </p>
        <img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=7db8d778-014d-4673-a147-8f2de6b5f712" />
      </body>
      <title>Dang Roses</title>
      <guid isPermaLink="false">http://www.andrewdothay.net/blog/PermaLink,guid,7db8d778-014d-4673-a147-8f2de6b5f712.aspx</guid>
      <link>http://www.andrewdothay.net/blog/2008/05/28/DangRoses.aspx</link>
      <pubDate>Wed, 28 May 2008 23:41:39 GMT</pubDate>
      <description>&lt;p&gt;
I noticed this when I left the house this morning. Le Wife dislikes the roses due
to the maintenance they require and this isn't helping matters at all.&lt;a href="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/DangRoses_EAC0/mean-roses_2.jpg"&gt;&lt;/a&gt; 
&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="304" alt="mean-roses" src="http://www.andrewdothay.net/blog/content/binary/WindowsLiveWriter/DangRoses_EAC0/mean-roses_3.jpg" width="404" border="0" /&gt;
&lt;/p&gt;
&gt;
&lt;img width="0" height="0" src="http://www.andrewdothay.net/blog/aggbug.ashx?id=7db8d778-014d-4673-a147-8f2de6b5f712" /&gt;</description>
      <comments>http://www.andrewdothay.net/blog/CommentView,guid,7db8d778-014d-4673-a147-8f2de6b5f712.aspx</comments>
      <category>observations</category>
    </item>
  </channel>
</rss>