Logo orientation matters

by Rob Kitson


John Gruber (the Daring Fireball) recently had a post about the history of the Apple logo orientation on it's laptop covers in which he mentioned that all other manufacturers had fallen in line with Apple's practice of displaying it correctly to on-lookers (which he recently corrected, mentioning that Lenovo has NOT adopted this practice yet).

A couple months ago I was issued a Lenovo ThinkPad W520 at work and the first thing I noticed was that logos on the back of the display were oriented such that they would be correct when I looked at them but would be upside-down to anyone that happened to look at my machine while I was using it.  Also, I noticed that my work laptop was lacking the logo of the laptop that I'd much rather be working on (ANYTHING made by Apple). So, I took the liberty of placing one of the stickers that was shipped with my MacBook Air on the back of my ThinkPad (with the proper oriention, of course).

lenovo_apple.png

"What kind of Mac is that?" is the usual comment.  And there's typically a good laugh once I explain the sticker, and then show them that it's the only logo that's not upside-down once you open the lid of the laptop and start working.


Thank you Steve

by Rob Kitson


As someone who has experienced very little death, the loss of Steve Jobs has had quite an unexpected impact on me. Part of me knew it was coming, while another part had convinced myself it was a couple years off. Quite frankly, I'm not sure how to deal with it and there will be some crying involved at some point.

My career started in the late 90's and I worked exclusively on Windows. The average Mac users that I knew annoyed me. They were always complaining about incompatibility and they typically knew less about computers, in general, than Windows users. As it turned out THAT was kind of the idea. Steve didn't want the average user to know about the specs of their machine, he just wanted them to have the best experience possible. It wasn't about specs, it was about experience.

I didn't fully grasp that until October 2008, when I gave my wife an iPhone 3G for her birthday. I had the AT&T Tilt at the time and was pretty damn excited about the prospects of writing apps for the windows mobile platform. One problem though, I couldn't take my hands off her iPhone (literally) and it actually sparked a few arguments (sorry babe). I quickly made the decision to switch to the iPhone and have never been happier or more confident in a decision.

That iPhone purchase led me to other iPhones, my first MacBook, a MacMini, a couple Apple TVs, and an iMac. I couldn't be happier with ANY of those purchases. I didn't feel that any one of them was overpriced; in-fact, I priced out my iMac against the same computer (if assembled from mid-range parts at a very reasonable online retailer) and my iMac ended up being cheaper, after OS/software licensing fees.

Steve Jobs changed my life in the 80’s, but it took 20+ years for me to find out. He had a vision, he sold it, and he delivered. I will be forever grateful for the influence he had on the industry, the world, and eventually me.

I am deeply saddened by the loss of this truly remarkable man. I was not ready to see him go. My deepest condolences go out to his family and loved ones.

Thank you Mr. Jobs.


My Error/Exception Handling Philosophy

by Rob Kitson


Exceptions should be exceptional. They should signal a major problem within the application, or one of it's dependencies. They should be handled in the scope that is as close to the source of the error/exception as possible and only passed on when truly un-handleable. A system that throws a lot of exceptions, when functioning correctly, will make it very difficult to spot actual problems when they arise.

Errors/exceptions should be descriptive and specific.The more (relevant) information you can give me about what's going sideways, the better. I think custom exception classes play a critical role in providing this information. You can load them up with data that's relevant to the error and they can bubble up with that information until they are caught and at that point the the data they're holding can provide hints as to how to fix the problem. If you use the standard errors/exceptions, just changing the message of the exception, you will find yourself doing a lot of string comparison/manipulation in a catch block in order to figure out what the error is, and wether you can handle it.


My Testing Philosophy

by Rob Kitson


Whenever possible I write my tests first. I try to keep my tests small and focused on a particular behavior of the SUT (System Under Test, a.k.a. the class I'm currently testing). I tend towards unit tests that exercise my SUTs in isolation, using mock objects to control the interactions it may have with it's dependencies but also wrapping those interactions in helper methods within the SUT to avoid creating tests that have too much knowledge about the implementation of the method being tested.

Integration tests are crucial to ensuring that the system is working from end-to-end, but should be used sparingly due to the fact that they typically are: long-running, more difficult to setup, more brittle, and quick to increase in number and complexity. My typical integration test suite includes 1 happy-path test and 1 sad-path test (the most critical), while every 'contract' between classes will have tests for the interesting pre/post conditions.

On occasion, I'll write a throw-away test fixture who's sole purpose is exploratory testing of a new 3rd party library/module that I want to get familiar with before adding it to my project.


Better living through favicons

by Rob Kitson


I use tabs, lots of them, and usually in more than one browser window.  Recently I've found myself hunting for the specific tab that has the site I'm developing/testing locally, testing in a staging environment, or verifying in the production environment, and I’ve gradually been getting more annoyed with the friction.

Last night I had an epiphany: What if I provided a different favicon for each environment instead of the same one for each? A little research and I discovered that I didn’t have to have a file name favicon.ico, I could name it whatever I wanted AND you can use file formats other than .ico.

I grabbed the actual favicon.ico and converted it to a .png.  Then I made 2 distinctly different versions for my ‘development’ and ‘staging’ environments and saved with a naming schema that will allow me to quickly figure out which one to use.

These are the 3 I'll be using on one of my current projects:

favicon.png

 favicon.png

favicon-staging.png

 favicon-staging.png

favicon-development.png

 favicon-development.png

Next, I added this:

<link rel="icon" href="/favicon<%= ("-" + RAILS_ENV) unless RAILS_ENV == "production" %>.png" type="image/png">

to the HEAD block in the /views/layouts/application.rb file.  So now, when the site is loaded from production it uses favicon.png, but favicon-development.png and favicon-staging.png for the development and staging environments, respectively.

In hindsight it seems obvious, but this little hack reduced my tab hunting time drastically.


localhost:3000 friction

by Rob Kitson


If you're like me, you probably have more than a few rails projects on your machine. And, if you're like me, you probably don't worry too much about setting the port when you spin up webrick to test your stuff.

Recently I've been increasingly annoyed by my browser trying to autocomplete my http:://localhost:3000/ urls to paths that are relevant to different projects.  I think I've found a simple solution that's been working for me for the past few weeks. I edited my /etc/hosts file to include entries for project names that point to the localhost, like this:
127.0.0.1 new_project
127.0.0.1 other_project
127.0.0.1 sandbox
Now, when I'm working on 'other_project', the url is http://other_project:3000/ and the browser doesn't try to autocomplete paths for http://new_project:3000/ or http://sandbox/. Of course, I have to be cognizant of the fact that any of my hosts entries will contact the webrick instance that is currently running on the port I'm designating in my url, but that's a bit less annoying than getting my url schemes mixed up between projects.

 


My Podcastroll

by Rob Kitson


5by5: http://5by5.tv/

TWiT Network: http://twit.tv/

This Week In...: http://thisweekin.com/

Other sources:

 

It's a lot of listening, good thing I have a dog that likes to go on walks...