The Apple … Store?

What do I do with this pretty green paper?The Natick Mall was a big mall, and now it’s a really big mall (and called the Natick Collection). One of the new stores is an Apple Store. I’ve been in Apple stores before, but not since they added the “Genius Bar” which is where the checkout lines used to be. When I went to pick up my new keyboard, I found it easily enough, the store is small and has an open layout. The first part of my mision complete, I looked around for where I’m supposed to pay for my item.

I wandered to the middle of the store, and saw another man looking around with an iPod box in his hand. It was obvious we were both trying, and failing, to do the same thing, which was to give someone money. I then walked to the back of the store, where there was a line of people, and waited in line. When my turn came I presented the product I wished to purchase, as well as my credit card. The “Genius” told me that the “Bar” was only for help and not for sales. “Who will take my money?,” I asked. “Anyone else,” said the Genius. Everyone else that had a nametag and a black shirt, Genius or not, was busy.

I was very tempted to place the keyboard in the middle of the floor and leave, go home, and order it online. However, I did really want it, so I waited for someone to finish explaining that all the software the person assumed was on the $2000 laptop they were about to buy (Word, Excel, and Photoshop) was extra, but “don’t worry, all the cool stuff is free,” quoth the Genius. After a few more minutes hovering behind the tentative victim, who reconsidered and left the store, I was able to get the black-shirted employee’s attention and he sold me my device from a handheld contraption.

Much like bad engineering is often identified by excessive cleverness, bad design, whether it’s a website or the layout of your store, is often identified by being excessively reductive. If you have a store, and want people to buy stuff, don’t feel offended that you need to stoop to having a sign that says “Pay Here”.

Usernames

Usernames for most websites are based on UNIX conventions/standards. They are lowercase, usually begin with letters, and have no whitespace. Many sites offer a “display name” which is more flexible.

While discussing requirements for a new project, my first inclination was to do something similar, simply because “that’s how it’s done”, but someone suggested this method might be antiquated. After giving it a few days of thought, I tend to agree. “Old” user domains like AOL, Windows, and Slashdot have logins that have allowed spaces for years, yet most of even the latest, shiniest Web 2.0 sites go back to the 1970s for their guidelines.

We’ve even taken it a little further and not only can users use spaces, underscores, and dashes, these characters are ignored for purposes of uniqueness, because I’m guessing people’s brains will tend to stem these characters when it comes to memorizing them. So “Eric Savage” and “ericsavage” and “Eric_Savage” and even something like “Eri__c-SAVA g-_E” would all be the same.

When appearing in a URL or other machine-readable context, these characters are all changed to underscore and consecutive duplicates are eliminated, so the previous username would be “eric_savage”. Also, leading and trailing non-alphanumerics are stripped, otherwise we’d likely find users all naming themselves __alphadog so they appear first alphabetically. We could expand the list of which extra characters are allowed, but we’ll start off easy.

Questions:

    Can anyone think of good reasons for why you should stick to UNIX-style usernames?
  • Should users on a community site be able to change usernames? [I’m currently in the “no” camp]
  • If changeable, should the change history be public?
  • Most people like short usernames, some people prefer long ones. What do you think should be the limit? [I’m currently thinking 20]
  • Is a short limit too ethnocentric?

21st Century Game Changers

A post on the Freakonomics blog got me thinking. What inventions have genuinely improved, or even affected, my life. I drew up a list, and decided to constrain it to the 21st century, so things like the cellphone, the VCR, the CD, the ATM, instant messaging, and online banking aren’t on the list. Here they are, and where possible I put the approximate year I adopted them.

Major Improvement to Daily Life

  • Tivo (2000) – Definitely #1 on the list. I don’t consider myself a couch potato, but this completely unshackled me from the network’s arbitrary scheduling. It also make more shows enjoyable, or even watchable, by cutting out commercials.
  • RSS/Google Reader (2002, 2005) – RSS enabled me to keep track of a much broader set of sources, and Google Reader took RSS to the next level by making my subscriptions and unread articles available anywhere (including my phone).
  • Smartphone (2006) – I’m far more organized now that I have my full contact list and calendar on me at all times, as well as being backed up, plus last-resort internet access is a nice bonus.
  • TV shows on DVD (2003) – There’s now a new category of TV show, the ones I don’t even bother to Tivo and just wait for the DVD.

Minor Quality-of-Life Improvement

  • Netflix (2002) – Like they say, no more late fees.
  • Wifi (2004) – Adopted later than most geeks, has proven useful in many ways.
  • Wikipedia (2003?) – Coming from someone who used to read the encyclopedia for fun, Wikipedia is like crack.
  • Text Messaging (2006) – Late to the game here. Enables a new layer of communcation and makes me both more responsive and more proactive.
  • GPS (2007) – I waited a while for the price dip, and now consider GPS a mandatory item for my car.
  • mp3 player/iPod (2002/2004) – No more discman and CD cases is a good thing.
  • Digital Camera/DSLR (2001, 2004, 2007) – I’m too lazy to deal with film. I got my first digital in 2001, my first nice one in 2004, and my first digital SLR in 2007, each a vast improvement over the previous.
  • Firefox (2004) – Firefox has gone from lightweight security-minded browser to bloated, customizable security-minded browser, both of which I’ve found value in.
  • Eclipse (2002) – Java wins in my book because of Eclipse. Having a program that thinks for you enables you to think about the real problems.
  • Launchcast (now Yahoo! Music) (2002) – One of the earliest and still one of the best customized music services. If you’re not sold on Pandora and Last.fm it might be because they are are inferior versions of Launch.

(supposedly) Major Advances, Adopted by Me, Negligible Impact

  • Social Networks (2004) – I use LinkedIn as a sort of resume-light, and myspace to keep up with my sisters, and facebook as the site du jour, but they are all just curious diversions.
  • OS X (2005) – Scores high on sexiness. Scores low on stability & usability
  • XP/Vista (2003) – Windows 2000 made computers better and more useful. XP and Vista seem to just make them slower.

Major Advances, Unadopted by Me

  • VoIP/Skype – I don’t use landlines.
  • Fastlane/Speedpass – I still find the ease with which someone can track me disturbing, plus the lines these days are usually shorter at the cash lines.

There’s probably some that I missed, or just weren’t important enough to remember. My main question is, what’s next to get on the list, and where on the list will it end up?

Wish List: Session Moratorium

DetourA feature that the major open-source/free servlet containers (Tomcat, Jetty, Resin) lack, AFAIK, is the ability to tell the container to stop issuing new sessions, and more importantly, make this flag known to the HTTP server connector. One or more of Websphere, Weblogic, and ATG Dynamo (I forget which) has this ability, and it’s extremely useful for higher-volume websites.

How it works: Server Bank A is running, Server Bank B is dormant. When you have a new release, you push it to B. Once B is up and running (this can take a while with some advanced applications), you tell A to stop issuing new sessions, and the load balancers send all new traffic to B. Once traffic has bled off of A entirely, A becomes dormant, and is ready for the next release.

Why it’s valuable: You can do a release without interrupting any sessions. This was particularly valuable on the project we used it on, because there was plenty of time to pre-compile pages, and the transactions were relatively high-value ones, so it was worth the price of the commercial license to ensure that none were lost or interrupted.

Considering all of the containers are relatively close performance-wise, and feature-wise, I think this would be a “killer feature” for any OSS container that had it.

Enabling Buttons on Apple Keyboard in Windows

I recently picked up, and am liking, the new “wafer thin” aluminum keyboard from Apple. Its very small, I like the key action and it’s very solid considering it’s size and thickness. But, I use it on Windows, and there’s no driver available other than the standard keyboard one, so the extra keys like media controls aren’t enabled. I came across a freeware macro program called AutoHotKey that works very nicely, and wrote up a few little scripts for it. You can download AutoHotKey and run the scripts yourself, or you can download the compiled version here [enable_mac_aluminum.zip, 193KB] and just pop it into your Startup folder.

Commands:
Shift-F3: Print Screen
Shift-F4: Task Manager
Shift-F7: Previous Track (in Winamp or Yahoo! Music Jukebox)
Shift-F8: Pause/Play (in Winamp or Yahoo! Music Jukebox)
Shift-F9: Next Track (in Winamp or Yahoo! Music Jukebox)
Shift-F10: Mute/Unmute
Shift-F11: Volume Down
Shift-F12: Volume Up
Windows-s: Open http://www.efsavage.com 🙂

Here’s the entire script:

#s::Run www.efsavage.com
+F3::Send {PrintScreen}
+F4::Send, {SHIFTDOWN}{CTRLDOWN}{ESC}{SHIFTUP}{CTRLUP}
+F7::
IfWinExist ahk_class Winamp v1.x
{
ControlSend, ahk_parent, z ; Pause/Unpause
return
}
IfWinExist ahk_class YMPFrame
{
SetTitleMatchMode 2
IfWinNotActive, Yahoo! Music Jukebox
WinActivate
WinWaitActive, Yahoo! Music Jukebox
MouseClick, left, 29, 107
Sleep, 100
MouseClick, left, 112, 76
WinMinimize
return
}
return
+F8::
IfWinExist ahk_class Winamp v1.x
{
ControlSend, ahk_parent, c ; Pause/Unpause
return
}
IfWinExist ahk_class YMPFrame
{
SetTitleMatchMode 2
IfWinNotActive, Yahoo! Music Jukebox
WinActivate
WinWaitActive, Yahoo! Music Jukebox
MouseClick, left, 29, 107
Sleep, 100
MouseClick, left, 30, 77
WinMinimize
return
}
return
+F9::
IfWinExist ahk_class Winamp v1.x
{
ControlSend, ahk_parent, b ; Pause/Unpause
return
}
IfWinExist ahk_class YMPFrame
{
SetTitleMatchMode 2
IfWinNotActive, Yahoo! Music Jukebox
WinActivate
WinWaitActive, Yahoo! Music Jukebox
MouseClick, left, 29, 107
Sleep, 100
MouseClick, left, 148, 79
WinMinimize
return
}
return
+F10::Send {Volume_Mute}
+F11::Send {Volume_Down 3}
+F12::Send {Volume_Up}

Update: Reader Svolte points us to SharpKeys, which (by default) maps F13 to print screen. The advantage of doing this is that alt-print-screen (capture just active window) works, while I was unable to replicate with the AutoHotKey script.

52 Word Review: Eastern Promises

Viggo Mortenson in David Cronenburg's 'Eastern Promises'Eastern Promises, an exercise in minimalist plot, succeeds due to delicate acting and stoic directing. It’s got the villian, anti-hero, idealist, and the fairly obvious Twist, but saves itself from mediocrity by telling only the important parts of the story. Cronenburg’s films succeed because they leave you with questions, not answers.

Database Naming Conventions

Time for another naming convention. This time it’s something people care more about than Java packages, we’re talking about databases. Here are the rules, and the reasons behind them.

Use lowercase for everything

We’ve got 4 choices here:

  • Mixed case

    • Some servers are case sensitive, some are not. MySQL for example, is case-insensitive for column names, case-insensitive on Windows for table names, but case-sensitive on Linux for table names.
    • Error prone
  • No convention

    • Same reasons as mixed case
  • Upper case

    • SQL is easier to scan when the reserved words are uppercase. This is valuable when scanning log files looking for things like WHERE statements and JOINs.
    • MySQL will always dump table names on Windows in lowercase.
  • Lowercase

    • Works everywhere. Some servers, like Oracle, will appear to convert everything to uppercase, but it’s just case-insensitive and you can use lowercase.

Only use letters and underscores and numbers (sparingly)

  • Most servers support other characters, but there are no other characters which all the major servers support.
  • Numbers should be used as little as possible. Frequent use is typically a symptom of poor normalization.

    • address1, address2 is OK
  • Whitespace isn’t allowed on most servers, and when it is you have to quote or bracket everything, which gets messy.

Table and column should be short, but not abbreviated.

  • You’ve seen the same thing abbreviated every way possible, like cust_add, cus_addr, cs_ad, cust_addrs, why not just customer_address? We’re not writing code on 80 character terminals any more, and most people aren’t even writing SQL, so let’s keep it clear, OK?
  • 30 characters is considered the safe limit for portability, but give some serious thought before you go past 20.

Table names should be singular.

Yes, singular! Oh yes, I went there. I used to use plural names, because it’s more semantically accurate. After all if each record is a person, then a group of them would be people, right? Right, but who cares. SELECT * FROM person isn’t any less clear than people, especially if you’ve got a solid convention. You don’t use plurals when you’re declaring class names for a vector of generics do you? Also:

  • English plurals are crazy, and avoiding them is good.

    • user -> users
    • reply -> replies
    • address -> addresses
    • data -> data (unless its geographic, then it’s datum -> data)
  • Singular names means that your primary key can always be tablename_id, which reduces errors and time.

Double Underscores for Associative Tables.

You’ve got your person table, and your address table, and there’s a many-to-many between them. This table should be called address__person. Why? Well what if you have a legacy_customer table that also ties to address. Now you’ve got address__legacy_customer. A new developer can easily pick up this convention and will be able to break down the names accordingly. Remember, no matter what the Perl/Lisp/Ruby/etc guys say, clarity of code is judged by how someone reads it, not how they write it.

Component Names of Associative Tables in Alphabetical Order.

This rule is somewhat arbitrary, but still beneficial. There’s no good way to determine which goes first. Table size, “importance”, age, who knows what else, and those assessments may change over time. Or, you might find that your manager assigned the same task to two people, and now you’ve got an address__person and a person__address table co-existing peacefully, when you only need one. Everyone putting them in the same order makes reading and writing queries easier.

That’s all I’ve got for now, but I encourage you to offer your own, or even refute some of the ones above (with some reasoning, of course).