June 2009 Archives

Web 3.0 - The semantic web - It all makes sense now

rdfa.jpgThere has been a lot of talk about Microformats, RDFa (Resource Description Framework - in - attributes) and Web Ontology Language (OWL). These naming conventions, although not widely used yet, present a solution that narrows down relevant search results and data correlation on websites.

As some of you may know, our favorite web pioneer has recently announced Google Search Options.

This refined view of data exploits semantic markup conventions making it easy for people to find the data they want. They also have some good documentation on structured data in their Webmasters guidelines section.

So far, it seems like the three most common implementations for rich snippets are reviews, people and products. When coding, property association for data can be added either by naming the element class or adding a property attribute. These two Firefox addons, Operator and Semantic Radar, will display this information.

Here is the recording from the webinar we attended today on the Semantic Web.



Labels: , , , ,

Methodology of a website critique

After speaking at Internet Retailer, I got several follow-up questions about how I reviewed websites on the fly. It's a great question, and rather than tuck it into an email or Twitter @reply, I thought I'd share it here.

Critiquing a website on stage is a unique endeavor. What it largely comes down to is playing to the strengths of one's co-presenters. Ethan Giffin, with whom I've presented before, focuses on conversion, looking at buttons and sales opportunities. Craig Smith quickly established his interest in SEO and search. That left me free to discuss information architecture and messaging, which are my own strong suits.

I'm not sure IRCE knew it had such a balanced team, but the result was a great rat-a-tat dissection of the sites we saw, with minimal overlap and dissent. Last time around, Ethan and I, and our third presenter, agreed with each other a lot; this time, the three of us carved out niches and took turns presenting ideas. We were all pleased with how it went.

Offstage, the process is a bit different. Ai does competitive reviews that encapsulate my criteria in painstaking detail--we often have more than 100 fields, laid out in a spreadsheet, to consider for each site. Our research categories are arranged as follows:

  • Branding and design: The first step is to consider whether a site is properly conveying its brand message. How polished is the design? Is the color scheme appropriate to the company and its target audiences? Are page layouts consistent and brand imagery persistent as one moves through the site? We also look at copy, and gauge how effectively the site is speaking to users, on everything from headlines to buttons to page text.
  • Navigation and ease of use: This is the core of Ai's user experience focus. We gauge how intuitive and logical a website is, and make sure that performing essential tasks is easy to execute. Objectively, we check navigation bars, page widths, pop-up windows and the like; subjectively, we look at UX on a more holistic level, to see how well the site performs.
  • Content: This varies by site type. For ecommerce sites (like the ones discussed at IR) we focus on product pages, and we run them through a robust checklist. How big are images, and are they manipulable? Is essential information easy to parse? Are important functions above the fold? What supplemental features, like reviews and technical specifications, are available? For content-driven sites, the focus shifts to hierarchies, layouts, and so forth.
  • Conversion: How well does a site seal the deal? We count steps in checkout, complexities in form data, and identify whether customer service is readily available. We also look at up-sell, cross-sell and shipping displays, each of which can be an opportunity or a deterrent to people in the conversion funnel.
  • Intangibles: There's actually a field on our spreadsheet called "Vibe," where we give our overall impressions of what the site is saying to its users. This is a vital component of our process. No critique can be completely objective; each site has a distinct audience to which it speaks, and our job is to assess how well the message will be received by the site's target segments. We also gauge the overall experience of exploring the site, and we actually overweight these two fields to give UX the proper amount of influence in our research.
Whew! There's a lot to cover to critique a site in depth. Our most recent competitive review spreadsheet spanned more than 1500 fields. It's a smart way to learn the landscape, though--and when the spotlight is trained on one site, a similar-minded critique is a great way to assess a site.

The art of the tweetup

Team Ai is actively tweeting the Internet Retailer conference this week. We're having fun observing, commenting, and getting to know some of our peers.

Nathan, Ed and I went to a tweetup in the lobby bar last night, and I met a few folks one-on-one today, all from Twitter interaction. It's a great way to meet people, as you're already in a fast-paced, topical conversation, and going f2f is a nice next step.

I've noticed that a tweetup is not the same as a meetup of an online community or users of a single website. It's much more quick-hit, because a) you've been conversing regularly, sometimes minutes earlier; b) tweets are more conversational in nature than blog or forum posts; and c) you'll probably resume that interaction afterward.

So individual encounters are often quick. "Oh hi! So you're that person," followed by a few minutes of small talk and a swapping of business cards. Then it's onto the next thing, be it greeting more people or heading back into the conference. But even at five minutes, the meeting has served its purpose, for now there's a face to the name, and further conversations take on a more congenial tone.

As we spend time at IR I'm continuing to reach out to folks whose tweets I've enjoyed with a request for a quick hello. What better place to do so than at a conference? The speedy nature of Twitter has begotten a speedy personal meeting that seems just right for the medium.

Going Green

As it turns out, keeping 25 computers on 24/7 so that people can remote in actually wastes a lot of electricity. I have been looking into ways to make our use of electricity much more efficient, so that we can both reduce our carbon footprint as well as knock a few bucks off the monthly electric bill.

I'm attacking this two ways. The first way is to get all the workstations to sleep when they aren't in use. The second is to use current virtualization technologies to reduce the number of servers we have.

The idea is that most servers are underutilized, and that you can take better advantage of your hardware and reduce energy usage by running several virtual machines on every real physical machine. The server stuff is going to have to wait until after I've dealt with the workstations. But I am hoping to be able to invest any money I save from making the workstations more efficient into the server consolidation project.

The first step in putting the computers to sleep at night was actually enabling Wake on Lan on our Windows XP Dells. Wake on Lan is not enabled by default in the BIOS, nor is it enabled in the power management settings for the network adapter in Windows. In Windows, go into Device Manager, find your NIC, and go to its properties. There will be a power management tab. Make sure you also check off "only allow management stations to bring to bring the computer out of standby," otherwise the computer will wake up for any network activity, not just a magic packet.

The second step was to figure out a way to make it easy for my users to wake their computers up if necessary. Remembering the MAC address of the NIC on the computer is not exactly practical.

I looked around for a nice little program to keep track of computer names/mac addresses, and I found something quite ideal for our network. We use Small Business Server 2003, and there is a product that integrates Wake on Lan features right into our SBS's Remote Web Workplace. It will cost me some euros when the trial expires, but in my opinion it is worth it to integrate a Wake on Lan feature right into an application my users are already used to using. It's called WOL4RWW, and is available from WESSTools.com. I've already tested this on a couple of computers and it works great.

After making my computers capable of sleeping and waking up, I needed to figure out a way to actually enforce settings that put these computers to sleep every night. There didn't seem to be a built-in group policy in Server 2003/Windows XP. It looks like the easiest way to handle this is going to be to install a little piece of software called EZ GPO on the XP machines. This will allow me to manage their power settings remotely. I hope to find time to do this in the next week or two.

The last piece of the puzzle, which I haven't looked into yet, is when Windows Update is going to run if the computers are sleeping all night.

After I'm done with setting up and testing the XP machines, I believe I can then handle Vista and Windows 7 machines via a GPO. After that, I will find a solution for our Macs.

If you're interested in making sure your home computer or business network is as green as possible, you can find a wealth of information at the Energy Star website.



Labels:

Transactional intelligence

Ai's fundamental strategic principle revolves around transactional intelligence. We take the basic truth of ecommerce--that every customer is a potential sale--and apply the same theory to each user that may visit a site.

On a high-performing ecommerce site, roughly 10 percent of users complete a purchase. What, then, of the other 90 percent? A portion of them may be lost sales, but the rest surely came to the site to achieve something.

Our goal, then, is to achieve as high a rate of successful transactions as we can, regardless of whether those transactions are financial. Should a user just want to know a company's phone number, or to find out color and size options, that goal will be easily achieved and considered a success if the user leaves the site satisfied. Those moments create brand awareness and lead to long-term sales and customer relationships.

This theory readily applies to our non-ecommerce projects, too. Users visit sites to read, learn, get contact information, send emails, look at photos, download files, socialize with others. ... Each site has its own set of achievable goals. By defining what these goals are, we can apply the same transactional sensibility to them, ana aim for high success rates across the board.

Ai has a full slate of projects right now, ranging from ecommerce to hybrid sites (content and commerce, community and commerce) to sites without a financial component at all. Our approach works across the spectrum, bringing transactional intelligence to each of them. Defining the opportunities makes each project unique while leveraging ecommerce best practices to make a website as effective as it can be.

Tip: Using Procs with Thoughtbot's Paperclip

Thoughtbot's Paperclip allows easy and reliable management of attachments. Using it is as simple as adding a few columns to your model and invoking the has_attached_file class method with the desired options.

One of Paperclip's as-yet-undocumented features is the option to pass an anonymous function to the :url, :path, and :styles parameters of the has_attached_file class method.

In the example below, a Product has many ProductImages. No problem, except that I might not want every product image to have the same style attributes (e.g., a product could have a header image of '200x400' and a main image of '300x300'). Certainly one way to handle this would be to create a distinct class for each type of product image (HeaderProductImage, MainProductImage, etc.).

But another, and perhaps more interesting solution, is to pass an anonymous function to the :styles parameter. That function can then return a customized style attribute for any kind of image:




class Product < ActiveRecord::Base

has_many :images, :class_name => "ProductImage"

end

class ProductImage < ActiveRecord::Base

belongs_to :product

has_attached_file :image,
:storage => :filesystem,
:path => ":rails_root/public/images/products/:attachment/:id/:style/:basename.:extension",
:url => "/images/products/:attachment/:id/:style/:basename.:extension",

# Because the :styles key can take a Proc object as an argument, we can specify the image
# styles dynamically based on the image's label.
:styles => Proc.new {|this|
defionition = ProductImageDefinitions.detect {|spec| spec[:label] == this.instance.label}
definition[:styles].merge(:thumb => '200x200>')
}

end


When Paperclip processes the attachment, it passes itself to the anonymous function. The model can then be accessed by calling the #instance attribute on the passed-in reference (see above).

The ProductImage class defines a #label attribute. The label acts as a key to a hash, ProductImageDefinitions, which specifies styles for various kinds of product images (you might define this somewhere in config/initializers).




ProductImagesDefinitions = {
'main' => {:styles => {:large => "1200x600!", :medium => "600x300!"},

'header' => {:styles => {:large => "400x600!", :medium => "200x300!"}
}


This allows for a high level of flexibility since adding a new kind of product image is simply a matter of modifying the ProductImageDefinitions hash. For a nice interface, you might write a module like this one to allow for the following manipulation of product images:




# Create product images.
@product.product_images.create(:label => 'main', :image => # Attachment object)
@product.product_images.create(:label => 'header', :image => # Attachment object)

# Access product images.
@product.available_images('main')
@product.available_images('header')


Not bad, right? The same kind of on-the-fly configuration can be applied to the :url and :path parameters. Thus does Paperclip's support for anonymous functions enhance an already superb library.

For the record, I myself am still on the fence about whether this application of anonymous functions can be considered a good practice in terms of readability and maintainability.

But from the perspective of the sheer fun and practicality of the functional paradigm in Ruby, I'm going to consider it a worthwhile excursion.



Labels: , , ,

Our day in transit

Days in transit: 1

Modes of transportation and personal conveyance utilized:

  1. Taxi
  2. Acela high-speed train
  3. D.C. Metro subway system
  4. Airport shuttle bus
  5. Private automobile
  6. MTA New York City subway system
  7. Escalators
  8. Elevators
  9. People-mover walkways
  10. Exterior stairs
Transportation structures visited:
  • Two train stations
  • One airport
  • One parking garage
  • One outdoor parking lot
  • Seven subway/metro stations
Clients visited: 1

To friend or not to friend?

The digital profiles that represent our personal and professional lives are becoming increasingly intermingled. My Facebook account isn't just made up of my friends, but a motley mash-up of friends, family, colleagues, clients, others, and some dude who said he went to my high school but I swear I can't remember him. On Twitter, I follow co-workers, clever people, some people I sold concert tickets to, and the family members that signed up for Twitter accounts whose both posts (first and last) were "This is my first twitter post." On LinkedIn, I accept any request, unless it's from an aggressive recruiter.

The (inter)net effect of my mixed up profiles is that I must always consider this varied audience when posting an update. Do I want everyone knowing that I had a nice time at the zoo this weekend with my kids? (maybe) Do I want clients knowing that I was out late the night before a big meeting? (probably not) Do friends care that we just won awards for some website? (most definitely) Does anyone care that my Entourage crashed and the rebuild progress on its database? (no, but they don't ask me to stop tweeting about it)

So it shouldn't be surprising that I was thrown two curve balls during recent new business engagements. During the first, we had reached the end of an exciting, and very competitive RFP process. I learned it was down to 2 firms. I was invited out to coffee to make our case, one-on-one. I did my best, explained our passion for the project, shared our ideas, and spoke to our other relevant success. I thought the meeting went well. On my way home that evening I see a LinkedIn request from the gentleman I had coffee with just an hour earlier. "I'd like to invite you to Join my LinkedIn Network!"

What did this mean? Was he saying that we had won the business and this was a cute way to notify me? Was he saying that he needed to complete more due diligence on me, check out my network, see who I know, and try to glean more information about me and our firm? Or was he simply asking me to join his network, even though we weren't really networked yet?

I couldn't very well ignore the request; I had to accept it and see how things developed. Spoiler: we won the business, it's an incredible project, and our client is a fabulous company to work with.

More recently, we were involved in another very competitive RFP engagement. We traveled to our client for the big pitch, presented, said our goodbyes, and were on the way back to the office. Suddenly an email comes in: "PersonX would like to make you a friend on Facebook." PersonX? Who was that again? Does anyone remember who was PersonX? Why are they friending me? To see if I really *get* social media and will promptly accept the friend request? To see if I had properly maintained a filter between my personal and professional life in my digital profile? To maybe find some forgotten nugget on me that I had posted years ago?

I agonized a bit over this one, but again came to the only logical conclusion: I had to accept the friend request. Spoiler: again we won the business, and have partnered with this truly awe-inspiring institution.

In both cases, but perhaps more importantly with Facebook, I felt completely comfortable accepting the requests because I have taken great care to preserve my digital image. Sure, Google can find a few oddball posts from Usenet and some funny discussion forums, but all in all, I'm squeaky clean. Some friends and colleagues maintain two profiles: work and fun. That seems like way too much effort and is far too dangerous. Just imagine the "did I just say that out loud?" moment when you post your opinions on the latest scandal to befall your favorite Yankees player to your Twitter feed usually reserved for ecommerce and UX tips.

In the two cases above the outcome was positive. But that's not always going to be the case. I have a friend that consistently uses Twitter to complain about his frequent air travel, usually to one particularly annoying destination to see a client. He doesn't seem worried one bit that the client will start following him on Twitter and will be somewhat put off to read, "oh joy, traveling again to the armpit of the U.S. via XYZ airport." Another colleague complains about meetings and co-workers, right on Twitter, for the whole world to see. He masks names, but everyone who knows him knows exactly who he's talking about. And yes, we've welcomed an employee or two ambling late into work one morning after posting 3am FB updates from the bar the night before.

I only see the personal/professional divide becoming more blurred. So, Caveat Twitterer: once you hit send, it's out there for the entire world to read. And if someone--a friend, significant other, a prospective client--wants to dig up a little dirt, it's just a search away.



Labels: , ,