Stay away from Gander Mountain Academy

My wife and I were interested in signing up for some training and use of the Virtual Range at the Gander Mountain Academy. It’s a very interesting facility available in a few places across the United States.

As I was signing up, I needed to agree to the Rules and Fees. I expected to read about the dangers of the facility (as there is a live-fire range there as well), but I didn’t expect to read that we would need to give up all rights to our likeness for any purposes forever. It’s unfortunately a typical clause in an sweepstakes where you’re being given something (for nothing). But, as the Gander Mountain Academy classes and ranges and simulators are anything but free, I certainly didn’t expect this:

(I can’t find a way to directly link to the agreement without putting a course in a cart. To see it for your self: https://gandermtnacademy.gandermountain.com/purchase-now/wichita-ks, pick training, then one of the courses, a Date/time, and then look for the Rules and Fees link near the bottom of the confirmation page)

2. Each Participant hereby grants Gander Mountain Company and its designees, and their respective affiliates, licensees, successors and assigns, (a) the right to capture, record or memorialize by use of any technology whatsoever, including, without limitation, by photography, video recording or audio recording, any Participant during any participation in any Gander Mtn. Academy activities; and (b) an unrestricted, absolute, universal, perpetual, irrevocable, non-royalty bearing, and transferable right and license (but not any obligation) to use, copy, reproduce, transmit, distribute, display, modify, perform, present, publish, transform, create works and derivative works, and otherwise promote or utilize each of their image, likeness, voice, words and/or other personal attributes captured, recorded or memorialized in any manner by Gander Mtn. Company or its designees, in any form, format, medium or media whether now or hereafter existing (including, without limitation, print, direct mail, catalog, in-store display, online, mobile or wireless communications, radio or television broadcast, telecast or photograph), in whole or in part, individually or in conjunction with other photographs, recordings, images or materials, whether in a realistic, artistic or composite rendering, for any purpose whatsoever (including, without limitation, in connection with the creation, advertising, sale and/or promotion of any products and/or services of Gander Mountain Company and/or its designees (including, without limitation, the Gander Mtn. Academy), and without any consideration, notice, consent or attribution by or to any of them or any third party. Each Participant hereby forever and irrevocably waives any rights to any of the foregoing and understands and agrees that Gander Mountain Company and its designees are the exclusive owners of any and all right, title and interest, including copyright, in and to any such materials.

I’m sure they have security cameras, and I accept that they are recording the people who come and go through their facility, but this is far far over the top.

Essentially, they can later use your likeness, including your voice, and words in any way they see fit.

We’re not using their facility or shopping at any of their stores until this changes. I encourage you to do the same. And tell Gander Mountain why!

If I hear back from them, I’ll update this post. What do you think of their terms?

One way to find all Metro/Windows 8 Modern UI applications in C#

Running this code as an administrator, you can use the following snippet as a method for determining the nature of a process on Windows 8 and whether it would seem that the running process is running in the new Modern UI shell (metro).

static void Main(string[] args)
{            
    var allProcesses = Process.GetProcesses().Where(p =>
    {
        try
        {
            var pid = p.Id;
            var modules = p.Modules.Cast<ProcessModule>()
                .Where(m => m.FileName.Contains("System.Runtime.WindowsRuntime"));
            return modules.Count() > 0;
        }
        catch { return false; }
    }).OrderBy(p => p.MainModule.FileName).ToList();
    
    for (int i = 0; i < allProcesses.Count(); i++)
    {
        var p = allProcesses[i];
        Console.WriteLine(string.Format("{0}. {1}", i, p.MainModule.FileName));
    }
    Console.ReadKey();
}

Modern UI / Metro applications are protected and cannot be easily interrogated by a non-administrative process. While you can get some basics about all processes, a standard user process isn’t allowed to look at the loaded modules for example.

In the code above, all processes are scanned for a particular DLL. In this case, System.Runtime.WindowsRuntime. I’m not 100% confident this is the best choice … there may be a few better options (or multiple that are required). (If you know of them, please leave a comment!). It did find the Modern UI / Metro applications running in my Windows 8 VM.

Once gathered, the code just outputs the basics to the console. (The name of the host, which is WWAHost.exe apparently some times).

Next step is to learn something useful via the process object.

Forcing IE to run as IE9 with embedded web browser

If you embed IE in a windows application, you may notice that it runs in IE7 Emulated mode. This is likely NOT what you want.

I’ve added code like below to solve the problem:

string appName = ""; try { appName = Path.GetFileName(Assembly.GetEntryAssembly().Location);

const string IE_EMULATION = @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";

using (var fbeKey = Registry.CurrentUser.OpenSubKey(IE_EMULATION, true))

{ 

fbeKey.SetValue(appName, 9000, RegistryValueKind.DWord);

}
}

catch(Exception ex) { MessageBox.Show(appName + "\n" + ex.ToString(), "Unexpected error setting browser mode!"); }

There’s a special registry key that must be set before IE9 loads and is navigated … it must be set to the name of your application. Oddly, not the full path to your application, just the name of your executable.

You may want to delete this registry setting when your application exits.

How to mask an image in HTML/CSS

Until browsers all agree on a technique for masking an image in HTML (like –web-kit-mask-image), I’ve got another option: using SVG.

image

I’m creating a single page application to help sell some electronics and other goodies I’ve collected over the years. Rather than the traditional rectangular display of photos, I wanted to try something different. I wanted the photos to be round. However, I didn’t want to create a bunch of round images.

Enter SVG:

<svg width="220" height="220">
<mask id="m1"><ellipse cx="110" cy="110" rx="98" ry="98" style="fill:white;stroke-width:0;fill-opacity: 1.0"></ellipse></mask>
<g>
<ellipse cx="110" cy="110" rx="100" ry="100" style="stroke-width:10;stroke:#222"></ellipse>
<image href="img/sales/lenovo/IMG_0468.jpg" x="-25%" y="-25%" height="150%" width="150%" style="mask: url(#m1)"></image></g></svg>

The original images aren’t square, so I tweaked the size and position of each so that it would completely fill the ellipse (150% and -25% for size and location).  As a fall back, I’m going to add the CSS property and value “display:none” to a standard HTML img element that will be optionally displayed if the browser can’t do SVG (like IE8 and lower for example). I don’t want to lose a potential sale to images not showing up! I’ll use modernizr for SVG detection.

And although the code above doesn’t demonstrate the technique, you can use CSS to decorate the SVG. Check this demo out that I created:

image

image

image

Announcing Html Grabber v3 (The Spy Who Loved Embedded Internet Explorer)

It’s been a long time since v2 of the Html Grabber.

I updated the Html Grabber earlier this year in response to some requests at work. It was performing poorly with long documents, and occasionally crashing in a few edge cases. I rewrote a few portions of the core code and created a new shell in .NET.

SNAGHTML120a4bae

The core functionality is basically the same. Press and hold the primary mouse button on the image button. Then, with the mouse button still pressed, drag and point at a window/region that you believe is using Internet Explorer. If it is, the cursor changes to include a small green circle. You may then release the mouse button to capture the contained HTML.

SNAGHTML120cc9e2

Once captured, double-click on the capture row and then paste the results into your favorite text editor (ideally, a syntax highlighting editor).

As usual, use at your own risk. It’s designed for debugging, so treat it accordingly. It’s been tested with IE8 and IE9. It requires .NET 4.0. 

Download it here. (Yes, the file name is called v2 … don’t worry, it’s correct). There’s no installer, just run the included EXE.