Posts Tagged ‘Outbursts’

My Starbucks disappointment

Written by Cornelius J. van Dyk on . Posted in Blog

So I just stepped off a long 5 hour flight from LAX to IND and headed to my favorite coffee shop for my morning Joe.  I wait in line and since it’s early and I’m hungry, I decided to also get an cheese bagel.  I was handed the bagel in a bag with cream cheese, but the bagel is uncut???!!!  I ask if they have some way to cut the bagel and they point out that I have a plastic knife in the bag.  A plastic knife?!  That’s barely able to SPREAD the cream cheese let alone cut it.  They must have have sensed my disappointment after I uttered “That’s OK.  I’ll just saw through my bagel with my plastic knife.” because in their defense, they offered to cut it for me… so I let them.

Seriously Starbucks? What the ???  If you’re going to sell bagels, how about spending $5 for a bagel cutter?  It’s a tiny little addition that makes a huge difference on the impression of your patrons!



Cheers
C




image

Why I think the Firefox 4 designers are retarded

Written by Cornelius J. van Dyk on . Posted in Blog

I’ve long since been an Internet Explorer holdout.  Living daily in the SharePoint world as I do, I’ve had to stick with IE through some really bad versions.  Now to be fair, what makes a version bad for ME is personal, biased and based completely on my experience with the product.  Unfortunately, like I always tell my Boot Camp attendees, “Perception IS Reality!”

To an end user, that is the absolute truth and as the consumer of the browser product, I am that user… and I am VERY unforgiving.  So why did I consider IE 6, 7 & 8 to be “bad”.  It all revolved around one thing.  The way I work.  I am always browsing in a dozen different places and then opening tabs that I want to get back to later.  In IE6, we didn’t even HAVE tabs.  That was such an annoyance because we were forced to open multiple IE windows instead.  It annoyed me to the point of writing a special app that would save your open IE windows and reload them after a reboot.

Then came IE7 and it brought with it tabs.  Too bad it lost all the tabs when it crashed.  At that point Firefox 3 was around with tabs and it DID restore tabs after a crash.  It even had a cute little “Oops, we’re sorry” message.  That was the point where many people started moving to Firefox as their main browser.  I started using Firefox but IE remained my main browser.  When I was browsing something I wanted to save for later, I’d do it in Firefox.  When I was doing anything else I ‘d be using IE.

Next came IE8… surely they’d have fixed the tab loss bug by this point, right?  Nope.  To my dismay, IE still lost my tabs after a crash.  At least I had a workaround in Firefox so I kept on doing that.  Now I think it’s a good thing that Firefox always tries to get you to upgrade to the latest version.

But then came Firefox 4.  With great fanfare I went along and upgraded to the latest version.  Imagine my horror when I re-opened Firefox expecting 20 odd tabs to open and there was just the home screen!!!  AAARRRGGGHHH!!!  What happened?  OK, I figured it must now be an optional settings somewhere.  I looked for it, but I couldn’t find it in any obvious location… and I’m a developer!  So if I couldn’t find it, I knew other people were having trouble too.  I ended having to search the Mozilla support site to finally find the answer and here it is:

This is where everyone in their right mind would look, right?  Under the “Tabs” menu… maybe something like “Restore tabs after crash” or something to that effect.

 

image

 

No, no, that would makes sense.  Nope, it’s not under that tab.  The tabs option for restoring your tabs is actually on the “General” tab.  Well of course!  Why didn’t I see that.  If you’re like me, you’re looking at the “General” tab and saying… um… where exactly is that option?  Well you have to look at the hidden dropdown values in the “When Firefox starts” item.

 

image

 

And change that item to be thus:

 

image

 

NOW Firefox is back to NORMAL and will save your tabs again.  Sigh.  So why my soapbox moment?

  1. Tabs is what MADE Firefox popular to begin with.
  2. I’m sure I’m not the only person on the planet that appreciated the fact it would ALWAYS recover you tabs.
  3. So having such great tab features, why for Pete’s sake would you go and make that an OPTIONAL settings???!!!   If you have to make it an optional setting, at least turn it on by default!
  4. And if you’re gonna make us hunt and peck for the answer, please just put the thing where we can actually FIND it without having to waste time searching your support forum for answers and then writing long winded tirades blog posts that waste even more time!

Whoever decided to change how tabs works in 4 is… well… nuf said…

And THAT, dear reader, is why this post is titled as it is.

Point in case…

image

 

So I want to point out that IE9 finally seems to do the tabs right and correctly restores tabs in a new session… and it does it BY DEFAULT Firefox!

 



Cheers
C




image

How do I – Filter values in two lists of custom classes using Linq

Written by Cornelius J. van Dyk on . Posted in How Do I...

I originally titled this post “Linq – So wonderful and oh so damn frustrating”, but then decided that the post probably warrants its current name since someone might actually be trying to do the same thing and search for examples of how to achieve that.  There are tons of examples of just how cool Linq is and I’m not saying that it isn’t, but man it can be so frustrating to work with at times.  Now I’m not going to pretend that I’m a Linq expert.  I’m not.  I know just enough to be dangerous.  Linq has been useful to me in the past, but this week I stumbled across an issue that just drove me batty!

<rant>
Just this weekend I was telling Jess (my wonderful SciFi, geeky wife) that 80% of a developer’s time is spent figuring out why code (methods & APIs) does NOT work the way it’s supposed to.  Not how we THINK it’s supposed to work, but how it was PUBLISHED and advertised to work.  
</rant>

OK, off my soapbox and back to the Linq issue…

I have a class defined as SystemFile.  I’m basically trying to compare a folder with all its files and sub folders to another folder with its files and sub folders.  In the process I have two lists of SystemFile containing the info about the two folders I wish to compare.  Using Linq to compare the lists, we can define a comparer class of type IEqualityComparer<T> to do the comparison of our custom class and assist in the filtering.  My comparer class is defined thus:

 

public class SystemFileGACComparor : IEqualityComparer<SystemFile>
{
    public bool Equals(SystemFile source, SystemFile target)
    {
        if (source.FullPath.ToLower().Contains(@"c:\windows\assembly\temp"))
        {
            return true;
        }
        else
        {
            if (source.FullPath.ToLower().Contains(@"c:\windows\assembly\tmp"))
            {
                return true;
            }
            else
            {
                if (source.FullPath == target.FullPath)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }

    public int GetHashCode(SystemFile source)
    {
        return source.FullPath.GetHashCode();
    }
}

 

A note about my logic.  The easiest code implementation of the Equals() method could have been simply as

   return (source.FullPath == target.FullPath);

but since I am actually comparing GAC folders in this case, there are the the “Temp” and “Tmp” folders to consider (and exclude) in my comparison.  Since “Tmp” is used during installation and “Temp” during uninstallation of of assemblies, they will have temporary GUID values in their path names which will always be different between systems.  As a result, we have to exclude anything from these folders in our comparison.  For that reason, I added the checks for these folders in the path of the source being checked.

With the comparer class in place, let’s implement it.  The code is straight forward thus:

 

SystemFileGACComparor compare = new SystemFileGACComparor();
IEnumerable<SystemFile> sfSource = LoadFileListFromXML("1WEB.xml");
IEnumerable<SystemFile> sfTarget = LoadFileListFromXML("1APP.xml");
List<SystemFile> lstOnSourceNotTarget = sfSource.Except(sfTarget, compare).ToList();

First we define a an instance of the comparer class for use.
Then we load the XML dump of our two lists into an IEnumerable<SystemFile> structure so that Linq can work on them.
Now simply ask Linq to compare the two lists and produce a list with the differences.  Per the published MSDN documentation, the Except() method will take our sfSource and remove any records that it finds in sfTarget that match, finally returning what remains.

For the record, here is what I’m comparing:

1WEB.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<GAC>
  <File FullPath=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a\adodb.dll” FileName=”adodb.dll” Size=”110592″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a” CreatedAt=”2010-07-07T14:27:58.103-04:00″ LastModifiedAt=”2010-07-07T14:27:58.119-04:00″ LastAccessedAt=”2010-07-07T14:27:58.103-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a\__AssemblyInfo__.ini” FileName=”__AssemblyInfo__.ini” Size=”196″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a” CreatedAt=”2010-07-07T14:29:40.671-04:00″ LastModifiedAt=”2010-07-07T14:29:40.703-04:00″ LastAccessedAt=”2010-07-07T14:29:40.671-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a” FileName=”7.0.3300.0__b03f5f7f11d50a3a” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\GAC\ADODB” CreatedAt=”2010-07-07T14:27:58.103-04:00″ LastModifiedAt=”2010-07-07T14:29:40.671-04:00″ LastAccessedAt=”2010-07-07T14:29:40.671-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\ADODB” FileName=”ADODB” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\GAC” CreatedAt=”2010-07-07T14:29:40.703-04:00″ LastModifiedAt=”2010-07-07T14:29:40.718-04:00″ LastAccessedAt=”2010-07-07T14:29:40.718-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.0__b03f5f7f11d50a3a\envdte.dll” FileName=”envdte.dll” Size=”245760″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.0__b03f5f7f11d50a3a” CreatedAt=”2010-07-13T11:42:59.953-04:00″ LastModifiedAt=”2010-07-13T11:42:59.968-04:00″ LastAccessedAt=”2010-07-13T11:42:59.953-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.0__b03f5f7f11d50a3a\__AssemblyInfo__.ini” FileName=”__AssemblyInfo__.ini” Size=”194″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.0__b03f5f7f11d50a3a” CreatedAt=”2010-07-13T11:43:16.625-04:00″ LastModifiedAt=”2010-07-13T11:43:16.625-04:00″ LastAccessedAt=”2010-07-13T11:43:16.625-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.0__b03f5f7f11d50a3a” FileName=”8.0.0.0__b03f5f7f11d50a3a” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\GAC\EnvDTE” CreatedAt=”2010-07-13T11:42:59.953-04:00″ LastModifiedAt=”2010-07-13T11:43:16.625-04:00″ LastAccessedAt=”2010-07-13T11:43:16.625-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\EnvDTE” FileName=”EnvDTE” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\GAC” CreatedAt=”2010-07-13T11:43:16.64-04:00″ LastModifiedAt=”2010-07-13T11:43:16.64-04:00″ LastAccessedAt=”2010-07-13T11:43:16.64-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp\30ROE94YXW\One.MasterPages.dll” FileName=”One.MasterPages.dll” Size=”6144″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\temp\30ROE94YXW” CreatedAt=”2010-10-11T10:43:21.996-04:00″ LastModifiedAt=”2010-10-11T10:43:21.996-04:00″ LastAccessedAt=”2010-10-11T10:43:21.996-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp\30ROE94YXW” FileName=”30ROE94YXW” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\temp” CreatedAt=”2010-10-11T15:27:36.922-04:00″ LastModifiedAt=”2010-10-11T15:27:36.922-04:00″ LastAccessedAt=”2010-10-11T15:27:36.922-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp\5ZY4HSUIYK\One.EVMS.Dashboard.dll” FileName=”One.EVMS.Dashboard.dll” Size=”837632″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\temp\5ZY4HSUIYK” CreatedAt=”2010-10-04T08:56:07.183-04:00″ LastModifiedAt=”2010-10-04T08:56:07.277-04:00″ LastAccessedAt=”2010-10-04T08:56:07.183-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp\5ZY4HSUIYK” FileName=”5ZY4HSUIYK” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\temp” CreatedAt=”2010-10-11T10:51:38.965-04:00″ LastModifiedAt=”2010-10-11T10:51:38.965-04:00″ LastAccessedAt=”2010-10-11T10:51:38.965-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp” FileName=”temp” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly” CreatedAt=”2009-07-14T00:58:28.892-04:00″ LastModifiedAt=”2010-10-11T17:33:53.016-04:00″ LastAccessedAt=”2010-10-11T17:33:53.016-04:00″ />
  <File FullPath=”C:\Windows\Assembly\tmp” FileName=”tmp” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly” CreatedAt=”2010-07-07T14:18:45.924-04:00″ LastModifiedAt=”2010-10-11T17:35:50.969-04:00″ LastAccessedAt=”2010-10-11T17:35:50.953-04:00″ />
</GAC>

1APP.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<GAC>
  <File FullPath=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a\adodb.dll” FileName=”adodb.dll” Size=”110599″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a” CreatedAt=”2010-07-07T14:27:58.103-04:00″ LastModifiedAt=”2010-07-07T14:27:58.119-04:00″ LastAccessedAt=”2010-07-07T14:27:58.103-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a\__AssemblyInfo__.ini” FileName=”__AssemblyInfo__.ini” Size=”196″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a” CreatedAt=”2010-07-07T14:29:40.671-04:00″ LastModifiedAt=”2010-07-07T14:29:40.703-04:00″ LastAccessedAt=”2010-07-07T14:29:40.671-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\ADODB\7.0.3300.0__b03f5f7f11d50a3a” FileName=”7.0.3300.0__b03f5f7f11d50a3a” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\GAC\ADODB” CreatedAt=”2010-07-07T14:27:58.103-04:00″ LastModifiedAt=”2010-07-07T14:29:40.671-04:00″ LastAccessedAt=”2010-07-07T14:29:40.671-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\ADODB” FileName=”ADODB” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\GAC” CreatedAt=”2010-07-07T14:29:40.703-04:00″ LastModifiedAt=”2010-07-07T14:29:40.718-04:00″ LastAccessedAt=”2010-07-07T14:29:40.718-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.1__b03f5f7f11d50a3a\envdte.dll” FileName=”envdte.dll” Size=”245760″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.0__b03f5f7f11d50a3a” CreatedAt=”2010-07-13T11:42:59.953-04:00″ LastModifiedAt=”2010-07-13T11:42:59.968-04:00″ LastAccessedAt=”2010-07-13T11:42:59.953-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.1__b03f5f7f11d50a3a\__AssemblyInfo__.ini” FileName=”__AssemblyInfo__.ini” Size=”194″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.0__b03f5f7f11d50a3a” CreatedAt=”2010-07-13T11:43:16.625-04:00″ LastModifiedAt=”2010-07-13T11:43:16.625-04:00″ LastAccessedAt=”2010-07-13T11:43:16.625-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\EnvDTE\8.0.0.1__b03f5f7f11d50a3a” FileName=”8.0.0.0__b03f5f7f11d50a3a” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\GAC\EnvDTE” CreatedAt=”2010-07-13T11:42:59.953-04:00″ LastModifiedAt=”2010-07-13T11:43:16.625-04:00″ LastAccessedAt=”2010-07-13T11:43:16.625-04:00″ />
  <File FullPath=”C:\Windows\Assembly\GAC\EnvDTE” FileName=”EnvDTE” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\GAC” CreatedAt=”2010-07-13T11:43:16.64-04:00″ LastModifiedAt=”2010-07-13T11:43:16.64-04:00″ LastAccessedAt=”2010-07-13T11:43:16.64-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp\33ROE94YXW\One.MasterPages.dll” FileName=”One.MasterPages.dll” Size=”6144″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\temp\30ROE94YXW” CreatedAt=”2010-10-11T10:43:21.996-04:00″ LastModifiedAt=”2010-10-11T10:43:21.996-04:00″ LastAccessedAt=”2010-10-11T10:43:21.996-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp\33ROE94YXW” FileName=”30ROE94YXW” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\temp” CreatedAt=”2010-10-11T15:27:36.922-04:00″ LastModifiedAt=”2010-10-11T15:27:36.922-04:00″ LastAccessedAt=”2010-10-11T15:27:36.922-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp\53Y4HSUIYK\One.EVMS.Dashboard.dll” FileName=”One.EVMS.Dashboard.dll” Size=”837632″ IsReadOnly=”false” IsFolder=”false” DirectoryName=”C:\Windows\Assembly\temp\5ZY4HSUIYK” CreatedAt=”2010-10-04T08:56:07.183-04:00″ LastModifiedAt=”2010-10-04T08:56:07.277-04:00″ LastAccessedAt=”2010-10-04T08:56:07.183-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp\53Y4HSUIYK” FileName=”5ZY4HSUIYK” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly\temp” CreatedAt=”2010-10-11T10:51:38.965-04:00″ LastModifiedAt=”2010-10-11T10:51:38.965-04:00″ LastAccessedAt=”2010-10-11T10:51:38.965-04:00″ />
  <File FullPath=”C:\Windows\Assembly\temp” FileName=”temp” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly” CreatedAt=”2009-07-14T00:58:28.892-04:00″ LastModifiedAt=”2010-10-11T17:33:53.016-04:00″ LastAccessedAt=”2010-10-11T17:33:53.016-04:00″ />
  <File FullPath=”C:\Windows\Assembly\tmp” FileName=”tmp” Size=”0″ IsReadOnly=”false” IsFolder=”true” DirectoryName=”C:\Windows\Assembly” CreatedAt=”2010-07-07T14:18:45.924-04:00″ LastModifiedAt=”2010-10-11T17:35:50.969-04:00″ LastAccessedAt=”2010-10-11T17:35:50.953-04:00″ />
</GAC>

When we run through the code and break after the Except() method, this is what we see for the sfSource an sfTarget:

 

image

As we expected, we see all the files in the sfSource.  Now let’s look at the value of the results list lstOnSourceNotTarget:

 

image

Hmm… that’s curious… I expected the three EnvDTE records to be there, but the \temp\ files SHOULD have been filtered out by our comparer class’ Equal() method, right?

Confused, I set a break inside our comparer class and rerun our code to see what is actually being compared and filtered.  This is what we see:

Breaking here:

 

image

First break

 

image

Second break

 

image

Third break

 

image

Fourth break

 

image

Fifth break

 

image

Sixth break

 

image

Seventh break

 

image

And ???

 

image

Hmm… Seven breaks for 14 files and NONE of them were the 4 that shows up at the end with \temp\ in the name.  WTF???!!!

Are you confused?  I sure am!!!

The closest thing to a “rationalization” I can make for myself on this is that it has something to do with Linq’s LAZY nature.  So the items doesn’t get checked unless I iterate over them.  (I thought that’s what the Except() method was doing, but oh well…).

OK, enough time spent on something that DOESN’T WORK AS PUBLISHED!!!

Let’s get a workaround in place…

We can use the Where() method in Linq to get the subset of records that actually contains the string we’re trying to parse out and then reversing our logic, we can pass that set of records to the Except() method to exclude them from the original list.  Our new code looks like this: 

 

SystemFileGACComparor compare = new SystemFileGACComparor();
IEnumerable<SystemFile> sfSource = LoadFileListFromXML("1WEB.xml");
sfSource = sfSource.Except(
    sfSource.Where(filter => filter.FullPath.ToLower().Contains(@"c:\windows\assembly\temp")), compare).Except(
    sfSource.Where(filter => filter.FullPath.ToLower().Contains(@"c:\windows\assembly\tmp")), compare);
IEnumerable<SystemFile> sfTarget = LoadFileListFromXML("1APP.xml");
sfTarget = sfTarget.Except(
    sfTarget.Where(filter => filter.FullPath.ToLower().Contains(@"c:\windows\assembly\temp")), compare).Except(
    sfTarget.Where(filter => filter.FullPath.ToLower().Contains(@"c:\windows\assembly\tmp")), compare);
List<SystemFile> lstOnSourceNotTarget = sfSource.Except(sfTarget, compare).ToList();

 

We start by taking the list and applying the Where() method against it.  Inside the Where() method expression, we use the .FullPath property and convert its value to all lower case using the ToLower() method.  Once in all lower case, we use the Contains() method to check for the “temp” reference.  This will produce a list of only the records that actually contains the “temp” values.  Passing that off to the Except() method leaves us with the original list MINUS the records containing “temp”.

Wash, rinse, repeat…

We simply drop in a second Except() with the same code and a reference to “tmp” instead and tada!  We have a list that doesn’t contain either “temp” or “tmp”.

Finally, we can move onto the next problems that doesn’t work as published…

 



Cheers
C




image

Things that make you go hmmm

Written by Cornelius J. van Dyk on . Posted in Blog

I saw this list of the supposed top 50 influencers in the SharePoint world as far as Systems Integrators/Consultants are concerned…

Now I can go into a long outburst over how they picked their criteria etc. for the list, but I won’t.  I agree with SOME of the names on this list.  My friends Andrew Connell and Scot Hillier absolutely belong on this list, as does long time SharePoint genius Ted Pattison, but some of the people on this list, I don’t even recognize… and I have been in the SharePoint world for almost a decade now… Lots of notable names are not on this list, like Todd Baginski, Gary LaPointeRobert BogueBil Simser among others… Suffice it to say, I think the list isn’t correct.  Now before I get accused of bias, I’ll prove my point simply… riddle me this…

Is ANY list of the Top SharePoint influencers complete or correct without… Joel Oleson???

Cheers
C




image

Nothing gets your blood boiling like Credit Card FRAUD!!!

Written by Cornelius J. van Dyk on . Posted in Blog

I’m one of, what I’d like to believe, the most careful people around when it comes to dealing with my confidential information.  I use Roboform for all my passwords which means I don’t have a single password that’s either the same, or easy to guess.  I have Lifelock for protecting my identity and I check all my accounts weekly when I download them into Quicken for review.  I like to think that I’m very careful about these things.

Let me tell you… nothing, and I mean NOTHING kicks your weekend off on a sour note like looking at your credit card transactions in Quicken and seeing nearly $2,000.00 in charges that you didn’t make.  That happened to me this weekend.

I found myself staring at four charges on my company credit card.  What struck me was not the amount of the charges, or even the number of charges even considering I had not used the card actively in almost 9 months.  No, it was the PLACE where the charges originated.  The payee was “Lollapalooza”.  I thought to myself… what the hell is Lollapalooza???!!!  So the first thing I did, after noticing there were three charges to it, was to Google it.  A music festival in Chicago?  That happened this past week?  Huh?  I’m from Indianapolis so it was clear to me that this was fraud.  On top of that, the was also a charge to T-Mobile which is NOT my cell phone provider.  Sadly, I’m on of the schmucks who are stuck with AT&T because I love my iPhone.  

It seems that my credit card number was somehow lifted and used.  What still confuses me is the fact that I had not used the card in 9 months.  The last time I used it, I set it up on file with my dry cleaning service and my limmo service in Boston.  That’s it.  It’s been in my vault ever since.  Of course, being my company credit card, it’s number had been used with multiple other companies and services and all I can think is that one of them was breached and my number was stolen as recently as last weekend.

In any event, I proceeded to logon to my bank’s web site to try and find the number to call in case of fraud.  Banks should REALLY get some usability experts to design the web UI.  It should be as easy as logging onto my bank web site, clicking on the account in question, and then having a menu option called “Report Fraud”.  Yes, yes, I know the bank needs us to call and report it in person, and I’m not saying allow me to do it online, but at least have the link give me the phone number to call.  I shouldn’t have to click through multiple customer support pages just to find out what number to call.  But that’s just me…  

I made the call and got the card cancelled.  Thankfully I’m not responsible for the fraudulent charges, but I would like to know where the breach took place.  The moral of the story is to watch your accounts closely.  These kind of things are, unfortunately, going to happen.  The best we can do is respond as quickly as possible.  I wish we could do more…



Cheers
C




image