Minasan, Watashiwa Wawan Desu...

NurCell Movies

Sunday, February 6, 2011

Sorry, but your charts are ugly


I once got fired for improving sales 300%.


I showed a client a report. It was awesome and I was dang proud of the results. The report read like this:


Sales from organic search last year were $50,000. Sales from organic search this year were $150,000.


Sales from PPC last year were $60,000, against a spend of $30,000. Sales from PPC this year were $70,000, against a spend of $10,000.


The client read the report, pursed their lips thoughtfully and said "Yeah, but my ROI from pay per click marketing sucked."


I started getting a twitch in my left eye that persists to this day.


"No", I said, "See, last year you spent $30k to get $60k. This year you spent $10k to get $70k. That's better, right?"


"Well, OK, but my ROI can't have improved that much if you only added $10k to my sales."


Fired.


This is an extreme case, obviously. But since then I've considered the presentation of the data as important as the data itself. That may seem horrible—the content's what's important, right? But it's a harsh reality: When you're presenting internet marketing reports to someone who has about 30 spare seconds, image is everything.


Want to avoid my sorry fate? Here are a few tips I've stolen from others over the years:


3D? Faded colors? Shiny bar graphs? No.


I said no.


Take your finger away from the drop shadow button and step. away. slowly.


Look at this graph:


lousy line graph


It's puuuurrrttttyyyyyy. But can you take it all in and figure out what it's trying to show? No, unless it's trying to show that someone bought the latest version of Numbers.


Now try this version, instead:


nicerlinegraph.gif


Still not perfect, but it's an improvement, right?


So, rule 1: No extra crap.

No 3D effects.No weird color fills.No 'creative' backgrounds.If you're feeling creative, focus that energy to making your data really easy to interpret.

If you've got multiple columns in your spreadsheet, and need to show separate trends for each, use separate charts. Trust me on this one - it always works better. Here's the example from above. I created a second Y axis so the 'conversions' line is easier to read. Yeah, right:


toomanylinesgraph.png


This isn't too bad, but it still makes your reader work. Try this instead—separate the graphs to multiple smaller ones:


nicemultiplelines.png


A few hints on this method:

Where possible, use the same scale. I can't do that with the 'conversions' graph, at least on the Y axis. But for the 'Clicks' and 'Cost', I set them both to a maximum of 1000. That lets you compare like with like.Remove every non-essential decoration when you're using small charts like these. Even gridlines. Your reader isn't looking for precise numbers. You can have the data table nearby for that.I also removed the round circles that were plotting points. I'm not a big fan of those.

Sometimes it's tempting to do things like change the Y axis to have a higher minimum value. That emphasizes trends:


messyyaxis.png


Please don't, unless there's a really good reason, and you tell the reader.


Sometimes, your client needs to really see the data. Don't be afraid to try creative approaches, like using repeating symbols:


pageviewswpages.png


Don't go wild, but sometimes using what Tufte calls 'small multiples' can really go a long way.


Really, all of this is about keeping it simple. A simple line graph. A simple bar chart. No decoration. Just the facts, ma'am.


If you want to learn a ton more about this, try



these books:


Everything I've learned, I've learned from these books.

comments (7) | trackbacks (0) | permalink


View the original article here

5 response codes you gotta know: Learn to speak server


Whether you're an internet marketing wonk, a top IT geek or an SEO pro, you need to know how to speak web server. Not fluently, of course. If you can do the equivalent of asking where the bathroom is, you'll be in good shape. That's what I'm going to go over now.


When you visit a web site, your web browser has a whole conversation with the server hosting that site:


Browser: Hey man, can I get the page that's located at... lessee... www.gibblegibbet.com?


Server: Let me check... Yup, looks fine.


Browser: OK, thanks! Send it over!


Server: Here you go.


That entire conversation is encapsulated in a single response code. Response codes are simple, 3-digit codes that a server sends back to visiting web browsers. Web servers send the same codes back to search crawlers, so it's very, very important that you know what these codes mean.


Yeah, I know, I just oversimplified. If you reaaalllly want all the details of http headers and such, I could write it all down, but you'll have to pay me. It's really boring stuff.

There are a lot of 'em, but I'll stick to the 5 you really need to know:


The 200 code is a server's way of saying "everything's fine, here's the page or file you asked for".


That conversation would match the one I wrote above.


301 - also called a permanent redirect - means that the page the browser/crawler requested is no longer around, but there's a new page now, and the server will provide the new URL instead. That conversation goes like this:


Browser: Yo, gimme www.gibblegibbet.com/default.aspx


Server: Nope, no can-do. It's gone. But we've put up a new, permanent page at www.gibblegibbet.com/index.html. You can go there from now on.


Browser: Ah, got it. I'll make a note.


Use 301 codes when you delete one page and replace it with another, or when you rebuild your site and your entire site structure changes. That'll make your site visitors and search engines happy.


302 means the requested page is not around right now, but it'll be back:


Browser: Yo, gimme www.gibblegibbet.com/default.aspx


Server: Nope, it's gone for now. Took a vacation. But we've got an alternate up and running at www.gibblegibbet.com/index.html. Use that for now, but remember, we'll be switching back to the original soon.


Browser: Stupid detours. OK, fine.


Server: Don't get all persnickety. I just do what my webmaster says.


I embellished a bit. But you get the idea. A 302 redirect - also called a temporary redirect - tells a browser or search crawler not to look too closely at the new page, because the old one will be back.


It's rare that a 302 is a good idea. If you're using 302 redirection, make sure there's a good reason, because it could wreak havoc with your rankings.


404 means the page is gone or never existed, and the server has no idea what happened.


Browser: I need to see www.gibblegibbet.com/cheepwareznow.html


Server: Yeah, right. Sorry, that page doesn't exist. It may have once, but it's gone now.


Browser: WTH?!!!


You should fix 404 errors when you find 'em on your site, or do a 301 redirect from the missing page to a relevant one.


There are actually a lot of different 50x options: 500, 501, 502, 503, etc.. But they all mean the same thing:


Browser: Hey, can I have a look at www.gibblegibbet.com?


Server: OK, I'll aaaaaaaaaaaauuuugh.


Browser: Auuuuuuuuuuugh?


Server: thud


The server is kaput. It's dead, unconscious or just taking a break, and it can't even respond to any request. If one of our sites starts delivering 50x errors, that's my time to panic, 'cause it means something went really wrong.


Congratulations. You now speak preschool server, and can ask for basic directions when necessary. Truth is, only 1% of 1% of people involved in internet marketing need to know more than this. You can wow your tech folks in the next meeting.


If you do want to know a huge range of status codes, look at the W3C site.

comments (2) | trackbacks (0) | permalink


View the original article here

Levinshtein link fixer (aka the Levinator) code, now available

October 15, 2010 by ian

Well, after spending 45 minutes trying to figure out github, I've realized I'm not as much of a nerd as I thought.

So, in the mean time, here's a nice ZIPped archive of the code for the Levenshtein link redirector I've written in PHP. I've named it the Levinator - Dr. Doofenshmirtz would be proud.

I've talked about it before, but here's the rundown.

This tool compares a list of good URLs and 404 URLs.

Then, using Levenshtein distance calculation, it figures out the closest-matching good URL for each broken one.

Finally, it generates a list of 301 redirects, .htaccess-style, so you can set up redirection.

You'll need:

PHPBasic knowledge of coding (very basic)A list of good URLs on your siteAnd a list of 404 errors - easy to get from Google Webmaster Tools

I'm releasing this under Creative Commons Share-Alike and require attribution.

Creative Commons License
The Levinator by Ian Lurie is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

Have at it:

[ Download the Levinator ]

comments (6) | trackbacks (0) | permalink


View the original article here

Saturday, February 5, 2011

2010: The year everything died

January 14, 2011 by ian

Man. 2010 turned internet marketing into a charnel house. RSS, SEO, the web were all pronounced dead by one pundit or another. Let's review:

Robert Scoble, Steve Rubel, Jason Calacanis, Jeremy Schoemaker and others all pronounced SEO dead because of Google Instant or blended search or a pressing need for more links to their blogs. Actually, Shoemoney pronounces SEO dead at least once a year, and has made it into a running gag with the SEO community, so I don't think he counts.

Reality. SEO is alive and well after another year of changes. See, there's this one fact all the coroners out there ignore: People still search for stuff. As long as they do, SEO will be around.

In their defense... As long as the entire SEO community rises up in hysteria, linking back to people who claim SEO is dead, expect pundits to make that claim. It's easier than getting links one at a time, that's for sure.

Steve Rubel, flush with victory after claiming SEO is dead (see above) and that the pageview is dead (back in 2007) decided to extend his win streak by claiming that yes, RSS is dead, or at least maimed, too. He then posted a desire to return to feed reading in 2011, so I'm just confused. But other publications and writers also say RSS is fading to dust.

Reality. Andy Beal shows pretty compelling evidence that RSS use is going up, fast. Smart marketers use the technology for all sorts of monitoring and information delivery/consumption. RSS isn't being used by consumers - that's true. That doesn't make it dead. That's like saying jet fuel's dead because we don't use it in cars yet.

In their defense... The world of RSS is an utter mess. Try to automate access to a Google Alert RSS feed and you get errors about 1/2 the time. It'd sure be nice, just once, to have a standard that's actually standard, just once.

Wired Magazine decided that the web is dead (again) claiming that the web is dead. They claim that the rise of video and decline of traditional web traffic means the old WWW ain't what she used to be.

Reality. Video is still primarily delivered using the web. So I'm not even sure that their statistics are valid. I also think that the rise of apps is going to be a temporary one. HTML5 and mobile-friendly javascript frameworks are poised to make web-driven mobile interfaces easier, more efficient and a better user experience than apps. And Wired's own venture into apps hasn't gone that great. That's right, I said it: Apps are dead (snicker).

In their defense... Declaring the web is dead sold a lotta magazines. Apps are damned cool right now. And Cisco gave them a really pretty-looking graph. Plus, Wired publishes a lot of great stuff. They have to go flying off the rails sometimes.

Subtext. The Cisco data they're using is a little murky. Wired doesn't actually say what Cisco is using as their metric. But Cisco typically uses bytes. If the graph Wired published in their article is based on bytes transferred, then the whole premise is badly flawed. Video is a heck of a lot bigger, and transferring 3 minutes of video requires a lot more bytes than transferring an HTML page that takes 3 minutes to read. You might as well claim America is on the rise because we're all fatter now.

Keep writing, Steve! Keep going, Jason! You give the rest of us stuff to write about.

Here's to 2011!

comments (6) | trackbacks (0) | permalink


View the original article here

Why Google's new in-page analytics sorta sucks: A video

November 12, 2010 by ian

I lie at the beginning of this video. I say that there are some things I love about Google Analytics' new 'in-page analytics' feature. Truth is, I hate it. You know I'm a fan of all things Google Analytics, but man, this one stinks up the joint like a rotting pig carcass. Watch the video to see why, and learn an alternative:

In which I say "don't use in-page analytics!", explain why, and present alternatives.

PS: I don't even mention the part where Google Analytics' page overlay then burrows into your browser like a tick and refuses to go away, so every time you load your site after using it, you get the overlay. Waaaah.

comments (7) | trackbacks (0) | permalink


View the original article here

9 things I want to learn in 2011

January 7, 2011 by ian

I'm not a big New Year's Resolutions kind of guy. My whole life is making lists and crossing things off of them. Why do that one more time each year?

I do love to learn stuff though. Here's my learning 'to do' list for the year. I want to learn:

How to give a kick-ass keynote. I love public speaking and teaching. I want to take what seems like the next step and give a keynote or two. But I don't want to suck at it. You may get to be the audience, who knows? Please don't throw anything that can cause permanent injury.How to use Google App Engine. For some reason, App Engine is a huge mental block for me. It's like fractions in 2nd grade - no one could explain 'em.Data visualization. I know the basics, but I want to learn the theory and principles behind really good data visualization. Because I'm a geek.Python's natural language tool kit. Because... Well, see #3.A bit of linear algebra. Just the vectors stuff. Yeah, I know. See #3 and 4.How to maintain the latest generation of bicycle drivetrains. What? You thought this would all be work? Compared to when I was a bike mechanic, the shifters, cranks, etc. on high-end bicycles these days might as well be printed circuits. I gotta start all over.4 new Yoga routines. Hopefully ones that don't make my fat hang out, my shorts ride up, my gut gurgle like Old Faithful and my face to turn beet red, but if I can avoid 2 out of 4 I'll be happy.How to build the brand of my company and myself. Ironic, I know. I seem to be good at building other's brands, pipelines, etc.. But when it comes to my own, well, I kind of suck. My laser focus turns into more of a silly string barrage.Really great paper modeling techniques. My kids, who now play D&D with me, love to see the worlds we create brought to life. Paper models are a great way to do it. It's amazing I ever got married, really. Actually, it's amazing I ever got a date.comments (7) | trackbacks (0) | permalink


View the original article here

Python web crawler code - use at your own risk


Big changes to the crawler code:

Switched from urllib, which left sockets open and created memory leaks, crashes and other computer higgledy-piggledy, to httplib.Now fetching mime-type and using it to separate images from text pages.Better URL handling.Cleaner output - removes domain name from output for smaller, easier to handle files.Switch to crawl only the current site, or to check other sites, too.Checks for URLs previously crawled and marks them as such, but still notes them. That will provide you a complete list of all links on every page, without slowing the crawl.Better connection management for faster crawls.

Things that still bug me:

The script will time out if the target site times out. Need a way to have it stop gracefully.Still not multithreaded.Not storing in a database. That's to keep the script simple and portable, but at some point it'll have to change.Needs a pretty interface. Working on that next.Download the code (and contribute to the project by improving the code!) here:

[ CMCrawler - an open source Python web crawler ]


This is a command-line Python script. It doesn't get much uglier, just so ya know. But it's fast, lightweight and the output is easy to mash for generating XML sitemaps, checking for 404 errors on your site, or just getting a sense of a site's layout.


As a speed reference: It averages 90 seconds to crawl 700 or so pages. It is single threaded (at the moment).


You must have Python installed. If you don't, or don't know how to install it, frankly I don't suggest you mess with this just now. It's not a mature-enough program yet.


You also need one library that doesn't come standard with Python: The fantastic BeautifulSoup library. It's worth the effort, and without it, writing this crawler would have reduced me to a damp, gibbering lump of flesh under my desk.


Finally, you need to know how to use the command line on your computer, just a little bit.

Download the code.Extract the compressed archive to your hard drive. Put it wherever you want - just make sure you remember the location.Start up your command-line client. On my Mac I use the trusty BASH shell.Navigate to the folder where you put the script.Type python cmcrawler.py [domain to crawl] [stay within domain]. Domain to crawl is your site's domain, without the leading 'http://'. Stay within domain is a '0' for 'stay within this domain or a '1' for 'crawl everything'. For God's sake, stick with 0 for now, OK?The script will spit out the results of the crawl, as they happen. The results are tab-delimited, so you can easily cut-and-paste them into a text editor or Excel.

A few folks at #seochat last night asked for the code from a Python-driven web crawler I'm working on, so here it is, in a Github repository.


I'm just warning you: This is some ugly stuff in that code. This was the very first Python code I wrote. Ever. It does all the horrible things developers do when learning a new platform.


I'll update it as often as I can. The code is totally, 100% free for everyone to use. There are a few conditions though:

You can't use this for a commercial project without talking to me first.Please improve it! Check out the issues page on Github and see what you can do. Send me feedback.You are not permitted to laugh at my lack of coding-fu.

Enjoy.


PS: This crawler is really me hacking together great libraries other people wrote. I get no credit for anything that works.


[ CMCrawler - an open source Python web crawler ]

comments (2) | trackbacks (0) | permalink


View the original article here