After getting burgled a couple of of years ago, I set up a webcam, a Windows app called Yawcam, and Dropbox to set up a motion detection system that would instantly upload any photos of an intruder to “The Cloud”. It was crude, but effective, but the one downside was that I had to leave the camera on all the time, so it did generate a fair amount of traffic.
I recently looked at replicating this functionality on a Mac Mini in my lounge, but because it was in a high use area, I only wanted the camera to be active when no-one was home. With both my wife and I owning iPhones, I wandered wether I could somehow use their location to control the activation of the camera. It seemed like a promising idea, so I started planning a geolocation app that could communicate with the Mac to notify it about the movements of our devices.
Fortunately, however, I didn’t spend too much time on it before I stumbled upon this great article which shows how to use the geofence feature in Find My Friends to control a home heater. I had no idea it had the ability to send an email to any address when you arrive or leave a location, but it was exactly what I needed to trigger my automated security system.
Step 1 – The Emails
I configured Find My Friends on both devices to send an email when we left, or arrived our home.
Step 2 – The Security Camera
As a proof of concept I went with iSentry – a free app on the Mac App Store which has the basic functionality I need.
Step 3 – The AppleScript
The script (Which you can find on Github) is the glue to hold it all together – it will be called whenever any emails from Find My Friends are received, and keeps track of the devices that are at home. When the last device leaves, it activates iSentry, and starts the camera. As soon as a device returns home, the script kills iSentry.
Step 4 – Mail
The final piece of the puzzle – you need to add a mail rule or 2 to call the AppleScript when Find My Friends emails arrive. See my previous post on sending iMessages for details on how to add these.
Conclusion
So far I’ve found the system to be fairly reliable, although I’ve had to play around with the sensitivity of iSentry’s motion detection system to prevent false positives. The app has some nice features like the ability to email you when it detects motion, but time will tell whether it’s up to the job, or whether a paid app will be needed.
The Find my Friends geofencing is not very precise (To help preserve the battery on your device), so it really works best if you travel a reasonable distance from your house: for instance it might not generate an email if you pop to the neighbours house in the same street.
You can also extend the script to do things like play tracks in iTunes depending on who comes home (which is already in the script), and in the future I have plans of using this technique to automatically send an iMessage to my wife, and play Gangnam Style really really loud when I leave work (I bought it for my kids, honestly..).
If you have any harebrained ideas of things you could do with AppleScript and geofencing, then put them in the comments, or send me a tweet.
I was playing around AppleScript and Mail Rules and it struck me that it might be useful to be able to send an iMessage when an important email arrives in your inbox.
However, a little bit of research indicated that the iOS Mail VIP inbox could already provide very similar functionality – it allows you to specify contacts that are considered important, and any emails they send you go into a separate inbox. More importantly though, is that you can configure a different notification for your VIP emails, which means you can get your phone to shout at you when these arrive, whilst any non-VIP emails can be left to quietly sidle into your “Peasant” inbox.
Slightly perturbed, I tried to see if I could think of any scenarios where I could still justify the iMessage notification script:
1. If you’ve turned off email push, or it’s not enabled for some reason, then emails may only appear when Mail is opened, or, at best, every 15 minutes.
2. You might want more fine grained control of the emails that trigger a notification, such as the subject line, or keyword in the body of the email.
3. iMessage notifications can be set to repeat if not acknowledged, but email notifications only sound once.
4. You may want to send iMessages to various people.
Maybe not very compelling reasons for most people, but certainly reason enough to have a play and try to get it working.
Requirements
You’ll need a Mac running Mountain Lion (10.8) that is always on, and a separate iCloud account (Since you can’t easily send messages to yourself) from which to send the iMessage.
AppleScript
The first step is to create the AppleScript that will send the iMessage. Open AppleScript Editor (It lives in /Applications/Utilities), and paste in the following code, changing the accounts at the top of the script.
--------------
-- Change these:
--------------
property iMessageSendingAccount : "test@icloud.com"
property iMessageRecipientAccount : "myAccount@gmail.com"
--------------
using terms from application "Mail"
on perform mail action with messages theMessages for rule theRule
tell application "Mail"
repeat with eachMessage in theMessages
set mySender to "Mail Received From: " & sender of eachMessage
set mySubject to " Subject: " & subject of eachMessage
set myMessage to mySender & mySubject
sendIMessage(myMessage, iMessageRecipientAccount) of me
end repeat
end tell
end perform mail action with message
end using terms from
-- Code to send the iMessage
on sendIMessage(myMessage, myRecipient)
-- Open iMessage and wait for it to start if it's not running
tell application "Finder"
set x to name of processes
if (x does not contain "Messages") then
tell application "Messages"
activate
delay 5
end tell
end if
end tell
tell application "Messages"
set serviceName to "E:" & iMessageSendingAccount
send myMessage to buddy myRecipient of service named serviceName
end tell
end sendIMessage
Save the new AppleScript into folder ~/Library/Application Scripts/com.apple.mail
Mail Rules
Now that you’ve created the script, you need to configure Mail to run it. Open Preferences, and then click on the Rules icon.
Next add a new rule, selecting “Run AppleScript” as the action to perform, and select your new script as the script to run.
Once you’ve saved your mail rule, you might want to ensure that Mail is polling every minute, to ensure the quickest possible delivery.
And there you have it, any emails the match the Mail Rule will now be sent by Messages to your devices.
I’ve been playing around with automation recently (more on that in a later post), and I thought that being able to control a network attached Onkyo receiver from my Mac sounded like a cool thing to do.
Onkyo provide a free iOS app to use as a remote control, so I wondered if there was an API available that would let me do the same thing from a Mac. Then I found that someone had already implemented such as thing: OnkyMote is a great little Mac app (US$2.99) by Tomas Larsson that sits in your menu bar and allows you to power on/off your receiver, select an input source, or adjust the volume.
With the problem half solved, the next step was to use Applescript to control OnkyMote. As a proof of concept, I decided to write and schedule a script that would turn on the radio every day at 7.30am.
The first step was to open the Applescript Editor (In /Applications/Utilities), and enter the following AppleScript:
-- Switch on Tuner with volume 20:
onkyoOn("TUNER", 2) of me
on onkyoOn(input, aVolume)
try
tell application "Finder"
activate
open application file "OnkyMote.app" of folder "Applications" of startup disk
delay 0.5
end tell
tell application "System Events"
tell process "OnkyMote"
-- Click on top level menu, to load the menu, and then select the source
click menu bar item 1 of menu bar 1
click menu item input of menu 1 of menu bar item 1 of menu bar 1
-- Click on top level menu, to load the menu, find and adjust the volume slider
click menu bar item 1 of menu bar 1
set names to name of menu items of menu 1 of menu bar item 1 of menu bar 1
repeat with i from (count of names) to 1 by -1
if item i of names starts with "Volume:" then
set value of slider of menu item (i + 1) of menu 1 of menu bar item 1 of menu bar 1 to aVolume
exit repeat
end if
end repeat
-- Click on the Label to dismiss the menu
click menu item "Devices:" of menu 1 of menu bar item 1 of menu bar 1
end tell
end tell
end try
end onkyoOn
Once the script had compiled successfully (By clicking the Compile button, which also formats the code nicely), I saved the file, ensuring that I selected the file format as “Application”.
I then configured the application to be an alert for a new repeating iCal event, selecting an alert type of “Open File”, and selecting the application file.
And that’s pretty much it – with this initial script working, it now allows my Mac mini to switch on the receiver, select itself as the source, and play any audio I want when a particular event occurs, and that opens up all sorts of automation possibilities for the future….
I was recently watching a colleague trying to recreate a bug that involved filling out a 20 field form, and after his 3rd effort, I thought “Wouldn’t it be awesome if there was a quick way of pre-populating the form to speed up testing?”.
Obviously the major browsers have auto-complete options, but these seem to be more geared towards names, addresses, and credit card numbers, which was no good in this situation. It did get me thinking though, if the browser could auto-fill values, why couldn’t we do the same using javascript?
The simplest way I knew to do this, was to use a bookmarklet, so I wrote a test bookmarklet (jsOutput) to populate a field:
javascript:(function(){document.getElementById("sku").value = "123456";})();
It looked promising as a solution, but the downside was that it was still painful to write the script for a form of that size, due to the number of ids and values that would need to be keyed.
Then, on my bike-ride home, I had another Eureka moment – if I can script the population of the form, why not script the creation of the bookmarklet url based on the values of an existing form?
A bit of playing around and I came up with my first cut of the jsGrab bookmarklet:
javascript:(function(){ function copyToClipboard (text) { window.prompt ("Copy to clipboard Using Ctrl+C and then paste into destination bookmarklet", text); } function htmlTree(obj){ var obj = obj || document.getElementsByTagName('body')[0]; var str = ""; if ((obj.tagName === 'INPUT' || obj.tagName === 'SELECT' || obj.tagName === 'TEXTAREA') && !obj.readonly && !obj.hidden && obj.id && obj.id != "" && !obj.disabled) { str = "setVal('"+obj.id + "','" + obj.value + "');"; } if (obj.hasChildNodes()) { var child = obj.firstChild; while (child) { if (child.nodeType === 1) { str += htmlTree(child) } child = child.nextSibling; } } return str; } copyToClipboard('javascript:(function(){function setVal(id,val) {var obj = document.getElementById(id); if (obj && !obj.readOnly && !obj.hidden){obj.value = val;}}' + htmlTree() + '})();'); alert('Text has been copied to clipboard');})();
It was a bit rough around the edges, and didn’t handle checkboxes or radio buttons, but given a form on a page where the fields were keyed but not yet submitted, I could click on the bookmarklet, press Ctrl+c when the pop-up displayed the bookmarklet code, and paste this into the jsOutput bookmarklet. Here’s a sample of the generated code:
javascript:(function(){function setVal(i,f,field,val) {var obj = null; if (f[i] && f[i] != "" && document.forms[f[i]] && document.forms[f[i]][field]) {obj = document.forms[f[i]][field];} else if(document.forms[i] && document.forms[i][field]) {obj = document.forms[i][field];} if (obj && !obj.readOnly && !obj.hidden){if (obj.type === "checkbox" || obj.type === "radio"){obj.checked = val} else {obj.value = unescape(val);}}} var f = ["facebookLoginForm","providerRegForm"]; setVal(0,f,'mode','DATA'); setVal(0,f,'accessToken',''); setVal(1,f,'',true); setVal(1,f,'profileImageUrl',''); setVal(1,f,'facebook',''); setVal(1,f,'linkedin',''); setVal(1,f,'skills','%22%22'); setVal(1,f,'summary',''); setVal(1,f,'education','%22%22'); setVal(1,f,'experience','%22%22'); setVal(1,f,'licenses','%22%22'); setVal(1,f,'emailAddress','test@test.com'); setVal(1,f,'firstName','John'); setVal(1,f,'lastName','Doe'); setVal(1,f,'username','johndoe'); setVal(1,f,'password1','password'); setVal(1,f,'password2','password');})();
I asked for some feedback from some of the full time web devs in the office, and the feeling was that the script would work well because we use the Spring framework (which generates ids for all form fields), but it would not work on any fields that didn’t have an id set. The suggestion was that documents.forms["formName"]["fieldName"].value might be more reliable.
Never one to shy away from a challenge, I went about rewriting jsGrab, and whilst I was at it, I added support for checkboxes, radio buttons, and escaping of special characters:
javascript:(function(){function copyToClipboard (text) { window.prompt ("Copy to clipboard Using Ctrl+C and then paste into destination bookmarklet", text); } function addToForms(i,form) {var str = ''; var obj = document.forms[i].querySelectorAll(['textarea', 'select', 'input']); for (var j=0; j<obj.length; j++) { if (obj[j].type =="checkbox"||obj[j].type =="radio") {str += "setVal(" + i + ",f,'" + obj[j].name + "'," + obj[j].checked + ");";} else { str += "setVal(" + i + ",f,'" + obj[j].name + "','" + escape(obj[j].value) + "');";}} return str;}var forms = document.forms; var str = ""; var f = new Array();for (var i=0;i<forms.length;i++){f.push('"' + forms[i].name + '"' ); str += addToForms(i,forms[i]);} copyToClipboard('javascript:(function(){function setVal(i,f,field,val) {var obj = null; if (f[i] && f[i] != "" && document.forms[f[i]] && document.forms[f[i]][field]) {obj = document.forms[f[i]][field];} else if((!f[i] || f[i] === "") && document.forms[i] && document.forms[i][field]) {obj = document.forms[i][field];} if (obj && !obj.readOnly && !obj.hidden){if (obj.type === "checkbox" || obj.type === "radio"){obj.checked = val} else {obj.value = unescape(val);}}} var f = [' + f.toString() + '];' + str + '})();');})();
The code in the generated bookmarklet tries to match the form and field names, or uses the form index on the page if no form name is present:
javascript:(function(){function setVal(i,f,field,val) {var obj = null; if (f[i] && f[i] != "" && document.forms[f[i]] && document.forms[f[i]][field]) {obj = document.forms[f[i]][field];} else if((!f[i] || f[i] === "") && document.forms[i] && document.forms[i][field]) {obj = document.forms[i][field];} if (obj && !obj.readOnly && !obj.hidden){if (obj.type === "checkbox" || obj.type === "radio"){obj.checked = val} else {obj.value = unescape(val);}}} var f = ["search_form","profile_form"]; setVal(0,f,'subcats','Y'); setVal(0,f,'type','extended'); setVal(0,f,'status','A'); setVal(0,f,'pshort','Y'); setVal(0,f,'pfull','Y'); setVal(0,f,'pname','Y'); setVal(0,f,'pkeywords','Y'); setVal(0,f,'search_performed','Y'); setVal(0,f,'q',''); setVal(0,f,'',''); setVal(0,f,'dispatch','products.search'); setVal(1,f,'selected_section','general'); setVal(1,f,'default_cc',''); setVal(1,f,'profile_id',''); setVal(1,f,'user_data[email]','test@test.com'); setVal(1,f,'user_data[password1]','password'); setVal(1,f,'user_data[password2]','password'); setVal(1,f,'user_data[birthday]','01-01-1999'); setVal(1,f,'user_data[firstname]','John'); setVal(1,f,'user_data[lastname]','Doe'); setVal(1,f,'user_data[phone]','031234567'); setVal(1,f,'mailing_lists[1]','0'); setVal(1,f,'mailing_lists[1]',false); setVal(1,f,'mailing_lists[2]','0'); setVal(1,f,'mailing_lists[2]',false); setVal(1,f,'newsletter_format','2'); setVal(1,f,'dispatch[profiles.add.]', 'Create%20an%20Account');})();
It’s worth noting that this method should not be relied on when testing, since it does not accurately simulate user behaviour. It may, for example, cause problems if there is javascript that fires when keys are pressed.
There may also be alternative solutions out there, such as keystroke recording and playback, that may provide a more authentic automated way of completing forms, but if you’re looking for a quick and dirty way to repeatedly fill out the same form over and over again, then this method certainly shows promise.
MailboxApp generated a fair bit of noise in the tech press when it hit the App Store in February due to it’s gesture based interface, controversial reservation system, and novel approach to email that treated messages like to-do list items that could be completed or “snoozed” until you’re ready to deal with them.
My interest piqued, I joined the reservation queue with more than 500,000 others, and waited a couple of weeks for my ticket to come up. When it finally did, I had a quick play with the app, but since I process most of my mail on the desktop, it wasn’t a great fit, and it’s now languishing on some distant springboard screen, whilst Mail and the Gmail App battle it out for a coveted spot in my dock.
Then a week or so ago, I happened upon a blog post that showed how to use a simple Google Apps Script to snooze Gmail messages for a few days. This immediately reminded me of MailboxApp and got me thinking about how I might use a “snooze” function when processing mail. I already use the heck out of reminders and calendar entries, so having a convenient way to get emails to re-appear on a specific date or time sounded fantastic – it would allow me to clear my inbox regularly during the day, rather than keeping old emails in the bottom of my inbox, and risk getting accidentally archived.
Assuming that there were probably other people who would like to snooze (Desktop Gmailers or members of the tinfoil-hat-wearing-brigade not wanting to hand over control of their email to a 3rd party) , I hacked together Gmail Snooze v1.0. My aim was to make it as simple to implement and use as possible: I did consider publishing it as a web app, but I felt it was important that the script be visible so that people could see what was happening to their Gmail.
Start Me Up
So how do you start snoozing? First up, you’ll need either authorise the script, or create your own copy and authorise that. I’d recommend the latter option for 3 reasons:
- You can edit any of the configuration options (should you choose to).
- I don’t break your version of the script if I ever decide to make any changes.
- You can take comfort in the fact that I can’t change your copy to do something nefarious after you start using it.
Once you have your own copy (File->Make a Copy…), and have edited any of the settings that you disagree with, then select Run->Setup from the menu, and you should see 2 pages that ask you to authorise the script:

Once you see the “Authorised Status” page, select Run->Setup again to actually run the setup script – this will create all the necessary labels, and schedule the script to run every minute.
At this point you’re actually ready to start “snoozing”, but to make it a more pleasurable experience when using Gmail in a browser, you may want to enable keyboard shortcuts in the Gmail settings – this will allow you to press “v” when selecting/viewing an email and it will pop-up the “Move To” dialogue.

Ready To Go
Now you’ve jumped through all the necessary hoops, you are ready to become a first rate snoozer. The concept is simple – move your messages into the required label.
Then sleep safely in the knowledge that the message will return to your inbox on the requested day or time, unread, and labelled “* Unsnoozed” (so that you know where it came from).
Maybe Tomorrow I’ll Want To Carry On
This one is pretty straight forward – move your message into “* Snooze/0 – Tomorrow”, and the message will re-appear in your inbox at midnight, ready for you to deal with tomorrow.
Sunday, Monday, Happy Days
You can snooze your message until the next occurrence of any day of the week. e.g. Move a message to “* Snooze/6 – Saturday” if you need to be reminded to do something at the weekend.
Time After Time
If you want a more fine grained, short term snooze, you can procrastinate until a specific time in the next 24 hours. There are some predefined times added during setup, but you can also create your own in (24 Hour) hhmm format.

Have A Nice Day
If you need to snooze for longer than a week, or you just want to enter a date rather than a day of the week, then you can specify a label in either ddmmyy or mmddyy format and the email will reappear shortly after midnight on that day.
You can create new sub-labels for dates in the same way as you can for time labels.
Don’t Get Me Wrong
If you happen to create a new label that is never going to be unsnoozed (e.g. “* Snooze/Bob”) and move an email into it, then it won’t get lost – it will simply be returned to your inbox with a label of “Snooze Error!” thus letting you know that you messed up, and to be more careful next time.
Conclusion
I’ve been using the script for a few days now, and I love it – it’s totally changed the way I process email, and I like nothing more than looking at an empty inbox. Whilst on iOS it’s not as slick or easy to use as MailboxApp, in a desktop browser an email is only about 5 keystrokes (“v”, 3 letters of the label you’re after, and Enter) away from being temporarily put out of sight and out of mind.
I recently did some work for a client who wanted some reports that outlined changes to their Trello boards week to week, and whilst I can’t share the resulting code, I thought it would be useful to share how I approached the problem.
Initially I considered 2 possible solutions:
- Read through the activity log of every card, and try to establish if that activity was something that needed to be reported.
- Use the Trello Backup Script that I wrote last year to save a dump of the boards on a weekly basis, and then compare the data to see what needed to be reported on.
It soon became apparent from the reporting requirements that I could not rely solely on the card’s activity log, because of the following issues:
- The card could be deleted (so there would be no activity to interrogate)
- It could be potentially complex to rewind back to a point of time solely using the activity log.
- Some changes (e.g. due date or checklist items) are not recorded in the activity section of the card.
So with option 2 looking like a clear winner, I set about writing a couple of scripts to manage the process.
The Data Dump
I modified the original Trello Backup Script so that it would output the JSON data into a new spreadsheet every time it was run, and keep a register of all of the backup spreadsheets that it had, and when they were extracted.
This process was scheduled to run at a set time every week, and was executed separately to the actual report generation script to make it easier to clean up if either script failed or timed out.
The Report Generator
This script was scheduled to run an hour after the data extract, and would only proceed if a successful data dump had occurred.
It produced each of the required reports as a separate sheet, and emailed the resulting spreadsheet to all the interested parties.
In the majority of cases, the reports were generated by opening the last 2 data extract spreadsheets listed in the register, and using the JSON objects stored within them to retrieve the frozen state of all the boards, which could then be compared to identify any changes that needed to be reported.
And that’s pretty much it – admitedly it was a bit more complicated than that, but you get the gist of how this method provides you with a solid platform from which you can write your own reports about changes to your Trello boards.
If you use IBM Rational Developer Tools, you’ll know that it’s leaps and bounds ahead of SEU for coding RPGLE, but when you compare it to the experience of developing with other languages in the Eclipse IDE you’ll have to agree that it’s not quite as slick.
One thing I love about the Java development environment is having access to class methods using code completion, but with RPG not being an OO language it obviously makes this kind of feature technically challenging!
Since we started taking advantage of ILE service programs over a decade ago, we’ve amassed a huge library of functions & procedures that we use day in, day out, but referencing these often involves heading over to a 5250 session to use one of our in-house development tools to search for the exact procedure name.
It was during one of these searches that I yearned for an easy way to easily access the list of available procedures from within Rational itself. After a bit of Googling, and some rummaging around in the file system I came up with a simple and elegant solution.
Templates
Rational Developer allows code completion (Via shortcut Ctrl+Space) that includes any templates that are defined in your workspace. It comes bundled with some basic loop structures by default, but you can add your own templates in the application preferences.
These templates are actually stored in a file (templates.xml) which resides in the \.metadata\.plugins\com.ibm.etools.iseries.edit subdirectory of your workspace.
With this in mind I wrote a process to generate my own version of templates.xml, populating it with all the procedures that are exported by the library of service programs:
<?xml version=”1.0″ encoding=”UTF-8″?><templates version=”1.0″>
<template context=”ILE RPG FREE-FORM” description=”OURLIB/S_EXCEL(HSSF_ADDPICTURE)” enabled=”true” name=”HSSF_ADDPICTURE”>HSSF_ADDPICTURE(${CURSOR})</template>
<template context=”ILE RPG FREE-FORM” description=”OURLIB/S_EXCEL(HSSF_BEGIN_OBJECT_GROUP)” enabled=”true” name=”HSSF_BEGIN_OBJECT_GROUP”>HSSF_BEGIN_OBJECT_GROUP(${CURSOR})</template>
<template context=”ILE RPG FREE-FORM” description=”OURLIB/S_EXCEL(HSSF_CELLNAME)” enabled=”true” name=”HSSF_CELLNAME”>HSSF_CELLNAME(${CURSOR})</template>
…
</templates>
I then replaced the copy of this file in my workspace, restarted Rational, and sure enough there were all the new templates:
These were then available after typing the first few characters, and pressing Ctrl+Space:
Selecting the desired procedure added it to the source:
Automation
Not wanting to rely on data that could get stale pretty quickly, I sought to automate the process by scheduling a daily job to generate templates.xml in the IFS of our dev machine (Making it available to all developers in the process) and then created a batch file to robocopy the file into my workspace.
robocopy \\serverName\rational %UserProfile%\Documents\Workspace\.metadata\.plugins\com.ibm.etools.iseries.edit templates.xml
I then configured the batch file to run at a set time each day using Windows Task Scheduler.
Work In Progress
This is just a first cut to ensure that the basic data is available within Rational, and verify that the mechanism works end to end, but there’s certainly more that I would like to do to improve it.
For example, it would be incredibly useful to be able view the parameters required by each procedure:
createsISODate(p_day 2s0 const: p_month 2s0 const: p_year 2s0 const)
Unfortunately we don’t currently have that information readily available in our developer tools database, but I’m sure it won’t take long to extract it, especially as I now have all our procedures at my fingertips…
** Update 13/11/2012 **
It’s been pointed out at that Rational Code Assist will already include prototypes in /include and /copy members, but only if you refresh the Outline view. This is certainly a great option for anyone who doesn’t already have easy access to their exported procedures.
The problem I have with that is that we currently have over 100 source members, so it would require including the appropriate one before the code assist will pick up the relevant prototypes. I’m going to investigate the effect of having a single /include to pick up all the prototypes in one go and see if this gives a better experience.
Whether it’s because I’ve experienced a natural disaster or because I spent some of my formative years in the Boy Scouts I’m not sure, but events half a world away this week have re-enforced the notion that it’s good to “be prepared”.
When we started using Trello for our product backlog earlier this year , I thought it was probably overkill trying to get an automated backup of our data, since it was being operated by Fog Creek who have a great reputation in the industry, but I ploughed on regardless and yesterday that preparation paid off.
We normally use Trello during our Sprint Review to recap user stories and acceptance criteria and one such meeting occurred at the same time Fog Creek were valiantly trying to keep the service going as New York was battered by Hurricane Sandy. Normally this wouldn’t have mattered as we keep paper copies on our scrum board, but for the first time in 13 sprints we were doing our review in Auckland, so these weren’t much use.
So there we were, mid review, far from home, no story cards, and Trello is going up and down like a whores draws. Compared to what the poor people in the NE United States were going through this was obviously not a big deal, but with a little bit of contingency planning it was a trivial task to fire up Google Drive, open our Trello backup spreadsheet and continue with our review.
This outage and the ongoing benefit we get from being able to print story cards from the backup spreadsheet means that it has totally repaid the time I spent writing the script – if you’re using Trello for user stories, and you haven’t done so already then go set the script up now – there’s nothing to lose and everything to gain.
It’s also a timely reminder to look at all your digital data and think about what would happen if you didn’t have access to it, or worse still, lost it permenantly. If your house burned down by a fire, would you lose all the photos of your kids? If your favourite web service went under (financially rather literally) and took your data with them, then what would the impact be?
It doesn’t take much to get yourself in good shape – get a good automated offsite backup (I use Crashplan) to handle your files, and periodically back up your online data to another service, or even to a local PC and you should be good to go.
Oh, and if you happen to live in the pacific ring of fire, tornado alley, somewhere hot and dry, or indeed anywhere on our rapidly warming planet that has “weather” you might want to generally be prepared so that in any eventuality, you manage to Get Thru.
I want to buy an iPhone 5, but I can’t, and that makes me mad.
So you’ve imported your precious data into Trello and are now merrily moving cards, ticking checklists, and adding comments ’til the cows come home. But what if something were to happen to your Trello data? How much work and knowledge would be lost?
This was a question I asked myself when I initially decided to use Trello. Having lived through a disaster (The 2011 Christchurch Earthquake) I tend to think a lot about disaster recovery, and the thought of having data sitting in the cloud, especially in a free service makes me nervous. Don’t get me wrong, I think that the guys at Fog Creek Software do their utmost to keep our data safe and sound, but I would sleep a lot easier knowing that there was another copy of my data somewhere, should I need it.













