Why Outlook Sucks: Part 1 of 900,000

Let’s find an email from Toni regarding her party next weekend. There appears to be a search box in the toolbar.
Wait.. that seems to be only for contacts. Nevermind.


There’s a find button to the left which brings up a toolbar, but it appears to search only the Inbox. Unfortunately I have a bazillion folders and rules and have no idea where the message is located, so I’ll go over to the “Options” menu (of all places) and start an “Advanced Find”.

Uh.. ok. I have no idea why I need “More Choices” or “Advanced”, and apparently I’m still searching only the Inbox. Let’s “Browse”..


Now that we’ve systematically selected every possible place the email could be–which could apparently be in my Calendar or Contacts–we can click OK and go back to the “Advanced Find” dialog and click ‘From..’


Great.. the engineers decided to reuse the same old contact finder dialog. There are a lot of people with a ‘Toni’ in their name, so we’d better embark on a separate sub-find quest to identify the correct contact record. Make sure you click ‘Find Now’ and not ‘New Search’ when you’re done.


When we come back from a coffee break, we see Outlook proudly presenting a result set, sorted by date, most recent first. That’d be great, except that if I’d received it recently, I probably wouldn’t need to use an ‘Advanced Find’ to locate it, would I? The results are also displayed within the dialog for some reason instead of the main window, so I guess I’ll have to keep this up on my second LCD, which I’ll now repurpose as the “Dedicated Advanced Search Dialog Monitor”. Whatever.

Just for shiggles, let find an email in Apple’s
Holy freaking crap. I typed in ‘toni party’, and it gave me emails from Toni about her party, sorted by likely relevance. It was immediately clear how to search and the results took less than a second to display, despite the fact the PC is apparently faster spec-wise and I have magnitudes more email on my MacBook Pro. Huh.

Update: Part 2 of 900,000


Configuring Rails To Use Gmail's SMTP Server uses Google Apps For Your Domain, and all email flows throw Google’s servers. Unfortunately, Rails 1.2.2 can’t send via out of the box. As originally pointed out by Anatol Pomozov there is a solution. Here’s the simple version tested with Rails 1.2.2.

  1. Save this code as lib/smtp_tls.rb within your rails app.
  2. Add this code to config/environment.rb.
  3. Use ActionMailer as normal.

Updated 2008.01.04: The original link was b0rken, so I pastied the code instead.


..But *Should* You Fix That Bug?

ladybugWe have a natural desire to fix things. As engineers we find satisfaction in resolving technical problems and, if you’re following test-driven practices, keeping them resolved. These thoughts flow through our minds as the primitive keyboard-wielding code monkeys we evolved from. What distinguishes us from our fecal-flinging counterparts, however, is our ability to question these instincts and wear business, user and developer hats simultaneously. Here are some additional questions we should consider before immediately reacting with technobabble.

  • What business value could be realized by addressing this issue? It would be ideal to resolve it, yes, but is there any ROI for the time spent?
  • How risky is this? If cleaning the big red button could potentially fire the nuke, you might want to leave the booger on it.
  • How critical is this issue? If sufficient workarounds exist or this does not prevent people from working, perhaps you could move it below other todo list items that are.
  • How does this make users feel? Requiring the user to click OK every two minutes will create desire to stab you with a sharp object. Your death will generate bad vibes around the project.
  • What is the business impact? If the tree fell, but nobody lives in the woods.. what tree?
  • What are the dependencies and dependants? Superman requires his tights be dry-cleaned before saving the planet today. You might want to run to the dry-cleaners.
  • When could a resolution actually be delivered? It may take 2 minutes to fix, but if users can’t get it for two months perhaps the work can be postponed.
  • Who is be most appropriate person to handle it? Maybe it’s you. Maybe it’s the guy who actually wrote the code.
  • What actually needs to be fixed? Don’t replace the alternator if you only need a battery.
  • Where does this fall in the project timeline? If the next deliverable is already late, you might need to rescope by sitting down with the business and reevaluating what is truly necessary.

Would You Like To Join The "Virus" Network?

Hmm. I think I’ll click “No” on this one..
The Virus Network

computer music personal

The $1K Home Recording Studio Mac Add-on

Update 1: Check out “Making Friends With Some Guy Named Mike” on this band page of mine for an awesome example of this studio in action.

20 years ago digital home recording wasn’t plausible. 10 years ago we started to see its potential, but most hobbyists (read: very cash-limited people) were limited to using still-primitive versions of multi-trackers such as Cakewalk, Cool Edit Pro or Cubase with either COTS Sound Blaster PCI cards or ridiculously over-priced, high-noise, high-latency specialty cards with break-out boxes such as the Lexicon Core 2. Running on Windows 95 or 98, we regularly struggled with the stability of the platform and device drivers. Today, you can have your own personal studio capable of producing DVD-quality recordings by adding a thousand dollars of equipment to your existing computer and music rig. Here’s my living room/home theater/recording studio/Mac haven, all driven by a single Mac Mini..
Here’s are the core components..

  • Mac Mini (Intel).
  • Big 1080p LCD television/monitor. The Mac Mini drives this beast with a DVI-to-HDMI converter cable.
  • Logic Pro (Apple’s recording software). For my needs, it’s really either Logic Pro or Pro Tools. For various reasons I’ve stuck with Logic Pro run in a distributed manner with other Macs in the house using built-in Xgrid functionality over gigabit ethernet.
  • Headphone amp w/studio headphones. You need at least one good headphone set to properly lay down track on top of track, but when you have people over you can usually get by with three or four. This is too much load to be powered directly by the computer, so the dedicated headphone amp is necessary. I have a Behringer HA4700. (I didn’t want to add my Event 20/20 references monitors to the already cluttered layout, so I have them in another room.)
  • PreSonus FirePod. This is a truly outstanding input device for recording the entire band simultaneously. The unit is rack-mountable, connects via FireWire and optical cables, and has pristine noise-free pre-amps.
  • Microphones and stands.
  • Instruments. I have a full-size Yamaha keyboard (pictured), a bunch of vocal mics and guitars, and a rack of mediocre analog schwag. BYOI, whatever ‘I’ happens to be.

If you’ve already got a Mac setup and some music equipment, grabbing Logic Express, PreSonus FirePod, decent vocal mic and a bunch of cables for $1K will turn your system into an audio powerhouse which your friends will envy.

computer photography

Apple Aperture Features Explained For Non-Photographers

The RAW format pictures produced by my Canon XTi are often in excess of 10MB. Couple this with “continuous shooting” and a fast CompactFlash card, and I can easily fill a 4GB’er in a couple days. I’ve used Apple’s Aperture for about a month now through the holidays and a friends wedding, and have been very pleased with the product.

Aperture is more like ACDSee or Picasa than Photoshop. It’s about fine-tuning, managing projects, browsing, searching, sorting, packaging and publishing, and does neither layering nor psychedelic effects typically associated with digital picture manipulation. It’s iPhoto on crack. Here are a few features which I like.

  1. Full-screen mode. This is similar to iPhoto’s full-screen mode, but with much better tools. The “adjustments” overlay provides typical white-balance and exposure controls, as well as a slick RAW-only section and easy-to-use tools for tweaking specific color ranges. All adjustments are non-destructive, so you can freely experiment with tools without worrying about being able to revert to the original. There is literally no “Save” button. The transport at the bottom is nice, too.
  2. Versioning & Stacking. Rather than copy/pasting files to make small adjustments while preserving the original, the versioning mechanism provides a great way to have many different versions of the same file, such as for different cropping ratios and color/sepia prints. Stacking allows you to make good use of continuous shooting on your camera by allowing you to select the best shot from a series and hide all others in the browser. The loop tool (see image) is a pin-point zoom pointer which works in both the browsing and viewing areas.
  3. Management. Understanding the various types of containers admittedly took me a few days to truly “get”. Once I did, however, it’s nice how Aperture combines typical concepts such as “Folders” and “Projects” with “Albums”, “Smart Albums” (search-based albums), “Light Tables”, “Books” etc. It’s easy to keep things organized while simultaneously being able to find things.
  4. Meta-data. In addition to handling EXIF/IPTC information and allowing changes at import time, making changing to images en mass is easy with the “lift and stamp” tools. Adjustments such as camera settings, tagged keywords and exposure changes are easily “lifted” off a select image and “stamped” onto others. This is especially useful when working with stacks.
  5. Backup. Aperture vaults are basically files on backup volumes (such as removable firewire drives) which can be sync’d to when plugged in, kinda like having rsync built into the application.
  6. Offline. When each photo is 10MB, you can’t keep every photo with you. You can, however, store the “master” on an external volume and keep a high-resolution preview and all meta-data with you at a fraction of the data size.

If you’re using OS X and are somewhat interested in photography, I’m sorry, but you’ll probably want to bite the $279 bullet and buy Aperture, though I got my copy for about half that as a bundle deal with my camera body.


RAZR v3, Bluetooth, T-Mobile Internet & OS X

Here’s the lowdown on setting up your Motorola RAZR to connect to the internet wirelessly via your bluetooth enabled Mac after signing up for T-Mobile internet services. I live in Arizona and have had no issues following these steps on several Macs.

  1. Grab this.
  2. Copy the “Motorola GPRS CID1” file into /Library/Modem Scripts
  3. Go to System Preferences -> Bluetooth -> Devices and click “Set Up New Device…”

  4. After selecting the more obvious options to set up your phone, enter the connection settings as in the following screenshot. (The password is “internet”.)

  5. After completing the wizard, select “Connect” from the new icon visible on the menu bar at the top of the screen.
    (Suggestion: manually “Disconnect” your phone when you’re done with the internet connection, as putting the computer to sleep while connected seems to cause issues when the system wakes up.)

computer personal

Tips For CS/CSE/MIS Seniors

As the Spring semester approaches, seniors start attending job fairs and submitting resumes to the Word-parsing, keyword-detecting machines of industry HR giants. In the seemingly few years since I completed my bachelors, I’ve been through the motions enough to have learned a great deal in the process. Here’s some advice for seniors trying to land sweet engineering or IT gigs.


The “it’s who you know, not what you know” principle is not bullshit. For better or worse, many things just work this way, and the tech industry is no exception. Almost every job I’ve had has been landed in part because of inside connections. Building these contacts is difficult for someone without industry experience, but can be overcome by involvement in student clubs, professional organizations, and other social activities. In my experience, involvement in mailing lists and local geek clubs has been the easiest and most beneficial means of networking. All the jobs fairs I’ve been to were a waste of time; most of the big companies just put your resume in a stack and direct you their HR website for further information.


One of the best things you can have when approaching a company is a pre-existing positive relationship with an inside contact. The better your relationship with your contact, the more they’ll sell you up before introductions are done or resumes passed. They will build good vibes for your interview, and generate internal momentum to push the process forward from the inside. A simple, “Hey, Jim, I just wanted to give you a heads-up that there’s a really bright guy named Bob that’ll be submitting a resume today” can build a valuable pre-conception with the evaluator that gives you an advantage over other applicants, if not land you the job before the interview even starts.


When submitting cover letters and conversing with potential employers, don’t send form letters. Show them you’re genuinely pumped about the job and company, and that you’re human by using real names instead of “To Whom It May Concern”. Know your audience and write to their tastes. If you know senior industry people, kindly ask them to review your writing before submission.


Do your research on a companies projects before talking to representatives, and be sure to come up with things you’ve done that could directly bring value to them. They don’t care that you have three dogs and that your cat’s name is Mittens, but they’ll find it intriguing that you’ve completed projects using Spring, Hibernate etc. If you’re talking to a non-tech person, just point out that you’re already familiar with what they’re doing and you’d love to talk to the project manager to see if you’d be a good fit. Also remember that what you what now and what you can know by your interview are two different sets of knowledge.

Honesty & Confidence

If you’re speaking to a technical interviewer, be honest about what you know. They’ll easily see through dodged answers and weak responses. With practice, however, you can easily turn many negatives into positives. For example, if asked “[a]re you familiar with Plajax: the AJAX for plague victims”, don’t say “No.” Instead, say “I’m familiar with Blajax: the AJAX for blind people, and have lots of experience handling server-side requests.” Always emphasise the positive. Practice in your next team meeting by using the word “and” instead of “however” and “but”. Speaking this way is an extremely valuable general-purpose skill, especially when you’re in discussions with people you don’t agree with.


Business Logic Code Generation

On numerous occasions I’ve seen Java code generated by other Java code as part of a standard build process. I’m not talking about “stub” or “boiler-plate” model code produced by tools such as rmic or hibernate, respectively, but logic code produced by a script. I’ve also seen this done in other languages, but it particularly bothers me when I see it done in an object-oriented language such as Java. Almost invariably it occurs for one of two reasons: an external dependency or structure prevents sane reuse practices, or a lack of modern object-oriented analysis and design skills. (The former case simply implies the latter on someone else’s part.)

Lame Dependencies
Some dependencies introduce more liabilities than benefits, yet are nevertheless necessary due to business or technological constraints. Libraries and frameworks that force you to extend specific classes (as opposed to interfaces) lessen your ability to create a flexible, adaptable application on top. When large amounts of boiler-plate code are necessary to satisfy a dependency, it might be reasonable to apply code generate techniques to avoid monotony; however, the generated code should at least adapt or delegate to a separate, reusable implementation.

Lame Developers (a.k.a. the people that write Lame Dependencies)
The pisser scenario that is often hard to differentiate from the former is a lack of OOA&D skills on behalf of the application designer. In particular, those accustomed to procedural thought may want to introduce “procedure generation” as a sort of clever closure mechanism which is more common in languages other than Java. This translates to large amounts of redundant, unnecessary code that could likely be avoided by applying modern design patterns and generics.

Classes are more than the place you put data and methods; together they implement a higher-level design which can be expressed in higher-level terms, isolated into components, and tested and maintained as such. If you have a system composed of a mesh of interwoven procedures with many statically bound components, mutual dependencies and generated logic, it may be more procedural than object-oriented.


Must-Have OS X Freebies

As far as I’m concerned, no Mac is complete without these great freebies..

Great SFTP/FTP rich-client.

An intuitive, native IRC client

Dirt simple media player capable of handling things that QuickTime can’t.

All-in-one DVD ripping and encoding utility. Provides plenty of features for most of us without be overly complicated.

Easy-to-use VOIP client. Works with MacBook (Pro)/PowerBook microphones out-of-the-box, and provide free calls to other Skype users.

CrossOver Mac Beta
Every OS X user I know must operate in a Windows environment on a regular basis. The recent release of Parallels for Intel-based macs (basically VMWare workstation-style guest-OS host virtualization) has made life one tick easier by allowing us to run Windows on our Core Duo systems, and the new CrossOver Beta for Intel Macs provides a great complementary technology. CrossOver Mac, by CodeWeavers of wine fame, allows you to run some Windows applications directly on your Intel Mac, without having to host a full-fledged copy of Windows by implementing the applications APIs dependencies on the Mac. The beta is free.

Provides Spotlight-like capabilities, but faster and way, way better. The extremely brisk find-and-launch concept will be new for many users, but will be hard to live without once understood.