Running with Code Like with scissors, only more dangerous

18Feb/140

When SEO goes way too far

Posted by Rob Paveza

Please remember that my comments are my own and do not necessarily reflect those of my employer.

SEO, or Search Engine Optimization, is a technique in online marketing that deals with driving traffic to your site via search engine rankings. There are two main channels, active and passive, which differ primarily via ad spend (specifically, active SEO involves spending money on ads and passive does not). From there, there are a bunch of different ways to improve your credibility with customers: have a targeted domain name (e.g., MyBusiness.com), have meaningful paths within your domain name (e.g., MyBusiness.com/BusinessUnit/WorkingGroup), ensuring that the words on your site are relevant to your topic, or having other sites about your topic linking to your site (for example, a site about puppies being linked-to by a site about Beagles), which is referred to as organic traffic. I learned a lot about SEO when I worked at Terralever, where as a developer I did a lot of work to implement the SEO designs our marketing team put together. SEO in and of itself isn't a problem; in fact, it's important to allow sites to be found by search engines.

But SEO can be abused. Search engines have rules that detect when website operators are trying to break into their heuristics, and if these rules are violated it can lead to a black-listing of your site or business. One of the most famous occurrences of these was JC Penney in 2010-2011, where Penney had hired an SEO firm to optimize their inbound traffic. The SEO firm in question created thousands of other sites, linking to Penney's main site, and driving the site to the top of Google's rankings. When search engines' crawlers detect inbound links to a site from other sites about the same topic, that's termed an organic link, and it substantially boosts the credibility of the site. Google famously (at least in marketing circles) punished Penney by substantially reducing its ranking (one example was from #1 to #68).

I know a lot about SEO from my old days working in that field. And yet, I was still fooled by this one.

Dylan, our new puppy

Dylan, our new puppy

My wife and I have been talking about adopting a puppy for about a year and a half. I've never raised a puppy, and our other dog, Samson, recently turned four years old. With us hoping to have a human child soon, Meredith thought that if I ever wanted to raise a puppy (for it to still be my dog), we should do it soon. I've wanted to get a Beagle for a long while, and after having been watching local shelters for a Beagle puppy for a long while and rarely if ever seeing one come available, we concluded that we'd need to find a breeder. I'm not generally a huge fan of breeders, but I also don't necessarily feel bad going to one if I think the arrangement will be good. We did some searching, found a site called Washington Beagle Breeders, and found a pup we thought would be a good fit for us. We chatted to one of the reps for a bit, and Dylan sounded like he'd be a good pup for us. And the arrangement with the people from the website seemed pretty cool - a way for breeders to just go through an internet presence and not have to worry about managing a website and all of that on their own. I thought, hey, if I was a breeder, that's a service I'd probably like!

When we were making our final decision, we were missing one crucial piece of information. One piece that was explicitly deceptive about the website.

Dylan wasn't from a breeder in Washington. Dylan was from a breeder outside of St. Louis, Missouri.

By now we were emotionally invested in going forward with Dylan. The breeder's rep informed us that there would be an additional travel fee on top of the base price of the dog, that we wouldn't be able to meet Dylan before the adoption, and that we'd be on the hook for a return fee and a service fee if we decided not to move forward with the adoption. I couldn't imagine we'd want to return the dog, but that put me off. But by now, like I said, we were pretty emotionally invested, and decided that would be okay. I figured it was within the same general measure of distance of flights we usually take - 3-4 hours - and that wouldn't be too bad. We arranged the travel and planned all of the timing, etc. Dylan was scheduled to arrive this afternoon.

This morning, checking the flight status, I found out:

  • Dylan wasn't on a direct flight from STL to SEA, but instead had a connection in Salt Lake City.
  • Although he was scheduled to arrive at SEA at 12:20pm local time, he was dropped off at 10pm the night before in St. Louis for a 6:45am flight out.

If you read up on raising puppies, you'll find out that puppies generally need to go to the restroom every 4-5 hours. You might be lucky enough to have a dog who can sleep through the night at 13 weeks, but you need to let him out. But by my calculations, he was in his crate for at least 15 hours. That meant he slept in his pee and poop for a long while. He's got a lot of energy and can't get out of his crate.

Keeping the dog confined for that long, I'd understand. I think it'd suck, but I get it. But since the dog is unable to control his bowel and bladder for that long, I think it's just rotten.

Never again will I go through an online breeder. We'll only ever go through a local rescue or a local breeder.

I want to show you the specifics. Check out these sites:

washingtonbeaglebreeders.com and beagle.washingtonpuppiesforsale.com

washingtonbeaglebreeders.com and beagle.washingtonpuppiesforsale.com

californiabeaglebreeders.com

californiabeaglebreeders.com

newyorkbeaglebreeders.com

newyorkbeaglebreeders.com

Will I ever do business again with a breeder? Maybe. I don't think breeders themselves are the problem. And I even think a middleman isn't necessarily bad -- like I said, I probably would have been excited to find a broker like this if I were a breeder. If Purebred Breeders (the company really behind all of these sites) was actually based in Washington, I wouldn't have had a problem with them. But the fact that these dogs aren't actually in Washington, or California, or Arizona, or New York - and the fact that the sites work so hard to make it feel like they are (Washington Beagle Breeders' site uses a Washington-based phone number - area code 206) - it just disgusts me.

And I'm disappointed with myself for not having realized that I was being played.

All of that being said, happily, my puppy and our current dog seem to be getting along just splendidly now that they've settled in:

Tagged as: , , No Comments
3Oct/131

I’m going to be on Channel9

Posted by Rob Paveza

I went and hung out with Larry Larson and Andrew Richards from the Channel9 show Defrag Tools today to record an episode! It was way cool, even though I got a little lost heading to the building which was literally right across the street from my own. (In my defense, I was up really early and I thought the building was further down the street).

All said and done, I got a cool Channel9 dude and I got to take a picture in the studio!

I'm @ Channel9 on 10/14/2013

I'm @ Channel9 on 10/14/2013

Be sure to check out Defrag Tools on 10/14 to see it, because I'll be talking about Just My Code in Visual Studio. If you haven't seen the blog I linked to last time, it's definitely worthwhile, but at the very least, you ought to watch the video, because it's AWESOME!

Update: It's live! Check it out!

19Sep/130

Just My Code for JavaScript

Posted by Rob Paveza

Super-excited that we FINALLY get to talk about a new feature that went out in Visual Studio 2013 RC last week. Check out the details in Andrew Hall's blog post on MSDN.

15Mar/130

A Loop for WinJS Promises

Posted by Rob Paveza

I had a co-worker ping me from an internal mailing list recently because he was having trouble reading from a network stream. I dug this out of mothballs from Win8 Consumer Preview:

WinJS.Class.define('Game', function() { /* constructor */ },
    { /* instance prototype */ },
    { /* static members */ 
        LoopWhileTrue: function (context, testCallback, actionReturningPromise, state) {
            /// <summary>Loops an action (that returns a promise) until another callback (that returns a Boolean) indicates that it should no longer continue.</summary>
            return new WinJS.Promise(function (success, error) {
                function evalActContinueLoop() {
                    if (testCallback.call(context, state)) {
                        var innerPromise = actionReturningPromise.call(context, state);
                        innerPromise.then(evalActContinueLoop, function (e) {
                            error(e);
                        });
                    }
                    else {
                        success(state);
                    }
               }
                evalActContinueLoop();
            });
        }
    });

This code was used for managing game state in a card-playing game app that I never finished. Usage might look like this:

var gameplay = Game.LoopWhileTrue(game, game.isGameInPlay, game.playHand, game.state);

gameplay’ then became a Promise that:

  • is fulfilled when the entire game completes (all hands have been played or a terminal score is achieved, based on the value returned by calling game.isGameInPlay(state)).
  • results in an error-fulfillment state if an internal call results in an error.
  • iteratively calls game.playHand(game.state), passing in ‘game’ as the this pointer (important in JS) until it is fulfilled (see 1st bullet).
  • if game.playHand completes synchronously, this method could cause a stack overflow. This can be broken with periodic use of setImmediate.

This method can conveniently be used to emulate a for-loop or a while-loop. It doesn't quite as well emulate a do-while-loop because it checks the terminal condition, but you could write a simple adapter method to always return true for the first call to the method.

11Jan/130

Modern Dilbert Reader v1.3 is in the Store!

Posted by Rob Paveza

I got the new Modern Dilbert Reader uploaded to the Windows App Store. It now has Favorites support as well as Offline Viewing support.

Favorites list

Offline Viewing settings

Get it and enjoy!!!

7Jan/134

Shame on you, Cnet

Posted by Rob Paveza

Please be reminded that what is written on this blog is my personal opinion and not that of my employer.

So today, I went to install BD Advisor from CyberLink. I was trying to play Vudu content on my 27" iMac (running Windows 8 of course), and was having inexplicable trouble with HDCP (I know that the still-relatively-modern AMD Radeon in the machine is HDCP compliant, as should be the DisplayPort-to-DVI adapter I use for my second monitor). So, after a few forums I looked at recommended BD Advisor, I went to get it. Bing presented a couple of options: Cyberlink's site, and Cnet's Download.com. I went for Cnet because I figured that it was more likely to not require me to enter my email address.

I remember back in the day, my friend Charles and I used to surf Download.com *all the time*. We used Download.com before it was Cnet's (which is forever ago in internet years), and even since then it was a pretty reliable repository for downloadable goodies and freeware. Usually, that freeware was unsullied.

I went through the download process, but instead of getting the BD Advisor installer, I got the "CBS Downloader" or something like that. But I let it go, not seeing another way to get the app I wanted. And it prompted me to go through what I thought were routine license agreements. But when I clicked Accept a couple of times, and my IE instance disappeared, I got to thinking that something might be a little fishy. So I looked a little closer.

It was prompting to install junkware.

I know it's junkware, because the text saying that it's what it's installing is really, really small.

Installer Screen

Now, that might not look terribly small to you. Trust me, on a 27" screen at 2560x1440, it's pretty small:

Installer Full Screen

So, recognizing the threat once I had clicked through a couple "Accept" buttons, I fired up Programs and Features, and whatever did I see?
Cnet Installer Installs Spyware

Oh hey, look at that, things I most certainly did not intend to install on my computer! (Wajam and Coupon Companion Plugin)

Even BETTER! When I went to uninstall Coupon Companion, whatever that is, I caught it trying to install MORE spyware from its UNINSTALLER!

CouponCompanion Uninstall Installs Spyware

"Basic Seek, which fixes DNS errors..." no doubt by overriding your default DNS configuration and points it to something which can track your DNS requests. That's nice.

Happily I was able to quickly get rid of that junkware, and I did get BD Advisor. But look again at the installer:
Installer Screen

See how its "Decline" button makes it look as if hitting Decline will cancel it out? I mean, you could make the argument that "Close" would do that, and therefore "Decline" wouldn't also, but given the green "go forward" button of "Accept" having a very clear opposite of "Decline," my initial reaction is, very understandably, that Decline means Stop.

For shame, Cnet. I have come to expect more from you over the years. Today, I'm very disappointed.

21Dec/120

Coming Soon: Offline Comic Storage for the Modern Dilbert Reader

Posted by Rob Paveza

Modern Dilbert Reader version 1.3 is in the works and is coming along very well! It's got a couple of bug fixes, but more importantly, it has two new features! The first is that it will support caching comics offline, so you can take them on the plane with you! (Yes, I'm actually planning this for an upcoming trip). The second is a built-in Favorites list. We'll leverage the strip information from the Dilbert Strip Index to provide a great rundown of the strips.

Keep an eye out for it soon! It isn't submitted to the Store yet, but I'm hoping to submit it before going on my trip.

Happy holidays!

10Dec/120

Modern Dilbert Reader v1.2 Pending Certification

Posted by Rob Paveza

I've updated the Modern Dilbert Reader app again. In version 1.2, there is new Live Tiles functionality, and updated date picker, and a new way to access the date picker: via the app bar. Hopefully, that will improve discoverability.

One reviewer said that the date looked funny with such a large font on a big monitor. I had to agree. So, I've made the font smaller, and the month/day/year read with full names. I've also updated the date picker to be more inline:

I also added a button for the date picker to the bottom App Bar (right click or swipe-in from the bottom):

Finally, new Live Tile functionality:

I'll update the post once it gets certified and submitted to the App Store.

16Nov/120

Modern Dilbert Reader v1.1 submitted to the Store

Posted by Rob Paveza

My Dilbert app for Windows 8, the Modern Dilbert Reader, just got an update that is pending certification for the Windows Store. This change fixes a bug that a few people have periodically seen where strips lie on top of each other. It also speeds up search.

Best, it uses the higher-quality images available for the main strip display.

I'll note when the new version gets updated, but you can download today's version and the Store app will let you know when the new version is available.

9Nov/120

Modern Dilbert Reader is now in the Windows 8 Store

Posted by Rob Paveza

My Dilbert reader app has passed certification and is now in the Windows 8 app store! Check out the info about it on my blog or head directly over to the Windows Store web site.

The "Modern Dilbert Reader" app is not endorsed by my employer. :)