Wednesday, December 12, 2007

Google Analytics can't track Javascript support

AJAX is almost a definitive component of Web 2.0. I tend to be an asshole about security so I like my sites to degrade nicely for those users who have Javascript disabled. I was wondering today if I am a relic.

Digg, my favorite web 2.0 site, is unusable without Javascript. You can login and click around your profile ok, but you can't digg any stories. I'd call that core functionality.

Google maps work ok. Maybe not mashups of Google maps, but the site itself will display in street view and text links for zooming and panning. Nice degradation.

But how many people actually surf around without Javascript enabled? I use Google Analytics to measure the meager traffic I get to this blog, so I checked there first. But since Google Analytics measures traffic solely by Javascript, by definition they can't tell how many people on your siet don't have Javascript enabled. Those users are invisible to Google Analytics.

Looks like Omniture has worked around this issue, I'm checking to see if WebTrends via log analysis provides the data too.

I can't complain about a missing feature in a free service, it's just uncommon for Google to miss a trick.

PS: Blogger requires Javascript, as I discover trying to click the "Publish Post" button and get nothing. Time to enable Javascript again.

Tuesday, November 20, 2007

The Aesthetics of Hex Rounding

~~ In which I coin a phrase, "hex rounding," as applied to color selection for the web ~~

A web project underway is for a Floridian audience, and needs to have a local feel. In choosing a color palette, the obvious first choice is "orange." But you can't use the Orange and Blue of the University of Florida fans w/ offending Seminole sensibilities. Similar issue for Orange Green of University of Miami. Can't use Miami Dolphins colors either. Note: I lived in Orlando for seven years, and graduated from UCF.

I was inspired by rainbow sherbet: the orange and green from that, plus a very light yellow, seemed Floridian to me. Please don't argue that with me, blogoshpere; I know its subjective, it's not the point of this blog, just the setup.

Working with a very talented web designer, we google-imaged "rainbow sherbet" and got enough results to color sample a few. Dropping them into the page layout and tweaking for readability netted the following palette:

orange #FB9E03 (251,158,3)
green #B7DF40 (183,223,64)
yellow #FEFF95 (254,255,149)

I have no training in color theory, but I grok the basics of color families. Color families can be colors that have the same hue, in different saturations. Or different tints. Whatever, you change some values but keep others the same and you'll get colors that "go well together." In computers, these colors are expressed in numbers that share similarities. In hex, base 8. Math aesthetics, you see?

And I remember my days of teaching "web design" back in ~1996, before CSS, when we had to worry about "web safe colors". Web safe colors were in the 256 color "Windows palette" of 8 bit graphics. Web safe octets were 00,33,66,99,CC, and FF. In decimal, that is 0, 51, 102, 153, 204, and 255. So the first round of my "hex rounding" netted:

orange #FF9900 (255,153,0)
green #B7DF00 (183,223,51)
yellow #FFFF99 (255,255,153)

So my orange and yellow were now "web safe", and the last octet of my green was "safe". But I'm not really caring about web safe these days. I'm just using it as the most convenient direction to push them, mathematically, into the same color family.

I like working in for web palettes, only because it is easy to share successful results with remote people. And this is color picking, not just math. But COLOURlovers doesnt let you input RGB, only hex. I imagine they think people are mostly clicking and dragging around the color picker.

I continue to work on the green. 183 is between my 153 and 204. I test pushing it all the way to 204, and the color works for me. Somewhat lighter. RGB = colors of light, so bigger numbers = "more lights on" and (no pun here, thats where the word comes from:) lighter color.

223 I push to 255 but now my color is yucky bright lime. Lets add blue: from hex 00 go to 33, still yuck, 66, 99 oops too far. I'm now at pistachio ice cream and I'm still aiming for lime sherbet so lets split the difference. Translating to decimal, I need a number between 102 and 153. 127.5 splits the difference. 7F. Check it, yes that works.

orange #FF9900 (255, 153, 0)
green #CCFF7F (204, 255, 127)
yellow #FFFF99 (255, 255, 153)

And here is my palette, hex rounded. Not necessarily better, just mathematically based. Sorta:

Wednesday, November 14, 2007

Rackspace SLA = 99.9%. Penalties kick in.

Rackspace had a serious outage. Valleywag scooped the actual police report.

I think most Diggers are being too kind to Rackspace. I just checked with my hosting provider about this scenario:

"There are two Central Hudson utility transformers that feed our building. They are located behind locked fences at the Central Hudson sub station on the perimeter of our campus --- far from any roads.

Additionally, there are receiving and distribution transformers within our building on both the second floor of our mechanical plant and our data center. Again, these devices are not located near roads or traffic.

Lastly, our emergency generators are located in protective, sound enunciator houses to protect them from the environment / external elements. These generators are also not located anywhere near traffic flow."

I host with Cervalis btw. I ckecked with Rackspace's live chat attendant this AM. Their SLA is for 99.9% uptime, so penalties kicked in for affected customers.

Their penalities are a percentage off monthly fees equal to the portion of the montly outage. So if your company was down for .5% of the month, about 3.5 hours, you'd "save" .5% of your Rackspace fees. How crazy would you be if your business was SOL for 3.5 hours?? This SLA is lousy imho.

Wednesday, November 7, 2007

Loving Ubuntu 7.10

When my sister asked me to help her with a web site in April, I took the opportunity to expand my professional skills by developing it in LAMP: Linux, Apache, MySQL, and pHp. I'd dabbled with Cygwin when I knew shell scripting was best suited to the task at hand, but that was the extent of my open source skills.

So I took a laptop that was past its prime -- the network card only worked intermittently, and the graphics capability meager -- and installed Ubuntu Feisty on it. It's worked pretty well, and I've been able to muddle through the learning curve to get the project underway.

I'm an update-aholic, so when Ubuntu 7.10 "Gutsy Gibbon" was released, I was edgy and feisty (lol) to get it. There were several kinks: first attempt failed because duh! I ran out of battery power. Second attempt: my network card went on vacation again. Sigh.

I tried the Live CD, then got back on track with the Alternate version. Luckily plenty of other computers around to allow for sneaker-netting.

The Apache upgrade was another hiccup: I had to re-configure pHp and chmod permissions.

I brought it into work and one of my IT guys wrestled with the wireless NIC to get that on our office network. I never could get that done under Feisty. But now I can easily roam, connecting to my home or office network without intervention whenever I'm in range.

But I confess: I love Ubuntu 7.10 for the eye candy. Transparent terminal. Clearlooks, Darklooks depending on mood. Transparent panels top and bottom. I'm a sucker for transparency, it seems.

Monday, October 22, 2007

Jobster gets blocked

We're having performance issues on RHW lately, and one finding is that Jobster is scraping our jobs. No surprise there. They do attribute us, but I never liked their model of just scraping instead of asking for a feed.

We're seeing this in our error logs:

DateTime={ts '2007-10-22 14:47:22'}, Template=/BrowseAds/index.cfm, RemoteAddress=, HTTPReferer=, Diagnostics=The request has exceeded the allowable time limit Tag: CFSTOREDPROC
The error occurred on line 223., QueryString=SN=103&M=100&RP=datedesc&D=summary&R=1, Cookie=, Browser=Mozilla/4.0 (compatible; +\

But the link their robot reports,, is 404. For shame.

So, quick ARIN lookup on the remote IP gives this:

AT&T WorldNet Services ATT (NET-12-0-0-0-1) -
CERFnet ATTENS-SEA1-1 (NET-12-129-0-0-1) -
Jobster, Inc. ATTENS-011426-005621 (NET-12-129-9-192-1) -

So I'm blocking them at the firewall, until they decide to play nice.

Thursday, October 4, 2007

In the press

It's kinda weird when non-technical people refer to me as a "geek guru" but I guess in small pond like Poughkeepsie that works.

As a company, we almost never get press in local dailies because we compete with their classified revenue so directly. They hate us.

Here we are in a local business weekly, and that adversarial relationship is explained:

Radio the the Web and Back

Tuesday, October 2, 2007 Spam

Ha seems (or at least, someone who works for them) got caught spamming, and then buried themselves deeper by trying to deny it. I saw this on the first page of tonight:

Thursday, September 6, 2007

PurplePages search box

Hey, now see that awesome PurplePages search box on the right of this page! Just added it there for testing but it looks good so I'll keep it. :D

Add a search box to your site :D

Friday, August 31, 2007 for public web analytics

Researching a competitor I found their "profile" at Never heard of them, so I dug in, checking out and

They do a "panel" analysis of web site traffic, like Alexa, ComScore, and Neilsens. But unlike those last two, they publish their results for free.

Alexa does that too, but I've always seen there data as heavily skewed. By nature, they skew heavily towards webmasters. Matt Cutts from Google pointed this out in his blog. I've also heard Alexa skews heavily toward young Koreans. Whatever.

Quantcast looks cool: they exact material that they present is curious: what web sites the users of a given domain have an affinity for. What magazines they read.

Another cool thing is that they let you put their Javascript on your site, so they can report on you with 100% accuracy. I'd *love* for all their competitors to do that!

But the don't make their methodology or sample size public, so it's all hogwash for now. I'll stick with Hitwise.

Update: looks like I'm musing in good company here.

New code? Bah.

I found myself telling one of my developers yesterday "We've been doing this for years now. If you find yourself coding anything from scratch, you're probably doing something wrong."

In that vain, props to the War of Stuff blog for the code necessary to add Digg,, reddit onto my blog.

Wednesday, July 11, 2007

Duplicate content

We have over 300 local web sites, each advertised on the radio as a local domain. But they all redirect to because of 1 thing: Google.

If you have separate domain names that all have significantly similar content, especially if they are all hosted at the same IP, Google's algorithm infers that you are trying to spam the search engine, and all your domains get banned from Google. The broad rule is "duplicate content."

It does not matter that for our business model, separate domain names are completely legitimate. Google has no mechanism to make exception, and no venue to argue the merits of our case.

We learned this the hard way with Can you imagine: we had tonsvof radio play, but when someone went to Google and searched for Cupid, we were not listed. Not on page 1, or 1000, or anywhere in between. It took us awhile to figure out what they had a problem with, and of course they
don't tell you, but even after we changed our system, it took 9 months for Google to list again.

I guess that's the downside of Google owning the search space: they make the rules and everyone else follows or sits out.

Wednesday, July 4, 2007

Trip to Colorado turns into Trip to Lake George, Part 2

Having just email blasted a link to Part 1, I realize I haven't gotten around to writing Part 2, about how Lake George turned out to be our best vacation ever.

I'm too tired at the moment to write about Lake George. Hosting a barbecue this rainy day has wiped me out. A picture is worth 10k words? Here's 40k or so: ttp://

Tuesday, July 3, 2007

Trip to Colorado turns into Trip to Lake George, Part 1

My family (a wife and five kids, you know) planned to be in Colorado this past weekend, for an informal memorial service for Mandy's grandmother who passed away last year. Mandy's dad organized the service, including arranging and paying for our flights. He'd be traveling with us. We'd be met in Denver by other extended family traveling from various parts of the country.

We agreed to meet at Stewart Airport, minutes from our house, between 5 AM and 5:15 for a 6 AM flight.

We arrive together. I drop off Mandy, the kids, and a pile of luggage at the curb, then find my way to Overflow Parking and back. I've flown out of Stewart a dozen times and never known Overflow even existed; its just not that busy of an airport. But a bus is waiting for me right behind my car, the driver reminds me to turn off my headlights, and speeds me back to the terminal.

Ever travel with five kids? I get the diaper backpack on Rose, age four, the toy backpack on Seth, six, the laptop and gadgets backpack on Meg, eight, and the snack backpack on Rourke, 9.9. Extend luggage handles, Meg pulls the small, Rourke the medium, I throw two toddler car seats over my shoulder by their straps and clasp large luggage. Mandy sees the plan and picks up what's left: Shane, 2.

John is waiting in line to check us all in by the time my pack and I get in. He's brought in two booster seats from our pile. Cool.

The line is huge, for Stewart: maybe thirty people at the airTran check in, and John says that they had just opened up a 2nd line and he had jumped into it, so was only four people deep.

There are four "self check-in kiosks" but I hear the attendant explain that people need to go one at a time because even though it is "self check-in" they still need to go through her. The wait is about fifteen minutes; one of the attendants called out while we were next in line: "Is the Bywater party here?" "Yes!" I called back. "Is the McLaughlin party here?" next. "Yes!" again; Mandy's maiden name. Cool, they know we're here. I'm feeling better.

So we finally get to the counter, and an attendant starts to check us in. It's now 5:30. At first she says that the flight was just closed but she can claim she was already checking us in and re-open it. But there is a problem, she doesn't have tickets for all of us. She reads off the names that she has tickets for, but doesn't have Rose or Rourke listed, and only has one Margaret (missing either Mandy or Meg, that is). I hand her back the ticket that she had just given us with Rose's name. My guess, in hindsight, is that they are in the process of giving our seats away upstairs at the gate as we are trying to get checked in downstairs.

She calls over a supervisor for assistance, and is truly trying to help us. She tells us that she is not going to be able to get us on, and even if she is they are going to close the doors ten minutes before the flight, and we still need to get through security. I ask if it's worth trying to get the kids rushed through security, the supervisor nods, so I bolt that way.

Mandy has already had the kids in line, and made it to the first security guard, who doesn't let our gang through because we don't have boarding passes. I explain that they are being printed, our flight is about to go, and the attendant had recommended I get moving through security since we have five kids in tow. The security guard bluntly states that we can't get past her without boarding passes. Grrrr. I bolt back to the check in.

Things there are over. No way we can get on the flight with eight of us, as it has been "way oversold, and closed." No way is there anyway to get us there before Saturday. Not with eight people. Ouch. John decides to bag the trip.

Regroup. Meg is crying because we aren't going on an airplane. Mandy and I put our heads together and decide to bring the brood to Perkins for breakfast while we figure out a new plan. On the way, Mandy calls Rocking Horse Ranch to see if they have rooms, but their Reservation Desk doesn't open until nine.

Ok, Lake George then.

Tuesday, June 5, 2007

Keeping scammers off online dating sites

Mark Brooks, my former co-worker, did an interview with Nelson Rodriguez of LoveAccess regarding keeping scammers off online dating sites. Nelson is a great guy, and from our past-discussions I consider him an expert in this area.

The idea of the online dating industry sharing resources to fight scammers was discussed at the iDate 2006 conference in Miami; Mark and I were on that panel. I publicly stated that I would support that effort, and suggested Mark be a good person to spearhead the effort. Seems like his recent interviews are a step in that direction. Kudos, Mark!

I'll include here my comments on Mark's interview with Nelson:

We talked about shared effort at iDate Miami 06. I still think it has merit -- somethings are easy to share and don't get into proprietary info.

At, we only advertise in the US and Canada, so we block IPs known to be from any other foreign country. We use
for this data.

Also, I have no need to allow anyone who wants IP anonymity on my site, so we also block all IPs known to be associated with TOR, The Onion Router.

Commercial anonymizing services will gladly block their members from access your web site if you send them a request.

IPs are easy to change. MAC addresses can be spoofed but that is a good idea I hadn't thought of. But as soon as you block someone, you alert them of the need to change. The only thing that seems to limit scammers is time. So when considering a scammer strategy, devise methods that let them waste time without letting them know that they've been identified. They will learn that your site doesn't convert for them, and they will be motivated to try elsewhere.

Tuesday, May 29, 2007

Netgear router = impossible to configure

I wasted another couple prime Friday evening hours this week at my brother's office trying to configure his Internet connection. I set it up once months back but he lost connectivity and called Verizon instead of me. The tech had him wipe out my configuration, and then couldn't help him get back online. Grrrr.

The hassle is his DSL router and his Netgear Wireless router both want to be a DHCP server, and both want to be IP I can configure the DSL router however I want, it's got a nice interface. So I disabled its DHCP and gave it a different IP. So far so good.

The Netgear router has a "configuration wizard" that you cannot escape. After a hard reset, it redirects all requests to, and writes a route aliasing the domain "routerconfig" or whatever to that adress. Then it tries to sense the Internet connectivity. If it doesn't have a upstream link, you can't proceed any further in the wizard. Nor can you bypass the wizard, Grrrrr! If it's plugged into the DSL router, it detects that it'll get a dynamic IP and beckons you to continue. But "poof!" it doesn't work. 404 for the next screen in the wizard.

I've concluded that the best way to "solve" the problem is to replace the Netgear wireless router with a different one, form *anyone but Netgear.* I talked to Jeremy, my Senior Systems Administrator, and he said that about a year ago Netgear switched their interface around and now they are total crap spo he's stayed clear.

I recently replaced my Netgear MR814 Wireless Router at home because it no longer allowed wireless connections. Most often it wouln't broadcast anything, not even its SSID. Most I could get out of it was 5 minutes uptime wirelessly. It guess that's a "security feature" since it couldn't do WAP either.

The replacement is a Belkin Wireless G Plus router. WAP, plus an interface I can do anything with. I sense I'll be buying one in the near future for my bro. Much better than losing yet another Friday evening.

Friday, May 18, 2007

Tragic follow up: High school poets

Last Friday I blogged about listening to high school students recite poetry at Barnes & Noble; their teacher is another parent from my daughters soccer team. Our daughters played together while I listened to her students' poems.

This week when I arrived for the end of soccer practice, the eight year old girls were all gathered around a picnic table working on a group sympathy card for a team mate. I learned that, tragically, her father had died suddenly over the weekend of a heart attack. He had been at work. This was the same family who I had run into at the book store.

I was flabbergasted. I cannot imagine. This is a young family; he was not an old man. He was my peer.

It made me assess: am I doing everything I can do the keep my heart healthy? I made it to the gym this week twice, I need to go more. I've been eating healthy. What would my family do? I cannot imagine.

Wednesday, May 9, 2007

Highschool poets

My 7 year old daughter -- D'oh!: 8 year old daughter! -- Meg and I both had birthday money burning a whole in my pocket tonight, and it needed to get spent at Barnes and Noble. While I was paging new paperbacks Meg's soccer coach asked if I'd come over and listen to her high school students present poetry. I applaud, no: snap, their willingness to stand up in public -- the closest thing we have now to a town square -- and read their own work.

It reminded me of a poem I wrote in college, especially appropriate for the young audience of tonight. I wish them all well.

"Bite Big"

Bite big!
Grow, puppy, grow!
Don't be afraid to choke.
Show canine smile around raw red meat.
Aggressively chew, aggressively eat
and Grow!

Monday, April 30, 2007

"The Diamond Age" by Neal Stephenson

Neal Stephenson must really hate glass. In "Snow Crash" (yeah, I know book titles are supposed to be underlined, not quoted like an article, but Blogger doesn't allow for underline because now underline = link).... (Begin again:) In "Snow Crash" he has skateboards equipped with sonic glass-destruction blasts. And in "The Diamond Age" nano-extruded diamond has replaced glass because its cheaper and stronger. He highlights the quaint distortion of perspective through glass. Ok, Neal, we get it: glass is bad. (I'll need to re-read Cryptonomicon to see if it contains glass bashing.)

This isn't a review, just some of my thoughts after reading the book. I loved the book and will continue to read everything Neal Stephenson writes. Without going through his trash, I mean.

In "The Diamond Age" Neal explores the possibilities of nanotechnology. My brain is stuck on Neal's (can I call you Neal? Thanks.) posit that things built in a vacuum can be hollow, thereby contain a vacuum, yet be strong enough to maintain integrity when exposed to normal atmospheric pressure, and thus are lighter than air. I love the premise. Its elegantly simple but my brain rejects it. I want to see if it really works. I don't get to; thats why its called fiction.

Diamond is pure carbon, simple. But doesn't it take enormous pressure to get carbon to align itself in a crystal lattice? Neal, I wanted you to explain where all that energy comes from. Just a paragraph or two lay that piece out, please. Energy is everything, really. Once energy is solved, all physical things like starvation go away.

I enjoyed the node logic of the drummers. It fits my world-view. All are nodes, all have a value. The whole exists as nodes add and delete. The equation never completes.

Friday, April 27, 2007

New rule

Lets just all agree, officially, that drinking Kahlua and coffee counts as multitasking.

Ok? Thanks.

Wednesday, April 18, 2007

How to tell if your website uses 301 redirects

I was at Search Engine Strategies in NYC last week so I'm in an SEO mood. It was a good conference... 90% reenforcement and 10% new stuff. Most of the people there were marketers, not technologists, which is good because they did most of the small talking for me.

One thing Search Engine Marketing people stress is using 301 redirects instead of META REFRESH or 302 "Moved temporarily" redirects. 301 and 302 are HTTP headers. Most web pages send a 200 for normal status. 404 is standard for missing page ("Help! I've lost my 404 page!"). Google and, presumably, other search engines prefer 301 redirects. Why? I guess it intuitively makes sense... they don't want to bother putting something in their index if they think it's not going to be around for awhile.

I know I've made sure both and use 301 redirects. We have a new product, in beta, though, and I wasn't sure if we coded that correctly. So I needed to check. And I realized most SES attendees probably wouldn't know how to check if their sites use 301 redirects and would have to either learn or trust their coders, so therefore I decided to blog it. It's good for marketing people to not have to rely on coders. Good for all.

You can't just "view source" of a web page to see if it's doing a 301 versus a 302, because by the time you have a web page you've already been redirected. You need something that will interrupt the process. An intermediary browser. A proxy!

In the past I've used Achilles proxy server for this. But I grimace every time I install it or suggest someone install it because it really is crappy. Free software doesn't have to be crappy. Achilles would run for a couple minutes and hang. Awful interface. But it was enough to get the job done. Barely.

Searching for Achilles today to install it on my new laptop, I found that it still hasn't been update but someone else had made a new proxy. Odysseus is the successor to Achilles. I love it-- wish it had come out years ago.

Ummm... if you are using a Mac ( and lots of marketing people do, right?) this isn't going to help you. Feel free to read on anyways. Like I could stop you anyway.

Download it (it's free). Install it. Start it... in your Windows System Tray right click on it and choose IE Settings > Odysseus. Now all your Internet Explorer requests will go through Odysseus. Right click on Odysseus again and choose Configuration. Check Intercept Reply. You can deselect Intercept Request unless you really want to click on the Ok button a lot (although that is great to leave on when use are security testing your site). Right click on Achilles one more time and select Interceptor.

Now navigate to whatever page you want to test. If you left Intercept Request checked then you'll need to click "Ok" for every pages and cookies along the way. Notice that the window title bar will say "Interceptor - REQUEST" for every item you request, and "Interceptor - REPLY" for your response from the web server. To see the status number, click on the Raw tab of a reply. The first line with be something like "HTTP/1.1 200 OK" for a normal page.

For me, I went to and got the status "HTTP/1.1 302 Moved Temporarily" as it redirected to D'oh! I immediately assigned it to a Web Developer to fix. Then as a sanity check I went to and thankfully it was "HTTP/1.1 301 Moved Permanently" to Whew!

When you are all done, just right click on Odysseus again and deselect Interceptor to turn it off to resume normal browsing.