Cannot show requested dialog. Property Owner is not available for Database ‘[DatabaseName]’.

This error popped up on me today while I was trying to shrink files for a database.


So I checked the owners of my databases:

And sure enough, I had NULLs for several owners.  No idea how that happened.  Easy enough to fix.  Switch to each database in turn and execute the sp_changedbowner stored procedure.

Problem fixed.

Posted in General | Leave a comment

Humble and Downloading Purchases in Bulk ( is a site where you can buy bundles of software (games and applications) and choose not only how much to pay, but how to distribute the payment.  Payments go to charities, developers, or both depending upon how you split it.  It’s a great way to get games at Steam Sale pricing – I have some two hundred odd games available to me through the site., fka as Good Old Games, is a distributor of DRM free software.  They take games and update them or package them so they work on a modern system (including OSX and Linux in many cases).  The just released the Forgotten Realms Collection 1, Forgotten Realms Collection 2, and Forgotten Realms Collection 3.  More commonly known as the Gold Box series from SSI – my most favorite games ever.

The problem becomes remembering you have purchased a game at these sites. has introduced GOG Galaxy which is similar to Steam in many respects but it’s not as mature.  You can’t save downloaded content directly to a network drive, for instance, and downloading extra content like manuals and avatars is a few steps out of the way of the normal download process.

To that end, I went in search of a downloader for both and  And found a quality product available for each.  Both are Python scripts.  This article covers the downloader; the next article will cover the Humble Bundle downloader.

First, for, there’s GOGrepo.  You need Python 2.7, html5lib, and html2text; you can use PIP to install the Python modules with pip install html5lib html2text .  Download the Python script to the root of the folder you wish to download your collection to and execute login .  Even though the shell output copied here is from a Linux box it should be identical on a Windows box or OSX.

This saves your session information to gog-cookies.dat.

Next you’ll want to update the manifest of files which are available to you for download.  This is done using ./ update -os windows linux mac -lang en.

As you can see it can take some time to download game information.  The information downloaded here is saved to gog-manifest.dat.

I ran GOGrepo in the same directory as my existing collection, which requires that you import the files so it knows doesn’t attempt to redownload files you already have. This is done using ./ import . .. More specifically, the first dot is the source directory of the files you want to import and the second dot is the destination directory of the files you want to import. In my case, the current directory was where I wanted them stored and imported from.

GOGrepo will calculate the MD5 checksum for each file it finds and compare it to the file information it downloaded in the manifest.

This takes some time, depending upon the size of your existing collection.  (And this can be skipped if you don’t have a collection you wish to import.)

Once this process is done we’re ready to begin our download from GOG using the command  ./ download .  The command starts by informing us as to what files it’s doing to download.  A pass indicates that the file passed inspection and will not be downloaded; a download indicates that the file failed the MD5 check or is not present and will be downloaded.

Once it’s listed out all of the files it intends to download, it will begin the download process.

It downloads the files in parallel, and gives updates once a second as to the estimated data and time left.

Note that with the recent restructuring of games (separating bundles into individual games) you may find that some files you already have are redownloaded.  As an example, I had all of the Ultima games – but not in their separate folders.  GOGrepo marked these as needing download.

Posted in Games | Leave a comment

C#: Finding Credit Cards within Free Form Text

Preliminary Notes:

Your users, unaware that it is a PCI DSS violation to store a PAN have been entering PANs into a free form text field, along with expiration dates and CVV code.  You’ve been tasked with identifying the PANs and CVVs and masking them in the text.

First stab at a credit card regular expression would probably go something like this:

For the regular expression impaired that would be a word boundary (\b) followed by a decimal digit (0-9) 4 times {4}, followed by a space or – [ -] zero or more times; this set is repeated.  A number in curly brackets specifies the number of times a prior definition should repeat; characters in square brackets specify the acceptable characters in the set.

That would match a PAN entered in the following formats:

4012 8888 8888 1881

Using RegexLab we can validate this:


But what happens if the PAN isn’t so neatly separated from the text?  We can see in the above screen shot that CC4012-8888-8888-1881 isn’t matching the expression.  That doesn’t work.

So, easy enough, we just want to pull the word boundary definition then, right?  New regular expression might be:

Results:CreditCardBasicRegularExpression2We matched the PAN with text mashed up against it, but now we’ve also matched the UPS tracking number.  That’s problematic.  While the users are in the wrong in this situation if we start to mask tracking numbers, they’re probably going to hang us out to dry.

We could add a requirement to the regular expression that it’s not prefixed by 1Z.  That would look something like this:

(Note:  negative lookahead is not supported by Javascript.)

CreditCardBasicRegularExpression3Great!  Well, wait a moment.  Let’s take a closer look at the types of available credit cards that are out there.  The following table is cribbed from the Bank card number Wikipedia page.  Non active types have been removed.

Issuing networkIIN rangesActiveLengthValidation
American Express34, 37Yes15Luhn
China UnionPay62Yes16-19Luhn
Diners Club Carte Blanche300-305Yes14Luhn
Diners Club International300-305, 309, 36Yes14Luhn
Diners Club International38-39Yes16Luhn
Diners Club United States & Canada54, 55Yes16Luhn
Discover Card6011, 622126-622925, 644-649, 65Yes16Luhn
Maestro50, 56-69Yes12-19Luhn
Solo6334, 6767No16, 18, 19Luhn
Visa4Yes13, 16Luhn

The first thing we see is that not all PANs are sixteen digits long. American Express, Mastercard, Discover, and Visa were definitely in the mix for me, meaning I needed to support 15 digit card numbers as well as 16.  Fundamentally, supporting all the types listed above represent equal difficulty.

So, given an American Express number how does our existing regular expression fare?

CreditCardBasicRegularExpression4Not well, it turns out.

So we can’t use four groups of four digits as the basis for our regular expression.  Stepping back a moment we know that we want to match digits, spaces, and possibly dashes, with any number of digits between 12 and 19.

CreditCardBasicRegularExpression5Unfortunately, we’re matching the phone number at the bottom now. “But it’s only 10 digits long!” Our regular expression asked for 12 to 19 characters with digits, spaces, or dashes. The complete phone number, including spaces, is twelve characters long.

What we really want is 12 to 19 digits, ignoring selected contents between the digits.  (That selection will change based on your input and environment.)

There are methods of making a character conditional in a regular expression but not of requiring a particular length without said conditionals.  There really isn’t a solid way to ensure you have 12 digits, minimum.  (It might be doable by someone more familiar with regular expressions.  Would love to hear how.) The return on investment for any research in this regard was rapidly dwindling.

We’ll have to deal with that issue in a procedural fashion.  Right now we need to ensure that when we lift a PAN from text that we actually pull the entire PAN.  We don’t want to pull only the first ten digits and leave out the final six because of odd spacing.

To this end we’ll increase the regular expression to accommodate up to twice the expected size, allowing for a credit card numbers entered like so:

4 0 1 2 8 8 8 8 8 8 8 8 1 8 8 1

Or any variation thereof.

RegexLab .NET result:

CreditCardBasicRegularExpression8Here’s a test against every test PAN on the Paypal Object’s page:

CreditCardBasicRegularExpression9The phone number and UPS tracking number are problematic, but understandably so.  As discussed above, the phone number matches the regular expression we’re using.  The UPS tracking number, if the highlights are examined, actually begins matching a character away from the 1Z prefix we were using previously.

Again, we’ll filter those out later.  In fact, we’re going to remove the UPS prefix exclusion at this point.  It no longer serves a purpose.

I never intended to identify the PANs in one step; if you can, which I doubt, it’d be one hell of a complex expression.  We’re going to use the regular expression we have and pull in matches from the text in order to further identify what we have.

We define the CreditCardRegex.  Then we define a function named FindAndMask, meant to identify PANs in the provided text and mask them with asterisks.  Inside of Mask, we iterate through the results of calling Regex.Matches with the input text and regular expression provided.

If there are no matches no changes to text occur and we return that unchanged value.

If there are matches, we need to narrow down whether they are a genuine match, a phone number, UPS tracking number, or any other incidental number which happens to occur in the environment.

Looking at the table of card definitions there are four variables.  Issuer name, issuer prefixes (IIN), minimum length, and maximum length.  We can encompass the last three variables in one regular expression per definition if we strip the data of all non numeric characters prior to applying the regular expression.

Alternate LINQ syntax:

For the definition, we need only a name and regular expression.  That fits neatly into the definition of a key/value pair.

So now we begin defining regular expressions for each card type.  We’ll use the static constructor of the CreditCardFilter class to populate the CardDefinitions dictionary.

American Express’ IIN start with 34 or 37 and are 15 total digits in length.

China UnionPay’s IIN start with 62 and are 16 to 19 total digits in length.

Diner’s Club Carte Blanche’s IIN start with 300, 301, 302, 303, 304, or 305 and are 14 digits in length.

The first Diner’s Club International definition is identical to Diner’s Club Carte Blanche. The two additional definitions start with 309 or 36 and are 14 characters in length. This is the first definition which doesn’t fit neatly into solution. We could create two definitions, or use an conditional operator. I chose the conditional.

Diner’s Club (United States & Canada) IIN starts with 54 or 55 and is 16 digits long.

Interpayment’s IIN starts with 636 and is 16 to 19 digits long.

Instapayment’s IIN starts with 637, 638, or 639 and is 16 digits long.

JCB starts with 3528 through 3589 and is 16 digits long.

Maestro starts with 50 or 56 through 69 and are 12 to 19 digits long.

Dankort starts with 5019 and is 16 digits long.

Mastercard starts with 51 through 55 and is 16 digits long.

Solo starts with 6334 or 6767 and is 16, 18, or 19 digits in length.

Visa’s IIN starts with a 4 and is 13 or 16 digits in length.

UATP’s IIN starts with a 1 and is 15 digits in length.

The final step in identifying a possible PAN (and that’s all any of this is, ultimately: a possibility) is to run the PAN through the Luhn algorithm. The Luhn algorithm isn’t a definitive tool for identifying a PAN; it simply increases the credibility of a random sequence of digits of being one.

While it’s not a complicated algorithm, we’re not going to write this ourselves.  We’re going to rely upon the Rosetta Code implementation.

We have everything in place to identify possible PANs, but no capability to mask them.  A couple of requirements in that regard:

  • The spacing of the filtered PAN should match the original.
  • The last four digits of any PAN should be left unmasked.

Because of requirement #1, we can’t simply grab the last four digits of the stripped PAN and use that for requirement #2.  Those digits might be 2 222 in the original text.  What we need to do is iterate backwards through the original matched text, counting digits, until we hit 4.

The masking function needs to iterate through the PAN and replace every digit with an asterisk. Remember that we should be dealing with the original match value as arguments to these functions, not the stripped values.

At this point we have the capability to identify a possible PAN of most major formats and the capability to mask it, leaving intact the last four digits of the account number. We can add the meat to the FindAndMask function we previously defined.

We need to setup unit tests for this code, and then examine the situations we’ve already identified as problematic and resolve them.

Both of those will come in a second post very soon.

Posted in Programming | Leave a comment

Privacy: Have I been pwned?

The Ashley Madison data released today is a reminder that sites get hacked all the time, and your information with it.  One resource I’ve rarely seen mentioned is Have I been pwned?

Enter your email address or addresses and the site will tell you whether you were affected by a number of breaches.  My address comes up with this:

breachesI must admit the pizza paste was a new one for me; I was unaware of it despite it happening a mere two months ago.  So I signed up for the free monitoring service – and now I’ll be warned when my email address shows up where it shouldn’t.

Honestly, by the time the data gets posted to the site you’ve probably already been victimized – it will never move as fast as the forums do for this type of thing.  Yet knowing about a potential breach (think positive!) can be very helpful, especially if you’re the type to reuse passwords across sites.

Which you shouldn’t do.  Use 1Password ($), LastPass ($), Keepass (free) or the like to generate and track a unique password per site.

If you’re a Gmail user be aware that you can add append any combination of words to your email address after a plus sign and Gmail will ignore it.  For instance if my email address was and I was signing up for the Plex service, I could use as my email address.  When sorting email to recipients Gmail ignores everything after the plus.  This helps tremendously when identifying a potential data leak, although it renders a site like Have I been pwned? a lot more tedious to use.

Not as useful but you can also add periods anywhere in an email address and Gmail will ignore them. is treated as  You can also combined the two methods.

Note:  not all sites allow this as they don’t recognize the + sign as being valid for email addresses.

Posted in Security | Leave a comment

Privacy and Windows 10: Turning Off The Easy Stuff

Windows 10 has quite a few pieces which are more invasive than people are used to knowing about.  (Note the phrasing; most of this isn’t new or isolated to Microsoft.  It’s because Windows 10 is a new release and it’s under a microscope that folks are objecting.)

First, you should take the time to read the actual Privacy Statement as issued by Microsoft.  It’s not that large of a read and is fairly understandable.  (Or I’ve simply read too many EULAs in my time.)

To start trimming the information we’re leaking we first need to open the Settings application.

With the Windows search bar enter Settings and click on the Settings icon that appears, subtitled Trusted Windows Store app.

Privacy_1Once the Settings app has initialized, click on Privacy, subtitled Location, camera.

Privacy_2You’ll be presented with a menu of choices on the left, and options from each menu choice on the right.

Privacy_3PrivacyGeneralLet apps use my advertising ID for experiences across apps (turning this off will reset your ID)  Turn this to OFF.  This ID is used to gather personal metrics and display ads based on those personal metrics.  By disallowing its use across apps you will receive fewer targeted ads and less personal information about yourself will be stockpiled by Microsoft Advertising.

PrivacyGeneralTurn on SmartScreen Filter to check web content (URLs) that Windows Store apps use.  This is subjective, but my recommendation is OFF.  If you or your relatives have a horrible habit of having software installed on a drive by basis from websites, you may wish to leave this on.

PrivacyGeneralSend Microsoft info about how I write to help us improve typing and writing in the future.  This should be turned OFF.  How I write is only determined by sending WHAT I write.

PrivacyGeneralLet websites provide locally relevant content by accessing my language list.  This should be turned OFF.  The access to a language list for translation purposes is one thing; however, the specific permission is to provide “locally relevant content” which translates to location services.

LocationLocationIf this setting is on, each person who signs in to this device can change their own location settings.  If it’s off, location is off for everyone who signs in.  Hit the Change button and turn this option OFF.  Turning off the option at the top of the page disables it for the remainder of the page.  (Location Services FAQ.)

CameraCameraLet apps use my camera.  My recommendation is for this to be OFF.  However, if you’re using the camera for web casting or selfies, leave it on and micromanage the list below labeled “Choose apps that can use your camera.”  (Obligatory link to Camera Privacy FAQ.)

MicrophoneMicrophoneLet apps use my microphone.  This is the same situation as the camera.  This is recommended to be turned OFF, but if you’re a web caster or need use of the microphone for certain applications (Skype comes to mind) then leave it on and micromanage the list below labeled “Choose apps that can use your microphone.”

Speech, inking & typingGetting to know youWindows and Cortana can get to know your voice and writing to make better suggestions for you.  We’ll collect info like contacts, recent calendar events, speech and handwriting patterns, and typing history. 

Turning this off also turns off dictation and Cortana and clears what this device knows about you.  Cortana is one of the brave new features of Windows 10 and many people want to use it.  If you do, realize that you’re spilling an awful lot of personal information onto the cloud for the privilege.  Otherwise, click the Get to know me and turn this feature OFF.

Account InfoAccount InfoLet apps access my name, picture, and other account info.  Unless you have a particular Windows Store app in mind that would take advantage of this information, turn this OFF.

ContactsContactsChoose apps that can access contacts.  Here’s where I personally started making some concessions to data sharing.  Any application listed here with permission to access your contacts can do just that.  Micro manage it; there is no way to turn it off across the board.

CalendarCalendarLet apps access my calendar.  This option has a global option for disablement, but I recommend you instead take a good hard list at the applications with permissions and make the decision there.

MessagingMessagingLet apps read or send messages (text or MMS).  For a desktop PC especially, OFF.

RadiosRadiosSome apps use radios – like Bluetooth – in your device to send and receive data.  Sometimes, apps need to turn these radios on and off to work their magic.  For a desktop PC this should be safe to turn OFF.  If you have a device that stops working after making this change and relies on a radio, turn it back on and micromanage the list below.

Other devicesSync with DevicesLet your apps share and sync info with wireless devices that don’t explicitly pair with your PC, tablet, or phoneOFF.

Other devices, Use trusted devices:  Let your apps use your trusted devices (hardware you’ve already connected, or comes with your PC, tablet, or phone).  OFF.  Let me give you a reason why:  my Windows 10 installation is several months old.  My Nexus 6 has been plugged into it several times.  My daughter decided she needed to charge her Nexus 4 on my machine; no problem.  However, Windows 10 marked the Nexus 4 as a trusted device with no action on my part.  If that’s how trust is going to be doled out, I want no part in it.

Feedback & diagnosticsFeedback FrequencyWindows should ask for my feedback:  Never, Once a week, Once a day, Always, Automatically (Recommended).  Automatically has been my setting since early beta and it hasn’t been too bad.  You choose what to send, and when to send it.  Never is certainly a valid choice.

Feedback & diagnosticsDiagnostic and usage dataSend your device data to Microsoft.  This is the infamous telemetry setting that has so many individuals up in arms.  There are three options (from Microsoft’s FAQ):

  • Basic information is data that is vital to the operation of Windows. This data helps keep Windows and apps running properly by letting Microsoft know the capabilities of your device, what is installed, and whether Windows is operating correctly. This option also turns on basic error reporting back to Microsoft. If you select this option, we’ll be able to provide updates to Windows (through Windows Update, including malicious software protection by the Malicious Software Removal Tool), but some apps and features may not work correctly or at all.

  • Enhanced data includes all Basic data plus data about how you use Windows, such as how frequently or how long you use certain features or apps and which apps you use most often. This option also lets us collect enhanced diagnostic information, such as the memory state of your device when a system or app crash occurs, as well as measure reliability of devices, the operating system, and apps. If you select this option, we’ll be able to provide you with an enhanced and personalized Windows experience.

  • Full data includes all Basic and Enhanced data, and also turns on advanced diagnostic features that collect additional data from your device, such as system files or memory snapshots, which may unintentionally include parts of a document you were working on when a problem occurred. This information helps us further troubleshoot and fix problems. If an error report contains personal data, we won’t use that information to identify, contact, or target advertising to you. This is the recommended option for the best Windows experience and the most effective troubleshooting.

As a Window Insider I’m automatically set to FULL.  Not my cup of tea, but it’s the price you pay for playing with bleeding edge stuff.  I’d recommend Basic.  (I’ll also be looking at later this week how to remove Telemetry from Windows 10 entirely, via unholy methods.)

Back up a page to the Settings menu.  Choose the Update & Security submenu.  Choose Windows Update, then Advanced Options.  From the resulting screen, click Choose how updates are delivered.

Privacy_4The next screen is one that seems to still be mostly unknown.  I wager when Internet bills start rolling in 30 days after release there’s going to be more screaming… this screen allows you to specify whether or not you wish to participate in Microsoft’s Peer to Peer network for delivering updates.  This should be a resounding NO.  ( article)

Privacy_5Even if you’ve checked that selection off previously, check it after each major upgrade.  I’ve seen it reset twice now.

Finally, if you don’t like the tiles on your Start menu or you’re yearning for some familiar ground within Windows 10, check out Classic Shell.  No advertising tiles, no information being sent, just a Start menu doing its job cleanly and reliably.  Highly recommended.

ClassicShellMenuThis article will be updated with any future findings regarding built in pieces of Windows 10 and how to disable them, either directly or with references to new articles.

Posted in Privacy, Windows 10 | Leave a comment

Android: Free Gradle for Android and Java Course @ Udacity

Udacity is one of the most well known online education sites right now, alongside Udemy and MIT OpenCourseware.  Udacity is (most recently) known for their Nanodegrees.  (Their name apparently comes from the company’s desire to be “audacious for you, the student“.)

Introductions aside, Udacity has a free course on Gradle for Android and Java available.  Gradle is one of those huge unknowns for me with Android Studio development, so I’m currently signed up and partaking in the offering.  Other than the usual “we are way too eager to be discussing technical material” behavior the course seems pretty good.

I’d try to use Gradle at work for our automated builds, but I’m pretty sure it’s a skill set that doesn’t exist.  At least with Team Foundation Server’s automated builds everything’s in a pretty package that everyone knows how to unwrap.

Posted in Programming | Leave a comment

Team Foundation Server: Change Default Behavior on Checkin From Resolve to Associate

The default behavior on checkin with TFS 2010, 2012, 2013, and 2015 is to close the associated work item.  If you’re checking in on a daily basis, this is annoying.  To change it for the current client, you need to change a registry key.

To make Associate the default action instead of Resolve set:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\<version>\TeamFoundation\SourceControl\Behavior\ResolveAsDefaultCheckinAction to False.

Replace <version> in the above registry key with the appropriate Visual Studio version below.

Visual Studio 2010:  10.0
Visual Studio 2012:  11.0
Visual Studio 2013:  12.0
Visual Studio 2015:  14.0

Microsoft promised to make this a non registry change some time ago, but as of 2015 I still don’t see this as an option.

Posted in Programming, Team Foundation Server | 1 Comment

Windows 10: KB3081424 Failed; Install, Fail, Reboot Cycle

I love you, Microsoft, but you’re going to catch hell until you back off this mandated Windows Update issue.  Or get a better grip on it.  Issue #1 was KB3074681 which caused explorer crashes when uninstalling software; issue #2 was the nVidia driver problem, as demonstrated here and Forbes.  Issue #3 is an aggregate update released on August 5th.  This is not a good batting average.

To fix the latest issue you need to 1) wait for Microsoft to release an updated version of the patch; or 2) follow the instructions below.

First, create a system restore point.  We’re going to be mucking around in the registry and I can’t give you exact instructions on what to do, so we want to be safe rather than sorry.

Second, open the registry editor.  Enter regedit in the Search Windows bar.  Click on the regedit (Run command) option that appears.

KB3081424-1Navigate to HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList.

KB3081424-2What you’re looking at is a list of SIDs, or security identifiers.  If your update is failing to install, there’s a good chance that it’s because one of these profiles is invalid.  We have to figure out which one that is and remove it.

Sidebar:  We can safely remove S-1-5-18, S-1-5-19, and S-1-5-20 from the list.  As you can see they don’t match the pattern of the remaining SIDs because they are system SIDs.  S-1-5-18 represents the Local System account, S-1-5-19 represents the Local Service account, and S-1-5-20 represents the Network Service account.  As well, SIDs beginning with S-1-5-82 can be removed from the list.  They’re identities which belong to the AppPool identity, used with IIS.

We’re looking for SIDs which start with S-1-5-21.  Hopefully if you have a reboot problem with KB3081424 you have two or more of these.  If you’ve only got one, your issue is elsewhere.  This article can’t help you.

For each of the S-1-5-21 profiles, select them in the left hand side of the window.  Then examine the ProfileImagePath option in the right hand side to help identify which user account is associated with the profile you’re looking at.

KB3081424-3To check whether a user is valid or invalid, you can use Computer Management.  Type Computer Management into the Search Windows bar, then click on the Computer Management (Desktop app) icon that appears.

KB3081424-4From the window that appears, navigate to System Tools, Local Users and Groups, Users.  The middle pane should show you a listing of all current valid users.

KB3081424-5Generally speaking the ImageProfilePath will match the name of the user (unless the path has been edited by an administrator).  If you find a profile with an ImageProfilePath which doesn’t have a matching user, delete the entry.  Right click the SID in the left hand column of the Registry Editor, and choose Delete from the resulting pop up menu.

KB3081424-6Find all the entries which don’t have matching users and remove them all.  Close the registry editor and reboot.  The update should now successfully install.

Posted in Windows 10 | Leave a comment

Windows 10: Create a Restore Point

With recent versions of Windows you’ve been able to create restore points, a point in time to which you can revert if things go awry during troubleshooting or monkeying around with a system.  Windows 10 is no exception.

To create a restore point in Windows 10, enter “create restore point” into the Search Windows bar.  Click on the Create a restore point (Control Panel) icon in the results.

W10CreateARestorePoint-1The System Properties window will display with the System Protection tab highlighted.  Click the Create… button in the lower right hand corner.

W10CreateARestorePoint-2Enter a description for the restore point.  “Repairing Windows Update boot loop”, for instance.  Something descriptive enough that you’ll recognize the restore point from a menu, with no other options.  Once entered, click the Create button in the lower right hand corner of the window.

W10CreateARestorePoint-3The system will work for a short bit.

W10CreateARestorePoint-4Then you’ll be notified that the restore point was successfully created.



Posted in Windows 10 | Leave a comment

The Cost of Ad Blocking: PageFair and Adobe 2015 Ad Blocking Report

Ad blockers have risen in popularity in recent years, mostly because of AdBlock and Adblock Plus.  PageFair and Adobe just released their 2015 Ad Blocking Report, showing how prominent the practice is becoming.  The title of the report itself shows where PageFair has it wrong.  Ad blocking is not becoming more prominent because of the availability of the ad blocker; ad blocking has been made easier because of the nuisance that ads have become.  When you begin to irritate a great number of people with your practices, they will begin to subvert you.

It should be noted that ad blocking has existed since the advent of TCP/IP.  It was more manual (an entry into the hosts file for the local operating system) but it was definitely there.

So why do I ad block?  (Disclaimer:  the hypocrisy is strong.  I use Google Adwords on this very blog.  With it, I’ve earned a whopping $0.03 of revenue in 8 months.  At this point, it’s a joke and experiment.  I send a text to my wife every time I earn another $0.01, claiming I am more powerful than ever now.  Do I care or penalize any visitor who comes to this site and blocks ads or tracking?  Nope.  More power to you.)

First, consider full page interstitial ads.  They show up when you click a link to an article.  A redirect, they force you to stare at an ad for 15 to 30s; in the worst cases, they are video and audio.  Consider the detrimental effect this forced redirection of our stream of thought costs.  We had a problem we were trying to solve, and now we’ve been redirected to another:  how do I avoid this unwanted interruption?  Our train of thought is destroyed in order to provide a thousandth of a cent of revenue to a company who’s probably hosting unoriginal content copied from someone else’s weblog.

Second, consider the privacy implications.  Ad companies have zero problem with advertising embarrassing content that they’ve linked to you through multiple sources, and don’t care about context – whether you’re at work, showing your wife something, or naked in your office.  “We see you’ve searched for erectile dysfunction.  Let us advertise some products to you!”  That’s a great one to have during an office presentation.

Third, auto play audio and video ads.  Simply put, they shouldn’t exist.  I shouldn’t have to worry about whether I left my laptop muted while I am browsing the web.  I’m looking at you, Game of War.  You’re certainly not the only offender in this regard, unfortunately.

Fourth, malware.  The industry is responsible for this, and they have not done enough to combat it.  “Oh, it slipped through the cracks during our review.”  Or, “they changed the contents after we’d approved it.”  Bullshit.  Unacceptable.  Related, you can also use the same technology as AB/ABP to block malware domains completely.

Fifth, speed.  Most sites have optimized their delivery and content.  Until we get to third party ad sites who don’t really care about your end user experience.  And when your layout is dependent upon their ads, everything is delayed until they deliver.  Which costs time and causes frustration upon your end users.

Finally, with ads we pay for the content coming and going.  We’re already paying to have an Internet connection.  Now you want us to use up our precious quota so you can play a video ad?  No.  If you can’t get your point across in a static, graphical ad then perhaps you should return to marketing school.  Video (and all “interactive”) ads only serve to get you banned from my life.

I do want to note that I white list most sites that I visit (ArsTechnica, for instance, had an article on this some time ago – and is white listed) and I do pay for the premium instances of other sites.  Some sites that I regularly visit, however, are not white listed.  Consider slashdot without ad blocking:

slashdot-adsI’ve been a member of slashdot for years.  (My UID is a high five digit.)  I’ve watched drama unfold as the site slowly circles the drain… And I solved the problem by blocking ads.  (I used to have the option to disable them because I was a regular, high karma user.  Then that went away.)  The owners of slashdot are now overly concerned with making money; serving their user base is a secondary consideration.

Lifehacker?  Feedly?  Reddit?  White listed.  Their ads aren’t nuisances and aren’t intrusive.  Is that subjective and personal?  Sure.  It’s about as subjective and personal as an ad company having a complete dossier on me and everything I’ve searched for.

Posted in General, | Leave a comment