Showing posts with label open data. Show all posts
Showing posts with label open data. Show all posts

Wednesday, October 01, 2014

Planning alerts hits the UK

https://www.mysociety.org/2014/09/30/making-planning-applications-more-open-with-the-hampshire-hub-partnership/ is pretty exciting. Schema and adoption by UK LGAs will likely help trigger matching efforts here in Australia.
Given the number of vendors is relatively small, potentially we could see a lot of councils enabling this kind of output with minimal effort.
Some platforms already provide rss (sadly underused!), and this makes a great use case example from the perspective of an LGA.

Wednesday, May 21, 2014

OpenStreetMap and Keepright: Fixing all of the redaction errors in Melbourne

The OSM license change that lead to redaction (here's a decent animation of the automated reverts) happened well over two years ago now; and a lot of remapping has taken place.

Unfortunately, humans aren't as good as some of the QA tools we have available, and that means a lot of valuable mapping is left untagged.

Keepright has been helping me find all of the untagged ways in Adelaide and Melbourne; both cities are now effectively 'clean'. Anything where the last edit was the redaction bot usually only needs a few tags or to be deleted if it's a duplicate.

I'd encourage any other mappers who feel their area is 'complete' to view it through a tool like Keepright - even if you pick as few as 5-10 errors to fix, you can make a big impact.




Saturday, April 06, 2013

New OpenStreetMap Editor available.

http://ideditor.com/ is pretty neat - it's a bit slower than potlatch, but try tracing the roof of a house.


Here's the full blog post. It certainly looks like the kind of editor you want for any kind of property data capture - imagine doing a kerbside valuation and pulling this up on an ipad to explore / add data.





Sunday, April 08, 2012

Idle tinkering - products, barcodes, freebase & wikidi

A little bit more work was done on products.freebaseapps.com this weekend. Products.freebaseapps.com simply grabs all Consumer products and renders them out as RDFa - as good relations info.

I did a bit of work to make the site more human friendly and to encourage random users who come across it to start editing.

All of that done, I still can't for the life of me get the Google Rich Snippets tool to actually render anything happily. Couple that with a variety of RDFa validators and other tools being out of action/upset with the markup in a most confusing way; and you start to think this linked data stuff is tricky...

While testing  and pounding my head against a brick wall I did come across wikidi.

I explored a bit, but couldn't decide - the content they are providing is largely freebase sourced; but there has been other data integrated (ie: prices). It's under a creative commons licence, but there's no 'bulk download' or other functionality - so getting data back out usefully is difficult.
There's no RDF/RDFa or other structured markup either - so this site is a bit of a black hole. I'm not sure I like knowing my contributions to open data are going into a location like that.



Monday, October 31, 2011

Ausgrid data sets

AusGrid are publishing data on how much people use; plus much more about their network.  It's a pity it's NSW only; but if you were wondering how green your LGA was; this is your answer.

Obviously; a heatmap would make a neat visualisation - but what else could you do with this data?

Saturday, April 30, 2011

Goodreads, Freebase

Goodreads provides an API; and has lots of data about books, editions, reviews and authors, Freebase has quite a lot of data about the same individuals.

It would be good to reconcile all of the Goodreads authors with freebase/dbpedia entries; or to populate freebase with links to goodreads reviews by ISBN.

Wednesday, June 30, 2010

Local Government Areas and IDs

The ABS have made their data creative commons; but it's still a pain to get to the data you want.

I'm trying to reconcile LGAs against our work application, freebase, and the census data - but it's a pain.

To make things a bit easier for others treading this path, here's a spreadsheet of LGAs and ABS ids for them, 2006

Saturday, November 22, 2008

OpenAustralia.org

How neat is OpenAustralia.org? I just found it today via twitter.

Even better, there's structured data available of the Hansard. I wonder if I can turn this into RDF or make it GRDDL-friendly.

I'll have to learn how to use git to get the source though.


Update


I just made a quick politics GRDDL transformation and ontology to extract data out from the hansard.

Sunday, June 08, 2008

How to extract useful OWL from Freebase schemas

So, I like Freebase a lot, but the biggest stumbling block for me was the MQL abbreviation.

It was immediately shuffled off into the too hard basket; and neglected to read the "its just JSON" bit.

Today, I went back to Freebase and started creating my own ontologies; which is actually pretty neat - the authoring tools, though a little slow, are clearly the exact kind of thing needed to make the Semantic Web a reality.

(As a side note, the importing tools for lists coupled with having slow internet is a horrible experience - I want that bit of my life back please!)

After finishing all of that useful schema authoring, I've been a bit glum: I can't use this outside of Freebase easily - There are no Freebase to OWL tools that exist, so I
decided to write some.

To use it you'll need:


It's a first run, and doesn't deal with errors at all. Later on, I'll actually throw a web frontend to it perhaps.

Using it is pretty easy:


// 1. Show me all of the types (Classes) in the Music domain (Ontology)
$domain = new FreebaseDomain('/music');
print_r($domain->listTypes());

// 2. Show me the details of all types (classes) in doconnor's mortgage industry domain (ontology)
$domain = new FreebaseDomain('/user/doconnor/mortgage_industry');
$types = $domain->listTypes();

foreach ($types as $key) {
$type = new FreebaseType($key);

print $key . ":\n";
print $type->toOWL("http://www.freebase.com") . "\n\n";
}

Thursday, May 29, 2008

Geocoding, Google Earth and Work

So I'm pretty excited at the moment, as we're finally rolling out our geocoding extras for our work application, ValEx.

This means you can see any of the 3.6 million or more Australian addresses we know about in Google Earth; search by proximity; find comparible sales to your subject property; or see your appointments for the day.

Frankly, it's all kind of amazing.

However all of that was just swept from my mind by Google Earth is embeddable in your browser.

Sunday, May 04, 2008

PEPR, XML_GRDDL and Digg's RDFa

So, Digg got RDFa all over the place.

That's pretty handy since I've just moved XML_GRDDL to a call for votes.

Why, you ask? Because you can have instant RDF from digg in a few lines of code (tip: you want to grab xml_grddl from SVN at the moment).

Saturday, April 12, 2008

Operator user script: Add to Google Contacts (GData API)

I wanted to export a hcard to my google contacts with Operator, but there was no such thing.

I went off and tinkered around with the google contacts API, and operator.

I did this all while experimenting with Flock 1.1, (by the way, Flock still sucks, but this time because it's only got a handful of sites it integrates with); so if it breaks in your fancy new firefox, don't look at me!

To use it;
Copy and Paste, save as add-google-contact.js
Install Operator
Tools, Options, Operator
User scripts tab
Find add-google-contact.js
Find a site with hcards (like this one), and export away to your Google account!

var add_google_contact_login_details = {email: false, password: false, auth_token: false};

/**
* A helper method to send http requests to the google services.
*/
function add_google_contact_send_request(method, url, content, auth, content_type) {
request = new XMLHttpRequest();

request.open(method, url, false);

if (auth) {
request.setRequestHeader("Authorization", "GoogleLogin auth=" + auth);
}

if (content_type) {
request.setRequestHeader("Content-type", content_type);
}

try {
request.send(content);

if (request.status == 200 || request.status == 201 || request.status == 409) {
return request.responseText;
}
dump(request.status);
dump(request.responseText);
} catch (ex) {
dump(ex);
}

return null;
}

/**
* Extracts information out from a hCard semantic object
* and returns a google-friendly XML representation.
*/
function add_google_contact_create_xml_from_vcard(hcard) {
var i;
var full_address;
var email;
var tel;
var url;
var xml = "";

xml += "<atom:entry xmlns:atom='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'>" + "\n";
xml += " <atom:category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' />" + "\n";

//Parse name
xml += " <atom:title type='text'>" + hcard.fn + "</atom:title> " + "\n";

xml += " <atom:content type='text'>Notes</atom:content>" + "\n";

if (hcard.email) {
for (i = 0; i < hcard.email.length; i++) {
email = hcard.email[i];

type = 'home';
if (email.type && email.type[0] == 'work') {
type = 'work';
}

xml += " <gd:email rel='http://schemas.google.com/g/2005#" + type + "' address='" + email.value + "' />" + "\n";
}
}


if (hcard.tel) {
for (i = 0; i < hcard.tel.length; i++) {
tel = hcard.tel[i];

type = 'home';
if (tel.type && tel.type[0] == 'work') {
type = 'work';
}
xml += " <gd:phoneNumber rel='http://schemas.google.com/g/2005#" + type + "'>" + tel.value + "</gd:phoneNumber>" + "\n";
}
}


if (hcard.adr) {
for (i = 0; i < hcard.adr.length; i++) {
adr = hcard.adr[i];
full_address = "";
if (adr["street-address"]) {
full_address += adr["street-address"] + " ";
}

if (adr["locality"]) {
full_address += adr["locality"] + " ";
}

if (adr["region"]) {
full_address += adr["region"] + " ";
}

if (adr["postal-code"]) {
full_address += adr["postal-code"] + " ";
}

if (adr["country-name"]) {
full_address += adr["country-name"] + " ";
}

if (full_address != "") {
xml += " <gd:postalAddress rel='http://schemas.google.com/g/2005#work'>" + full_address + "</gd:postalAddress>" + "\n";
}
}
}


xml += "</atom:entry>" + "\n";

return xml;
}

/**
* Send a create contact request for the email & auth_token provided.
*
* The contact is described in xml.
*
* @see add_google_contact_create_xml_from_vcard()
*/
function add_google_contact_create_contact(email_address, auth_token, xml) {
url = 'http://www.google.com/m8/feeds/contacts/' + escape(email_address) + "/base";

return add_google_contact_send_request("POST", url, xml, auth_token, "application/atom+xml");
}

/**
* Fetch an authorisation token for a given
* username and password
*
* @return An authorisation token string
*/
function add_google_contact_login(username, password) {
var url = 'https://www.google.com/accounts/ClientLogin';
var content = "";

content += "accountType=HOSTED_OR_GOOGLE";
content += "&Email=" + username;
content += "&Passwd=" + password;
content += "&service=cp";
content += "&source=NoCompany-Operator-0.1";


response = add_google_contact_send_request("POST", url, content, null, "application/x-www-form-urlencoded");


// Sample response
/*
HTTP/1.0 200 OK
Server: GFE/1.3
Content-Type: text/plain

SID=DQAAAGgA...7Zg8CTN
LSID=DQAAAGsA...lk8BBbG
Auth=DQAAAGgA...dk3fA5N
*/
if (response) {
parts = response.split("\n");
return parts[2].substring(5);
}

return null;
}

function add_google_contact_get_login_details() {
var passwordManager = Components.classes["@mozilla.org/passwordmanager;1"]
.getService(Components.interfaces.nsIPasswordManager);

var e = passwordManager.enumerator;

//Ask the existing password manager for google account details
var queryString = 'https://www.google.com';

while (e.hasMoreElements()) {
try {
var pass = e.getNext().QueryInterface(Components.interfaces.nsIPassword);

if (pass.host == queryString) {
email_address = pass.user;
password = pass.password;

//TODO: Check if the email_address is valid (I store my username without the @ details)
return {email: email_address, password: password, auth_token: false};
}
} catch (ex) {
dump(ex);
}
}

//We didn't find the details. Oh dear.
//Better ask nicely.

var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);


email_address = {value: ""};
password = {value: ""};
check = {value: true};

var result = prompts.promptUsernameAndPassword(null, "", "Enter email and password for your Google Account:",
email_address, password, "Remember password", check);


if (check.value) {
try {
passwordManager.addUser(queryString, email_address.value, password.value);
} catch (ex) {
dump(ex);
}
}

return {email: email_address, password: password, auth_token: false};
}


var add_google_contact = {
description: "Add to Google Contacts",
shortDescription: "Add Google Contact",
scope: {
semantic: {
"hCard" : "fn"
}
},
doAction: function(semanticObject, semanticObjectType, propertyIndex) {
//Do we have login details?
if (add_google_contact_login_details.email == false) {
add_google_contact_login_details = add_google_contact_get_login_details();

//If the user cancelled finding them...
if (add_google_contact_login_details.email == false) {
return false
}
}

if (!add_google_contact_login_details.auth_token) {
add_google_contact_login_details.auth_token = add_google_contact_login(add_google_contact_login_details.email,
add_google_contact_login_details.password);
}

xml = add_google_contact_create_xml_from_vcard(semanticObject);

result = add_google_contact_create_contact(add_google_contact_login_details.email, add_google_contact_login_details.auth_token, xml);
}
};

SemanticActions.add("add_google_contact", add_google_contact);

Sunday, March 23, 2008

How to make OpenID really rock (user signup process)

Robby finds himself asking why come I have 75 openids, and why can't I just transfer my details from site to site?

Well Robby, this is for you.


First, you need to grab XML_GRDDL. It's fairly stable at the moment, and a PEPR proposal.

For now, do a

pear install http://xmlgrddl.googlecode.com/files/XML_GRDDL-0.0.4.tgz

... but if it gets through PEPR, this will be easier.


Be warned, you'll need version of PHP 5.2.5+ unless you can compile php with a decent version of libxml / libxslt.

You also need the XSL extension.

Open up your favourite editor.

Paste in:

require_once 'XML/GRDDL.php';

/**
* Example: Fetch multiple URLs about a specific user
* and get useful information out.
*/
$urls = array();
$urls[0] = 'http://flickr.com/people/clockwerx/';
$urls[1] = 'http://www.linkedin.com/in/clockwerx';
$urls[2] = 'http://www.last.fm/user/CloCkWeRX/';
$urls[3] = 'http://clockwerx.blogspot.com/';

//For each URL, pretend it has these urls in <head profile="foo" />
//These look for hcard, hcalendar, etc.
$profiles[$urls[0]][] = 'http://www.w3.org/2002/12/cal/cardcaletc';
$profiles[$urls[1]][] = 'http://microformats.org/wiki/hresume-profile';
$profiles[$urls[1]][] = 'http://www.w3.org/2002/12/cal/cardcaletc';
$profiles[$urls[2]][] = 'http://www.w3.org/2002/12/cal/cardcaletc';
$profiles[$urls[3]][] = 'http://www.w3.org/2002/12/cal/cardcaletc';

//Set what kind of transformations we're interested in.


$options = XML_GRDDL::getDefaultOptions();
$options['quiet'] = true;

$grddl = XML_GRDDL::factory('xsl', $options);
$results = array();
foreach ($urls as $n => $url) {
$data = $grddl->fetch($url);

$data = $grddl->prettify($data);

$modified_data = $grddl->appendProfiles($data, $profiles[$url]);

$stylesheets = $grddl->inspect($modified_data, $url);

$rdf_xml = array();
foreach ($stylesheets as $stylesheet) {
$rdf_xml[] = $grddl->transform($stylesheet, $modified_data);
}

$results[$url] = array_reduce($rdf_xml, array($grddl, 'merge'));
}

print "We scuttered " . count($urls) . " urls and found these results\n";
foreach ($results as $url => $rdf_xml) {
print $url . "\n";

$sxe = simplexml_load_string($rdf_xml);
$sxe->registerXPathNamespace('vcard', 'http://www.w3.org/2006/vcard/ns#');
$sxe->registerXPathNamespace('ical', 'http://www.w3.org/2002/12/cal/icaltzd#');

print "We found the following pieces of information, choose which are yours:\n";
$xpaths = array();
$xpaths["Formatted name"] = '//vcard:fn';
$xpaths["First name"] = '//vcard:givenName';
$xpaths["Last name"] = '//vcard:familyName';
$xpaths["Email"] = '//vcard:email';
$xpaths["Homepage or URl"] = '//vcard:url';
$xpaths["Workplace name"] = '//vcard:organization-name';
$xpaths["Photo URL"] = '//vcard:photo';
$xpaths["Locality"] = '//vcard:locality';
$xpaths["Position/Title"] = '//vcard:title';

foreach ($xpaths as $name => $xpath) {
$results = $sxe->xpath($xpath);
if (empty($results)) {
continue;
}

print $name . ": ";
foreach ($results as $node) {
print trim((string)$node);
$attributes = $node->attributes(XML_GRDDL::RDF_NS);
if (!empty($attributes['resource'])) {
print trim((string)$attributes['resource']);
}
print "\n";
}
}
//print $rdf_xml . "\n\n";
print "\n";
}


Save it, run it.

You *should get*:

---------- PHP ----------
We scuttered 4 urls and found these results
http://flickr.com/people/clockwerx/
We found the following pieces of information, choose which are yours:
Formatted name: DanielO'Connor
First name: Daniel
Last name: O'Connor
Homepage or URl: http://clockwerx.blogspot.com/
Locality: Klemzig
Position/Title: Web Developer

http://www.linkedin.com/in/clockwerx
We found the following pieces of information, choose which are yours:
Formatted name: Daniel
O'Connor
Adelaide Institude of TAFE
PEAR member
LIXI Members member
First name: Daniel
Last name: O'Connor
Homepage or URl: http://http;//clockwerx.blogspot.com
http://www.valuationexchange.com.au
Workplace name: PEAR
Valuation Exchange
Fresh FM
Self-employed
Adelaide Institude of TAFE
PEAR member
LIXI Members member
Locality: Adelaide Area, Australia
Position/Title: Developer at Valuation Exchange
Contributer
Software Developer
Web Developer
Freelancer

http://www.last.fm/user/CloCkWeRX/
We found the following pieces of information, choose which are yours:
Formatted name: Daniel O'Connor
NoBloodForOil
Homepage or URl: http://clockwerx.blogspot.com
Photo URL: http://userserve-ak.last.fm/serve/160/682792.jpg
http://userserve-ak.last.fm/serve/50/690470.gif

http://clockwerx.blogspot.com/
We found the following pieces of information, choose which are yours:
Formatted name: Daniel O'Connor
Email: mailto:daniel.oconnor@gmail.com
Homepage or URL: http://clockwerx.blogspot.com/
xmpp:daniel.oconnor@gmail.com
Workplace name: Valuation Exchange


Output completed (30 sec consumed)


Now, how neat is that. You can grab any url which publishes microformats, grab out the hcards from it, grab the information from those, and viola! A pre-populated signup form.


Why is this neat?
* If an OpenID url has Microformats, bam! You can read it.
* If you are a bit more hardcore, you can hook up xOperator and a triplestore to this information.
* Or you could use it in Drupal.

There you have it, ladies and gents: semantic web in a box, with practical applications for user signup.

Tuesday, March 11, 2008

Microformats vs Machines

I've been toiling away in the background for a few weeks now, slowly pushing XML_GRDDL through its paces, and the GRDDL spec tests.

It's finally at a point I'm mostly happy with - it fails some xml:base related tests, and doesn't like content negotiation - though it's hard to test against a misconfigured setup.

So now that I've hit a happy place, I thought I might as well do some explorations - particularly of microformats to RDF.

So, who's got real world microformats? Flickr! Upcoming! Hurray! Or maybe not quite GRDDL friendly formats.

Not even Tantek really bothers with profiles - apart from XFN.

Now I'm about stumped. How do I convince the vast majority of microformat users to look sideways at a //head[@profile] containing GRDDL friendly information?

Especially since the driving matra behind microformats is people first, machines second

Tuesday, March 04, 2008

Open Data and Buses

Since my last tangle with the buses has left me angry about open data, it's a pleasure to come across this hublog pointer to helsinki e-buses.

Follow the links and read the articles - London is spending 117 million pounds on an e-fleet of buses, all running windows and with no plans for openness. Helsinki runs linux, and barcodes bustops.

Guess which one is cheaper and more useful?

Tuesday, February 26, 2008

xOperator, the Valuation Industry, XSLT, GRDDL and RDF

I just discovered the most amazing thing. It's a jabber/xmpp sparql interface, called xOperator.

It sits between you, the end user, and multiple other agents and datastores. It uses XMPP (Google talk!) to interact with you.

You say things like:

me: add ds DBPedia http://dbpedia.org/sparql

me: query SELECT ?name WHERE {
?musician skos:subject <http://dbpedia.org/resource/Category:Australian_musicians> .
?musician foaf:name ?name .
}

bot: (Alright, this is dummied up, but I *did* have it working with other stuff before)
"Ben Lee"@de
"Billy Thorpe"@de
"Brody Dalle"@de
"Charlie McMahon"@de
"Craig Nicholls"@de
"Daevid Allen"@de
"Delta Goodrem"@de
"Fritz Hart"@de
"James George Thirlwell"@de
"Joe Dolce"@de
"Johnny Diesel"@de
"Kasey Chambers"@de
"Kevin Johnson"@de
"Natalie Gauci"@de
"Percy Aldridge Grainger"@de
"Peter Garrett"@de
"Peter Allen"@de
"Rick Springfield"@de
"Richard Franklin"@de
"Sophie Monk"@de
"Steven Kilbey"@de
"Stevie Wright"@de
"Tina Arena"@de
"Toni Collette"@de

me: add template "Tell me about *" "PREFIX owl: <http: org="" 2002="" 07="">
PREFIX xsd: <http: org="" 2001="">
PREFIX rdfs: <http: org="" 2000="" 01="">
PREFIX rdf: <http: org="" 1999="" 02="">
PREFIX foaf: <http: com="" foaf="" 1="">
PREFIX dc: <http: org="" dc="" elements="" 1="">
PREFIX : <http: org="" resource="">
PREFIX dbpedia2: <http: org="" property="">
PREFIX dbpedia: <http: org="">
PREFIX skos: <http: org="" 2004="" 02="" skos="">


SELECT ?name WHERE {
?thing skos:subject <http: org="" resource=""> .
?thing foaf:name ?name .
}"

bot: template added

me: Tell me about German_musicians

me: Tell me about German_artists
bot: Store dbpedia answered:
name
"A. R. Penck"@de
"Adolf Ziegler"@de
"Adolph Menzel"@de
"Albrecht Altdorfer"@de
"Alfred Harth"@de
"Alfred Rethel"@de
"Alfred Mahlau"@de
"André Butzer""@de
"Bruno Paul"@de
"Bärbel Bohley""@de
"Carl Grossberg"@de
"Carsten Höller""@de
"Charles Crodel"@de
"Christian Möller""@de
"Christoph Meckel"@de
"Christoph Ruckhäberle""@de
"Cosmas Damian Asam"@de
"Dieter Grossmann"@de
"Dieter Roth"@de
"Eberhard Bosslet"@de
"Eberhard Havekost"@de
"Egid Quirin Asam"@de
"Elsa von Freytag-Loringhoven"@de
"Ernst Deger"@de
"Hugo Höppener""@de
"Franz Joseph Spiegler"@de
"Franz Wilhelm Seiwert"@de
"Franz Xaver Feuchtmayer der Jüngere""@de
"Franz Xaver Feuchtmayer"@de
"Frieder Nake"@de
"Fritz Maurischat"@de
"Gerd Aretz"@de
"Gerd Arntz"@de
"Gert Heinrich Wollheim"@de
"Gert Neuhaus"@de
"Hans Haacke"@de
"Hannah Höch""@de
"Hans Grundig"@de
"Hans Richter"@de
"Heiko Daxl"@de
"Heinrich Aldegrever"@de
"Herma Auguste Wittstock"@de
"Herbert Holzing"@de
"Horst Janssen"@de
"Horst Antes"@de
"Ignaz Günther""@de
"Jankel Adler"@de
"Hans Arp"@de
"Jim Avignon"@de
"Johann Peter Melchior"@de
"Johann Baptist Straub"@de
"Johann Joachim Kändler""@de
"Johann Joseph Christian"@de
"Johann Melchior Dinglinger"@de
"Johann Baptist Zimmermann"@de
"Johann Michael d.J. Feuchtmayer"@de
"Johannes Baader"@de
"Jonas Burgert"@de
"Joseph Anton Feuchtmayer"@de
"Gotthard Johnny Friedlaender"@de
"Jonathan Meese"@de
"Joseph Beuys"@de
"Karin Ulrike Soika"@de
"Karl von Fischer"@de
"Karl Hubbuch"@de
"Klaus Herlitz"@de
"Konrad Peter Cornelius Klapheck"@de
"Kurt Wegner"@de
"Leo Kahn"@de
"Franz Karl Leopold von Klenze"@de
"Lore Lorentz"@de
"Ludwig Fahrenkrog"@de
"Martin Kippenberger"@de
"Manfred Mohr"@de
"Manfred W. Jürgens""@de
"Maria Innocentia Hummel"@de
"Mariele Neudecker"@de
"Werner Mathias Goeritz Brunner"@de
"Mary Bauermeister"@de
"Max Ernst"@de
"Michael Buthe"@de
"Matthäus Günther""@de
"Michael Sowa"@de
"Otto Eckmann"@de
"Otto Hupp"@de
"Ottmar Hörl""@de
"Otto Pankok"@de
"Otto Piene"@de
"Peter Vischer"@de
"Peter Dreher"@de
"Rebecca Horn"@de
"Ruben Talberg"@de
"Rosemarie Trockel"@de
"Sandra Rauch"@de
"Silvia Quandt"@de
"Thomas Eller"@de
"Thomas Schütte""@de
"Tilman Riemenschneider"@de
"Tomma Abts"@de
"Torsten Amft"@de
"Uwe Laysiepen"@de
"Veit Stoß""@de
"Virgil Solis"@de
"Wilfried Behre"@de
"Wilhelm Heine"@de
"Wilm Weppelmann"@de
"Wolfgang Joop"@de
"Wolfgang Müller""@de
"Wolfgang Tillmans"@de
"Evi Moechel"@de

(10:22:30 PM) clockwerx@livejournal.com/Home: Tell me about Australian_musicians
(10:22:32 PM) daniel.oconnor: Store dbpedia answered:
name
"Ben Lee"@de
"Billy Thorpe"@de
"Brody Dalle"@de
"Charlie McMahon"@de
"Craig Nicholls"@de
"Daevid Allen"@de
"Delta Goodrem"@de
"Fritz Hart"@de
"James George Thirlwell"@de
"Joe Dolce"@de
"Johnny Diesel"@de
"Kasey Chambers"@de
"Kevin Johnson"@de
"Natalie Gauci"@de
"Percy Aldridge Grainger"@de
"Peter Garrett"@de
"Peter Allen"@de
"Rick Springfield"@de
"Richard Franklin"@de
"Sophie Monk"@de
"Steven Kilbey"@de
"Stevie Wright"@de
"Tina Arena"@de
"Toni Collette"@de



Big whoop you say.

Well, I've been working on both an XML_GRDDL package (php5), and the relevant GRDDL transformations to turn LIXI Valuation documents into the relevant RDF/XML representation.

I'm also re-deploying work's internal Jabber server in the not too distant future.

So:
1. We handle a pretty big chunk of all residential valuations within Australia.
2. A lot of that gets described adequately in LIXI
3. There's now or soon to be a GRDDL transformation or two for that
4. And a GRDDL parser for PHP
5. Add in xOperator
6. Add in robust jabber services
7. Mix in a few microformats as well

Viola:
My workplace is half a step away from becoming a knowledge enterprise as well as a valuation panel manager.

That's not bad for a few days off!

Imagine these future scenarios:

Working smarter with internal data and external clients:

Internal xOperator to answer questions like "show me similar valuations we've done to address xyz", and "show me everything valuer X has completed over $1million"

Paid commercial access to a SPARQL service as well, for larger clients who want to better understand the marketplace
Paid commercial access to an xOperator style service for smaller clients, who just want a couple of pre-built, on demand answers


Publishing old (> 12-24 months) LIXI data on the web
Merge our data up with other countries, like the US, for trend analysis
Provide anonymized public data, with http basic auth. to protect names, addresses, privacy
Merge diverse sets of data - ie, imagine EuroStat data for Australia, but with an atomic level of detail available about the raw input

Provide semi-automated valuations based on known data
Suburb X has a population of Y and an area of Z (db/wikipedia), factor that into calculations

Tuesday, November 13, 2007

Local Government Areas

Can anyone find me a list of Local Government Areas in Australia?

The best I can find is the mystery Appendix F.

While that's a good start, and annual reports from there on in only include changes, I can't seem to find a list of postcodes / suburbs those local government areas contain.

Sunday, October 28, 2007

More feedback to the Government

I was wandering around the Green Vehicle Guide and I found a link or two about reusing their data - you just have to seek permission from the right people.

So I followed it and stumbled across this: Statement of IP Principles for Australian Government Agencies (read PDF).

It pissed me off to no end, as I've wasted time dealing with people who don't seem to be aware of this.

Basically; the document linked to boils down to:
  • Open your data
  • If a business a can use it; consider letting them
  • More data, more access equals more jobs
  • More access means the public is better informed
  • Be flexible

The bit I really liked was:
Agencies should encourage public use and easy access to copyright material that
has been published for the purpose of:
.. snip ..
facilitating access to government services
.. /snip ..

So after being treated liked a moron the last time I tried to do something, the moment I saw a Feedback on Copyright / etc link; I bashed out:

This is just general feedback about public access to IP here in South Australia.

I recently contacted the DTEI here about gaining access to data - bus routes and timetables in a plain text format ('csv').

I wanted to create a 'google maps' type application to view the data on, and otherwise have better access to it. I had no commercial aims for it, and was very clear about that.

I also wanted it because the current way to view this data on the web is horrible and hard to use.

I'm a software engineer, so I [also] wanted to combine it with other data sets: for example a list of restaurants to create a 'find me a bus route to my restaurant booking @ 8pm Sunday'.

I was initially rebuffed; then after further persistence, I was invited a meeting - I thought I was in luck.

When I went in, after taking half of a day off from my full time work, I was completely stuffed around.
There appeared to be little or no understanding of 'Intellectual Property Principles for Australian Government agencies'.

I felt ridiculed by the way I was spoken to and treated.

Every question I asked was met with a look of confusion or a half hearted refusal.

While I can understand there is a balance between protecting commercial IP and public access, those I spoke to had no concept of a member of the public being able to make use of data.

I wasn't made aware of any other possible avenues or approaches I could take - basically; the matter was 'closed'.

I no longer wish to obtain this data, but I thought I'd let you know a first hand experience about us members of the public getting access to IP / data; and what (at least one) individual representing the government knows of your recommendations.

Your move, Australian government!


Update: My move again.

Dear Mr O'Connor

I refer to your email below to the Commonwealth Copyright Administration
requesting to use data - bus routes and timetables from The Department for
Transport, Energy and Infrastructure (DTEI) website. The DTEI administer
their own requests to use information from their website.

There is an online feedback form located at the following weblink
http://www.dtei.sa.gov.au/online_feedback_form.html

Regards
Commonwealth Copyright Administration
Attorney General's Department

Saturday, October 20, 2007

Songbird webpage api, bits, pieces, and notes

Imagine this scenario:

You are using your media player/browser, and you stumble across a track on a webpage. You preview it. You like it. There's no information on the webpage about where it's from, but luckily, the mp3 is tagged correctly.

You hit a button on your media browser, and bam! You can find popularity information on Last.fm, prices on Amazon, full album information on Musicbrainz. Last.fm suggests a similar artist. The process rinses and repeats. You get to stuff yourself full of delicious music.

To see (some of) this in action; fire up Songbird 0.3 or greater, play some tunes, and go explore.

Last.fm's API is being used to render information that the page asked songbird about.
Sweet.

Look at the code underneath: simple javascript. More about songbird's webpage api. That's pretty easy looking.


Other notes and odds and ends:
Songbird now takes regular firefox extensions, (say hello to greasemonkey) and Freebase is awesome.

Basically: Freebase has an API, it's got data from wikipedia, and you can do things like search for episodes of Battlestar Galactica. Or shows produced by JJ Abrahams.

So, mix the power of Songbird's webpage api with the vast data of wikipedia/freebase, sprinkle in a few applications, and you've got something far more fun looking than a simple google maps mashup.

Throw in greasemonkey and operator, and you can scrape information from pages into microformats. Then export them.