Archive for May, 2010

Week 137

Not a whole lot to report. There is, I suppose, but it's too damn nice of a day to spend it reading (or writing) this stuff. I'm dangerously close to finishing a site for PBS' Frontline after a week-long crunch. It's been yet another experience that's re-affirmed my love for Django. It's to the point where I can take on (literally) twice as much work as I could before Django and the scary thing is that I'm just getting comfortable with it and each project exposes me to at least one new package that makes things easier. For instance, I really wish I'd known about PyFacebook a couple of projects ago. It would have made things a lot easier (especially if I'd coupled it with django-socialregistration).

The downside to my love affair with Django is it gets really easy to become picky, to insist on only taking projects that can be done in Django. The next step is to try to force each project into the shape of previous projects; the whole reason I gave up on CMSes in favor of a framework like Django was to avoid cramming a client's square peg into a round hole (dirty!). Always working in the same language and framework is a ghetto: you only know what you know and you don't get exposed to new ideas.

So I've ripped through another Django project and have picked up a new one this week as well. And yet, given my chronic case of Irish Alzheimer's, I'm down in the mouth because this week also saw the death of a project. Not death exactly, but it's being shipped off to India to apply the final touches. Whether that's death or CPR depends entirely on who gets a hold of it, but I'm guessing the project would have a hell of a time getting term life insurance right now. It's only the second project I've had go south in the 2-and-a-half years I've been out on my own, but it still sucks. In each case I came in after the contract had been agreed on and after (what would have been) the requirements gathering period had ended. I'd call it a clear lesson learned except it's one I learned a long time ago and keep screwing up because I assume I can punch my way out of anything. I need to spend less time improving my code and more time improving my ability to communicate the value of up-front requirements gathering and a process "agile" enough (whatever that means) to get regular feedback from the client on how things currently look.

Totally unrelated to any of this, but I did run into an interesting usability issue while we were on vacation in Maine. Though it may be silly to generalize about a state's drivers, I will still assert Maine's drivers are far more law-abiding than their New Hampshire counterparts. So I was surprised to see how they lay out passing lanes in Maine: like a challenge to your manhood. The first couple I shrugged off as mistakes, but after a day or two I could not get over how many passing lanes didn't end until you were just about up to a curve or hill that obstructed your view. I finally figured it out at the end of our trip: Maine assumes the best in its residents and visitors. Passing lanes end at the last possible second it's safe to pull back in. New Hampshire knows their residents are crazy. Passing lanes end at the last inch you could possibly pull out at and pass someone assuming you're on a motorcycle and passing a rickshaw. It'd be nice if Maine added one more sign to the Burma Shave-esque laundry list of warnings they have when passing from New Hampshire into Vacationland. Or just replace them all with "Welcome to Maine: Don't Do It, Brutha".


django-avatar and Pinax Configuration

Noting this here for the sanity of my future self. When using django-avatar (which is included in Pinax), you need to add at least one of the avatar settings, AVATAR_STORAGE_DIR, to your file. The important thing to note is this needs to be a relative path to a folder under your MEDIA_ROOT as the path will be used both to create a file system path and to build the urls when serving the avatar images.

For local development, I had trouble getting the avatars (or anything under /media) to appear. The patterns in Pinax's staticfiles.urls include one for everything under /media, but not only didn't I see files under that folder, the server didn't even attempt to serve them. I tried explicitly putting the pattern into my main at the top of the list, but nothing changed. As a fix, I changed my local MEDIA_URL to '/includes/' and added that pattern to my, which fixed things. The production server should not be affected since the files won't be served by Django.

Tags: , ,

Week 134

"It ain't always easy, if your knees knock as hard as mine, but you must remember the golden rule: when the game's going against you, stay calm— and cheat."
Flashman at the Charge

Heard from an old client and met with a (potential) new one this week. Though both New England-based service companies of comparable size, they're from two different eras. Due to dropping margins in their current business, the existing client is moving into a new, tangentially-related one. Before building a new site, they wanted me to do some search engine research. I've been working in SEO since around the time they coined the term and it's never been satisfying. Some of it's just my personality: I like coming back to clients with finished work, with correct answers. SEO resists that. No matter how the algorithms change, it's always going to be an art[1]. The client's new industry is a competitive one. Until they've established themselves, search engines are going to be an opponent, not a help. We've come up with a list of keywords and a strategy for using those words and getting linked to by their partners and other industry sites, but that's about all that can be done on my end. I could do a lot more busywork and generate a lot of documentation, but that's the dark art part of SEO. Without relevant content that interests people enough to link to it, you're chasing the keyword market (through bought AdWords) rather than creating it. My advice to the client is the same easy (for me) advice I always provide: from the terms you gave me, here are the words people actually search for. Put those in your content. And then keep creating new content on a regular basis (blog). Create it with a consistent voice and create it because the content is worth knowing.

The new client also feels their chosen industry is contracting. Rather than branching out, they've decided to reposition. The Internet made their business a lot easier; reduced costs led to higher margins. For a while. But like nature abhors a vacuum, the economy always destroys an arbitrage. The efficiencies introduced by the 'net brought much larger companies into the industry on a national level. The client cannot compete at their price point. They could, but it'd be a short competition given the negative margins they'd suffer.

So they have to change their model. In any service industry, you can be a boutique. There are some people out there so good at what they do they can make it on word of mouth, but it's a pretty risky bet to assume you're that good[2]. The client's idea is to become a resource. A lot of people pay lip-service to this idea, but it's nice to see a client come up with the idea on their own and be committed to it. I enjoyed it all the more because it was disconcerting: they're a small shop hidden in New Hampshire and the client's old enough (ageism alert!) it was unexpected. Survival's a powerful motivator.

I'm sure every region of the country (and every country in the world) has them, but I've only known New England and I think this region runs on people hidden in the woods who know what they're doing. I once went on a business trip with my Dad when I was still in high school. We wound up down a dirt road in Rhode Island in front of a couple of old Quonset huts representing the sum total of a metal fabrication shop. Out walks a heavyset guy in his 60s with a bushy beard full of tobacco spit off the unlit cigar that never left his mouth. But inside one of those huts was a CAD program driving a plasma cutter. This was 1992 at the latest: it'd be like walking into your neighborhood auto parts store and finding wings for flying cars. Little ahead of his time. It's nearly two decades later (God help me) and there are still people in his business not that technically advanced.

Guys (sexism alert!) like that always survive. They don't thrive: they refuse (or are uncomfortable) marketing themselves and to grow past a certain size they'd have to overcome the cultural barrier of dealing with bankers from a city. Maybe put on a suit. Which means there's room in the industry. Between giant (multi-)national companies and brilliant Yankees in the woods, there's room for people who, regardless of how good they are at what they do, are decent at marketing themselves. If you don't go with the giant in the industry and you don't know about the boutique, you wind up with whomever you can find. Which is why spam works and why you have to pay $100 to get a poster framed in your town. The Internet's flattening those things out. It's abstracting marketing out of industries: killing trade magazines, newspaper classifieds, anything that made money by holding onto information. I don't know what it will mean when it's easy to find the boutiquess and the ass-kickers for whatever job needs doing, but it can't hurt to be a resource in your industry. Give away the knowledge and show you can do the job.

1. "art" in either the loosest sense of the word or when the best people in the industry do it. Most of it's a lot worse than art and some of it is pure snake oil.
2. "Hello Kettle, this is Pot. Can you hear me?"