Browsing articles from "August, 2010"

OnStar and Usability

By Rob Warner  //  Ablog  //  1 Comment

Originally posted 2004-08-23 10:34:33

Here in the US, OnStar is running a radio ad trumpeting the power of their flagship service. This system allows motorists to press a button inside their vehicles while they drive down the road, which contacts an uber-service for fixing all their problems and curing all their woes. You can read more about it here. DISCLAIMER: I’m not associated with OnStar, nor do I have access to it in any of my vehicles. I have never used it, and know virtually nothing about it.

In the ad, which has run for a few months, a woman notices that her \”Check Engine\” light has turned on. She presses her OnStar button, a helpful OnStar agent responds, and a friendly dialogue ensues. The OnStar agent runs a remote diagnostic, which reveals that the vehicle’s gas cap is missing or otherwise not properly screwed down. The woman breathes a sigh of relief and promises to check the cap at the next opportune moment. Problem solved. Case closed.

Two issues I have:

  1. Is this the lone OnStar success story? If so, why would I want the service, as I never forget to screw on my gas cap? If not, why is this the only story they run? It’s been months, so you’d think they’d rotate a new story in.
  2. The remote diagnostic certainly wins a gee-whiz award. Honestly, that’s pretty cool that someone sitting in Omaha, Winnipeg, or Bangalore (I’m guessing–I have no idea where their call centers sit) can remotely debug a vehicle flying down the highway. Once you get past the technical wizardry, however, you can’t help but wonder: why do I have to notify a call center to determine the disposition of my gas cap? The vehicle evidently diagnosed the problem without any remote assistance, as it lit its \”Check Engine\” light. Presumably, it knew at that time that the lid was askew. Why the middleman? Why make the harried driver press a button and chat, when the vehicle could have used some sort of rewritable display (LEDs, LCD, whatever) that said \”Check gas cap\”? Indeed, the car could have announced it: \”*Ding* Please check your gas cap.\”

As software developers, we fall into the same trap: we display error codes in our applications and expect users to Google for the full error description and possible remedies. Either that or we just crash!


Apple Mistake: Turning off Wi-Fi

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-07-06 08:06:58

Everytime my 16 year-old son sees the screen of my iPhone 3GS, he mocks me as if I were carrying a dog turd. He claims that the jagged pixelation tears his retinas, and he hurriedly scurries to the rounded curves of his iPhone 4. Youth have no respect.

Apple, too, has no respect for those of us who live in the intersection of \”always in a hurry\” and \”need to prolong battery life.\” Like a vampire athirst for blood, we rush from power outlet to power outlet, cursing the anemia of our 3GS’s battery and urging it to suck energy up quickly. We read and obey every blog post that promises tips to prolong iPhone battery life, and it’s never enough.

One of the first things we do, of course, is turn off wi-fi whenever we can. The process to do so rivals filling out an IRS form in both complexity and irritation, and nothing short of digging into Setting’s bowels shows you if your wi-fi is on, pitching forth its beacon and sucking your battery life, and simply not connected. Only those who live in the gray area of jailbreaking escape the wi-fi setting tyranny.

I understand that Apple adores user interface consistency, and controlling wi-fi through Settings rings harmonious–both for turning on and off and connecting to a network. The user interface for connecting to a network, though, offers an alternative: when you try to access the Internet, your wi-fi is on, it’s not connected, and a wi-fi network lies within range, you see a dialog box that allows you to connect via wi-fi, as below:


This dialog box usually reminds me that I’ve left wi-fi on. I rarely choose this opportunity to connect to a random wi-fi hotspot. Rather, I make a mental note to turn off wi-fi as soon as a tap \”Cancel\” and finish what I’m doing, but by the time I finish what I’m doing, I forget to heed my mental note and my wi-fi beacon keeps draining my battery. This is Apple’s mistake: it has recognized that I want to take action, but it has guessed poorly about what I want to do. The remedy? Include a button on that dialog to turn off wi-fi.

Apple, please do it. My battery and frustration level will thank you.


LessConf 3010 Day Two

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-05-23 20:35:21

The folks at Storenvy cooked us breakfast: pancakes, chocolate chip pancakes, and bacon pancakes. Lots of buzz about the bacon pancakes. My love for Bacon, Egg, and Cheese McGriddles drew me to the bacon pancakes. I took an eager bite, a charitable nibble, and gobbled a chocolate chip pancake. I’ll keep my bacon and pancakes separate in the future.

Alex Hillman, cofounder of IndyHall, grabbed the podium first and strode forcefully into a presentation sans slides. He should have used slides, or he should have had less to drink at the party last night, or something, because he abruptly faltered, looked blankly at the crowd, confessed that he was stuck and stumbling, and turned pleading eyes to Steve Bristol. Bristol tossed some prompts from his seat (\”You were saying that . . .\”, \”Talk about . . .\”), and Hillman tried to leap on them, sputtered a bit, then said, \”Steve, I’m dying up here,\” so Steve bounded onto the stage and co-presented.

The presentation was on coworking, which responds to people who work remotely, alone, but need some sense of community to produce and maintain sanity. Hillman has created a physical plus virtual community where people can come every day or drop by on occasion and do their remote work. You can be a lone worker without being alone. The community commands 5,000 square feet of office space in centrally-located Philadelphia, and you can pay $275/month to have a permanent desk or $25/month to drop by occasionally. They started with 1,800 square feet, furnished it for about $4,000 with IKEA desks, got profitable, moved to larger digs, and got profitable again. All the profits have been plowed back into the company, and Hillman consults to pay his bills. He spent the year before opening the business attending technology meetups, meeting tech people, throwing events, holding \”cream cheese\” sessions (everyone descends on a cafe for a day to cowork), and building an audience before opening the doors to their coworking offices. The company is four years old now and thriving.

For awhile, you suspected that Hillman’s swoon was an act to underscore the importance of coworking–the presentation suffered until Bristol vaulted onto the stage and they co-presented–but no big flash and polish appeared to say, \”See! We’re proving the message!\” Afterwards, Hillman tweeted this: \”Thanks for enduring that train wreck. Apologies to @lessconf attedees, @lessallan, and @stevenbristol for totally psyching myself out.\” So I guess he was really dying. The presentation worked pretty well, though, so kudos to Bristol for jumping in and helping him along. Together, they conveyed the IndyHall message, and it’s a good one that should work to bring together creative communities in any city.

The next person to take the stage was Peldi Guilizzoni, founder of Balsamiq. He entertained on stage as he did at lunch the previous day, and his enthusiasm drove me to action: I bought Balsamiq while he presented. Some of what he presented rehashed things he’d told us at lunch, but some of the other highlights:

  • The product took off right away. His business plan called for 150 customers after two years. He’s not quite two years in, and he has over 20,000 customers.
  • He reads all the time. Three books on his bedside table are Crossing the Chasm, Rework, and Growing a Business.
  • He displayed his pantheon: an array of pictures of his heroes, the people he learns from and reads everything they write and that he tries to emulate. He recommends that we all do the same. Jason Fried was on his pantheon, so he expressed relief that Fried had left the day before, or he’d have felt awkward.
  • As a business owner, your job is to do email all the time unless you take steps to avoid that.
  • He maintains a \”write-only\” text file of business ideas–he closes his eyes, opens the file, types in his new idea, hits enter, and closes the file. He doesn’t want to look at any of his ideas right now because he doesn’t have time to do them.
  • He showed a clip of Steve Martin: Be so good that they can’t ignore you.
  • Put your product above everything else (support, blog, et al).
  • Be brave about asking your customers for money. You need it to stay in business, and they want you to stay in business so you can support them.
  • He named the product after a condiment because the original vision was a plugin to Confluence. Like a condiment, Balsamiq makes Confluence and other apps better. He says Balsamiq is spelled like the vinegar, but with a \”q.\” His father jokes that if his success continues, they’ll say that the vinegar is spelled like the software, but with a \”c.\”

Go buy Balsamiq!

Clay Hebert, founder of TribesWin, took the stage to wrap up the conference. Clay studied under Seth Godin as part of a 6-month \”Alternative MBA\” program in 2009–see Clay’s comment below, and thanks for the clarificiation! Seth Godin has authored several books, including Purple Cow, Tribes, The Dip, and the new Linchpin. I recently purchased Linchpin on my nook, though I haven’t read it yet, and they gave us a hardbound copy at the conference. Hebert’s talk bumped Linchpin to the top of my \”next read\” list. He made me squirm as he attacked the \”factory working\” status quo, where people learn to obey and keep their heads down and check off lists and trade greatness for following instructions. He pulled out a baggie of 400 nickels and said that the nickels represented the scope of human history, and that a single nickel represented our current economic setup of having jobs and going to work for someone else. No one used to be unemployed because no one used to have jobs!

The educational system trains us for a factory world of obedience and cooperation. When you obey and comply, you are replaceable. Linchpins, on the other hand, don’t obey the rules or check off someone else’s lists. They make the rules. They’re more human, more connected, more mature. They do emotional labor, rather than physical labor. They’re artists. They don’t rely on resumes, which are tickets to being average–sheets of paper that sit on HR desks while you hope you’re picked.

Hebert showed a picture of a squirrel, and confessed he’d rather use a real squirrel in his talks but can’t figure out the logistics. He talked about the squirrel’s lizard brain, which makes it hungry, horny, and scared. The lizard brain, which we also have, scares us and makes us back off. We must overcome our lizard brains to become great, to become linchpins.

If you haven’t felt roused or challenged by my account, the fault rests entirely with me. Hebert’s presentation was amazing. Go read Linchpin.

The LessConf folks outdid themselves, and rewarded me far beyond the time and money I spent to be there. I hope they never change the single-track format, nor do they compromise their standards on who they invite to speak. They targeted greatness and brought it. I met some amazing, passionate folks, and felt inspired to be amazing myself. I have pages of notes to read and digest, websites to go to, tools to try, books to read, and practices to implement. I’d better hurry–I have only a year until I’m back at the next LessConf to learn more!


LessConf 3010 Day One

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-05-22 08:39:08

I first met Steve Bristol in 2007 at the inaugural RubyJax meeting. I walked into the meeting expecting a typical tech gathering of strangers: people sitting as far away from each other as the room will allow, reading email on their smart phones and acting as if they’d rather be anywhere else, and hoping someone else would start the conversations. Steve (along with Jon Larkowski) set the tone for the meeting. He started the conversations, and was no stranger (though he was stranger than I expected). As people filed into the room, he acted as if his life had been leading to this moment, that he’d hoped to meet that person for so long and was as happy as a Macolyte on iPad-release day to finally do so. That night, he was open, fun-loving, needling, profane, unkempt, and raw, and has been so every time I’ve seen him. The RubyJax user group continues in that vein, and is the most social, smartest group of people I’ve ever hung around. It’s worth moving to Jacksonville, just to come to our meetings!

When I saw the announcement for LessConf 3010 and the lineup of speakers, I emailed my boss, a 37signals fan, and told him we should go as a management team. He responded that I and a coworker should go, so we signed up. My coworker realized late that he had previous plans to attend a wedding this weekend, so missed the conference. Two words: Mis Take. I’d have skipped my best friend’s wedding, my sister’s wedding, and would have considered hiring a proxy for my own wedding rather than miss this conference. You can always explain the pictures to the kids later.

Atlanta rains washed me to a runway in Birmingham while the first speaker–Chris Wanstrath, founder of GitHub–explained why your idea sucks, and why that’s a good thing. I feel like I missed a dosing of abuse and an affirmation that I’m OK, so I plan to scream at myself in the mirror tonight, and then soothe myself with a pint of mint chocolate chip while channel surfing for House reruns. I’m bummed I missed his talk, but maybe he’ll post slides?

I finally arrived at the conference and squeezed into the middle of Dan Martell’s talk. Martell is the cofounder of Flowtown, and talked about \”lean product development.\” Apparently he made a bundle with Spheric, and now seeks success with Flowtown, which takes your customer email list and sends you a bundle of information about them. Some highlights from his talk:

  • Show mockups or prototypes to users before building your great idea
  • If someone who is not your friend, family, aunt, etc., pays you $1 online, you have gone pro
  • It’s not about marketing–it’s about product, so make a product that’s marketable
  • Be ready to pivot from what you’re doing, but not jump
  • Early adopters are important, because they’ll be patient with you
  • Don’t fear competition, but don’t be distracted by it. See what your competitors’ customers are saying on Get Satisfaction or UserVoice
  • Use metrics that are Actionable, Auditable, and Accessible
  • They push code to Production 50 times a day, and anyone can push. A watchdog process monitors metrics, and automatically rolls back if it detects a problem
  • Use to see how real users are interacting with your site

Next up was Cameron Moll, author of Mobile Web Design and co-author of CSS Mastery: Advanced Web Standards Solutions. He’s a designer by both trade and passion, and he runs Authentic Jobs. He talked about good vs great design, and his passion for great design dripped from his presentation. He showed us some of the efforts he went through to make a poster of the Roman Colosseum with typography. He showed us a technique he uses to make sure his designs have the appropriate visual hierarchy: he removes the color, blurs the design, and makes sure the important parts stand out. He talked about influence vs inspiration, that influence is borrowed and inspiration is earned, and that you’d better schedule time to seek inspiration and have a plan to capture that inspiration anytime, anywhere. He recently started using Dive Slates so he can capture ideas in the shower. He talked about the importance of creative pause, when the body is engaged in some monotonous task and the mind is free to roam, and that this typically happens in bed, bath, or bus. When designing, be sure to understand the problem you’re trying to solve–don’t just jump in with your array of solutions.

Moll was running well into lunchtime, and said he would skip most of his talk so we could eat. A swell from the audience insisted he deliver the full material, however. No one wanted him to stop. We didn’t eat until 2:15, and no one complained.

A small group of us got to eat lunch with Peldi Guilizzoni, founder of Balsamiq, a mockup tool. He told us the story behind Balsamiq, that he was working at Adobe and needed a mockup tool, couldn’t find one he liked, and pitched his bosses on creating a tool for Adobe to sell. Adobe doesn’t touch things that won’t bring in at least $100 million, so he set off to do it himself. He said that the tool is nowhere near finished–he can’t believe people buy it!–but that he hopes to complete his vision of the tool this fall. He also said he’s embarrassed of his website, that he based it off some old 37signals design, but thinks maybe people like it because they can tell that it’s not backed by a big company, just \”some dude.\” He talked about the accounting pains of having two companies: one in California, where he started the company, and one where he now lives, in Italy. He has an office in his home in Italy, off his bedroom, where he and another employee work. There’s no phone jack in the office, so they used to carry the fax/printer into the bedroom anytime they needed to receive a fax, but they recently bought a 20 meter phone cord that they can roll up or string out as faxes demand. He was expressively Italian, open with his thoughts and experiences, and quick to laugh and poke fun at himself. He talked about how angry people get when your software breaks for them, but how grateful and supportive they are when you fix it quickly. He talked about his early beta group, that he has a release version and an early beta version, and that he’d built a group of passionate users that gave him great feedback on the beta, but had to start over after burning the group with a completely broken beta build. His American wife and children came with him on this trip, and they’re staying here for a two-week vacation but he flies back to Italy tomorrow. As he explained this to us, his face beamed and his fists punched joyfully upwards as a he slavered over two weeks of 20-hour coding days, though he hastily explained that he loves his wife and children. We all understood and openly envied his plans.

After lunch, he approached me and asked me if we’d met before, saying I looked familiar. For one fleeting, foolish, vainglorious moment, I thought perhaps his tech career had been sparked by The Definitive Guide to SWT and JFace, that my book molded his entire approach to developing software, and that he recognized me from my smashing Celtics-hatted photo from the back of the book. Alas, a quick probe revealed that he’d never touched SWT, but that Balsamiq boasted an SWT importer. We decided I must just have one of those faces or bald pates or something.

After lunch, Saul Colt from thoora spoke about how marketing is going to change in 2011. He probably caught us at our worst: long morning, full bellies, and ready to nap. The man apparently can’t be daunted, however, so he entertained and cajoled and got us moving. He approaches marketing by making people scratch their heads and think–sort of a high-tech shock jock–and his approaches defy convention. He claims to be the smartest and most handsome man in the world, and though he’s likely neither he sparks conversations with those claims. He confessed that he spends most of his time on the road, and often gets 10-12 hotel room keys that he passes out when asked for a business card (without revealing his room number, or so he says), just to start conversations. At zipcar, they forewent the budgeted, small, employee-only Christmas party, borrowed to the hilt, and threw a party/rock concert for all their customers. Break from the ordinary, he seems to say, and get noticed. He talked about knowing your customers (the more you know them, the less you’ll want to disappoint them), listening to them, and instead of just engaging them (which can be scary for them), empower them. He talked about the TupperWare-like party containers packed with Fresh Books goodies that they gave to Fresh Books customers so they could throw Fresh Books parties and do Fresh Books marketing. Transparency will be replaced by Invisibility, that instead of \”it\” kid rock stars being Twitter marketing celebrities, personalities will disappear and companies will just be doing great work. He said to find the niches where your customers go and go there.

In the days leading up to LessConf, some folks have pointed to the all-white, all-male slate of speakers, chosen by an all-white, all-male company, and have launched accusations of racism and misogyny at Less Everything. The panel contains more diversity than the critics acknowledge: David Heinemeier Hansson is from Denmark, Peldi Guilizzoni is from Italy, and Saul Colt is from a different planet altogether. True, though, that the panel has neither women nor people of color, but such strident accusations based on a nine-person slate, which has little wiggle room for adhering to statistical norms, seem unjustified. Bristol’s wardrobe attests to his colorblindness. Colt, however, didn’t help matters when he showed a slide of underclad lesbians kissing or about to kiss (I refuse to look it up), and that slide fell with a thud on the audience. You can be outrageous without offending. Colt muttered, \”OK, I need to remove that slide from this presentation.\” I agree.

After Colt, the 37signals folks took the stage for an interview with Bristol, where most was banter or rehashed information you can find elsewhere, but some tidbits surfaced. Years ago, DHH wrote editorial reviews for a video gaming site, grew tired of working with belligerent programmers to get his reviews published, and learned how to program so he could bypass the programmers. We owe Ruby on Rails to a few jerky programmers? Amazing! He then did some contract work for 37 signals, building Basecamp in 10 hours/week and proving how much you can get done when you focus. DHH also races a Porsche Cayman and wins often. Fried has two cars that he wouldn’t disclose.

With their recent book Rework, they’re trying to reach a larger audience than they have, and are succeeding. They revealed that the buildout on their new office is $1 million, but that this doesn’t flout the Getting Real concepts because they’re not spending other people’s money to do this. They’ve earned this by staying in substandard offices for so long, and are treating this as a luxury item. They’ll have an auditorium in their new office that uses 30% of the total space where they’ll hold seminars to teach others, as well as bring in others to teach them. Stay tuned.

The bacon pancake breakfast starts in five minutes, and I’m unshod and unpacked, so I have time neither to finish nor to edit, so this is coming at you raw–which, for a piece on a Bristol/Branch conference, seems appropriate. Looking forward to another great, raw day!


Big To-Do in the Land of To Do

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-05-16 07:41:50

I love software updates, and both my iPhone and my iPad offer me plenty. I’ve downloaded enough apps, both free and purchased, that I can count on available updates a few times a week. Like unwrapping a gift, updating software brings mystery, surprise, and intrigue. What’s fixed? What’s new? And yes, sometimes, What did they break? Always, though, software updates offer the thrill of getting something you didn’t have before. Launching App Store on both iPhone and iPad and checking for updates is part of my daily routine.

Yesterday morning, I launched App Store on my iPad and saw a list of updates, which made me smile in anticipation of what new things these bits held. Just as I was about to tap Update All, I saw that the release notes for Todo for iPad by Appigo listed \”Removed RTM sync service.\” Whoa! That’s a gift in the same vein as a pair of opera tickets from your wife for your birthday or that neon-hued hula tie your kids gave you last Father’s Day. As a long-time Remember the Milk user into the second year of Remember The Milk Pro, at $25 per year, I wanted removal of that sync service as much as I wanted to write code on a Windows Vista box. Time for some digging on the Appigo and Remember the Milk sites.

And it took some digging — this wasn’t front-page news for either company, but both companies speak to the issue. You can read Appigo’s version here and Remember the Milk’s version here, or you can accept my synopses below:

Appigo: When we ported Todo from iPhone to iPad, we ported the RTM sync code as well. We thought nothing of it — Todo for iPad is a natural extension of Todo for iPhone, so of course we should continue to sync with RTM. We didn’t change any of the sync code, so it’s practically the same app. Suddenly, with neither notice nor warning, Remember the Milk cut off sync access from the iPad version of Todo. They shouldn’t have done this. They should have contacted us first, let us know where they thought the breach in the terms of our agreement was, and we should have taken the time to work something out. RTM is less than 1% of our users, though, so for those users we’re offering a Toodledo Pro account free for six months, and let’s put this ugly mess that RTM foisted upon us, behind us.

Remember the Milk: Our API is free for non-commercial use, but to connect to us from a commercial app, you have to have an agreement. Appigo has an agreement with us for the iPhone version of Todo only, not the iPad version. They know this. We alerted them long beforehand. We warned them of the consequences of releasing an iPad version of Todo that includes RTM sync without a proper commercial license, and they chose to ignore us. We’re not surprised — they’ve abused our API in the past — but we are disappointed. We will no longer do business with them. If you upgraded to Remember the Milk Pro on 5/12 or 5/13 because you bought Todo for iPad thinking you could sync with us, we’ll refund your money.

My Analysis: Someone’s lying, obviously, because either RTM warned Appigo, as RTM claims, or they didn’t, as Appigo claims. My guess, and it isn’t a stretch, is that RTM warned Appigo, and Appigo played chicken because they were willing to live with the consequences. I assume RTM charges a fee for a commercial license (the site doesn’t explicitly say that, just that commercial use requires prior arrangement), and Appigo didn’t want to pay again. They paid for their iPhone license, 1% of their users take advantage of it, and they don’t want to give RTM any more money. They figured RTM wouldn’t cut them off, but that if they did, they could make RTM look like the bad guys and could move customers to a service that’s easier (read: cheaper) to work with.

So who do I side with in this dispute? Neither, because neither sides with me. I originally bought RTM Pro, after using RTM Free for some long period of time, to use RTM for Blackberry, and then kept RTM Pro when I transitioned to the iPhone last year. I move among several devices (Linux desktop at home, Windows desktop at work, MacBook Pro at home, work, and in between, iPhone anywhere, and now an iPad that hasn’t yet settled into a routine) and I need to access and complete my \”to do\” list wherever I am. That means I need a cloud service, but I also need optimized interfaces on smaller or slower-connected devices (iPhone and iPad). I originally used RTM’s app on iPhone, but found Appigo’s Todo and much prefer it to RTM’s iPhone app. Todo on iPad is gorgeous, fit perfectly (at the time) into my workflow, so of course I bought that.

So, after $65 (2 x $25 for RTM Pro, $9.99 for Todo for iPhone, $4.99 for Todo for iPad), I had a task solution I was happy with, and now this happens. I’m squarely in the target demographic for both companies: I’m someone willing to pay money for a task list solution, despite the scores of free solutions available. And both companies ignored me in a quest to save money or be right. One telling quote from Remember the Milk:

Unfortunately sometimes we’re forced to make tough decisions like this, even if it makes some users unhappy. We won’t be coerced into allowing API abuse, just because enforcing the terms might make us unpopular.

For the moment, Todo for iPhone still syncs with RTM, though the latest update from Appigo (which I haven’t yet downloaded) removes that sync option. All of my tasks still sit in RTM. My guess is that RTM has the moral upper hand in this dispute, but now I trust neither company because, regardless of who’s right or who’s wrong, I’m the one who’s stuck with having to take steps to fix my situation. Besides, I think RTM is being disingenuous by trying to make the issue about API abuse when I assume it’s really about money. I use a task list app extensively, so I need to measure my next steps carefully. Do I sign up for the free Toodledo account and use Todo on iPhone and iPad to sync with them? Do I ditch Todo, go back to RTM on iPhone, and hope RTM finishes their iPad app soon? Do I go find another service that’s not involved in this mess? Do I just put my tasks in a text file on my Dropbox account so it syncs to all my devices, and perhaps use Lifehacker’s Do I use this mess as an exercise to write something useful in a new language and write my own task list manager in Erlang, perhaps so I can do more things faster? These are all good questions — ones that I’d rather not answer right now, because frankly I’m too busy with other things, but must anyway.

In a world of cloud services and interoperability, trust becomes more important. As I work with cloud services, I have to think: As someone who holds my data, are you going to stay in business? Are you going to back up my data? Are you going to do your best to keep hackers out and data in? Are you going to read or sell my data? Are you going to give me ways to use my data across other cloud services? Are you going to keep my interests at heart? Are you going to be diligent stewards of the data I entrust to you? You’d better answer these questions well, or my data and money will go elsewhere.


No Fluff Just Stuff Tampa — Day Three

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-04-19 15:44:08

I started the day plopping down for breakfast at the same table with Nate Schutta and chatting him up about various technology questions and issues. I then went to his talk: jQuery: Ajax Made Easy. I think I would have chosen a different title for the talk — something like jQuery: An Overview, with Some Comparisons to Other JavaScript Libraries. It was a good talk, though, and stressed the importance of using a library. The only way to do JavaScript \”wrong,\” he said, is not to use a library. He talked about the paradox of choice that all the JavaScript libraries puts us in, and explained why jQuery is a great choice. Here are some other highlights:

  • They kept track of how much effort IE6 compatibility cost them on a project: 20%. I take this to mean that the project would have completed 20% sooner if they hadn’t had to support IE6. They also had to reduce the feature set.
  • jQuery makes UI effects easy, but proceed with caution. Just because you can doesn’t mean you should. <blink>, anyone? UI effects are the seasoning, not the entree.
  • People have traditionally learned JavaScript through google –> cut –> paste. This is a bad way to learn a language.
  • Lazy programmers are better programmers because they don’t write everything from scratch.
  • JS libraries have \”flavors\”: Prototype has a Ruby programming flavor, whereas jQuery has a web designer flavor.
  • jQuery does CSS selectors the best.
  • Always follow the principle of least surprise.

I then went to Jeff Brown’s Compile Time and Runtime Metaprogramming with Groovy. Loved it. I didn’t take a lot of notes — I was too busy typing in the code as he wrote it to help me learn this stuff better. He went through metaClass and methodMissing and @Delegate and I don’t remember what else. He pointed out the flexibility and power of the JVM to support all this metaprogramming. It was really neat and compelling stuff.

I then went to Ken Sipe’s Enter the Gradle. Build technologies always interest me, and Ant (which we currently use) is showing its age. I’ve looked into Maven enough to figure out that while everyone loves it conceptually, only some love it in practice. I’m on the side of not loving it in practice (from what little practice I have with it). In my naivete, Gradle reminds me of Rake (which is praise indeed), and I’m happy to see the build file done in code, not XML. I’m happy to see most anything not in XML.

The final session I went to was Pratik Patel’s Easy Mobile Development Without Native Code. I incorrectly assumed it was about mobile optimization of websites — yes, I know what happens when you assume — but it was still very interesting. It was about technologies that allow you to write these apps in HTML, CSS, and JavaScript (at this point you’re probably assuming it’s about mobile optimization of websites, too!), but the HTML, CSS, and JavaScript are deployed to the device, not served by a web server. The presentation covered three options:

With the fuss around the recent changes to Apple’s 3.3.1 policy, people feel a little leery about using these non-Objective-C technologies, but their sites assure us that they’re Apple-approved. During the talk I downloaded PhoneGap, built and installed it, created an app, and ran the app in the iPhone simulator. By golly, it worked! Not sure how much I’ll pursue this, but good to know.

NFJS puts on a terrific show. The speakers are terrific, the food is good and plentiful, and the technologies are timely. The themes I took from the conference are:

  • Java as a platform — the JVM — is sound and viable.
  • Java as a language is slipping in its ability to address today’s problems.
  • Object-oriented programming is slipping in its ability to address today’s problems.
  • The future includes large data sets and multiple cores.
  • Functional languages, dynamic or otherwise, address the problems of today and the future.

As long as they keep the vendors out and the talent in, they’ve got a winning formula. Can’t wait for next year’s NFJS!


No Fluff Just Stuff Tampa — Day Two

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-04-18 06:41:23

As Moore’s Law gets repealed and multicore processors demand that we actually learn to write good, safe, non-buggy multi-threaded code (Note: if the business people where you work understand the term \”race condition,\” you’ve got threading problems), functional languages gain appeal. I’ve eschewed Haskell, started looking at Erlang, and vowed to look at Scala. When I saw Ted Neward’s The Busy Java Developer’s Guide to Scala: Basics on the schedule, I figured I’d go to get a Scala jumpstart.

Neward’s presentations, in my experience, sometimes have slides, always have a text editor, always have a command line, and always have lots of code that he composes as he goes. He’s smart enough and knowledgeable enough that he almost always gets away with this approach, and his methods produce engaging presentations that he can easily mold to his audiences. Today, he got bogged down with enough compile errors around for \”not-loops\” (I forget what Scala calls them) that he had to eventually and grudgingly abandon. Live demos can be a tough gig. Later, though, as he wrapped up the presentation, the bolt of lightning hit and he realized that Int has a % method and Integer doesn’t, and that’s why the compiler kept barking.

Despite his frustration and embarrassment, however, the presentation was good and I’m glad I went. I downloaded and installed Scala on my MacBook Pro, downloaded and fussed with Vim support for Scala, and realized that I need Tim Pope to get interested in Scala so he’ll clean up the Vim plugin, make one of his vimbundles, and make it easier to install. I followed along with the code, typing in examples and verifying that I could compile and run them. I saw enough Scala that I’m intrigued. Also, although I can author very little Scala at this point, I leapt the \”clueless\” barrier. As I plunge into Scala and expend the effort to learn it, the pieces that I saw will be familiar. Not bad for 90+ minutes. Incidentally, Neward would have had no cognitive nor compiler issues if he hadn’t been presenting from Windows 🙂

When someone asked, at the end of the presentation, what problem Scala is trying to solve, Neward replied, \”Java.\”

I next attended Brian Sletten’s REST : Information-Driven Architectures for the 21st Century. He also talked about Richardson’s Levels of Maturity, explaining that most of today’s well-known REST services are level 2. The difference between level 2 and level 3, however, is small, and it’s easy to jump from 2 to 3. My understanding is that the jump requires only to embed linkage support in the responses.

He talked about the importance of keeping RESTful interfaces and implementations stateless, requiring all requests to contain sufficient information so that any server in a cluster can handle the request. He then walked through the different verbs and their safety (\”not safe\” changes server state, \”safe\” does not) and idempotence, and included the best explanation I’ve heard on the difference between POST and PUT:

  • GET — safe and idempotent. Retrieves a resource.
  • POST — not safe and not idempotent. Used for both create and update. Used when client is creating and doesn’t know the identity of the resource, or when client is updating by appending (doesn’t send complete information).
  • PUT — not safe and idempotent. Used for both create and update. Used when the client knows the identity of the resource and completely overrides it.
  • DELETE — not safe and idempotent. Deletes a resource.
  • HEAD — used for what-if scenarios.
  • OPTIONS — what can I do?

If what I typed isn’t clear, it’s my fault, not Brian’s.

He talked about the HATEOAS hypermedia links, talked about the human-readable URI approach vs RDF predicates, and pointed out that your REST services will be used in ways you didn’t think of. As an example, he demonstrated Retrievr, which allows you to make a rough sketch and then returns Flickr images that roughly match that sketch using Flickr’s RESTful API. Amazing.

I played with Groovy a few months ago, liked it, and have been too busy to get back to it. So, I attended a couple of sessions with Jeff Brown, who is a core member of the Grails development team. The first was on GORM, the object-relational mapping layer built atop Hibernate, and the second was on polyglot web development using Grails. He demonstrated his Grails Clojure Plugin, which works amazingly well. Both talks amply demonstrated the dynamic nature of Groovy, including metaprogramming and other Groovy goodness. I started writing an app in Groovy that I think, this time, I’ll actually finish.

Between the two talks, I chatted with Jeff about Grails vs Rails. He asked me what I missed in Grails that I have in Rails, and I blurted out, \”Haml!\” He hadn’t seen Haml, so I showed him some and we talked it through. He talked about GSPs and that they’re either looking at or perhaps working on (I don’t remember which) a new view technology for Grails based on Groovy code. Sounds interesting. Maybe, though, I’ll try to port Haml to Grails!

Great day two, ended by a trip to Ceviche, where we dined outside and saw a baby opossum who looked an awful lot like a rat foraging under the tables, a gelato run, and a win by the Celtics. Woohoo!


No Fluff Just Stuff Tampa — Day One

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-04-16 20:57:05

No Fluff Just Stuff began in Tampa today. This is my second NFJS conference — my first was in 2008. Five of us from work drove down from Jacksonville, all expecting great things. So far, the conference hasn’t disappointed.

After check-in, at which we were handed a badge, a binder, a commemorative 10-year T-shirt, and a 2GB branded thumb drive with all the conference materials pre-loaded, we went to the various sessions. The first session I attended was Neal Ford’s Implementing Evolutionary Architecture. He talked about how architecture evolves, going from a spaghetti-pile of connections among servers and services, to a clean implementation of an Enterprise Service Bus, to a renewed spaghetti-pile because the policies and bureaucracies around the ESB make stringing wires around it faster and easier. He asserted that the web as a platform needs to be more evolvable than that.

He then talked about Richardson’s Levels of Maturity:

  • Level 0: Single URI, Single HTTP verb
  • Level 1: Many URIs, Single HTTP verb
  • Level 2: Numerous URIs, addressable resources
  • Level 3: HATEOAS

He walked through architectures at the various levels, but the interesting part was the HATEOAS (not his term — let me google that for you), which stands for pool! No, it stands for:

  • Hypermedia
  • As
  • The
  • Engine
  • Of
  • Application
  • State

The tenet of HATEOAS is that the service and consumer exchange representations of resource state, not application state. It reduces coupling between service and consumer, preserves RESTful and XML semantics, and leverages HTTP appropriately. He gave as an example the Atom format. The talk was well-done, full of code examples, and illustrated the points well. It contained too much information for the allotted hour-and-a-half, so we raced through it, but I’ll be reading and rereading the slide deck, as well as purchasing the book he mentioned: REST in Practice.

After a cheese-and-Diet Dr Pepper break, I went to Mark Richards’ The Art of Messaging. He has more fun writing code and presenting than Shaq does taunting Kobe. His presentation focused on leveraging ActiveMQ and JMS, touting it as a superior solution — at least behind the firewall — to Web Services: easier, cleaner code, and guaranteed delivery. He also showed how two messaging queueing solutions (ActiveMQ and WebSphere MQ) are implementing JMS over HTTP, which would allow you to dump Web Services all together. Great presentation that talked me into downloading ActiveMQ.

Ted Neward’s The Busy Java Developer’s Guide to Advanced Collections came next. He demonstrated how to use Java functional programming to shut up the Rubyists and Groovyists who mock Java, not for unit tests, but for its verbosity. By using generics and anonymous classes in your libraries, you can read a file and print its contents just as tersely as you can in Ruby or Groovy. He also demonstrated the power of Iterables and Iterators. He then took a swing at classic object-oriented techniques and thought patterns for changing behavior by subclassing or decorating. Instead, he showed, you can change behavior by passing functions or closures. He encouraged us to look into Google’s and Apache’s collection classes, cherry-pick the parts that interest us, and develop our own collection libraries for our problem domains. He eschewed slides completely, fired up TextMate for Windows, opened a command prompt, and spent the time writing, compiling, and running live code. The one part I don’t understand is that he runs Windows on his MacBook Pro (I think in a virtual machine) — that’s like buying a convertible Ferrari and using it as a wheelbarrow.

After a tasty dinner, we gathered for Neal Ford’s keynote: Smithing in the 21st Century. The premise of the talk was that blacksmiths had all the business they could handle in the 1890s, and smithing seemed a secure career choice. 20 years later, the world had changed and smiths begged for food while rooting for the $%@#! Yankees. Technologists face a similar fate (well, most of us don’t even know who the Yankees are or what they do, and we’re happier for it) if they fail to adapt as the world changes. He pointed out, however, that we’re terrible at predicting the future, mostly because we rely on the past as a predictor of the future. As he spoke, I scrawled highlights across six pages of notes (well, hotel-shrunken sized pages) that read like sanskrit, I’m afraid, and don’t recapture the brilliance of the material. The things to watch for, however, to determine what will succeed in the future are:

  1. Right Place, Right Time (Java hitting right when the Internet rose to prominence, Struts and then Rails arriving when we needed easy-to-learn, powerful web frameworks)
  2. Paradigm Changers (iPhone)
  3. Warmed-over Technologies (Java resurfacing p-code’s ideas, functional and dynamic languages coming back to address multi-threaded programming)
  4. Accelerators (War as a technology accelerator: Civil War accelerated surgery, WWI accelerated airplanes, WWII accelerated computers, and today’s wars accelerating robotics)

He then spent some time on cautionary tales, stressing the importance for us to step back from problem-solving mode to make sure we know why we’re solving a particular problem. Someone wrote the code, after all, for a border-patrol robot that shoots to kill if you lack the proper RFID card (or if its RFID reader is out or you washed your card and damaged the chip or if you’re wearing a blue shirt and three hawks have flown between the robot and the sun in the past 3 minutes and 13 seconds and no one thought to test that scenario).

He then asserted that the future will involve processing gigantic datasets (Google, for example, processes an entire petabyte of data every 72 minutes). The languages we use will affect our ability to address the problems we face — notation matters, so we should embrace polyglot programming and match the language we use to the problem we’re trying to solve. He talked about the rise of social networking and the current platform plays to gain RIA lock-in (Silverlight, Flex, JavaFX). He pointed out that no cell phone has open standards (with the arguable exception of Android), and painted a picture of Apple and iPhone and iTunes that ended with Apple become the world’s largest bank through their micro-payments platform.

Overall, he said, the future will come from left field, and then quoted Peter Drucker: \”The best way to predict the future is to create it.\”


The Best Code I Ever Wrote

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-04-09 16:37:48

On Christmas 1981, our parents gave my brother and me our first computer: an Atari 400. I was in 7th grade and my brother was in 8th. My parents really couldn’t afford to buy this gift, but they consistently made sacrifices to make sure our active minds stayed engaged. They also gave us the Atari BASIC language interpreter, which came on a cartridge, and the Atari 410 cassette player so we could both store and load programs. The 400 was later replaced by an 800, the 410 by the 1010 cassette player (which moved the power supply to a wart) and later a disc drive (1050?). We wore all that computing power out. These were the days of Softside and Compute! magazines, which offered entire code listings that we painstakingly typed in, ran, debugged, and ran again. We read those magazines like we’d read comic books a few years before, typing in program listings, learning to program, and writing our own programs. We fired at spaceships, redefined character sets, drew mazes, and programmed sounds. It’s like the Bill Gates story, but without all that pesky fortune and fame.

Our church youth group leaders, always on the lookout for activity ideas, asked us if we could help them do a \”computer date night\” activity: we’d use our computer to match boys and girls up for a night of dinner, dance, punch, and cookies. We accepted the assignment, and crafted a questionnaire for all the youth to fill out to use as input to the matching program we’d write. The questionnaires were distributed, filled out, and returned, and then my brother and I sat down to write a pre-harmony program to correlate the soul mates. We looked at each other . . . and realized we hadn’t a clue what to do. We knew how to make a pixel-ball bounce around the screen, award 50 points for a downed alien, fire a laser with that cheap-movie laser sound, or make a spaceman jump over a meteor-induced crater. We knew nothing about love or romance, let alone how to help others find it.

Luckily, my brother had had the foresight to include a final question on the questionnaire we’d distributed that went something like this:

In this fully-computed dating experience that relies only on algorithms, not passions or preferences, do you have a preferred someone with whom to be matched?

I swear, he really does write that way — even back then.

The complexity of our task immediately plummeted. We turned away from the computer, ignored the answers to all the questions but the last, and found that people’s preferences aligned closely enough that matching couples for a night was child’s play. My brother matched himself with someone he was sweet on, and I conveniently had some other engagement that would keep me away from the activity. Spending an evening with a girl, at that time in my life, would have been enjoyable for neither me nor her.

So there — that’s the best code I ever wrote. Before you cry foul or think that’s a copout, my point is that we write too much code, and try to find digital solutions for all our problems when often analog problems will suffice. I was reminded of this when our CEO challenged our management team to solve a particular problem without dumping the problem on our development shop. We could have written one-off code to solve the problem, but creating and debugging software is expensive, and this problem didn’t warrant that level of cost. Code not written can’t have bugs, has no maintenance costs, does not require deployment scripts, and needs no documentation. Every line of code you write is both an asset and a liability. Think before you add to both sides of your technical ledger.


Tech Books Deals of the Day: Sinatra, Haml, and Heroku

By Rob Warner  //  Ablog  //  No Comments

Originally posted 2010-04-02 16:09:57

I buy books, but I swear I could quit any time. The bookshelves in my home swing low like telephone wires, topped with books perched like crows wing-to-wing and two-deep to maximize the shelf space. I’ve wedged clouds of books into the gaps above the bird-books, distending the shelves even more. Authors and genres span a gamut that rivals public libraries: Tolstoy, Petzold, non-fiction, thrillers, Bryson, Bloch, contemporary fiction, tech books.

The technical books have overflowed from my home to my office, fleeing from my wife’s rubbish bins and donation bags. One weekend, when no office manager was about, I swiped an extra bookshelf to augment my office shelf space by 50%. Another box of books sits under my desk. I read most of what I buy — though I have a deep stack in my \”to read\” pile — and I recoil at the thought of divesting my collection of any of them. As proof: the box of books sitting at my feet contains a book on Windows 3.1 programming using Borland C++ and another called Writing OS/2 REXX Programs. You just never know when you might need to refer to them, y’know?

My wife, on the other hand, abhors clutter and stuff. The aforementioned box sits at my workplace in exile, hiding from her book-burning tyranny. Other books sit in boxes in our garage, and war wages regularly in my home over which ones we should banish forever. In my mind, that’s none. In hers, that’s every single one that no one is actively reading. I try placing bookmarks at varying depths in all my books, but she didn’t fall for that. I guess you could say that she reads me . . . like a book. We argue, we weep, and the books silently witness the maelstrom that decides their fate.

For my birthday this year, we compromised: she bought me a nook, and I’m swooning. I’d already begun hoarding electronic books, but having a nook to tote and read from has fueled a surge in my books-in-bytes collection. I’ve expanded the storage on my nook, of course, and have already read several books and pieces of books on it: A Reliable Wife, my sister’s novel-in-progress (watch for it: Beatrice Andrews), enough of Programming Erlang to question mutability in general — if I can find it in bits, I shove it on there. I can now surreptitiously feed my bibliophilia fix, and my wife has no idea. My nook retains the same size, shape, and heft, whether it contains one book or the weight of the Encyclopedia Britannica. She’ll soon learn to watch the account register diligently, but for now I can buy and download and create no bulky evidence.

Three publishing sites for technical books offer daily deals on books, usually electronic books:

  1. Apress
  2. Manning
  3. O’Reilly

I set my Twitter account to follow their Deal of the Day tweets, but I follow enough folks that tweets are too easy to miss. Yes, I could subscribe to their Twitter feeds, but my track record on missing the \”free day\” for iPhone apps in my RSS reader proves I’d miss too many book deals as well. When I found myself opening a browser and going to three separate sites daily, however, I realized I needed to create a better way to check the daily ebook deals. My solution: Tech Books Deals of the Day.

In last December’s RubyJax meeting, Adam Lowe gave a presentation called Sinatra, Heroku, and You, and You. He introduced me to both Sinatra and Heroku, and I’ve since been looking for an excuse to dance with both. The Sinatra documentation and the Heroku Quickstart Guide are excellent and led me through the process, with a couple exceptions that I’ll note later. You can download the source from

I encapsulated the data for a \”Deal\” in a class (deal.rb), and the rest of the code is in myapp.rb (I renamed it from techbooksdotd.rb in a misguided attempt to get my Rack app to start on Heroku, and never felt compelled to change it back — more on this later). myapp.rb gathers the data from the three sites, creates Deal objects, and then displays the view (views/index.haml). The way it gathers data differs for each site. Read about each below.


Apress shows its deal of the day at the same URL daily: The price is always $10, in my experience, but that data is shown only in a graphic:

I decided not to worry about displaying the price. The pertinent information, though, is in a snippet that looks something like this:

<div class=‘bookdetails’> 
2         <h3><a href=‘/book/view/1590592662’>Hardening Windows</a></h3> 
3         <div class=‘cover’><a href=“/book/view/1590592662”><img width=‘125’ src=“/resource/bookcover/9781590592663?size=medium” border=‘0’ alt=“Hardening Windows” align=‘left’ /></a></div> 

This piece contains the book title, the relative URL for the book, and the relative URL for the book’s cover image. A regular expression snatches these bits nicely and creates our Apress Deal object:

1 matches =
/.*\<div class=’bookdetails’\>.*?\<a href=’(.*?)‘\>(.*?)\<\/a.*\<div class=’cover’\>.*?\<img.*?src=”(.*?).*/m.match(content)
2 if matches.nil?
3   return @@apress_deal
4 end
6 url_part, title, image_url_part = matches.captures()
7 => Apress, :vendor_url =>, :title => title,
8   :url =>{url_part}, :image_url =>{image_url_part})

Note the /m at the end of the regex to span the search across multiple lines.


Manning’s approach is to include a JavaScript file whose contents change daily. This file, found at, performs a document.write to write the day’s deal into the home page. Here’s a sample:

document.write(“March 28, 2010<BR><BR><a href=’‘>Ext JS in Action</a><br> Get the MEAP Print edition for $25!  Enter dotd0402 in the Promotional Code box when you check out.”)

My initial approach aggressively scanned the JavaScript using regular expressions to parse various items to display. The very next day, however, their deal had two books, not one, and my regular expression ignored the second. After some thought and tinkering, I decided to capture the guts of the HTML that the JavaScript writes and display that. The code to create the Manning deal looks like this:

1 matches =
/.*?(\<a href=.*?Promotional Code box).*/m.match(content)
2 if matches.nil?
3   return @@manning_deal
4 end
5 title = matches[1]
6 => Manning, :vendor_url =>, :title => title,
7   :image_url => no_cover.png)

I opted not to attempt to display a cover image, though I may some day try to follow the link(s) and pull cover images from there.


O’Reilly has an RSS feed, in atom format, at I use Simple RSS to parse the feed. The one challenge is to find the cover image, since it’s not in the feed, but some poking around O’Reilly’s site (ooh! two apostrophes in one word!) revealed that their cover images can be found with a URL in the format:

where XXXXXXXXXX is the catalog number found in the URL for the book. We can parse it from the URL like this:\//)[-1] # -1 gives us the last item

The code looks like this:

 2   rss = SimpleRSS.parse content
 3   entry = rss.entries.first
 5   return => O’Reilly, :vendor_url =>,
 6     :title => entry.title, :url =>,
 7     :image_url =>{\//)[-1]}/cat.gif)
 8 rescue SimpleRSSError
 9   return @@oreilly_deal
10 end

What about error handling?

The code creates static objects for generic non-deals that it uses if it encounters problems parsing data for any of the publishers:

@@manning_deal = => Manning, :vendor_url =>,
2   :title => No results — check Manning site, :url =>
3 @@apress_deal = => Apress, :vendor_url =>,
4   :title => No results — check Apress site, :url =>
5 @@oreilly_deal = => O’Reilly, :vendor_url =>,
6   :title => No results — check O’Reilly site, :url =>


I had a few head-scratching moments trying to push the app to Heroku, but generally the documentation worked perfectly. I had to create a .gems file containing the list of gems my app required. I resolved that issue quickly, but the one that stumped me was the error message I received when I tried to push the app to Heroku:

Heroku push rejected, no Rails or Rack app detected.

One of my attempted fixes was to change techbooksdotd.rb to myapp.rb, thinking perhaps that Heroku relied on a special naming convention to detect Sinatra apps. Convention over configuration, right? That wasn’t it. Google finally led me to a page that told me to create a file: config/ I created the file, but I guess the page was outdated — it directed me to run the app with a line that looks like this:

run Sinatra.application

It should have been:

run Sinatra::Application

which seems obvious now but by this point is was 2:00 AM and I was ready to screech. This was more of a five-minute hardship, though, and my app was soon running on Heroku.

Subsequent Google searches lead me to understand that current convention is not config/, but instead in the root directory, so I’ll probably get around to changing that soon.


I enjoy the efficiency of hitting a single site daily to view book deals, and I’ll have to keep my eyes open for other publishers to add to the site. Tech Books Deals of the Day contains a single page, so I didn’t have to learn anything fancy about Sinatra to make it work. I’ll probably want to learn more about Sinatra, though, for possible future projects. Think I can buy a book for that?


I'm Rob Warner, and I'm a software developer. I live in Jacksonville, Florida, and work for Availity, LLC. The postings on this site are my own and do not necessarily reflect the views of Availity.