AppleCare at the Apple Store Is Better Than Mediocre

Last week while sitting in Studio F on Microsoft’s Redmond campus, I knew something was wrong with my Macbook Pro. The computer would lock up periodically, wouldn’t reboot, wouldn’t stay working, and had somehow found a knack for annoying me on a day when I should have been having fun with friends while learning about super secret stuff I can’t write about. After dismissing the “Bad gas” explanation (well, it was powered by a power outlet owned by Microsoft), I did a few diagnostics, and nursed it through the rest of the day. The next day I didn’t use it much, but still had problems, and by the time I was sitting in Seatac Airport with Don trying to show him Bible Fruit, it was stuttering worse than something non-offensive that stutters a lot. Over the weekend, I brought it home, re-installed OS X, and it seemed like it had started to work again. I breathed a sigh of relief.

I should mention at this point that I absolutely hate fixing computers. I’m pretty good at it, but I really don’t enjoy working with computers when they’re broken. I don’t enjoy the “hunt” for the problem, and I don’t find working with other people’s computers in any way “exciting”. I sold all of my tower and desktop systems years ago so I wouldn’t have to deal with the temptation to upgrade, and I buy $300 service plans that include “accidental damage” whenever I buy a laptop. I don’t want to be bothered by repairs, I’m a busy man. So when I got to work on Monday, ready to start a brand new week of exciting psychological stuff, I was really annoyed to find that my Macbook wouldn’t work for more than 20 minutes every 3 hours. I reluctantly made an appointment at the Genius bar for 2:15, and took out my “spare” machine at work (an IBM Thinkpad that, while it was under warranty, was at the shop 3 times to fix the same issue!).

Now I’m the sort of guy who is always expecting a problem with my computer repairs. Mostly because I’ve been through the routine before. A bad hard drive to experienced technicians might be interpreted by script-readers / novices as “Eh, maybe it’s the OS, let’s wipe it, reinstall, and send him home with it” (Which of course just brings me back more irate later). The next step might be even more asinine and onward until they finally deem it’s time to install a new Hard Drive. I really hate when my errors aren’t easily reproducible (This one wasn’t – the device would boot if powered down for an hour or so, then stop working 20 minutes later, so at a glance it looked fine). But I figured maybe the Geniuses would take pity on me. After all, they were quick to swap out my iPad when my first-gen got a stuck line of cyan pixels a few months back.

So at 2:07 I arrive at the Apple Store on the Upper West Side of Manhattan, only to be greeted by a 20 minute wait PAST my appointment time (I was not happy when one of the techs started calling 2:30 appointments while I stood there, something he realized when one of the “coordinators” in front of the desk walked up to him and told him). I finally got seated across from a nice young Genius named Frances, who spoke quickly and gave me the impression that while what I was saying made sense (i.e., it was English), she wanted to make her own diagnosis. Thankfully after 5 minutes, she realized her diagnosis was the same as mine. And here is where the real magic comes in – she set up the repair at 2:45 and I was able to pick up my freshly hard drive replaced Macbook at 3:50. No problems to report on it yet, thankfully. So in this case, while I wasn’t 100%  thrilled with AppleCare service at the Apple Store (I did have to wait 20 minutes, and Frances did look pretty forlorn as I told her what I’d observed – of course it was at the end of the day, so that’s to be expected), it was a lot better than it could have been with other companies / services (Definitely better than my experience with IBM Service Hell in November 2007). While some people claim that Mac users give praise to Apple out of blind loyalty, I gotta hand it to the Geniuses – they are genuinely friendly, seem well trained, and know how to make a computer geek happy – by getting his machine back to him, fixed, in just a little over an hour.

The 2011 Jon’s Device Photo

So if you’ve been following me on Facebook (and at times, Twitter) you’ve seen this photo:

Which I took in April of 2009. In case you care, the 12 devices from left to right are listed below, in italics if they’ve since been sold:

Top: iPaq 6915, Treo 750v, T-Mobile Dash, i-Mate Jasjar, HTC TyTN II, i-Mate K-JAM, Motorola MPx 220

Bottom: T-Mobile G1, Samsung Omnia, HTC Touch Pro, Pantech Duo, Pantech Matrix Pro


Anyway, with many of the devices now sold and replaced, I figured it was time to update that photo, so I bring you the 2011 Version of Jon’s Devices:



Top row: Samsung Galaxy Tab, i-Mate JasJar, Motorola MPx 220, Apple iPad 16 GB

Second Row: HTC HD7, HTC HD2, iPhone 3GS (8 GB), 2nd Gen iPod Touch (8 GB), Google Nexus One, Google Nexus S, T-Mobile G1, T-Mobile G2

Third Row: T-Mobile MyTouch 3G Fender edition, Pantech Duo, Treo 750v, iPaq 6915

And the scary part? Not pictured is the MyTouch 3G, T-Mobile Touch Pro 2, and Dash 3G that I owned and sold in the interim Winking smile


So there you have it – for those of you who have asked how many phones I have, the count right now is 13 GSM phones, 2 tablets, and an iPod Touch for fun. Why do I need so many? Well simply because I like playing with them, and collecting them has become a fairly interesting hobby in and of itself. The real question is, like the JasJar, MPx, Duo, Treo, and iPaq: Which ones will I have in another 2 years?

Hack Usermin to Encourage Users to Read Policy Updates!

Had an interesting situation at work recently that required a bit of hackery to make sure that everyone on the research team was on the same page. Since 95% of the actual work (everything but documentation) occurs through a central Usermin-powered portal, I had the idea to build a “nag” screen that I could periodically make users acknowledge before they’d be allowed into the system. Ideally, the system is used infrequently, only when policy changes are done that require everyone to know the new policy immediately. The system is pretty simple:

1. User Logs In, and if updates are present, they are shown the update page.

2. User reads the update, and enters a “codeword” on the update page. This is so the updates can be securely displayed (on our documentation site) while the update landing page remains static.

3. User isn’t bothered again until the next update.

The code isn’t too difficult, so I’ll post it below. Warning though: Webmin/Usermin/Virtualmin are written in PERL, and I’m a PHP sort of person, so this is a mix of both!

Step 1: Modify Usermin to Point to Landing page

The system works by having a file written to a non web-accessible server directory once the person enters the correct codeword. When I need to issue a new update, I simply delete the username-named files and everyone needs to enter a new codeword. Below is the code that you’ll have to put in Usermin’s file, which on my system is located at /usr/local/usermin-1.420. You’ll also want to decide first where you want to store your “nag” files. I put them under a special directory in /var, however you can put them anywhere you’d like that the webserver can read/write to them.

The following code is inserted around line 3532, right after the post-login script statement (&run_login_script…):

#Check Nag Screen, see if we need to nag user (Added by JW on 3/2/2010)

local $nagfile = “/var/nagfiles/” . $authuser;
if (-e $nagfile) {
syslog(“info”, “%s”, “Successful Nag Check for $authuser from $acpthost”) if ($use_syslog);
else {
my $url = “https://landingpage_server/updates.php?user=” . $authuser;
&write_data(“HTTP/1.0 302 Moved Temporarily\r\n”);
&write_data(“Date: $datestr\r\n”);
&write_data(“Server: $config{‘server’}\r\n”);
&write_data(“Location: $url\r\n”);

You’ll want to modify the URL and the nagfile location to suit your own installation. Once you save the file and reload Usermin, it will take effect.

Step 2: Create the Landing Page

I wrote a pretty simple PHP page that shows some text (using an include file) and a form, and then writes a file with the user’s username to the directory of interest. It also logs the interaction for auditing purposes. Below is my code, see the inline comments on what you need to edit/change

// Jon’s Nag Screen for Usermin. Usermin will redirect people here if Jon clears out the /var/nagfiles/ directory of username files.
// This file shows the update notice, and asks users to read and agree by entering the codeword, which is changed with each update!

// CHANGE this to whatever you want the codeword to be.
$codeword = “swimmer”;

if (isset($_POST[‘submit’])) {
// Do Form Processing

if ($_POST[‘codeword’] == $codeword)
// Good, right codeword, now write the login file and redirect them

// CHANGE this to the directory you’re putting the nag files into. make sure that directory is writable to Apache!

$filename = “/var/nagfiles/” . $_POST[‘user’];
$ourFileHandle = fopen($filename, ‘w’) or die(“can’t open file”);
$ourFileHandle = fopen(‘/var/nag.log’, ‘a’) or die(“can’t open file 2”);
$logentry = “Valid Codeword Entry by ” . $_POST[‘user’] . ” at ” . date(“F j, Y, g:i a”) . “\n”;
fwrite($ourFileHandle, $logentry);

// CHANGE this to be the location of your Usermin installtion.
} else {
// Bad, wrong codeword!
$ourFileHandle = fopen(‘/var/nag.log’, ‘a’) or die(“can’t open file 2”);
$logentry = “Invalid Codeword Entry by ” . $_POST[‘user’] . ” at ” . date(“F j, Y, g:i a”) . “\n”;
fwrite($ourFileHandle, $logentry);
print(“Wrong Codeword! Please hit the back button in your browser and try again!”);
// Show Info Screen

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “”>
<html xmlns=””>

<meta content=”en-us” http-equiv=”Content-Language” />
<meta content=”text/html; charset=utf-8″ http-equiv=”Content-Type” />
<title>Important Updates</title>
<style type=”text/css”>
.style1 {
text-align: center;
font-size: xx-large;
font-family: Arial, Helvetica, sans-serif;
.style2 {
text-align: medium;
font-size: large;
font-family: Arial, Helvetica, sans-serif;
.style3 {
text-align: center;
.style4 {
font-family: Arial, Helvetica, sans-serif;
.style5 {
font-family: Arial, Helvetica, sans-serif;
font-size: x-large;


<p>New Lab Policies have recently been issued. In order
to access the Usermin, you must do the following:</p>
<p>1. Visit <A HREF=”” target=_blank>This Page on the Wiki</A> detailing the changes.</p>
<p>2. Enter the codeword (provided on the page above) in the box
below and press Submit. You will then be redirected back to Usermin where you should
now be able to log in.</p>
<p><font size=2>Note: By entering the valid codeword and pressing submit, you affirm that you have read the updates, will follow the policies, and are not a zombie.</font></p>
<form method=”post”>
<span><strong>Codeword: </strong> </span><br />
<input name=”codeword” type=”text” /><input name=”user” type=”hidden” value=<?=$_GET[‘user’]; ?>><br />
<br />
<input name=”submit” type=”submit” value=”submit” /></div>





That file can be named updates.php (or whatever you want) and placed in a location that users can access.

Step 3: Create Directories, Set Permissions, Test

The last step is something you may have done already – create directories to house your files (/var/nagfiles in my example) and set the permissions to allow the Apache Webserver (and Usermin) to write to those directories.

Once the system is running, adding updates is a pretty straight forward process: Update your update page, change the codeword in updates.php, and delete all of the username-named files from /var/nagfiles. Users will now get the nag screen again after they login for the first time after updates. You may also want to periodically purge the log file, depending on how busy your usermin portal is.

While not explicitly written, this hack probably will also work with Webmin. Be sure to be careful with automatic updates to those products though – you may have to re-integrate your code into after each update.

If this has been a useful document for you, please let me know, I’d love to see other people implementing creative solutions to balance ease of use and ease of policy notification!

I’m Posting From The MVP Summit, and Sorry, There Will Be No Meaningful Content

So I am at the MVP Summit, in a room with a bunch of interesting people, and sadly I can’t give you any updates on the content (Other than to say Jack Cook is talking about suits right now, and no, suit isn’t a slang word for anything). But here are a few things I can talk about:

  • It’s great to see everyone as usual
  • Don Sorcinelli can apparently morph into a laptop bag. Be careful when he does this.
  • The move to Bellevue is a nice change in terms of location, eventhough we aren’t able to bum around downtown Seattle.
  • The reception last night (The “Welcome Reception”) was horribly executed. The room was way too small, the food kept running out, and there was no way to hold a conversation with more than 2 people without blocking someone or something.
  • Everything is supposed to be 100% green, which is great from an ethical standpoint, despite all the gas that was used to get me here from NYC.

I’ll try to get some pics for the blog, although I didn’t bring my camera (for some reason I’m not sure; but I do have a phone with a camera in it!). But for now I’ll just show this picture from Windows Phone 7 Series (.com):

Being a Geek Means Sometimes Having To Explain Yourself

Got an interesting phone call this morning from a company that sells Voice over IP (VOIP) hardware and accessories on a Business to Business basis. They had my name in their customer database and were quite confused as the company name I had listed was simply “Jonathan Westfall”. The conversation went something like this:

Sales Rep: Hi, this is X from Y, and I was wondering if your previous voice over IP hardware purchases were for yourself or a company

Me: Uh… OK

SR: Yes, I know it’s an odd question, but you’re in our database and your company is just listed as “Jonathan Westfall”, and we were wondering if you had purchased the equipment for a company.

Me (realizing the purchases they are referring to): Oh yea… I think you’re talking about some Voice over IP equipment I purchased last year… it was for personal use.


Now at this point I probably should explain myself. About 2 years ago I read an article talking about Asterisk, and thought “Hey, that sounds kinda cool”. I had been interested in phone/computer interactions for a long time (ever since trying to turn a computer into an answering machine, with software I never got working quite as well as I’d liked). So I did a bit of research on Asterisk and decided to teach myself how to set it up and, by extension, how Voice over IP worked. I took some of my geek “fun money” and spent about $200 on various hardware (that I still have in case I need to wire up an office worth of phones) and devoted an old machine to be my Asterisk box. I put phones in practically every room of a small ranch house (connected over wireless bridges as I didn’t have Ethernet hookups in the rooms), built custom equipment boxes that packed a wireless bridge, voice over IP box, and power strip into a compact package, and hooked up my Asterisk box to the outside world using a service called CallWithUs. After around 3 months I realized that the setup wasn’t exactly needed in a household of 2 people and a cat, and the bandwidth on my Sprint wireless card (which I was using for internet) wasn’t sufficient to run VoIP with any good quality. So I packed up my equipment and decommissioned the server. It was a great experience – I learned far more about VoIP than I knew before (and thus could wire up an office if I felt like it now…), and had a lot of fun for $200. Haven’t played around with it much lately so that’s why it wasn’t on the top of my mind when this sales rep called. So back to the conversation:

SR: Uh… so the purchases were…

Me: Yea, just for me. I’m a geek, and I got interested in VoIP a few years ago and decided to teach myself how it worked. So those are the purchases you’re seeing, they were just personal use.

SR: Well.. that’s actually pretty cool. You have no idea how valuable those skills you learned are going to be!

Me: Yes, I hope so. So I’ll keep your company in mind if I ever need anything, thanks for calling.


I didn’t have the heart to tell her that this geek was also a psychologist who was quite happily working in a profession quite far away from VoIP phones (Other than the fact I have a VoIP phone in my desk drawer at work right now… just for fun).

Give Yourself A Present: Less Commercial E-mail

So how do you give yourself this present of less e-mail? You Unsubscribe to legitimate commercial e-mail! And this is the best time of the year to do it. Why? Well because everyone you have any sort of relationship is trying to sell you something this time of year. So you’ll have plenty of opportunities to take the 2 seconds per e-mail item to open it, scroll to the bottom, and hit “unsubscribe” or “manage my e-mail preferences”.

Now I’m sure some people think “Yea… they’ll just send me more!”. While this was true of illegitimate SPAM e-mail in the past, legit companies (the ones who are likely to make it to your inbox) should honor an unsubscribe request. I’ve been designating 2-3 weeks a year “unsubscribe” weeks where each commercial e-mail I see that I’d rather not in the future gets the unsubscribe ax. Over the last year I’ve noticed a marked decrease in e-mail traffic. Most weekend days I get only 5 or so e-mails a day, all legitimate and all directed just at me. On Weekdays, I’ve seen commercial traffic decrease from 3-4 pieces a day down to perhaps 1.

So for the next week go through and unsubscribe (and report illegitimate SPAM as usual to your provider or filtering software). You’ll enjoy the lower inbox counts all year long!

Awesome Simple Tool: File Thingie

Hey, here’s a nice gem I found this morning. On a few servers of mine I keep files for each domain under one central tree (e.g., /web/ , /web/, etc..). Most of these files are static HTML (just for quick domains or inside jokes), and whenever I need to edit them I fire up notepad or an HTML editor, download the page. Update it. Then upload it back. A lot of work! So last week I started exploring ways to manage multiple domains off of one CMS. However this was a bit complex when really all I needed was an online file manager that could edit things in a WYSIWYG editor.

File Thingie Default Screenshot

Today I found File Thingie, which offers just that. I installed it under the web root (/web/) and can now access all my static HTML files easily, making minor edits. It offers password protection, and TinyMCE support for editing. If you have a set up like mine and want a quick manager/editor, check it out!

Using Mail Merge With Custom FROM: Addresses in Word/Outlook 2007 or Word/Entourage 2008

The following was written for my lab group at work, however it strikes me as something everyone may benefit from. Mail Merge is an awesome tool, and this makes it much more useful when a group shares an incoming e-mail address that replies should be directed to (e.g., sales@ or info@ etc.. instead of the individual who sent the mail). I’ve had to sanitize some of the screenshots to remove private information, however it shouldn’t detract from the overall message!

You’ll need:

  • A copy of a mailing list, in either excel format or CSV.
  • Microsoft Word
  • Microsoft Outlook or Entourage
  • An SMTP username & Password to send out through SMTP Servers that require encryption.

First-Time Setup

You’ll do these steps once per computer you use this on. I’ve broken them down by Outlook 2007 or Entourage 2008, with screen shots. The basic process is…
Outlook 2007:

  1. In Outlook, click on “Tools” then “Account Settings”
  2. Click New to set up a new e-mail account
  3. Choose “Microsoft Exchange, POP3, IMAP, or HTTP”, and click “Next”
  4. Click “Manually configure server settings or additional server types”, and click “Next”
  5. Choose “Internet E-mail” and click “Next”
  6. Fill out the information in the box as is appropriate using your group e-mail and a valid username and password that can authenticate to the SMTP server. Then click “More Settings”Screenshot%20-%2010_26_2009%20%208_40_29%20AM
  7. After hitting “More Settings”, choose the “Outgoing Server” tab and configure as follows (Assuming you need SMTP Auth):Screenshot%20-%2010_26_2009%20%208_41_45%20AM
  8. Then click the “Advanced” tab and configure as follows if you need to specify SSL or TLS:Screenshot%20-%2010_26_2009%20%208_46_06%20AM
  9. Click “OK”, click “Next”, then click “Finish”. On the accounts box, select the new POP3 account you just created and click “Set as Default” so that the box looks like this:Screenshot%20-%2010_26_2009%20%208_43_02%20AM
  10. Hit “close”. You should now be set to use Mail Merge. Be sure to change your default back when done (See below for this step under “cleanup”)

Entourage 2008

  1. In Entourage, click on Tools, then Accounts.
  2. Click on New, then MailScreen%20shot%202009-10-26%20at%208
  3. Click on “Configure Account Manually”
  4. Choose “POP” then click “OK”
  5. Configure your account like the setup below, putting in your SMTP username and password:Screen%2520shot%25202009-10-26%2520at%25209_004
  6. Click on the button under SMTP Server that reads “Click here for advanced sending options”
  7. Configure as follows depending on your server, the following is for one that requires TLS encryption:Screen%2520shot%25202009-10-26%2520at%25208_002
  8. Click OK, and return to the Accounts window. Select your new account and choose “Make Default”. You’ll want to change this back later:Screen%2520shot%25202009-10-26%2520at%25208_003
  9. Close the Accounts window, you should now be ready to mail merge!

Running the Mail Merge (After Setup)

Word 2007/Outlook 2007

  1. Open Word, Choose “Mailings” tab from the Ribbon, and click “Start Mail Merge”, Then choose “Email Messages”Screenshot%20-%2010_26_2009%20%209_04_32%20AM
  2. Next choose “Select Recipients” and then “Use Existing List”. In the dialog that pops up, select the CSV file containing the mailing list:Screenshot%20-%2010_26_2009%20%209_05_12%20AMScreenshot%20-%2010_26_2009%20%209_06_40%20AM
  3. Clicking on “Edit Recipient List” should show you something like this:Screenshot%20-%2010_26_2009%20%209_07_41%20AM
  4. Click OK. Now you need to use “Match Fields” to make sure that title, firstname, lastname, and e-mail address are all matched up properly (The file in my example doesn’t have headings on the rows, so the first row values (my information) is what Word feels is the best identifier of each field):Screenshot%20-%2010_26_2009%20%209_09_54%20AMScreenshot%20-%2010_26_2009%20%209_09_31%20AM


  5. With everything all matched up, you can now type your letter including Merge fields as you’d like. Here’s my example:Screenshot%20-%2010_26_2009%20%209_12_51%20AM
  6. After you have everything written, click on “Preview Results” and you can see the “live version” that your readers will receive:Screenshot%20-%2010_26_2009%20%209_31_37%20AM
  7. Once you’re satisfied, hit “Finish and Merge”, then “Send e-mail messages”Screenshot%20-%2010_26_2009%20%209_32_18%20AM
  8. In the box that pops up, find the e-mail column in the the “to:” drop down. Enter a subject as well, and hit OKScreenshot%20-%2010_26_2009%20%209_33_17%20AM
  9. Mail Merge will rev up and spit a bunch of files into your Outbox in Outlook, and these will eventually go out to the masses
  10. Cleanup: Remember to go to tools -> Account Settings and change the default back to your usual email account instead of the account you created in the “First Time Setup” above!!

Word 2008 / Entourage 2008

  1. Open Word 2008 and choose “Tools” then “Mail Merge Manager”
  2. In the window that opens, choose “Form Letter” under “Select Document Type”, then under “Select Recipient List” choose “Open Data File”Screen%20shot%202009-10-26%20at%209
  3. Chose the CSV file that contains your mailing list.
  4. Drag and drop placeholders where you’d like them in your mailing. Here’s my example:Screen%2520shot%25202009-10-26%2520at%25209_005
  5. Under “Preview Results” click “View Merged Data” to see the resulting e-mailsScreen%2520shot%25202009-10-26%2520at%25209_003
  6. Click “Generate e-mail messages” on the “Compete Merge” tab. NOTE: If Entourage is not your default mail client, this button will be grayed out. To make Entourage your default mail client, go into Entourage preferences and click the button that says “Make Entourage my default mail client”.Screen%2520shot%25202009-10-26%2520at%25209_002
  7. Fill in the appropriate values in the Mail Recipient dialog, and click “Mail Merge to Outbox”:Screen%2520shot%25202009-10-26%2520at%252010_002
  8. Because the world is a scary place, Entourage pops up a warning message like this below. Go ahead and let it send your mail since you know what script sent it!Screen%20shot%202009-10-26%20at%2010
  9. Cleanup: After the mail merge is done, you’ll want to go to Tools -> Accounts and set your e-mail default back to your original account so that you send as yourself and not as the group e-mail address you used for mail merge.

So there you have it, mail merge to any particular list you have, with a custom FROM header.

Migrate A Google Sites to a Google Apps Installation

After much gnashing of teeth and cries of angst, I was able to move a Google Site to a Google Apps Installation. In the end, it was actually really simple…

The first approach was to use the Google-Sites-Liberation tool, published recently on Google code, which looked very promising. However I soon found 2 issues with our particular domain (This one and this one) which unfortunately prevented me from using the tool. I also didn’t have much time to devote to debugging it. Desperate, I pieced together the following method through a few inferences and forum posts. It’s pretty simple: Copy the site from your account to your apps account!

You’ll need to be an “owner” of the site you’re trying to migrate to do this, and will probably need GMail enabled on the destination apps installation, here are the steps:


1. Log into the google site you want to migrate and bring up sharing properties.


Next, share the site to your Google Apps account’s e-mail address



2. Log into your Google Apps GMail and you should find an e-mail telling you that you’ve been added as an owner to the original site:


3. Click on the link (you may want to sign out of your original GMail account here so that you enter the site as your Apps identity). You should see your Apps e-mail address in the upper right, not your GMail address. If you see the GMail address, sign out and then click the link again from your Apps GMail.

4. click on “More actions” then “Manage Site”




5. Click on General in the left link bar.


6. On that page, click “Copy This Site”


7. The dialog box for copying should be for your Apps domain, not for regular Google Sites, it should look something like this (With your apps installation name where I’ve blacked out):


8. Click Copy Site (Unchecking revisions if you have a lot of them, and site members if you don’t want them), and you should now have an exact copy of the Sites site in your Apps installation!

9. You’ll probably want to close off editing of the old site to the new, if applicable to you. Now pop some champagne and enjoy!

Add Facebook Friend’s Birthdays to your Calendar Automatically

Lifehacker recently published an article detailing a few ways to help remember the things you actually care about, as opposed to those you don’t but remember anyway (such as the MVP of the 1996 All-star game). One of the little gems that was tucked in the article was the application fbCal which integrates your Facebook Birthdays and events with the calendar of your choosing. I have this now set up on my Google Calendar and am extremely happy as it’s A) always up to date and B) putting information where I’ll actually look for it, not where I don’t look (e.g., a sidebar on

To get it set up, all you need to do is install the fbCal application to your facebook account and allow it offline access (So you’ll have two prompts to hit “OK” to when installing):


Once it’s installed, you can then choose how to export your calendar. The tool exports in the standard iCal format, so it’s easily imported into desktop PIMs like iCal on the Mac and Outlook on the PC. It not only includes birthdays, but can include events as well:


Since I use Google Calendar, I clicked on the Google Calendar link and was taken to my calendar, then asked if I wanted to add the new fbCal calendar to my list of calendars. It adds as a shared calendar, which means that it will automatically update whenever I add a friend (Or I guess if a friend changes their birthday!). It gave a very long and annoying name to the calendar, so I changed that by drilling into settings and changing the name:


Now on my Google Calendar main page, I have the FB Birthdays calendar, which I can toggle on and off as desired:


All of this took around 10 minutes, and the feed took about an hour (for some reason) to show up in my calendar. Now it’s working just fine and I thought it was cool enough to share here! Happy calendaring!