“Call with iPhone” for macOS

call-with-iphone

Six years ago I made a little utility to right-click a phone number on my computer and dial it using Skype. I’ve used this daily for years, but it broke recently with Skype’s redesign.

I don’t otherwise have a reason to use Skype regularly these days, and ever since Apple introduced the ability to make phone calls from macOS via FaceTime (and your iPhone), I’ve been meaning to explore using that instead anyway.

FaceTime supports the tel protocol, so adapting my AppleScript to use that was easy.

You can download it here. Double-clicking the file should open Automator and prompt you to install it (or install manually by putting the file in ~/Library/Services/).

Now you should be able to right-click any phone number (including international formats) in most applications and “Call with iPhone” using FaceTime (it does make a “real” phone call, not FaceTime or FaceTime Audio). If an application other than FaceTime launches, you probably need to go to FaceTime > Preferences and set FaceTime as the “Default for calls”.

Meerkat Roulette

With all the hubbub over Meerkat the past couple of weeks, I thought for sure that someone would have beaten me to this already.

Introducing, Meerkat Roulette.

I’m using Twitter’s search API to grab recent tweets containing “mrk.tv” and cycling through them randomly. You’ll probably see some repeats because of Twitter’s rate limiting, and also a lot of streams that are already over. I probably won’t fix that because I’ve already spent too much time on this stupid idea.

And since it’s the breakout app! at SXSW this year, I added a filter to only include streams tagged #sxsw. This one gets much more interesting at night :)

Have fun!

Using Gravatar with Salesforce

This is pretty hacky, but with a bit of Javascript you can replace the default avatars for Contacts and Leads in your Salesforce account with Gravatars instead.

Here’s the script, and you’ll need to follow these instructions to get it loaded in Salesforce.

I’ve only tested this with the Salesforce account I have access to…no reason to think it won’t work for you too, but your mileage may vary.


<script>!window.jQuery && document.write(unescape('%3Cscript src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"%3E%3C/script%3E'))</script>
<script>
(function($){function safe_add(x,y){var lsw=(x&65535)+(y&65535),msw=(x>>16)+(y>>16)+(lsw>>16);return msw<<16|lsw&65535}function bit_rol(num,cnt){return num<<cnt|num>>>32-cnt}function md5_cmn(q,a,b,x,s,t){return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b)}function md5_ff(a,b,c,d,x,s,t){return md5_cmn(b&c|~b&d,a,b,x,s,t)}function md5_gg(a,b,c,d,x,s,t){return md5_cmn(b&d|c&~d,a,b,x,s,t)}function md5_hh(a,b,c,d,x,s,t){return md5_cmn(b^c^d,a,b,x,s,t)}function md5_ii(a,b,c,d,x,s,t){return md5_cmn(c^
(b|~d),a,b,x,s,t)}function binl_md5(x,len){x[len>>5]|=128<<len%32;x[(len+64>>>9<<4)+14]=len;var i,olda,oldb,oldc,oldd,a=1732584193,b=-271733879,c=-1732584194,d=271733878;for(i=0;i<x.length;i+=16){olda=a;oldb=b;oldc=c;oldd=d;a=md5_ff(a,b,c,d,x[i],7,-680876936);d=md5_ff(d,a,b,c,x[i+1],12,-389564586);c=md5_ff(c,d,a,b,x[i+2],17,606105819);b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);a=md5_ff(a,b,c,d,x[i+4],7,-176418897);d=md5_ff(d,a,b,c,x[i+5],12,1200080426);c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);b=md5_ff(b,
c,d,a,x[i+7],22,-45705983);a=md5_ff(a,b,c,d,x[i+8],7,1770035416);d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);c=md5_ff(c,d,a,b,x[i+10],17,-42063);b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);a=md5_ff(a,b,c,d,x[i+12],7,1804603682);d=md5_ff(d,a,b,c,x[i+13],12,-40341101);c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);b=md5_ff(b,c,d,a,x[i+15],22,1236535329);a=md5_gg(a,b,c,d,x[i+1],5,-165796510);d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);c=md5_gg(c,d,a,b,x[i+11],14,643717713);b=md5_gg(b,c,d,a,x[i],20,-373897302);a=md5_gg(a,
b,c,d,x[i+5],5,-701558691);d=md5_gg(d,a,b,c,x[i+10],9,38016083);c=md5_gg(c,d,a,b,x[i+15],14,-660478335);b=md5_gg(b,c,d,a,x[i+4],20,-405537848);a=md5_gg(a,b,c,d,x[i+9],5,568446438);d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);c=md5_gg(c,d,a,b,x[i+3],14,-187363961);b=md5_gg(b,c,d,a,x[i+8],20,1163531501);a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);d=md5_gg(d,a,b,c,x[i+2],9,-51403784);c=md5_gg(c,d,a,b,x[i+7],14,1735328473);b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);a=md5_hh(a,b,c,d,x[i+5],4,-378558);d=md5_hh(d,
a,b,c,x[i+8],11,-2022574463);c=md5_hh(c,d,a,b,x[i+11],16,1839030562);b=md5_hh(b,c,d,a,x[i+14],23,-35309556);a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);d=md5_hh(d,a,b,c,x[i+4],11,1272893353);c=md5_hh(c,d,a,b,x[i+7],16,-155497632);b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);a=md5_hh(a,b,c,d,x[i+13],4,681279174);d=md5_hh(d,a,b,c,x[i],11,-358537222);c=md5_hh(c,d,a,b,x[i+3],16,-722521979);b=md5_hh(b,c,d,a,x[i+6],23,76029189);a=md5_hh(a,b,c,d,x[i+9],4,-640364487);d=md5_hh(d,a,b,c,x[i+12],11,-421815835);c=md5_hh(c,
d,a,b,x[i+15],16,530742520);b=md5_hh(b,c,d,a,x[i+2],23,-995338651);a=md5_ii(a,b,c,d,x[i],6,-198630844);d=md5_ii(d,a,b,c,x[i+7],10,1126891415);c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);b=md5_ii(b,c,d,a,x[i+5],21,-57434055);a=md5_ii(a,b,c,d,x[i+12],6,1700485571);d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);c=md5_ii(c,d,a,b,x[i+10],15,-1051523);b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);a=md5_ii(a,b,c,d,x[i+8],6,1873313359);d=md5_ii(d,a,b,c,x[i+15],10,-30611744);c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);b=md5_ii(b,
c,d,a,x[i+13],21,1309151649);a=md5_ii(a,b,c,d,x[i+4],6,-145523070);d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);c=md5_ii(c,d,a,b,x[i+2],15,718787259);b=md5_ii(b,c,d,a,x[i+9],21,-343485551);a=safe_add(a,olda);b=safe_add(b,oldb);c=safe_add(c,oldc);d=safe_add(d,oldd)}return[a,b,c,d]}function binl2rstr(input){var i,output="";for(i=0;i<input.length*32;i+=8)output+=String.fromCharCode(input[i>>5]>>>i%32&255);return output}function rstr2binl(input){var i,output=[];output[(input.length>>2)-1]=undefined;for(i=
0;i<output.length;i+=1)output[i]=0;for(i=0;i<input.length*8;i+=8)output[i>>5]|=(input.charCodeAt(i/8)&255)<<i%32;return output}function rstr_md5(s){return binl2rstr(binl_md5(rstr2binl(s),s.length*8))}function rstr_hmac_md5(key,data){var i,bkey=rstr2binl(key),ipad=[],opad=[],hash;ipad[15]=opad[15]=undefined;if(bkey.length>16)bkey=binl_md5(bkey,key.length*8);for(i=0;i<16;i+=1){ipad[i]=bkey[i]^909522486;opad[i]=bkey[i]^1549556828}hash=binl_md5(ipad.concat(rstr2binl(data)),512+data.length*8);return binl2rstr(binl_md5(opad.concat(hash),
512+128))}function rstr2hex(input){var hex_tab="0123456789abcdef",output="",x,i;for(i=0;i<input.length;i+=1){x=input.charCodeAt(i);output+=hex_tab.charAt(x>>>4&15)+hex_tab.charAt(x&15)}return output}function str2rstr_utf8(input){return unescape(encodeURIComponent(input))}function raw_md5(s){return rstr_md5(str2rstr_utf8(s))}function hex_md5(s){return rstr2hex(raw_md5(s))}function raw_hmac_md5(k,d){return rstr_hmac_md5(str2rstr_utf8(k),str2rstr_utf8(d))}function hex_hmac_md5(k,d){return rstr2hex(raw_hmac_md5(k,
d))}$.md5=function(string,key,raw){if(!key)if(!raw)return hex_md5(string);else return raw_md5(string);if(!raw)return hex_hmac_md5(key,string);else return raw_hmac_md5(key,string)}})(typeof jQuery==="function"?jQuery:this);
</script>
<script>
jQuery( document ).ready( function() {
if( $('.contactTab #con15_ileinner a').length ){
var email = $('.contactTab #con15_ileinner a').text().trim().toLowerCase();
var gravatarhash = ( 'http://gravatar.com/avatar/' + $.md5( email ) );
$('#contactHeaderRow div.headerPhotoContainer img.socialProfilePhoto').attr('src', gravatarhash);
}
if( $('.leadTab #lea11_ileinner a').length ){
var email = $('.leadTab #lea11_ileinner a').text().trim().toLowerCase();
var gravatarhash = ( 'http://gravatar.com/avatar/' + $.md5( email ) );
$('#contactHeaderRow div.headerPhotoContainer img.socialProfilePhoto').attr('src', gravatarhash);
}
});
</script>

“Call With Skype” Service for Mac OSX

Update: “Call with iPhone” now available too.

I spend a lot of time on the phone these days, and am tired of copy/pasting phone numbers into Skype’s finicky little dial pad, so I hacked together a Service for OSX to dial them for me.

Download this zip file, unpack it, and drop the Call With Skype file into ~/Library/Services/ (note for anyone using an OSX version since Lion: the Library folder is hidden…you’ll need to use the command line or go to Finder > Go and press your Option key).

Once you’ve done that, you should be able to highlight a phone number within any application, and right click to Call With Skype:

It should work for international numbers too.

Also, a tip: if you have a bunch of Services installed, “Call With Skype” might get buried under a “Services >” submenu when you right-click. Most people don’t use Services at all…if you’re in that camp you can head to System Preferences > Keyboard > Keyboard Shortcuts > Services to disable any that you’re not using. If you disable enough of them, the submenu will disappear.

Average Airline Departure Delays

Like any good nerd, I was excited about today’s Data.gov announcement, so I put together this infographic (using Google’s fancy MotionChart API) which charts the yearly average departure times for major domestic air carriers.

The chart isn’t terribly interesting; this was more of a mental exercise than an attempt to do anything useful with the data.

There is one notable data point in the chart though, and that’s JetBlue circa 2007—their average departure time spikes as a result of the infamous Valentines Day screwup. Having myself spent 9 hours (and my first wedding anniversary) on the tarmac at JFK during that fiasco, I was curious to see how that would be reflected in the data.