October 30, 2009

Google Maps South Africa launches new features for 2010

Today Jaroslav Bengl, the Business Product Manager for Google Switzerland GmbH, presented a developer overview of Google Maps features released in South Africa just yesterday.

As of yesterday, the South African Google Maps has driving directions, reverse geocoding ("what is near this coordinate"), and overlays for terrain elevation, photos, Wikipedia, Panoramio, and public transit routes. Google Street View cars are surveying Johannesburg, Cape Town, Durban, Pretoria and East London - and the street view should be ready before the World Cup.

Here is a view of the Koeberg Interchange which now has directional arrows used by the route finders:


All the effort is indeed in preparation for the World Cup, for the sake of all the tourists who have become accustomed to driving directions and complete road networks in the Google Maps of their own countries. Jaroslav says South Africa is getting driving directions and street view ahead of even some European countries and cities.

Google no doubt is paying a lot of license money for access to complete and up-to-date road network data, and we have the Fifa 2010 World Cup to thank for pushing us up the list of priorities.  However, for the last few years as a Google Maps backwater, there were some people working to fill in the SA road networks and directions, namely the GPS-equipped volunteers at OpenStreetMap, who even took the trouble to mark on OpenStreetMap the changes to the Koeberg Interchange that are under construction:



On the Google Maps API side of things, the geocoding API (address->latitude/longitude) is now also available in South Africa, and the search box supports mixed languages: searching for "cape town ショッピング" where the second word is Japanese for "shopping" works as expected. However, "레스토랑 cape town" where the first word is Korean for "restaurant" brings up hotels instead.   There are many APIs for overlaying your own data on Google Maps, for example using a public KML feed. The terms of service require in any case that apps using the free Google Maps API themselves be free and open to the public.

October 29, 2009

The South African User Experience Forum

The South African User Experience Forum ("SA UX Forum") is a community of practice in the field of user experience design.

I went to a SA UX Forum event last night at 24.com, organised by Phil Barrett  of Flow Interactive and hosted by 20Four Labs, with wine from Stormhoek. About 50 people attended, mostly designers and architects, and a handful of developers like myself.

Phil Barrett spoke about innovation and sketching (especially how sketched interfaces can be iterated and refactored with the users' participation, infinitely faster than software iterations), Kath Roderick from Microsoft gave a demo of Sketchflow (part of Expression Blend), and Dennis Williams from DNA|Creative spoke about the basics of how to sketch - including what pens to use (about 5 different pens) and "how to draw stuff" for people who can't draw. They also demo'd Balsamiq Mockups a lo-fi sketching software for Adobe Air.

I thoroughly enjoyed it, even though by "interface" I usually think of an Application Progamming Interface. If you're interested, they announce events via a Google Group and Facebook.  Here's a list of their previous meet-ups and other user experience resources

October 18, 2009

The 2004 Fiesta and the loose plastic door bits

These are black plastic strips on the outside between the front and back door of the 2004 Ford Fiesta. What happens is they are glued on, and the glue is of the cheap sort that loses its adhesion over time and in the elements.

Twice, a plastic strip has come loose and vibrate at high speed, threatening to fall off. I have personally glued the strips back down with contact adhesive and test them from time to time to check if they are coming loose again.

It is a consistent manufacturing defect: the wrong choice of glue, and a design defect by not securing the strips properly.

Also, the plastic grills on the left and right of the Fiesta bumper come out easily when pressed and could easily come off if bumped.

All plastic trimmings cost a lot - R100 for radiator caps, R400 for plastic grill-bit for a bumper, probably R300-400 for the plastic bit for the door.

IOL article about it: http://www.iol.co.za/index.php?click_id=3027
in reference to:
"FMCSA"
- IOL: Wendy Knowler's Consumer Alert (view on Google Sidewiki)

October 11, 2009

Getting new habits to stick

I was reading Engineer Life: Set Up Habit Changes So It’s Hard to Fail,  which advocates applying reinforcement or "feedback" from all angles: with positive and negative reinforcement to the desired behaviour or habit  and alternative undesired behaviours - old habits or not bothering with the new habit - until repetition makes the new habit into a well-worn path. 

Here are the mentioned sources of reinforcement and the directions of reinforcement stated with parallel constructions - because it looks neat to see the same thing from four different perspectives. 

Some sources of reinforcement

  • Social reinforcement: via friends, clubs, classes, forums, coaching. Positive from encouragement and congratulations, negative from discouragement and chastisement.
  • Self-reinforcement: positive from congratulating yourself and celebrating small successes.  Negative... usually works against you.
  • Convenience: positive from making the behaviour convenient, negative from making it inconvenient. For example, being near to a gym vs far away.
  • Satisfaction: positive from making the behaviour more pleasant, negative from making it more unpleasant.  Get a bad screen to reduce time spent on the computer?
Make it easy to carry out the new behaviour

Strengthen positive reinforcements for the new behaviour by adding positive social feedback, positive self-feedback, and making it more pleasant and more convenient.

Weaken negative reinforcements for the new behaviour by removing negative social feedback, negative self-feedback, and making it less unpleasant and less inconvenient.

Make it difficult not to carry out the new behaviour

Weaken positive reinforcements for alternate behaviours by removing positive social and self-feedback, and making them less pleasant and less convenient.

Strengthen negative reinforcements for alternate behaviours by adding adding negative social and self-feedback, and making them more unpleasant and more inconvenient.

September 28, 2009

Google Sidewiki

Web-wide comment toolbars aren't new, although the web-scribblers I've tried before were barely social, never mind wiki-like.

But, Google as usual comes in with the simplest (to the user) implementation: SideWiki (official blog post)

If you are the verified owner of a site in Google Webmaster Tools, Sidewiki lets you "Write as the site owner", pinning your messages to the top.

There's some worries around about sidewiki "stealing" blog comments or fracturing the conversation around a page: but much same goes for Facebook, Twitter, Digg, Reddit, Friendfeed, etc. Facebook et al even add headers to shared links so that comments can go to facebook rather than the website.

September 10, 2009

A notation for nested data structures in Python

The Python programming language makes it easy to compose collections into nested hierachies, built up from lists, dictionaries, tuples and objects with generated attributes. One can put together a dictionary that maps a pairs of strings to lists of objects whose "calls" attribute is a dictionary mapping ints to pairs of dates and whose "topics" attribute is a list of integers. If for some reason such a nested data structure is actually returned by a function (e.g. to fill a complex report template), anyone using it will also need to understand what it holds. So, I've been refining a notation that I use in docstrings to concisely express the structure a composition of collections. Here it is by example:

  • List of strings: [name]
  • Set of strings: {name}
  • Pair of string and int: (name, age)
  • List of tuples: [(name, age)]
  • Dictionary from strings to dates: {firstname: birthdate}
  • Object with dynamic attributes: .name .age .phones=[phone]
  • Putting it all together: {(country,city): [.name .phones=[phone]]}
  • Example from the intro: {(name1,name2): .calls={phone:(start,finish)}, .topics=[topicid]}
The notation as it stands describes the semantics of a collection or composition of nested collections and not the types of the collected objects, but it could be extended to do so, for example {firstname<string>:birthdate<date>}, although the types are redundant in that case. In languages which lack convenient collection types, one would typically define classes for everything named above. There would be an Address class having "country" and "city" fields, a Person class having "name" and "age" and "phones" fields and a PersonPair having "name1" and "name2" fields and a DateRange having "start" and "finish"... which is fine if a lot of code relies on PersonPair objects and makes the structures explicit, but is annoying for throwing together ad-hoc collections.