Archive for the ‘Development’ Category

Interface List Design – Drupal

Oct 09
1

This is a quick UI critique on a list design pattern that’s in a proposed stages for Drupal7. The UI being critiqued is not final, as such the feedback is meant to be helpful to both the Drupal team and anyone else designing list based design patterns.

Before:

drupal_content_list

Example image from drupal 7 content list

Key points with this screen:

  • The title areas don’t tell you what you’re supposed to do on this screen. In fact there are at least three competing title areas. “Content” as a title, “Content” as a tab, “Add new content” as a secondary title and two group boxes that cover filtering and updating. The actual title of the screen doesn’t reflect the modal nature of dialog. You’re actually adding content to something else and it’s not clear what that is.
  • The information is presented in the wrong reading order.  The content table should be first.  You first have to read the list to see what you’re dealing with before you decide to either filter it or update it.
  • An empty list is a dead-end. It tells you there is no content but doesn’t direct you on how or where you should go to create some.
  • The X in the upper doesn’t make it clear what it would close. The tab? The dialog? A simple cancel button or a standard cancel button or a close button in the upper right would be more obvious.

After

drupal content list updated

Key points

  • Title should say what you’re doing.
  • Filters should sit above column headers whenever possible. No additional button action should be needed and multiple filters can be applied at the same time.
  • It should be easy to reset the filters and hide them. Hidden should be the default.  The filters should give you a clue as to the number of items in each filter bucket:  Articles (3)  Posts (120). This makes it easier to select the right filters.
  • If the table is empty it should be easy to get to a content creation page.
  • Buttons along the bottom of a dialog provide clear ways to exit or complete the task.
  • Things that don’t map to the core task should be hidden.  In the original mockup there were options to update the status of content from published to unpublished. This type of functionality belongs in a management section, not when you’re “adding content.” It should be removed or hidden in a similar way that filters can be hidden.

A better iPhone tip Calculator

Jan 09
17

One of the very first things I did when the iPhone came out was to write a little free web based tip calculator. This was mostly a tool to learn about the web-capabilities of the iPhone while writing a simple tool.  We decided we could do much better with a native application.  Our new version is available today.

For this application we really wanted to do a scenario based design.  We had three core scenarios in mind:

1) I go to lunch or dinner and figure out a tip

2) I go to dinner with friends and split the check with a tip

3) I go to dinner with friends and one person just gets a salad and everyone else gets a full meal with drink.

Most tip calculators get you to Scenario 1 or 2. Scenario 1 is pretty easy we need the bill total and the tip percentage and we can quickly compute the tip amount.

Scenario 2 was a little more complex but not much. We perform the original calculation and then just divide the total bill and the tip line up between the number of people.

Scenario 3 was when it got a little more interesting and I think this is a unique feature I haven’t seen anywhere else.  We allow the user to go into the details of the bill and manually adjust each dinners check.

If one person had an extra drink you use the slider or plus/minus arrows to adjust their price and everyone price adjusts automatically.  This can also be used as people are putting money into a pile. You can quickly see who has put in how much and what amount is left.  If you adjust a slider it stays fixed allowing you to move to the next diner.

Tip Calculator for the iPhone

Our calculator allows you to see if you have an underpayment or an overpayment. This makes it easier to ask everyone to chip in another buck or two as needed.

The visual design of the application is styled to look like a restaurant napkin. While this doesn’t impact the functionality it makes for a fun and attractive design that we hope people will enjoy sharing and using with their friends.

We learned an interesting usability lesson in building this applicatoin. It turns out that it’s critical to test on actual hardware and not just on a simulator. For most of our basic development we built the application and tested it in the iPhone simulator software. It was only when we got it on an actual device that we discovered that the slider bars can be a little tricky to adjust at a fine granularity.  If you had a $90 bill the slider can go from 0 to 90 and making fine level adjustments with your finger can be quite difficult. After usability testing this we decided to add the plus and minus icons to make fine grain control a little easier.  We also made it possible to just hold down the plus/minus and allow the button to repeat as an added way to help peeople get the price right.

There’s a lot of subteltly in building applications for mobile devices. We hope you like this one.

Download our new tip calculator from the App Store for $0.99

Death to API’s, Long live standards

Dec 08
12

There are too many API’s in the world and the problem is getting worse not better.  Before the web the number of people creating programing interfaces was relatively small.  Most software applications didn’t have plug-ins and most applications were self-contained. 

Now every web site that’s developing software has their own API to allow developers to code to their website. Let’s take a simple example of 10 more popular sites for photos: Flickr, Facebook, Picassa, SmugMug, Kodak, Snapfish, Shutterfly, Photobucket, MobileMe and Phanfare.  Each one has it’s own API and each one has it’s own authentication layer, it’s own way to send, enumerate and thumbnail files. It’s stupid and broken.

It’s broken because anyone who wants to support multiple partners needs to code at least 10 different tools to support each one.  This is perhaps great for Flickr since they are high on the list but generally bad for everyone else.

Consider instead how standards work. What if each one of these sites supported a simple standard such as FTP.  In a manner of minutes you could add support for 10-20 or even 100 different photo sites.  Sure FTP’s not perfect, nor is it optimized for photos but standards rule and we as a web-community need push, evangelize and encourage sites to move back to standards and away from API’s. 

Myabe I’m being extreme. After all, API’s are a good way for two systems to talk to one another.  Especially when those systems are proprietary.  Oh and what if the existing standards are poorly written or poorly designed?  Sure API’s have thier place but it shouldn’t be the tool of choice. 

If you’re a developer trying to connect to a popular site it may not matter. You code with what you have. If there’s an API you use it, if there is a standard you use that. If that fails perhaps a little reverse engineering.  

But if you’re in that same developer on the other side of the fence trying to decide how others may interact with your service ask yourself if it wouldn’t be better to use conform to a standard rather then write a whole new API? If a standard doesn’t exist take the extra effort to build a community and evangalize one.

Iphone Clipboard Concept for Cut, Copy, Paste

Jul 08
26

One of the current drawback of certain touch devices (Iphone) is it’s lack of copy/paste functionality. The difficultly in creating this functionality on a mobile device is that the interaction technique has to be non-intrucive to the core interface. 

Unlike a desktop application where you can toss commands into a menu the interaction model on a phone has to be more direct and gestural.  The copy/paste model I’m proposing tries to address some of these issues. 

When a user is viewing a core text area:

  1. They can scroll (tap + drag ).
  2. They can move the insertion pointer (tap)
  3. They can use the magnifier loupe to position the insertion pointer (tap+hold)
In my illustration you could activate additional copy/paste gestures:
  1. You can bring up the copy/paste pallet ( tap+tap near the insertion pointer)
  2. Once the panel is open you can mark a selection (tap+dragging) from the insertion point creates a selection. Similarly you could create a selection with two fingers marking both corners..
  3. When in copy/paste mode the keyboard is replaced by your recently cut/copied blocks of text or images.  You can tap a piece of text to insert it into your document 
Note: The tap+tap gesture is sometimes used in application to zoom however it is never used to zoom while editing text or viewing read-only text such as in emails or contact lists. 
Unfortunately at this point it’s not possible for third party application developers to write an extension such as this so it’s a concept sketch only at this point. 
P.S. Did you know we’re now developing and designing mobile apps?  Check out our latest design work for a new fitness startup focused on running. 

Top mistakes made creating tables of data and how to avoid them

Jan 08
8

Interfaces design is all about managing data input and output. Input is done through various forms. Output is done most often through tables of data. There are a number of basic things that can be done with a simple HTML or application data table to make the data easier to read and understand.

Table Basics

  • The table should have a title telling users what the table is about. Don’t forget about this and don’t label the table with the non descriptive noun such as: “users” or “groups” try to use a label that tells users what they should do with the table of data… “Edit user permissions and create new accounts” or “Add and remove people from groups.” Whatever the table of data try to construct a simple title to explain the purpose of the table.
  • Use clear and descriptive column headers, avoid acronyms. If you can’t avoid acronyms provide tooltips.
  • Make the column headers sortable, on all tables and on all columns.
  • When sorting by a column show an indication of what column is sorted. Use a triangle icon and point it in the direction of the sort. Make sure that users can visually tell the column can be sorted either by using a standard column look or by using a hover effect.
  • Use horizontal lines or subtle alternating colors if you want to help people read across, use vertical lines or alternating colors if you want people to read down. Border=1 is almost always the wrong answer.
  • If you have a detail page the hyperlink goes in the first column with the name of the item. Underline the hyperlink. Avoid hyperlinks in other columns as this can be confusing. Alternatively make the entire row one big hyperlink if appropriate.
  • If the row can be deleted use a delete icon in the last column. Consider confirming the deletion if the deletion is hard or impossible to recover.
  • Align the header and the text of a column to the left if it’s normal text. Align to the right if it’s a number. Use a fixed number of decimal places so your numbers line up vertically.
  • If you’re displaying a date use the right date format based on the data you are using. Use as short a form as possible but no shorter. You don’t need to use UNIX timestamps for everything.
  • Avoid scrolling the table along the horizontal.

Table Paging

  • If your table has 100′s of results or more add the ability to page your results. (50-100 per page seems to work well)
  • Consider virtualized scrolling if this is available. This is the ability to make the scrollbar larger and dynamically fetch items as they are scrolled into view.
  • It’s usually not necessary to give users the option of how many results they should see per page. If you need to provide this option you should keep it within an options page and not directly under every table cluttering your main interface.
  • Paging elements should be at the bottom of the table. You can optionally place paging controls at the top of the table if users are likely to jump around.
  • The following should be present in the paging area: Current Page, Next Page, Previous Page, Total Page Count.
  • Users may not go past the the first couple pages of results, if your users need to flip through more than this make sure you have alternatives for finding data such as filters or search.

Table Filtering (optional but necessary for long lists)

  • Design your filters to narrow long lists down quickly and eliminate large portions of the data. Filtering is not the same as searching you’re trying to get the list down to be a smaller list it’s not trying to find a specific item.
  • Consider filters that match the logical roles that people perform on the data, filter by User, Region, Job-Title, Permissions, Sevarity, Priority, etc.
  • Usually people want to filter by the data columns that you present. If you want to filter by a column that isn’t shown consider showing the column so users can sort by it.
  • It should be obvious when the list is filtered and when it isn’t. Make it easy to clear any filters. If a filter is a narrowing choice make it easy for users to change their mind and pick another choice without needing to use the back button.
  • Filters can be placed under the columns (as in Excel) or in a module to the left, right or above the table. Avoid putting filters bellow a table as it may not be seen.
  • When possible consider in-place typing filters that filter the data as you type.

Selection

  • If you need to provide selection within a list consider either the shopping list metaphor where you add list items to a growing collection or a checkbox selection where you can check off multiple items and perform an action.
  • If using check box selection avoid having hyper links in the list as users may inadvertently click the link trying to click the check box.
  • Provide simple command buttons or checkboxes to select all or clear the selection.
  • If you provide keyboard access try to address traditional keyboard selection shortcuts (CTRL/Shift/Arrow/Spacebar selection).

Creating great tables in your application will make the data easier access. Many people forget that a very large percentage of peoples time is spent trying to view analyse and manipulate data within the interface. Having great tables across your appication is a good start.

iTip – A Tip Calculator for the iPhone

Oct 07
2

UPDATE: We have a new and improved tip calculator. Get details and download the best iPhone tip calculator available.

Itip - Tip Calculator

Last night I coded up a simple tip-calculator for the iphone using the ‘web sdk.’ It’s very basic and allows you to easily calculate the tip and figure out how to split a bill between multiple people. It was mostly a learning exercise but it turns out to be somewhat useful. Add it to your bookmarks for easy access on the go.

  • The iphone uses a strange meta tag called a viewport to determine if content should be scaled.
  • You need to use the style default-width; and default-height to get the window to fill the screen.
  • If you give text fields special names like ‘zip’ you’ll get a number mode keyboard if you use ‘mobile’ you’ll get a telephone input keyboard. (no longer true)
  • Since the iphone has no text selection model there seems to be no way to move the text input cursor. I wanted to use the ‘telephone pad’ for all numeric input and then auto- place the decimal point into but I couldn’t get Safari to behave.
  • Webkit has some nice effects like rounded rectangles, shadows and more. Too bad it’s not part of all modern web browsers.
  • You can get the Address bar to disappear by placing an onload event on the body:
    onload=”setTimeout(function(){ window.scrollTo(0, 1);}, 1)”
    Note: This only seems to work if the window is large enough to scroll.
  • The EDGE network is slow enough without needing to load external files. Minimizing external calls to import CSS and Javascript and things will load faster, especially for one-page applications like this one.
  • Hope you like it. If you have tips for my tip-calculator leave comments.
UPDATE: We have a new and improved tip calculator. Get additional details and download the best iPhone tip calculator.

A Social Network for Social Networks

Sep 07
1

There is an obscene amount of social networks and there seems to be no-end to new social networks that are being developed. This is great because it means that developers are thinking about communication as a key feature to the success of an application. The problem with social networks is that users end up spending a lot of time building and maintaining the network. Here’s a concept for how this could work in an open way.

The key guidlines:

  • The identify of users on the network needs to remain private
  • Collaboration between networks should be encouraged

Social Network Interop

Here’s how it works.

  1. We have two social networks and each one has a set of users [ O M L Q ] and [ M L N O P Q R ] each user is identified uniquely by their email address.
  2. Each social network can be encoded using MD5 or a similar hash algorithm. Different social networks can share thier social graph information without divulging the identify of the individuals.
  3. Missing edges and connections can be spotted between the different networks
  4. The MD5 process can be reversed with a local lookup table. Normally you can’t reverse an MD5 hash.

The basic procedure could be implemented as a simpe API with two core functions:

  • ListFriends(FriendID as string, ServiceName as string, SharedSecret as string) returns an array of FriendID’s
    You call this function when you want to get a list of friends from someone elses social network. You pass in the encoded ID of the person you’re looking for, your own service name and the shared secret that you’ve agreed on with the other service.
  • CreateIDfromFriend(Email as string, ServiceName as string,SharedSecret as string) returns a FriendID
    You can use this API to compute the ID’s of each user in each respective network. The API is such that you’ll always get the same ID for any given email address. A simple method would be to MD5 the email, XOR the SharedSecret and Shift the letters up using the service name.

The way these API’s would work is that any two social networks that want to talk to each other can have a shared secret key. This key ensures that both networks agree to the same privacy rules and protocols. Without the key you can’t compute the proper hash for a person. Given these two basic functions you can find the missing nodes on a social network and allow it to grow faster.

Since cooperation helps build social networks this basic technique could be expanded to allow more sophisticated trust relationships.

Misconceptions with SSL security

Aug 07
27

SSL security is supposed to give a ‘secure’ connection to a website but there’s an inherent problem with the way that SSL is done. There are two parts to security.

  • A secure connection – when sending data between two computers a secure connection ensures that the data stream is secure from point A to point B. (Armoured car)
  • A secure identity – when communicating with a website a secure identity can tell you that the person you’re communicating with is who they say they are. (A registered identify and address)

A simple analogy would be an armoured car is your secure connection getting your data between places and the registered address ensures that the data is traveling between the right locations. That’s the theory…

An SSL certificate allows you to have a secure connection and at the same time ensures that your address is correct. This in theory isn’t a bad thing but the problem is that SSL does a good job of securing your connection but it does a much worse job of ensuring your identity. Anyone can purchase an SSL certificate for between $10-$400 a year. Secondly users don’t pay much attention to the identify and very little to the address. This means that the ID info isn’t that important, you really just want the armoured truck for the secure connection.

Imagine a large website with 100 servers. Each server is numbered and each connection has it’s own address. www1.example.com www2.example.com and so on. Each one of these seperate sites needs it’s own certificate. At up to $400 each per year the certificate over a couple years can end up costing more than the computer.

Unfortunately you are not allowed to use the armored car (secure connection) without a notarized address (signed certificate). If you want to move data securely between two computers your web-browser won’t let you do it. You could try to notarize the address yourself, this is called self-signed certificate but web-browsers don’t let you do that either.

This is bad because it forces many web developers to choose between spending between hundreds of dollars or using no security at all. The vast majority of sites don’t use any security. Only banks and shopping sites take this more seriously and even on these sites the certificates can cause problems. Try this… type https://yourbank.com  (notice I left out the typical www’s).  Chances are you’ll get an error message. Bankofamerica, CitizensBank, CitiBank, Etrade, Charles Schwab and countless others forget to buy a certificate for some parts of their website.  As far as SSL certificates are concerned each address is totally differen. www.bankofamerica.com is totally different from bankofamerica.com.   Yeah, this is dumb.

When you open a web-browser for the very first time and you enter your very first search into a search engine the browser shows you a warning about the fact that you are sending clear text across the internet. You get this message once and you forget about it but every day you may be sending thousands of personal bits of data out in the open across the internet.

From trivial gossip, passwords, secrets, bank cards and all sorts of other private information. If self signed certificates were allowed many of this information could be sent securely. It wouldn’t prevent every possible attack (you still want to use signed SSL in some cases) but for casual everyday use, email and basic browsing using self-signed SSL communication could prevent a lot of data and identity theft.

JavaScript rubber band

Aug 07
12

This is a simple Javascript rubber band funciton that I wrote. Typically an animation function moves directly from point A to point B. This gives a very mechanical feel. I wrote a very simple rubber band funciton. This animates an object with velocity. The object can overshoot the destination and bounce back. The further you drag the farther it bounces.

Grab this and drag

Tested and seems to work in FF, IE and Safari.

RIML – Reduced Instruction Markup Language

Aug 07
9

Traditional HTML is a “complex instruction set” language. It’s got tons of tags, properties, and semantic definitions.

What if there was a reduced instruction set markup language. The idea would be to come up with primitives that could be used to layout a page and try to design the language with the minimal set to express complex designs.

My primitives:

  • Point
  • Line
  • Box
  • Polygon
  • Circle
  • Text
  • Image

Pretty simple so far. Each has a set of properties some specific to the element some global:

  • Position (top/left/right/bottom)
  • Height/Width
  • Color
  • Rotation
  • Semantic description (optional)
  • Data (Rich text data, Image data, font data)
  • Actions (Hover/Click/Drag/Etc defined in a scripting language)

Any element can be nested within another element or within a set of elements. Existing styles and elements can be referenced across a page. Note: I’m not specifying common controls. These would be pre-defined styles using the same core-elements and actions.

Using this type of simple language you could build the foundation of a new type of web rendering engine.

This simplifies the implementation of the browser. This means you can express more complex designs in a simpler and more straight forward way. The core ‘brains’ of the design would happen at design time in a design tool rather then at run-time. The relationships, positions and attributes are not interpreted, cascaded or defaulted. This means you have a tool that better represents designer intent.

Why is this in my head today? Once again I’m frustrated by the lack of browser support for key design oriented features. Did I mention that I don’t think CSS is so hot? I also read the proposal for new HTML 5 spec and it’s more of the same. I’m not impressed. Designers deserve better.