The online home of John Pollard

An IE8 Accelerator for sharing on Posterous

Originally posted on my old MSDN blog

I've been working on my friend Josie's website and was looking for a simple solution for her to be able to post news, updates etc. without too much technical knowledge.

After looking around a loads of different blogging sites, software and stuff somewhere in between I stumbled upon Posterous. You can read all about it from their FAQ but it's simplicity really is a thing of beauty.

Simply send an email to a special email address and it will get posted automatically to the blog. Attached images and videos can automatically get converted and embedded, and it has a host of Autopost features which let you forward details of new items on to Twitter, Facebook, Flickr,...

You can see the results for yourself and some of Josie's beautiful pictures at http://josiemccoy.posterous.com

Anyway, I thought it would be a good idea to be able to easily share information on Posterous using an IE8 Accelerator, and not finding one already at http://ieaddons.com I thought I’d knock one up myself.

Building the Accelerator

Accelerators are simply XML files containing descriptions of the services they offer – the MSDN documentation at http://msdn.microsoft.com/en-us/library/cc289775(VS.85).aspx is pretty straightforward to follow.

It was then simply a question of matching the Posterous variables on their “share” page documented at http://posterous.com/help/waystoshare to the Accelerator variables, which resulted in the following XML file.

 

<;?xml version="1.0" encoding="UTF-8"?>
<os:openServiceDescription xmlns:os="http://www.microsoft.com/schemas/openservicedescription/1.0">
<os:homepageUrl>http://www.posterous.com</os:homepageUrl>
<os:display>
<os:name>Share on Posterous</os:name>
<os:icon>http://www.posterous.com/favicon.ico</os:icon>
<os:description>Share on Posterous</os:description>
</os:display>
<os:activity category="Share">
<os:activityAction context="document">
<os:execute action="http://posterous.com/share" method="get">
<os:parameter name="linkto" value="{documentUrl}" type="text" />
<os:parameter name="title" value="{documentTitle}" type="text" />
</os:execute>
</os:activityAction>
<os:activityAction context="selection">
<os:execute action="http://posterous.com/share" method="get">
<os:parameter name="linkto" value="{documentUrl}" type="text" />
<os:parameter name="title" value="{documentTitle}" type="text" />
<os:parameter name="selection" value="{selection}" type="text" />
</os:execute>
</os:activityAction>
<os:activityAction context="link">
<os:execute action="http://posterous.com/share" method="get">
<os:parameter name="linkto" value="{link}" type="text" />
<os:parameter name="title" value="{linkText}" type="text" />
</os:execute>
</os:activityAction>
</os:activity>
</os:openServiceDescription>

Installing the Accelerator

To allow a user to install the accelerator, you simply add a JavaScript link as documented at http://msdn.microsoft.com/en-us/library/cc197034(VS.85).aspx

window.external.AddService(URL)

I’ve uploaded my Accelerator to the IE Addons Gallery for people to use but at the time of writing it’s being reviewed by the IE team (it’s only been a hour and it is Sunday!). However if you want to try it yourself, I’ve made the JavaScript link to my copy of the XML file here.

Experiments with my Garmin GPS and Windows Live Maps

Originally posted on my old MSDN blog

I love my Garmin 275 nüvi! I’ve always put off buying a SatNav as it somehow seems a sign of weakness to not know where you are, but now I have one I wouldn’t be without it.

What I also like is the integration with Windows Live Maps, in particular the way you can save your collections as Favorites on your device. This makes it trivially easy to find where you’re going to on the site beforehand and then download the location to the GPS.

Communication with the device is handled by a browser plug-in provided by Garmin which can be downloaded from http://www8.garmin.com/products/communicator/

Once the plug-in is installed and the Garmin is connected, then saving a collection to the GPS is as easy as going to the Actions->Send To->GPS menu in the Collections window

The Garmin Communicator Plugin API is available for use on your own website – full details can be found at http://developer.garmin.com/web-device/garmin-communicator-plugin/

There is a great demo page at http://developer.garmin.com/web/communicator-api/apidemo/garminDeviceControlDemo.html which shows all the functionality available via the plug-in, including reading and writing the saved points of interest, and also the tracks of previous journeys made with the GPS.

This is all good stuff, but all the example code uses Google Maps so I thought it might be interesting to adapt the code to get it to work with Windows Live Maps instead.

You can see the results of my experiments on my website at http://www.bravelocation.com/locationdemo and you can see below a screenshot of the page showing my journey home from my office in building 109 in Redmond back to the hotel I’m staying in in Bellevue:

The code is hopefully reasonably understandable and is fairly closely based on the sample Garmin code so I won’t go into too many details here, but here are some of the highlights…

    • There are various issues with the current version of Windows Live Maps in IE8 Beta 1, so you need to run the code in compatibility mode. Rather than expecting the user to know this, I now realise you can force IE into IE7 mode by adding the header
<meta http-equiv="X-UA-Compatible" content="IE=7" />

to the page.

  • When creating a VELatLong object, you need to ensure the latitude and longitude parameters are floats, so I wrapped the parameters in the JavaScript parseFloat() function
  • My only real addition to the Garmin code was to add a “last known location” function to the code. All this does is:
    • Loop through all of the track data on the device
    • Find the track with the latest end date
    • Get the last valid sample location of the latest track
  • I’m only currently using that last known location in the UI, but it won’t take much work to be able to hook this up to be saved at FireEagle – watch this space!

If you’re so inclined, please feel free to use and extend this code however you wish. Let me know if you do, or if you find any bugs!

Fixing an issue with Windows Live Toolbar and Favorites Sync

Originally posted on my old MSDN blog

I’ve always used the Windows Live Toolbar to sync favorites across my multiple machines, so it was a bit disappointing when the previous beta removed that functionality with the demise of http://favorites.live.com

That meant I was pleased to see the service had been added to the latest beta of the toolbar in the new Windows Live Essentials pack, but then very frustrated when it failed to install properly on a couple of my PCs.

However after a bit of playing about I stumbled on a fix, so I thought I’d share the solution here as I couldn’t find any other references online.

After setting up the sync on my work laptop, after what I thought was a successful install on my home PC there was no option for setting up the sync in the left hand side of Toolbar options - see the picture below:

 

 

I had no idea what the problem was, and was going to try the trusted uninstall/reinstall route, but when I went to the uninstall control panel I realised I still had the old Favorites toolbar add-in installed:

On one PC simply uninstalling the “Windows Live Favorites for Windows Live Toolbar” did the trick, and the sync options magically appeared.

On another PC I had to reinstall the toolbar too, but then finally I was in sync across all my PCs.

I hope you found that helpful!

Update (23/12/2008): There has been some discussion on Liveside about this issue that you should check out. One thing I didn’t know is that the Favorites sync isn’t available in all markets at the moment.

Update 2 (18/02/2009): I’ve upgraded a couple of machines to Windows 7 and on one of them I just couldn’t get the sync to appear. They were both fresh installs so the issue above didn’t fix it. I also made sure everything on the failing machine was “en-us”, but to no avail.

Actually I was getting frustrated with the way the sync wouldn’t handle deletes properly, so I’ve given up and am just using the superior Live Mesh to sync my favorites directory.

Linking Fire Eagle and Twitter

Originally posted on my old MSDN blog

The next stage in my plan to let the whole world know where I am has been to hook up my Fire Eagle location to Twitter, so every time my location changes a Tweet is sent to everyone following me.

I thought for a while about hooking up my code to Twitter using the Twitter API, but then realised there is a much simpler way.

  1. Expose my Fire Eagle location via an RSS feed
  2. Use TwitterFeed to post changes to the feed to my Twitter account

For the RSS feed part, it was relatively simple to adapt my existing code to make my own feed, but there are several existing Fire Eagle services that will do this for you.

Then TwitterFeed – which is a simple but excellent service – does the work of watching the feed for updates, and then posting any changes to my Twitter feed.

All pretty simple in the end.

Some fairly vaguely related thoughts…

1. The power of both Twitter and Fire Eagle are only really exposed by the services and applications that use them. Fire Eagle is designed specifically to work in that way, but my use of Twitter has really taken off since finding applications like TwitterFeed and Tweet Deck.

2. I’m really impressed with the updated Windows Live web sites, and in particular the web activities. It’s great that my tweets are now exposed to my contacts who are much less likely to use Twitter. Although after the work I’ve done above means I don’t really need it, it would be fantastic if Fire Eagle was a future web activity.

3. TwitterFeed used Open ID as it’s authentication scheme, and it was the first time I’d used it. If I didn’t have half an idea what was going on it would have been a very confusing experience. All the talk of “what’s your URL?” didn’t make any sense until I realised I could just go to Yahoo! and use my account there to generate my ID. Definitely wouldn’t have passed the “can your Mom use it?” test.

P.S. If you want to follow me on Twitter, you can at http://twitter.com/yeltzland

Using Fire Eagle to store your current location

Originally posted on my old MSDN blog

Not that you’d really notice, but I’ve updated the code to show my current location on the map on this blog to use Fire Eagle to store my current location.

If you haven’t heard of it before, Fire Eagle is a service provided by Yahoo! which lets you store your current location, and then allow different applications read or write access that location at an accuracy level that you control.

This is a simple service which is actually really cool, and there are already multiple applications on different platforms (web, client and mobile) which allow you to read and/or update your location dynamically. So if you really want to – and I do! – you can track and expose your location however you want.

The full developer details are at http://fireeagle.yahoo.net/developer (you need a Yahoo! account to access this) so I won’t explain too many of the low-level details here. However here’s a few things to note if you want to investigate yourself:

1. Fire Eagle uses OAuth for securing access to their API, which means:

  • First get the application token by registering your application at Fire Eagle
  • Using the application token you get a request token for an individual user, from which a URL is created to send the user to Fire Eagle to both confirm access permissions to their location for your application, and at the level of accuracy the application may show
  • Once the user has confirmed permission, your application gets a user-specific token which it should store and use to access the Fire Eagle API to get that user’s location

2. There are various libraries available for both OAuth and Fire Eagle access:

  • I used the C# Fire Eagle library at Google Code
  • However there are a couple of bugs in the library that I had to fix:
    • The response can’t be serialised properly because the Error object uses IDictionary which can’t be serialised
    • A couple of the values in the location hierarchy - “exact” and “region” weren’t available
  • Also, the library didn’t expose the latitude and longitude of the locations returned – the main thing I was interested in so I could display the position on my Virtual Earth map!
  • Update (8th Dec 2008) I’ve checked in fixes for both issues and the library extensions I made to the code repository at http://code.google.com/p/fireeaglenet/ If you find any problems, let me know and I’ll take a look ASAP.

 

Once all of the access token details have been obtained and stored in my web.config file (I know, not the most secure practice and not one I’d use on a real production site), then using the C# library it’s very easy to get my location with a few lines of code:

  Token userToken = new Token(appSettings["fireeagle_usertoken"], appSettings["fireeagle_usersecret"]);
  FireEagle fireEagle = new FireEagle(appSettings["fireeagle_consumertoken"], appSettings["fireeagle_consumersecret"], userToken);
  User fireEagleUser = fireEagle.User();
  Location bestLocation = fireEagleUser.LocationHierarchy.BestGuess;

I can then use that Location object (after my extension to the library) to get the latitude and longitude to drive my JavaScript implementation of Virtual Earth shown in an earlier post.

As an aside – which I may come back to in a future post – I wanted to protect some of the pages I built (the ones where I expose my Fire Eagle token details). To do this I used Windows Live ID using code from the Web Authentication SDK – see http://dev.live.com/liveid/ for details.

This was almost trivially easy, and having banged my head against earlier Passport implementations, this was a pleasure to use (if that’s not overstating things!). Kudos to the Live ID team, and if you’ve been put off using WLID after being scarred by previous attempts with Passport, I definitely recommend taking another look.