Gravatar

A Gravatar is a Globally Recognized Avatar, used as an identifying image on blog posts, comments and similar. The concept is a simple but clever solution to the problem of how you get an image linked to someone’s email address without exposing that email address to the public. A naive solution could be the following:

<img src="http://provider/avatar?email=john@smith.com">

The trouble is, the email address is there in the HTML ripe for indexing and spamming.

Gravatar uses the simple approach of hashing the email address, so it is not exposed:

<img src="http://www.gravatar.com/avatar/ff938a97ec6097459954962e66c88a43">

This gives the result below for one of my email addresses. Note that the address isn’t exposed, I can happily post it here without inviting a deluge of spam. I’ve also included the gravatar of a commenter, again not exposing their email, and shown the neat “unknown” image returned if the gravatar doesn’t exist.

pseudocode gravatar flashforward gravatar unknown gravatar

The other point of course is that the Gravatar site is a widely known solution for blogs, and part of WordPress, so the most likely avatar source is easy to pinpoint.

Out of curiosity I wrote a quick online tool to show gravatars for a big set of emails, and put in the contents of my address book. Of two hundred people only a handful have gravatars, which compares very poorly with the number who have a Facebook account, suggesting Gravatar is still a fairly niche solution.

K.I.S.S.

Often heard advice in system design – Keep It Simple Stupid. It’s a reasonable idea, a little similar to the Agile principle of no gold plating, that simplicity is efficient and robust.

The trouble I find is that all too often it actually translates to Keep It Simple & Stupid, and the result is a design unnecessarily limited or lacking in flexibility. As is often the case in English, a simple word can have many meanings…

Clear, Clean, Pure, Transparent 🙂 these I want.

Amateur, Foolish, Naive, Stupid 🙁 not in my system thanks.

Is there a point to this? Not really, just a thought – I like the no gold plating rule, but KISS is just too simple for me.

Movable Type on the iPhone

I don’t write much on this blog, one of the reasons being lack of time. Since I spend a couple of hours a day on the train, I wondered if there was an iPhone app which would enable me to write and upload blog entries reasonably easily while on the move.

Unfortunately MT don’t have an app of their own, unlike several of the competitors such as WordPress and Blogger, therefore I tried several third party alternatives and report on their effectiveness here.

BlogPress

The first app I tried was BlogPress, which claims to offer connections to most of the leading blogging software, both online and offline editing and storage, and support for draft and published entries.

Connection to my MT installation was straightforward, and it managed to find all the current entries. Unfortunately it couldn’t distinguish the draft entries, and doesn’t get it right when you try to upload as draft, but that isn’t a show stopper since I’m happy to keep my drafts on the phone.

What let it down was a simple inability to handle newlines. I use Markdown for my editing, and BlogPress has two problems – it insists on replacing newlines with <br /> tags, and worse it compresses multiple newlines (i.e. paragraphs) into one, losing my formatting.

I’ve raised this as a bug with the developer, but currently it makes an otherwise decent solution unusable for me.

Oh, and it also kept claiming network issues, even on a reliable WiFi connection.

Movable Manager

I then tried Movable Manager, a MT specific application which also supports many of the additional fields specific to MT such as excerpts and keywords.

Connection to my MT installation was also straightforward, and it found all the current entries with operation being extremely fast. Unfortunately it has no concept of a draft entry, either offline or online, anything sent to the server is immediately published.

Editing is good, with the content kept exactly as you type it, perfect for Markdown although there is no preview which makes the immediate publishing a bit of a leap of faith. It also has the ability to upload photos, but a word of warning – it silently overwrites existing files of the same name!

On the whole, simpler and more reliable than BlogPress, but lack of offline editing doesn’t fulfil my needs.

Nocs combination

I’d already been using Nocs as a Markdown enabled notepad to edit blog entries and other files, so I wondered if this could be used to solve my requirements.

The big advantage with Nocs is that it is designed for Markdown from the start, and it supports CSS controlled preview, so it’s possible to get a reasonable approximation of what it will look like on the real blog. Unfortunately it doesn’t directly connect to MT, only supporting local storage and Dropbox.

To get the entries from the phone onto the blog I added the iMT plugin to my MT installation to give me a usable control interface on the iPhone. This is a pretty good solution, although at time of writing the part handling comment management is giving an error.

Recommended Solution

At the moment my recommended solution is Nocs + iMT, with Movable Manager useful if you want to upload photos easily.

One thing about iMT is that there’s no option to jump into the full web interface. If this is a problem for you then Nocs + Movable Manager may be more appropriate.

BlogPress iPhone App

This is a quick post to try out the iPhone app BlogPress that I’ve just installed.
Connecting to my Movable Type installation worked fine, and it finds all the existing posts although it doesn’t seem to correctly recognise the drafts.
Writing in the app is OK, the basic option to insert italic or bold text is a bit primitive but it does make adding hyperlinks easier. Support for something like Markdown would be good.
Saving an online draft still doesn’t seem to recognise the result as a draft, and loses some of the line feeds. Also the editor window doesn’t always scroll up in time when typing reaches the bottom, so the insertion point ends up under the keyboard.
Posting on an Edge network also doesn’t seem to work, just giving a network error even though direct access to the site works albeit slowly. Possibly the timeout is set too low, but it can’t be configured.

Strangely saving remotely as a draft, then reinserting the missing line breaks before publishing seems to work, but then they’re gone again when reopening 🙁

Update: The line compression problem is significant enough to make the app unusable for me. I’ve raised a bug report with the developer, maybe they’ll provide an update.

Start at the Beginning

One of the hardest parts of my role is getting projects started, and it sometimes feels exacerbated by poor attempts to use Agile mindsets.

The fact is that a project needs a reasonably clear set of targets and plans in order to start successfully, with a defined order and a some idea of timelines. This is especially important where multiple applications and owners are involved and need to coordinate their work.

From an Agile viewpoint, I’m quite happy to adjust the plans based on experience and refine the details as the project progresses. The one thing I believe very strongly though is that you must start at the beginning.

Of course your beginning depends on your methodology, you can pick requirements, epics, acceptance criteria, data, test cases, etc etc. It doesn’t really matter, although I suspect it helps if each application area chooses the same option (I’ve never done a mixed methodology project of any size, I’d be interested to hear what happens if you run requirements driven and test driven parts in one project).

In several recent projects I’ve found that people are diving right in to the middle of the analysis, with no agreement on useful things like goals, ownership or basic timescales. The culprits are often recent Agile adopters who haven’t done anything big yet outside waterfall, and just throw away all the planning steps and hope they can adjust later.

The problem is that the analysis never seems to finish – how can it with no definition of done… Instead, people jump from one analysis task to the next and we end up with a load of 80% complete parts that don’t add up to anything useful.

I believe Agile planning and analysis can be done successfully, but as with anything in software development you need to follow some basic rules which I would suggest are:

  1. Prioritise – some analysis has a fundamental impact on the project, some is detail or tweaking. Do the big stuff first, or you end up throwing away a lot of work from options later dropped.
  2. Have a definition of done. Nothing is ever analysed 100%, nor should it be. Define how much certainty is needed, and make sure it is sensible and consistent across all tasks.
  3. Write it down and Sign it off. Do it Agile if you can (stories in Jira, great), but make sure everyone is doing the same project!
  4. Timebox and Review. Make sure you are getting somewhere and doing so efficiently, using sprints and retrospectives or something similar.

Of course it isn’t easy to influence this in big projects where no one person is fully responsible, but I have found that by pushing these principles you can move things in the right direction. Retrospectives are particularly powerful in this regard if you can get good open participation.

Mixed Messages

In the IT industry, this classic BIOS message is a byword for unhelpful responses and nonsense requests:

But even now, with usability experts around every corner and end-to-end user testing the norm, I still see some subtle and not so subtle examples…

UBS eBanking – Wrong Password

Put in the wrong password to UBS Quotes and you get this. So if I repeat my entry, will it accept the wrong password? Hopefully not…

Less Haste, More Speed

 

My team is part onshore, next to the business users, part offshore outsourced where the two scrum teams are. Naturally in an Agile methodology this is a no-no, but rules are meant to be broken and given a choice of remote Agile or no Agile then it’s a no-brainer.

However, one thing we have found is that shorter sprints (two weeks) are actually less efficient and less Agile than slightly longer three week sprints. With overheads like planning and retrospective, the efficiency gain isn’t that surprising, but the Agility improvement is.

I put it all down to the communication lag.

Because the scrum teams are remote, there’s an inevitable delay in communication (although they are at least in virtually the same timezone). In a two week sprint there just isn’t enough time to respond, so ironically the close communication of Agile reverts to the guesses and assumptions of waterfall. In a three week sprint, as long as developers work on tasks in parallel, they have some scope to wait for responses.

It seems that in Agile the old adage of less haste more speed also applies.

 

Google Analytics – Hiding your own visits

As a web developer I’m interested in the visitor statistics for any site that I manage, but with this new blog I find that my own visits are swamping the results. On commercial sites I’ve used IP address filtering to exclude employee visits, since they are usually coming from a limited number of access points related to company offices, but in this case I view my blog from several difference devices with dynamic IP addresses.

Trawling the web I found a solution using _setVar on googlelytics.net but this approach is now deprecated.

Several more searches gave me a solution that works using _setCustomVar which is the replacement for _setVar.

Step 1 – Adding the exclusion to your site

Firstly, I assume you have the standard Google Analytics tracking code somewhere on your pages, like this:

<script type="text/javascript"> 
  _gaq.push(['_setAccount', 'UA-????????-?']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>

Then create a simple page with the following additional script:

<script>
  var _gaq = _gaq || [];
  _gaq.push(['_setCustomVar', 1, 'Me', 'yes', 1]);
</script>

(It doesn’t matter where the script goes, although I put it just below my tracking script which means I can also remove the var _gaq = _gaq || []; line).

The page content doesn’t matter (I just show a message saying my own visits are now excluded), but it shouldn’t be linked by other pages in the site or your sitemap, and should have a URL you can remember.

To exclude your own visits you simply access this page from every browser you use, and it sets the custom variable in a cookie that is used in the next step. If you clear your cookies or use a different browser you need to visit the page again before accessing the rest of your site.

Step 2 – Configuring Google Analytics

To use this cookie, we create an “Advanced Segment” that will filter tracking based on it.

  1. View the Dashboard report for the site you are interested in (the one associated with the UA-????????-? in the tracking code).
  2. In the top right corner there is a dropdown labeled Advanced Segments:, select this and it gives you the option to manage Advanced Segements.
  3. Select the Create a new advanced segment link which gives you a report builder interface.
  4. Expand the Visitors dimension in the green part on the left, and drag the Custom Variable (Key 1) entry onto the report dimension or metric area.
  5. For the Condition enter “Does not match exactly” and for the Value enter the name from your _setCustomVar call (in this case Me). Note it’s the name that you enter, not the value. It should look like this:
  6. Save the segment as “Exclude own visits” and you can now apply this to your reports by using the Advanced Segments selection screen as accessed in point 2.
  7. You can create the opposite filter by using Condition “Matches exactly” instead, and name it “Own visits”.

One thing I haven’t yet discovered is how to set an Advanced Segment to be the default view on the dashboard, comments on how to solve this would be very welcome.

Cause and Effect

One thing which really annoys me in articles is confusion or deliberate misrepresentation of cause and effect, so I thought I’d collect a few good examples to disect.

Of course this is just my opinion, which colours my reading of articles and may not be the original intention of the writer.

Man dies after Taser arrest near Bolton    (guardian.co.uk)

IPCC to investigate police use of Taser to subdue man, 53 – the third fatal arrest using stun gun or pepper spray in a week.

Clearly tasers and pepper spray are dangerous, three fatalities in a week is something worth investigating and the writer is right to raise serious concerns.

Or perhaps the first paragraph of the article is more relevant:

A man who stabbed himself in the abdomen has died after being Tasered by police officers.

I’m not a trauma specialist, but I’m fairly confident a knife in the abdomen is more likely to be the cause of death than being zapped by a taser, although I suppose being tasered as well may not improve things. I don’t imagine the chief constable who volunteered to be tasered (Top cop tastes a Taser) would have tried the same with a knife in the gut.

No doubt the post-mortem will clear things up, but it seems likely the journalist has conveniently ignored cause and effect to get a better headline.

  • Effect: Death
  • Claimed cause: Taser
  • Much more likely cause: Stab wound to abdomen

The BBC managed to find a more realistic title: Stab man Tasered by Greater Manchester Police dies

Algorithm Bashing

Strange article on the BBC site today – When algorithms control the world. I say strange because a lot of it seems just plain wrong and much of the rest just waffle, which is relatively unusual from Jane Wakefield.

For example, on film rental recommendations by algorithms:

“The algorithms used by movie rental site Netflix are now responsible for 60% of rentals from the site, as we rely less and less on our own critical faculties and word of mouth…”

OK, I can accept the second bit about word of mouth, but I think it’s fair to say most people used to base their film viewing on trailers, charts and possibly critic reviews. But if you base your critical reasoning on a trailer you’ve failed at the first step, charts are more an indicator of lead popularity and advertising budget, and critical reviews are effectively based on algorithms not understood by the user (i.e. opinion). At least the Netflix/Amazon/Blockbuster algorithms are based on my opinions/actions or those of real viewers, and I also suspect that the algorithms are far from being difficult to understand.

There’s also the usual bit of Google bashing, with no alternative solution proposed to indexing the estimated 13 billion pages on the web; my view is that the most popular predecessor, Dewey Decimal, isn’t really going to cut it although deweybrowse.org gives it a go. Maybe alphabetical by web address would be cool, like the old phone books, thus resurrecting the aardvark as an unlikely company mascot and consigning the pointless www prefix to history.

As for this one:

“Meanwhile, a transatlantic fibre optic link between Nova Scotia in Canada and Somerset in the UK is being built primarily to serve the needs of algorithmic traders and will send shares from London to New York and back in 60 milliseconds.”

Kind of like ticker tape but a bit quicker. OK, the trades were done by phone, but we’re still talking evolution here not radically new applications.

And algorithmic trading is a buzzword-friendly way of saying calculating the best trade, which I’m pretty sure the real human traders do as well, and in a similarly unpenetrable manner in most cases. Warren Buffet even publishes letters which go into some detail about Berkshire Hathaway choices, but you don’t see too many people taking this “algorithm” and making billions, there’s plenty more in the sage’s head to make it work.

Update: 26 August 2011 ~ 16:00

The corresponding Slashdot article has some interesting views.