Yes, it’s… yet another redesign

I’ve redesigned this blog more times than I can count. Many of those redesigns have been incremental tweaks, to be sure, but still, there’ve been probably dozens of times that I’ve completely torn it down and rebuilt it, more-or-less from scratch. This is one of those times.

I’ve also (finally) wised up a bit. Usually when I post these redesign announcements, I don’t include a screenshot… as if this is the last time I’ll ever redesign the site. I wish I could go back to some of those earlier posts and see what the site actually looked like when I announced the changes. I can remember most of them, even from the pointless ramblings I composed to commemorate their creation. But it would still be nice to see them on the outside of my brain.

There are some big changes in this version. Most significantly, I’m using two (relatively) new technologies as both key components of the underlying structure and also as inspiration for the design itself. They’re created (or at least inspired) by some amazingly talented people in this field, so they deserve recognition.

First, the fonts are being delivered by Typekit. Finally, web designers have more fonts at their disposal than Arial, Georgia and Verdana. (Yes, there are some others, but these three are the most excessively used.) There are some awesome people behind Typekit, but I especially want to call out founder Jeffrey Veen and creative director (and probably the best web designer on the planet) Jason Santa Maria.

Next up, we have a responsive web design using CSS3 media queries. (Yes, that’s probably the most boring possible link about one of the coolest technologies out there right now in web design.) I think we have Ethan Marcotte to thank for devising this brilliant use of CSS3 media queries to dynamically adapt web page layouts to the size of the browser window. At the very least, he named it and helped spread the word with the aforelinked A List Apart article and his new book.

In short, by employing CSS3 media queries to adjust the page layout to an appropriate width and number of columns (and smartly resizing elements within), it’s possible to easily adapt a web page’s presentation to suit the capabilities and dimensions of a number of screens. Just take a look at this site on your 27-inch iMac and then on your iPhone (or your roughly equivalent non-Apple devices) to see what I mean. I’m sure I’m not doing Ethan’s work justice, either in my description or in my application of it here, but I’m excited about the potential regardless.

It’s a great time to be a web designer!

Update: I went for less than 48 hours with Futura PT Light as my primary font for body text here, despite knowing it was too light and, perhaps, too geometric for good body type. Finally, at a friend’s prodding, I resorted to the inevitable: Proxima Nova. I love Proxima Nova. It’s the primary font I use in all of my business materials (and in my logo itself). I had envisioned a kind of ’50s retro school textbook concept with this site redesign, and Proxima Nova, a 21st century font, doesn’t fit that description, but… man, it just looks so good. So, now it’s here.

CakePHP at the command line: it’s cron-tastic!

I’m kind of surprised it’s taken this long. cms34 has been around for almost three years now, and this is the first time I’ve had a client need a cron job that relied on CakePHP functionality. (The system has a couple of backup and general-purpose cleanup tools that can be configured as cron jobs, but they’re just simple shell scripts.)

And so it was today that I found myself retrofitting my CakePHP-based web application to support running scripts from the command line. I found a great post in the Bakery that got me about 85% of the way there, but there were some issues, mostly due to the fact that the post was written in late 2006, and a lot has happened in CakePHP land over the last 4 1/2 years.

There are two big differences in app/webroot/index.php in CakePHP 1.3 compared to the version that existed at the time of that original post: first, the calls to the Dispatcher object are now wrapped in a conditional, so the instruction to replace everything below the require line should now be something closer to “replace everything within the else statement at the bottom of the file.”

The other big change is that this file defines some constants for directories within the application, and those paths are all wrong if you move the file into the app directory as instructed.

Below is my revised version of the code. Note that I also reworked it slightly so the command can accept more than two arguments as well. There’s a space before Dispatcher is called where you can insert any necessary logic for handling those arguments. (I also removed all of the comments that appear in the original version of the file.)

<?php
if (!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
}
if (!defined('ROOT')) {
    define('ROOT', dirname(dirname(__FILE__)));
}
if (!defined('APP_DIR')) {
    define('APP_DIR', basename(dirname(__FILE__)));
}
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
    define('CAKE_CORE_INCLUDE_PATH', ROOT);
}
if (!defined('WEBROOT_DIR')) {
    define('WEBROOT_DIR', APP_DIR . DS . 'webroot');
}
if (!defined('WWW_ROOT')) {
    define('WWW_ROOT', WEBROOT_DIR . DS);
}
if (!defined('CORE_PATH')) {
    if (function_exists('ini_set') && ini_set('include_path', CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS . APP_DIR . DS . PATH_SEPARATOR . ini_get('include_path'))) {
        define('APP_PATH', null);
        define('CORE_PATH', null);
    } else {
        define('APP_PATH', ROOT . DS . APP_DIR . DS);
        define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
    }
}
if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) {
    trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR);
}
if (isset($_GET['url']) && $_GET['url'] === 'favicon.ico') {
    return;
} else {
    // Dispatch the controller action given to it
    // eg php cron_dispatcher.php /controller/action
    define('CRON_DISPATCHER',true);
    if($argc >= 2) {

        // INSERT ANY LOGIC FOR ADDITIONAL ARGUMENT VALUES HERE

        $Dispatcher= new Dispatcher();
        $Dispatcher->dispatch($argv[1]);
    }
}

After implementing this version of cron_dispatcher.php, I was able to get CakePHP scripts to run at the command line without being fundamentally broken, but there were still a few further adjustments I needed to make (mostly in app_controller.php). Those were specific to my application. You’ll probably find yourself in the same boat.

A couple of other things worth noting: if your server is anything like mine, you’ll need to specify the full path of the PHP command line executable when running your scripts. In my case it was /usr/local/bin/php. And, the one sheepish confession I have to make: I know the goal with the way the file path constants are defined is to avoid any literal naming, but I couldn’t find a good way to get around that for WEBROOT_DIR, with the file no longer residing in webroot itself. I’ll leave fixing that as an exercise for the reader.

Good luck!

Download the Script

Download zip file... cron_dispatcher.php
cron_dispatcher.php.zip • 1.2 KB

Takin’ it to 3-2-1 Contact

I’ve been thinking this for years, but I finally decided to put it to the test. I tweeted the results, but it felt like something worth commemorating here as well.

First, a confession: I am a Michael McDonald fan. Not the latter-years, “songbook”-type crap Paul Rudd’s character made fun of in The 40-Year-Old Virgin. But the classic, late ’70s/early ’80s stuff with the Doobie Brothers, Steely Dan, and countless other backup vocals and solo tracks that inspired Yacht Rock.

As a Michael McDonald fan, I’ve listened to his work with the Doobie Brothers probably more than anyone should. Tracks like “Takin’ It to the Streets.” And another thing I’ve done a lot of in my lifetime — again, probably more than anyone should — is watch shows produced by Children’s Television Workshop for PBS in the late ’70s and early ’80s, right around the time of Michael McDonald’s peak.

So, no, I don’t think it’s an accident that what I’ve anecdotally observed is now, here, for you, concretely proven: the 3-2-1 Contact theme song is almost a direct ripoff of the transitional bridge of the Doobs’ 1976 hit “Takin’ It to the Streets.” But don’t take my word for it… your ears will tell you.

Listen to “Takin’ It to the Streets,” particularly, the section beginning at 0:47 in the clip below.

And now, the legendary title sequence of 3-2-1 Contact, whose music and imagery is indelibly etched in my brain.

SEO doesn’t matter

Note (April 22, 2011): I rarely second-guess myself after posting a blog entry, but this was one of those rare cases. I reconsidered the post due to the fact that shortly after writing it, I observed a case with a client where SEO did matter. But upon further, um, reconsideration, I decided the post did still have merit, because the type of SEO we were dealing with was not the type of SEO I’m talking about here. In fact, “the type of SEO we were dealing with” is something I’m reluctant to call SEO at all, even though that’s denotatively what it is: search engine optimization. But there’s a huge difference between semantic HTML, well formed title and meta tags, and carefully constructed sitemap.xml and robots.txt files, versus “gaming the system,” which is the negative connotation SEO typically carries, and what I’m focusing on in my criticism here. So… on we go. With a few edits for clarification.


There, I said it. Well, actually I’ve been saying it in various ways for years, so what I actually mean is: there, I made it the title of a blog post. And if SEO does matter at all, then people who don’t think SEO matters (and somehow feel inclined to express that sentiment in Google’s search box) will soon be viewing this post. (Huh?)

Today I was perusing my RSS feeds (a good way to find information that is relevant to your interests, often much more effective than just searching for random terms on Google), and I came across a blog post entitled Whitehat SEO Is a Joke. Intrigued, I read it, and it made some sense. The argument in a nutshell is that whitehat SEO is, really, just ineffective SEO. This spawned a satirical response, Blackhat SEO Is a Joke. It made some sense too. And that’s when the thought really coalesced in my mind: all SEO is a joke. Not because on one end of the spectrum it’s ineffectual and on the other it’s unethical. Because manipulating search engine rankings shouldn’t really matter to a sustainable business model.

To the Twittermobile!

Forget SEO. If your business model depends significantly on search engine rankings, you're doing something wrong.

After some thought (and a few minutes of research), I followed up with this:

To wit: Google "Minneapolis web development" and I don't come up until page 4 of the results. IT DOESN'T MATTER. I have plenty of work.

So, what do I really mean here? In this specific example of my own work, what I mean is I don’t depend on random people googling “Minneapolis web development” to get work. I get most of my work through the network of contacts I’ve developed over a decade and a half of professional experience, and through referrals from past clients. And even if I do want people to be able to find me on Google, which of course I do, I expect they would type Room 34, not Minneapolis web development. Go ahead and google “Room 34.” I’ll wait.

Welcome back. And guess what? I didn’t spend a cent on SEO consulting, and I didn’t spend much time of my own thinking about SEO either. I thought about well-formed semantic HTML and relevant content and that just happened. But it still doesn’t matter because I don’t depend on search engine rankings for business.

If you’re building a website as a means to promote your business, or if the website is your business, you’ll certainly want to appear in relevant search results, but ultimately your goal is quite simply to get people to your website, regardless of how they got there. Search engines are therefore a marketing tool — hopefully only one of many you’ll be employing — and if search engines don’t lead visitors to your site based on its own merits, then the problem is not the search engines and their confounded algorithms, it’s your site.

Don’t ask me what the other marketing tools are or should be. I’m a web developer, not a marketer. For myself, word-of-mouth and business cards have been the only marketing tools I’ve needed. Other businesses need other strategies, and the first thing any business needs to do when developing a marketing strategy is to figure out where its business is likely to come from and how best to reach that audience.

Regardless of whether you’re deeply immersed in the world of SEO or you hold it at arm’s length like I do, there are some interesting and relevant points in the two blog posts I linked to above, but I think the most salient is this, from the blackhat post:

If however you have a web property that has some value to it, then true blackhat strategies are not the way forward.

Black, white or gray, all SEO (apart from basic web design best practices, careful [and responsible] use of legitimate tools like sitemap.xml and robots.txt files, Google Webmaster Tools, and meaningful, relevant content) is essentially about gaming the system. Some techniques may achieve more immediate impact, and others may have more lasting value, but ultimately I see only two reasons to engage in any of them:

  1. Your content and/or its presentation doesn’t have enough value on its own.
  2. Your business model itself is based on gaming the system.

If the latter is true, there’s nothing I can say or do to help you or to persuade you to act otherwise. We’re simply in this world for different reasons and will never see eye to eye. If the former is true, however, there’s an alternative. It’s a lot more work, but in some ways that’s the point: make your content better. And that will often lead to an even broader, harder, and more important task: figure out what you’re really trying to do in the first place. Because if you need to be on the first page of a generic Google results page to stay in business, maybe you don’t really have much of a business at all.

Addendum, a few hours later: Like I said…
Google search for "SEO doesn't matter"

A childhood fantasy (almost) realized: 100 Atari games in my pocket

Owners of 1980s technology intellectual property are in an unenviable position. Their IP has very little value beyond historical significance or nostalgia. No one (well, I hope no one) is going to use an Apple IIe computer for serious productivity work these days, but that doesn’t diminish its importance in computing history, nor the strong positive memories its once loyal users may still hold onto.

There are few properties from the ’80s whose value is more purely historical and nostalgic than those bearing the brand of Atari. Sure, there’s still a company today named Atari, and it still makes modern video games for modern consoles, but this Atari shares only its name with the hallowed institution founded in Sunnyvale, California in 1972. The name and all of the properties that go with it have been sold and re-sold and re-re-sold so many times over the intervening years that any minute connection to the past, beyond the games themselves, has been lost.

So, what is a modern company that owns all of this (relatively speaking) useless IP to do? Trying to cash in on it is obvious, but doing it right is a huge challenge. The biggest hurdle is the very historical significance and nostalgia that give these games any lingering value in the first place. The only people who are really going to want to play Combat or Yars’ Revenge or — ah-hem — Math Gran Prix on an iPhone are people who either owned (and played the hell out of) these games as kids 30 years ago, or their kids, who harbor a morbid curiosity about this old crap their parents like for some reason. In order to satisfy these customers, the company that now calls itself Atari needs to achieve perfection in recreating the experience people remember. Not just the graphics and the sounds and the program mechanics of the games, but the feel… the essence of what it meant to play video games in the days when Ronald Reagan was president, pastels were popular in men’s fashion, and MTV still showed music videos.

Yesterday Atari released Atari’s Greatest Hits as a universal app for iOS devices. (To the non-nerd[s] in my audience: that means the same app works on iPhone/iPod touch and iPad.) The game comes free with arcade Pong, and 99 other classic (and not-so-classic, but… well… old) Atari games, both from the arcades and for the Atari 2600 VCS, available as in-app purchases. The games are sold in packs of four for 99 cents, or the entire set can be downloaded for $14.99. Let’s be serious: anyone who cares about this at all should just get it over with and download the works, immediately.

So did Atari live up to my unrealistic expectations? Read on after the screenshot gallery to find out.

First impressions

It’s clear from the moment you load Atari’s Greatest Hits on your iPhone or iPad that a great deal of attention and care went into putting this package together. And yet, it just doesn’t quite hit the mark. The graphic design of the menu interface bears plenty of superficial nods to the vintage Atari experience: plenty of use of Bauhaus font (the font Atari used with the original 7 cartridges released with the Atari VCS in 1977), lots of browns and oranges, and of course the carousel navigation that uses the original cabinet and/or game box art to help you select a game to play. But despite fonts and colors, this doesn’t look ’80s, and it certainly doesn’t sound ’80s. The entire time you’re on the menu, loud 21st century techno music booms from your speaker. To be fair, I like this kind of music, and the music they chose is decent. But it’s a distracting anachronism.

I compare this to the Williams Pinball Collection that came out a few years ago on the modern consoles. Its interface looks like an arcade, with the pinball tables lined up along the wall, and over the din of a dozen pinball machines blasts licensed ’80s popular music. (The song that stands out for me is the quite-possibly-perfect Loverboy hit “Workin’ for the Weekend.”) This is what I would have liked (if not downright expected) in a properly executed Atari collection.

Lamentations about “what could have been” aside, it is truly great to see the original game box art and arcade cabinets on the menu, and the menu itself is intuitive and fun to navigate. And it’s great that each game also includes a full high-resolution scan of the original instruction manual, which also explains why a collection of 100 games, most of which were only about 4 KB each on the original cartridges, could add up to a 68 MB download on iOS.

The sound and the fury

There was almost no question for me which game I would try first: Yars’ Revenge. I logged hundreds of hours (sometimes in a single game, it seemed) playing this game in the ’80s, long past the date when I should have moved on to the NES or PC games. Any true Atari retro experience needs to deliver a perfect rendition of Yars’ Revenge for me to consider it a success.

I started the game, picked my favorite game variation (Game 6), and then… WHAAAAA!!! Playing the game on my iPad, I was assaulted by hideous distorted grinding noises. I tried a few other games and confirmed that all of the 2600 games had horribly distorted sound. (It also didn’t help that Yars’ Revenge gets most of its intensity from a constant droning buzz, making this quite possibly the worst game I could begin this experience with.)

Fortunately, later in the evening I loaded the game onto my iPhone 3GS, and found absolutely no sound issues with the 2600 games, even Yars’ Revenge. So I’m not sure if this is a general issue with the game on the iPad, or if it was an isolated problem that could have been resolved with a reboot. I’ll follow up on that when I know more.

Playing the game

With my worries about sound allayed, I was able to focus my attention on the quality of the game experience. All of the games are presented in a relatively small area of the screen, with ample space above and below devoted to on-screen controls. There have been some complaints in App Store reviews about the games not using the full display, but I think those complaints are misguided. These Atari games in their original form were so low-res that even when shrunk down to a little less than half the size of an iPhone screen, they’re still easily viewable. Plus, displaying the games in full-screen mode would mean you’d need to obscure part of the display with your fingers in order to control the game. Unacceptable.

The developers and designers who worked on this collection put considerable thought into translating the original game controls to on-screen counterparts that do not necessarily mimic the original feel, but that usually (but not always) contribute to a satisfying game experience.

A good pair of games to consider in reviewing the merits of these control systems are the arcade versions of Asteroids and Tempest. Both games translate quite well to the iOS experience. They look fantastic (all of the vector games, in particular, come through well here), and are just as fun to play as ever. With Tempest, the original control mechanism was a flywheel-like spinner. That is replaced with a thumbwheel that reminds me of the volume controls on old transistor radios. It’s way different from the original control, but it feels surprisingly natural and it’s very easy to adapt to this type of play.

Asteroids, on the other hand, does not benefit from this new alternate control mechanism, at least for the way I like to play the game. (I should probably note that I own an actual Asteroids cocktail table, so I’m very accustomed to the arcade controls.) The default control mechanism is a combination rotate/thrust “disc,” not unlike the disc controller on an old Intellivision. (Intellivision controls on an Atari game? Blasphemy!) Some people may prefer this, but I found it absolutely unusable, mainly because of my preferred Asteroids playing style: I don’t thrust all over the screen. I stay in one spot and just rotate, and I move around only when absolutely necessary. The disc control makes it nearly impossible, for me at least, to rotate without thrusting. Luckily, Asteroids (and apparently most of the arcade games, though I haven’t tried them all yet) offers multiple control schemes, including the original arcade-style five-button configuration. This worked well for me on the iPad, but I didn’t try it yet on the iPhone, and I imagine size could be an issue there, not to mention just holding the iPhone while fiddling with five on-screen buttons at the bottom of the display.

A few other miscellaneous game notes:

No licensed games. This was a no-brainer for me, but apparently (based on reviews on the App Store) it’s confusing to some users. This collection only consists of games Atari owns the rights to. That means games that were licensed for the original Atari 2600 won’t show up here, not even if Atari developed those games. You won’t find arcade classics like Pac-Man, Space Invaders, Defender or Berzerk, and you won’t find licensed movie properties like Superman, Raiders of the Lost Ark or E.T. And you definitely won’t find games that were originally released by other game companies like Activision, Imagic or Parker Brothers. Although… one wonders. Atari licensed Pitfall! and River Raid from Activision for inclusion on the plug-and-play Atari Flashback 2 console a few years back. Maybe a similar license could be in the works. It wouldn’t be difficult for Atari to offer additional in-app purchases of more games in the future.

I think the funniest instance of licensing issues popping up here though is the matter of Pong Sports. Back in the ’80s Atari manufactured the 2600 and a number of its games under special branding for sale at Sears stores, and there were three Sears exclusive titles (Steeplechase, Submarine Commander and Stellar Track), all of which are included here. And then there’s Pong Sports. Atari released this game as Video Olympics, and sold it as Pong Sports in Sears stores. But here it’s called Pong Sports, presumably because they couldn’t get the rights to use the word “Olympics” this time around.

Unreleased and homebrew games. If you’re not a hardcore Atari fanatic, you probably don’t realize that in recent years a number of unreleased prototype games have come to light as downloadable ROMs to play in computer-based Atari 2600 emulation software. And a rabid homebrew community has developed as well, creating brand new games for the system. This collection includes a few of these prototype and homebrew games, such as the Atari 2600 version of Tempest and an unreleased game called Save Mary. I find it funny that Atari had to, of course, come up with box art for these games for the menu interface, and they went with some really low-quality homemade art for most of them. But Save Mary is the weirdest… it uses the cover art that originally went with the Atari 2600 BASIC Programming cartridge.

It’s also funny… and probably an intentional joke… that for these games, the manual scans that are displayed are not for the games (since they don’t have instruction manuals) but for the Atari 2600 console itself. Somewhat of an Easter egg, I think.

God (or is it the devil?) is in the details

Atari got a lot of things right with this collection, but there is definitely room for improvement. Here are a few things that come to mind, some of which I’ve already mentioned.

License some great ’80s music for the menu. The aforementioned Loverboy hit would certainly be great, but really just about any music that was in heavy rotation on MTV circa 1983 would work. Personally I’d love to hear plenty of Duran Duran and Men at Work.

Alternate control schemes for the 2600 titles. Here’s the one thing that I think would make the biggest difference in creating an authentic Atari 2600 experience: position the on-screen controls to better mimic the feeling of holding an old CX-40 joystick. The space is already there; they’d just need to rearrange the controls. Move the fire button to the upper left where the pause button is; move the d-pad to the lower right where the fire button is; and move the pause button to the lower right where the d-pad is. Holding a square-ish device in the left hand and pressing a button with one’s left thumb while using one’s right hand to control movement is the natural way of the Atari 2600 experience. Ideally the d-pad would be tweaked a bit as well… it’s a little too restrictive feeling. A lot of iOS games with a virtual d-pad allow you to place your thumb anywhere in a general region of the screen and that instantly becomes the “zero” position of the d-pad. I suspect (or at least hope) that, given the nature of iOS apps, Atari will continue to refine the controls in future updates.

Better “cabinet art.” I have to be honest… I can live with the graphic design of the main menus, but the graphics framing the game itself while in play are downright ugly. Better to have it look like an actual vintage TV set like VH1’s (yes, VH1’s) Intellivision collection for iOS. And I’d prefer that the on-screen buttons look exactly like the real buttons on the arcade cabinets and console controllers, without the unnecessary added visual junk. It also seems like they phoned in the design of the on-screen slider for the paddle-based games. (Why doesn’t it at least look like the control they developed for Tempest?)

Final thoughts

I could nitpick details only an OCD Atari junkie will notice, much less care about, but in the end there’s only one thing I can say about this collection. Back in the early days of the App Store, Atari released a few of its classic arcade games as standalone apps, each consisting of both the original and a new version with modernized graphics and sound: Centipede, Super Breakout, Missile Command. Then they disappeared, and were gone for ages. A month or two ago, they reappeared, but with only the modernized portions. For ages I’ve been speculating that Atari had a massive collection app in the works, and finally yesterday it arrived. I was absolutely giddy. And while it will probably never fully live up to my expectations, it’s damn close. I’ve dreamed ever since I first got my Atari 2600 console in 1982, when I was 8 years old, that one day I’d be able to carry the experience around in my pocket. And now I can… almost. It’s not perfect, and it couldn’t be. But I’ll take it anyway.