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.

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).

New Toy Review: TeraStation Live

2 TB TeraStation LiveA few weeks ago I picked up 2 TB TeraStation Live, and so far I have to say I’m very happy with it. I got it for $800 from buy.com, which puts the whole device at about $400 over the price of it’s 4 500GB hard drives. I think that premium is well worth it.

It was very easy to set up, at least for someone with a base knowledge of setting up a file share. The administration is done via a slow, clunky, but straightforward and ultimately effective web UI. I have set up a few different shares with varying permissions, and haven’t had any problems so far. Among its nice/key features are the fact that it is virtually silent, has gigabit networking, and isn’t too big, about the size of a mini-tower PC.

The Mobile Revolution Begins! (and 3 years later the iPhone comes out)

I find the whole iPhone phenomenon interesting because people are seeing it as a technology advance when it’s really a textbook marketing/branding success (revolution?) in the making. Apple essentially tricked the entire media landscape into doing amazing PR, even “independent” sources like blogs and NPR.

Let’s be clear, the $500+ phone isn’t new. The phone with a google map that you can drag around with your finger isn’t new. Neither is one that can play gigs of mp3s, has a real address book, a real web browser, real email, etc. Having the option from a text message to reply or voice call the person back isn’t new. These things have existed for years, I know because I have it. Oh and mine lets you build/install apps, the sticking point many techies complain about for the iPhone, but very few of these apps have seen any success. It’s also available for any network, uses EVDO, has wi-fi and bluetooth, has handwriting recognition, serves as internet conduit, a real keyboard, etc. The reason nobody had to camp out for my phone, the reason I don’t pimp it to everyone I meet? It’s running a Microsoft OS, ho hum. So from a technology/feature standpoint, the iPhone is nothing new, but even well-informed tech people seem to have fallen for the slick ads, the expert PR “reviews”, and the general fanfare.

People are opining that this was Steve Jobs’/Apple’s greatest risk, which I disagree with, because they weren’t really taking a risk because they weren’t doing anything new. They’ve added that Apple shine to devices that have existed for years, that they’ve been able to watch people use, and they’ve fixed the mistakes. They’ve made the interface sexy with effects and constraints, a skill they’ve honed for even longer. They’ve used all their fanboys to turn a device into the Beatles.

I’ve done enough software to know how important (and potentially misleading, though that’s not the case here as far as I know) a well-executed interface is to adoption. I once co-wrote a CMS that was effectively ignored by everyone but its authors, but then I spent a day adding some logos, gradients, and javascript UI effects, and people were immediately scheduling meetings with me just to get a peek at it. Where Jobs & Co. deserve credit is that all of the “news” coverage their product is getting is lauding a revolution, instead of saying “Apple’s new iPhone is almost as capable as a 3-year-old Windows Mobile phone, but they executed the interface much better.” For more information, see the next edition of most marketing/branding books.

Facebook: 200 Hours (of dev time) FREE!

The soup du jour in the Web 2.0/startup community is Facebook’s new API. StyleFeeder has an app on it now, because it made sense and it’s a good fit. You should try it out. Phil did most of the heavy lifting, and we should pity him for it, because it’s very poorly documented, not completely built, and nerve-wrackingly unstable. But it works, and it’s pretty cool to be able to get in to a place people feel comfortable and offer them something we think is useful, that Facebook never would have got around to building. Not everyone is impressed about the whole idea though:

Kottke obviously wasn’t doing any internet development in 1994 or he would have heard “why isn’t my website as nice as stuff I see on AOL?”

“What happens when Flickr and LinkedIn and Google and Microsoft and MySpace and YouTube and MetaFilter and Vimeo and Last.fm launch their platforms that you need to develop apps for in some proprietary language that’s different for each platform?”

It’s pretty clear what would happen. People would develop for Google and MySpace, people are already developing for Microsoft, and the others would be ignored. You need massive scale and a big carrot (Facebook’s is a massive, clean network of users), to pull this off. Everyone else puts their faith in the W3C. Eventually the Facebook API will be deprecated or ignored, and if there are any good ideas in it, they’ll trickle out into the mainstream.

Valleywag has a screed by someone who bought the hype and blames Facebook for it, and is now apparently trying to generate some backlash to justify to management why it didn’t work as promised. Keep in mind that the hype was not from Facebook, I didn’t get any emails from them, see any ads, it was solely driven by tech-pundits, bloggers and VC panic. This person is sad that they didn’t get millions of users overnight and that Facebook “undercut” developers by preventing them from spamming their apps all over the place. If your app is useful or fun, it’s going to grow on its own, just like any other software distribution method. Sure it may seem unfair that some people got in and got big before the rules tightened up, but it’s also unfair that my parents got a house with an acre of land for $32k before I could (I was 3).

PuTTY: Custom Icons

PuTTY is the most popular free SSH client for Windows. It’s very stable and very lightweight, due to the developers keeping bloat out of the source. One piece of bloat that I would like to see is the ability to pick icons, which I find very valuable when working on multiple servers, a common task for most developers. Luckily it’s pretty easy to roll your own PuTTY, so I figured I would offer a little how-to here.

  1. Download and install Cygwin. I’m not sure which packages you need, as I typically just install everything.
  2. Download putty source code from here: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
  3. Open cygwin shell
  4. cygwin: mkdir putty
  5. cygwin: cd putty
  6. cygwin: unzip [wherever download is]/putty-src.zip
  7. cygwin: mv WINDOWS/PUTTY.ICO WINDOWS/PUTTY_ORIG.ICO
  8. Now put your icon (.ico) file in WINDOWS and name it PUTTY.ICO
  9. cygwin: cd WINDOWS
  10. cygwin: make -f MAKEFILE.CYG putty.exe
  11. You should now havea nice fresh putty.exe file in the WINDOWS directory, copy this wherever you wish.
  12. Copy the next icon to PUTTY.ICO and re-run make. Repeat until you have one executable per server.

Safari for Windows: No Thanks

I’m with many others, including Yuval, in saying that Apple porting Safari to Windows is unfortunate. Web developers have basically got 3 main browsers to deal with right now, and adding a 4th isn’t going to help. IE6 is dying, but still prevalent. IE7 isn’t great, but is obviously a force to be reckoned with. Firefox is bloated and slow, but comfy and relatively painless to develop against. Safari is outdated, buggy and less standards-compatible than IE7 or Firefox, often intentionally so (try styling a submit button).

The big claim Apple makes is page rendering performance. Firstly, I hope nobody takes Apple’s performance numbers seriously, they’ve been flat out lying about them across the board for a decade or more. Even if the stats are legit, picking a browser based on page rendering speed is silly, it’s like buying a car that goes 200mph instead of 150mph, when you live in Los Angeles and spend most of the day in slow traffic anyways.

I think Apple ported Safari to force people to support it, since it’s often sidelined due to low usage and its quirky behaviors. I’m really loathe to support a browser that offers no new features yet has a unique set of drawbacks. The solution here is for Apple to abandon the KHTML core and put it’s overstated development resources into the Gecko engine, giving them the ability to Mac-ify and brand a browser, but not impose increased costs on web developers. They should look to their own successful Airport line for how you can drive adoption, leverage/strengthen a standard, and maintain a strong brand at the same time.