by Rob Styles at 2009-07-02T20:31:32Z
by Rob Styles at 2009-07-02T20:31:32Z
For Ian Davis‘ birthday, Danny Ayers sent out an email asking people to make some previously unavailable datasets accessible as linked data as Ian’s present. It was a pretty neat idea. One that I wish I had thought of.
Given that Ian is my boss (prior to about a month ago, Ian was just nebulously “above me” somewhere in the Talis hierarchy, but I now report to him directly) one could cynically make the claim that by providing Ian a ‘linked data gift’ that I would just be currying favor by being a kiss-ass. You could make that claim, sure, but evidently you are not aware of how I hurt the company.
Anyway, as my contribution, I decided to take the data dumps from LibraryThing that Tim Spalding pretty graciously makes available [whoa, in the time that I first started this post until now, the data has gone AWOL, I suppose I did this just in time]. The data isn’t always very current and not all of the files are terribly useful (the tags one, for example, doesn’t offer much since the tags aren’t associated with anything — it’s just words and their counts), but it’s data and between ThingISBN and the WikipediaCitations I thought it would be worth it.
I wanted to take a very pragmatic approach to this: no triple store, no search, no rdf libraries, minimal interface. Mostly this was inspired by Ed Summers‘ work with the Library of Congress Authorities, but, also, if Tim (or, whoever at LibraryThing) saw that making LibraryThing linked data was as easy as a few template tweaks (as opposed to a major change in their development stack) this exercise was much more likely to actually make its way into LibraryThing.
What I ended up with (the first pass released before the end of Ian’s birthday, I might add) was LODThing: a very simple application written in Ruby’s Sinatra framework, DataMapper and SQLite. The entire application is less than 230 lines of Ruby (including the web app and data loader) plus 2 HAML templates and 2 builder templates for the HTML/RDFa and RDF/XML, respectively. The SQL database has three tables, including the join table. This is really simple stuff. The only real reason it took a couple days to create was trying to get the data loaded into SQLite from these huge XML files. Nokogiri is fast (well, Ruby fast), but a 200 MB XML file is pretty big. It was nice to get acquainted with Nokogiri’s pull parser, though.
There are a few things to take away from this exercise.
LODThing isn’t really intended for human consumption, so there’s no real “default way in”. The easiest way to use it is to make a URI from an ISBN:
If you know the LibraryThing ‘work ID’, you can get in that way, too:
Also, you can all of these resources as RDF/XML by replacing the .html with .rdf.
So, Tim, you wrote on the LT API page that you would love to see what people are doing with your data, here you go. It would be even more awesome if it made it’s way back into LT — after all, it would alleviate some of the need for you to have a special API for this stuff.
Also, special thanks to Toby Inkster for providing a ton of help in getting this to resemble something that a linked data aware agent would actually want and finally turning the httpRange-14 light bulb on over my head. He also immediately linked to it from his Amazon API LODifiier, which is sort of cool, too.
I’ll be happy to throw the sources into a github repository if anybody’s interested in them.
by Ross at 2009-07-02T16:39:04Z
Clive got the job after his Video CV, and now we join him at the end of his first week.
by Tim Hodson at 2009-07-02T16:01:17Z

He also defends professional journalism, arguing forcibly that at best, citizen journalism can only ever complement professional journalism unless we are to resign ourselves to second-rate poorly-informed information:To make a top-quality recording today… an “exquisitely slow and detailed album… ideally would take a full year and, given the price of top contemporary musicians, could cost a million dollars. But this kind of investment… can’t be earned back in a market where people are buying fewer and fewer compact discs. So recording artists necessarily compromise their music because it is not economically viable to hire the best musicians and take enough time making the recording.
Despite my reservations around the record of professional journalists for delivering a consistently in-depth and accurate view of conflicts such as the second Gulf War (weren't they essentially spoon-fed information from the military?), or the political demonstrations of theThomas Friedman, the New York Times columnist, and Robert Fisk, the Middle Eastern correspondent of the Independent newspaper, for example, didn’t hatch from some obscure blog – they acquired their in-depth knowledge of the Middle East by spending years in the region.
I’m hugely sympathetic with Keen at a cultural level. I hate the thought of snippets of content becoming so prevalent that people no longer read a book in a linear fashion – have we collectively thought about the intellectual consequences of this? And I do share his nostalgia for Tower Records – in my case based in Piccadilly Circus, just round the corner from Haymarket in London, where I worked for years in my 20s. Yes it sometimes feels like the soul has been taken out of music. Stuart Maconie recently reported on radio 2 that over 40% of people no longer listen to a complete musical track let alone album – they get what they want from it emotionally, and then move on. What room is there for the pop grower, let alone the complexity of classical or operatic works?
But, on the other hand, not everyone had access to the rich variety of music on offer at Tower Records in LA or London, whereas now the cultural divide between kids in Manchester and kids in, say, the Lake District, must surely be narrowing as access to culture levels off with ubiquitous internet availability.
He makes a very very important point with regard to Web 2.0 user-generated content, namely that it is to a great extent dependent on professionally produced content i.e. it’s highly derivative, and yet it is simultaneously destroying that content.
So basically, at the level of description at least, I find much to applaud in The Cult of the Amateur. And that’s really what I expected from this book. I truly expected to identify some sort of soul sibling who shared my commitment to ensuring intellectual integrity in a Web 2.0 context, but who nevertheless espoused new technologies in terms of their potential for furthering human progress.
However early on in the book I started to get a bit concerned. It started here, in the introduction:
It’s ignorance meets egoism meets bad taste meets mob rule, on steroids.
Plus…
…if you provide infinite monkeys with infinite typewriters, some monkey somewhere will eventually create a masterpiece.
And…
… instead of creating masterpieces, these millions and millions of exuberant monkeys – many of them with no more talent in the creative arts than our primate cousins – are creating an endless digital forest of mediocrity.
References to “mob rule” and comparisons of human beings with monkeys seemed to me to be a highly elitist and dangerously anti-human articulation of concerns around cultural decline. Why is Keen deploying such unattractive arguments? Personally I’d say it’s a consequence of the overall faultiness of his critique. Keen argues that reasoned informed analysis is now in short supply, as we become swamped with inexpert user-generated content. Yes, Web 2.0 may have exacerbated that trend, and it has certainly surfaced it. But is Web 2.0 really to blame? Did
some golden era of informed analysis come abruptly to an end in 2004 when a bunch of moneyed Californian geeks (that most of us have never heard of) went off camping together?
Keen’s deepest concern is a feeling that truth itself is under threat:
This undermining of truth is threatening the quality of civil public discourse,
encouraging plagiarism and intellectual property theft, and stifling creativity.
When advertising and public relations are disguised as news, the line between
fact and fiction becomes blurred.
Surely Keen can’t be arguing that the “undermining of truth” began with the inception of Web 2.0 technologies? I’m no expert on philosophy, but didn’t cultural relativism start to gather force way back almost half a century ago in the 1960s? Yet he does seem to be saying that:
Yes, that means that if the community changes its mind and decides that two plus
two equals five, then two plus two does equal five.
The problem is that by failing to trace back intellectual trends historically, Keen seems to be leading us irresistibly to the conclusion that only Web 2.0 can be the cause. Isn’t it more helpful,
though, to see Web 2.0 as a phenomenon that became technically feasible precisely at a point in history where humanity’s uncertainty about its mission has deepened over a period of time, and society has fragmented to the point that:
every posting is just another person’s version of the truth; every fiction is
just another person’s version of the facts.
So I see the value in Keen’s descriptions of the web’s impact in areas such as music, industry and books. But I’m less certain about his ability to analyse that impact in terms of underlying causes and forces at play.
It’s a very enjoyable and engaging read though. The sheer vitriol is immensely entertaining, not to say refreshing in this politically correct world in which so many of us shy away from forthright statements of conviction.
But towards the end I came to understand that it wasn’t just the analysis that was a problem. Many of my disagreements are rooted in the fact that Keen’s motives for writing the book were at variance from my motives for reading it. When Keen writes that “our real moral responsibility is to protect mainstream media against the cult of the amateur”, I perceive that
his interests are too narrow to enable him to write the book I want him to write.
It is surely time to examine dispassionately at the broadest level what is gained and what is lost with user-generated content. But maybe that will only become possible once we collectively re-engage with the realm of ideas and re-gain an understanding of what we need them for.
by Sarah B. at 2009-07-01T20:07:57Z
by Rob Styles at 2009-07-01T10:30:41Z
I'm not going to try to explain RDF and/or RDFa here, but thought any poor suckers looking for RDFa examples might benefit from me posting what I finally worked out, with help from my colleague Rob. Namely, how to annotate an HTML ordered list (<ol>) with RDFa attributes; and how to put RDFa attributes onto form elements.
Here's the HTML page with RDFa embedded in it. What I'm representing here is a sequence of collections, and the individual collections within it:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Collections</title>
</head>
<body>
<h1>Collections</h1>
<form method="post" action="http://receptacular.org/collections">
<ol xmlns="http://www.w3.org/1999/xhtml" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rec="http://receptacular.org/schema#" typeof="rdf:Seq" about="http://receptacular.org/collections">
<li rel="rdf:_1" resource="http://receptacular.org/collections/1">
<span style="display:none;" rel="rdf:type" resource="http://receptacular.org/schema#Collection"></span>
<div class="collection-label" property="rdfs:label">Vague Collection</div>
<input type="checkbox" id="collections-1-hidden" property="rec:hidden" datatype="xsd:boolean" content="false"/>
<label for="collections-1-hidden">hidden</label>
<input type="checkbox" id="collections-1-defaultSearch" property="rec:defaultSearch" datatype="xsd:boolean" content="false"/>
<label for="collections-1-defaultSearch">use for searches</label>
</li>
<li rel="rdf:_2" resource="http://receptacular.org/collections/2">
<span style="display:none;" rel="rdf:type" resource="http://receptacular.org/schema#Collection"></span>
<div class="collection-label" property="rdfs:label">Archive Collection</div>
<input type="checkbox" id="collections-2-hidden" property="rec:hidden" datatype="xsd:boolean" content="false"/>
<label for="collections-2-hidden">hidden</label>
<input type="checkbox" id="collections-2-defaultSearch" property="rec:defaultSearch" datatype="xsd:boolean" content="false"/>
<label for="collections-2-defaultSearch">use for searches</label>
</li>
<li rel="rdf:_3" resource="http://receptacular.org/collections/3">
<span style="display:none;" rel="rdf:type" resource="http://receptacular.org/schema#Collection"></span>
<div class="collection-label" property="rdfs:label">Main Collection</div>
<input type="checkbox" id="collections-3-hidden" property="rec:hidden" datatype="xsd:boolean" content="true" checked="checked"/>
<label for="collections-3-hidden">hidden</label>
<input type="checkbox" id="collections-3-defaultSearch" property="rec:defaultSearch" datatype="xsd:boolean" content="true" checked="checked"/>
<label for="collections-3-defaultSearch">use for searches</label>
</li>
</ol>
<p>
<input type="button" value="Save" id="save-collections"/>
</p>
</form>
</body>
</html>
Available online here: http://receptacular.org/collections
Things of note:
To see the RDF which can be extracted from this page, you can use the W3C's RDFa Distiller. Here's the resulting RDF:
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:dist="http://www.w3.org/2007/08/pyRdfa/distiller#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:rec="http://receptacular.org/schema#"
xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
>
<rdf:Seq rdf:about="http://receptacular.org/collections">
<rdf:_1>
<rec:Collection rdf:about="http://receptacular.org/collections/1">
<rec:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</rec:hidden>
<rec:defaultSearch rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</rec:defaultSearch>
<rdfs:label>Vague Collection</rdfs:label>
</rec:Collection>
</rdf:_1>
<rdf:_2>
<rec:Collection rdf:about="http://receptacular.org/collections/2">
<rec:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</rec:hidden>
<rec:defaultSearch rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</rec:defaultSearch>
<rdfs:label>Archive Collection</rdfs:label>
</rec:Collection>
</rdf:_2>
<rdf:_3>
<rec:Collection rdf:about="http://receptacular.org/collections/3">
<rec:hidden rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</rec:hidden>
<rec:defaultSearch rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</rec:defaultSearch>
<rdfs:label>Main Collection</rdfs:label>
</rec:Collection>
</rdf:_3>
</rdf:Seq>
</rdf:RDF>
Saving changes to an RDFa-enabled form like this is another challenge, for which we used rdfquery, and RDF library for JQuery. (I recommend you use the latest svn HEAD version of this library, as older versions have a bug where they ignore RDFa elements nested inside elements without RDFa attributes.) Maybe I'll get round to that another time.
by elliot at 2009-06-30T09:52:35Z
This is a Ruby script which randomly copies mp3 files from one directory to an mp3 player. I wrote it so I could easily fill up my mp3 player from the 9000 odd mp3s I have on a different external drive.
To run it, you'll need the sys-filesystem gem (see http://rubyforge.org/projects/sysutils):
$ gem install sys-filesystem
Next, edit these variables in the script (near the top):
* source_dir to the directory containing the mp3s you want to select from
* dest_dir to the path for the directory on your mp3 player you want to copy to
Be a bit careful, as this will attempt to fill the dest_dir you specify with mp3 files from source_dir. You might end up filling the wrong disk up.
Then just run it with ruby from the command line:
$ ruby mp3s_random.rb
Note that it won't delete anything from the destination drive, and will attempt to fill all the space available. Also note that it doesn't keep trying mp3s until it finds one which will fit the last remaining space: once it tries to copy a file which won't fit, it stops. You can always run it again to see whether the next run finds a file small enough to fit.
I've only tested it on Linux, but, who knows, it might work on Windows too. (No operating-system specific commands are used in the script, as it uses Ruby for all file operations.)
The code is below, but I've attached it as well.
require 'rubygems'
require 'sys/filesystem'
require 'ftools'
source_dir = '/media/disk/music'
dest_dir = '/media/disk-1/music'
files = Dir[File.join(source_dir, '/**/*.mp3')]
num_files = files.size
stat = Sys::Filesystem.stat(dest_dir)
disk_free_space_kb = (stat.blocks_free * stat.fragment_size).to_kb
files_selected = []
while disk_free_space_kb > 0 and num_files > 0 do
# choose an mp3
file_num_to_copy = rand(num_files - 1) + 1
file_path = files.delete_at(file_num_to_copy)
num_files = num_files - 1
# work out how big file is
file_size_kb = File.stat(file_path).size.to_kb
# subtract from free space
if (disk_free_space_kb - file_size_kb) > 0
files_selected << file_path
disk_free_space_kb = disk_free_space_kb - file_size_kb
else
break
end
end
files_selected.each do |f|
copy_to_path = File.join(dest_dir, File.basename(f))
puts "Copying #{f} to device"
File.copy(f, copy_to_path)
end
by elliot at 2009-06-30T09:24:41Z
by dave at 2009-06-29T20:03:47Z
by mauvedeity at 2009-06-28T20:18:00Z
by Karen Toon at 2009-06-28T11:04:30Z
by mauvedeity at 2009-06-25T20:58:00Z
by mauvedeity at 2009-06-24T21:13:00Z
by Rob Styles at 2009-06-24T12:02:51Z
by mauvedeity at 2009-06-23T21:50:00Z
by Rob Styles at 2009-06-22T11:42:18Z
belief | the organized beliefs of a period or group or individual higher cognitive process | the process of using your mind to consider something carefully mental object | the content of cognition; the main thing you are thinking about opinion | a personal belief or judgment that is not founded on proof or certainty (4 meanings)
thinking | the process of using your mind to consider something carefully
instinct | inborn pattern of behavior often responsive to specific stimuli
by Sarah at 2009-06-21T00:08:55Z
by mauvedeity at 2009-06-20T22:02:00Z
I was out with my new friend Jason Smith at Jyoti's on Wednesday (we're planning to set up a Birmingham Salon in conjunction with the Institute of Ideas). Because Jason reads a lot about food, I mentioned the craze that's been sweeping Talis for some time now - namely Graze. For the uninitiated, it's a service delivering a daily box of healthy snacks that costs about £3 a day. I told him that my colleague Grant White started subscribing at the beginning of this week, and that I was monitoring him carefully to see whether he survived the vertiginous drop of food intake. by Sarah B. at 2009-06-19T16:26:32Z
by mauvedeity at 2009-06-18T21:36:00Z
by mauvedeity at 2009-06-18T21:26:00Z
ukeig posted a photo:
Richard Wallis presenting at the UKeiG 2009 Conference, Innovation in e-Information", held at the Manchester Conference Centre 2009
by ukeig at 2009-06-18T08:56:42Z
by Rob Styles at 2009-06-18T08:00:37Z
by mauvedeity at 2009-06-17T18:52:00Z
A friend recently loaned me the DVD of “An Inconvenient Truth” featuring Al Gore, the politician-turned-environmentalist who was beaten to the White House by George Bush.
The film was so full of half-truths that it is difficult to know where to start. One example will suffice. Al Gore cited the drying up of lake Chad as a result of Climate Change. It so happens that I spent three months flying light aircraft around Lake Chad in 1978. This was right at the end of a period of global cooling that took place between (roughly) 1960 - 1980 The level of the lake had been falling for years. There is not the slightest evidence that this had anything whatsoever to do with climate change. It might, but it seems unlikely.
But Gore’s biggest error was the classical one beloved of politicians, and the media: he confuses a positive correlation with a causal relationship. The issue is not whether the climate is changing, nor whether Carbon Dioxide concentrations in the atmosphere are increasing, nor whether mankind’s activities are putting out Carbon Dioxide.
The point at issue is the linkage between these observations. Has the carbon dioxide caused the warming, or has the warming caused the carbon dioxide? Or are they both related to something else like sunspots, cloud cover or factor X that we haven’t discovered yet?
There is no “safe side” to this argument. If mankind’s activities are indeed the cause of climate change then Gore’s conclusions are correct (even if his arguments aren’t) and we should be putting our energies into curbing emissions. But if they are not, then carbon capture, carbon trading and all the rest are a dreadful waste of money and energy that we should be putting into safe drinking water supplies, irrigation, storm warning systems and flood defences.
by John H at 2009-06-15T22:14:43Z
by Rob Styles at 2009-06-15T14:04:51Z
by mauvedeity at 2009-06-14T18:43:00Z
Faster than a speeding bullet! Easier to maintain than something that’s really easy to maintain! Reliable! That’s what we want from our tests, but how do we get there? This presentation covers key strategies and patterns for writing test suites using WebDriver, a developer focused tool for web application testing similar in spirit to Selenium RC. We’ll cover why it was written, the problems it addresses and how to integrate it into your projects and testing process.
This talk presented by Simon Stewart, creator of WebDriver, still serves as a useful introduction to the tool, even though the talk itself is a couple of years old and WebDriver has moved on since then.
I’ve been experimenting with WebDriver as an alternative to Selenium/Selenium RC, although it is worth bearing in mind that both projects are merging. I’m enjoying getting to grips with WebDriver and am finding that the tight integration between WebDriver and each of the browsers it automates is much faster than Selenium, since it uses the mechanism most appropriate for controlling that browser. For example in Firefox, WebDriver is implemented as an extension, whereas in IE, WebDriver makes use of IE’s Automation controls. In addition to Firefox and IE, WebDriver also supports the following:
It’s the Selenium Emulation I’d like to touch upon here, what this basically means is that the Java version of WebDriver provides an implementation of the existing Selenium API, and therefore can an be dropped in as a substitute for the Selenium Driver. Here’s an example of how you’d do this:
This allows for WebDriver and Selenium to live side-by-side, and provides developers with a simple mechanism for a managed migration from the existing Selenium API to WebDriver. I’m still experimenting with it but I have to admit I really like it simplicity.
selenium, Testingby nadeem.shabir at 2009-06-14T16:58:39Z

by Karen Toon at 2009-06-14T09:20:06Z
by mauvedeity at 2009-06-12T21:07:00Z
by mauvedeity at 2009-06-12T20:55:00Z
This is my first plugin for Wordpress, and may not be my last now that I see just how darned easy it can be!
http://informationtakesover.co.uk/blog-in-blog-wordpress-plugin/
by Tim Hodson at 2009-06-12T18:50:11Z
You ever had one of those days when you get home from work, your tired, but you carry on working because there always seems far more to do than time to do it in? you feel like you want to find a way of picking yourself up out of whatever temporary rut you feel yourself in? Well yesterday was like that I think I must have stopped around 11ish. Rather than hit the sack I made myself some tea ( courtesy of Zach ), and started to flick through channels. I’ve noticed that I have a tendency to do that, a lot! there’s nothing you actually want to watch, so you just flick through until something vaguely interesting catches your eye. And something did, I stopped on BBC Four and caught the last few minutes of Alan Yentob’s Interview with Yusuf Islam (formerly known as Cat Stevens), from 2006.
I’d never seen the full interview before, and yet the image I was confronted with on the screen, of this bearded man playing this acoustic guitar and singing in this beautifully melodic voice just made me want to listen (at the 45 minute mark). It was curious I suppose that I’d tuned in just in time to listen to Alan Yentob ask him the question”:
“After all those years of resistance you’ve now picked up the guitar again. Do you think you have allowed yourself to sort of take a position you didnt feel this literalism about Islam which a lot of people find difficult to accept. Some people might say to that extent you’ve been brainwashed perhaps?”
Yusuf Islam:
“The positions that I took previously, I held fast to them because I believed them to be true. However, one only has to look at history, it wasn’t long ago when we discover, guess what, the guitar was probably introduced to Europe, through Spain by the Muslims. Now I’m saying, hang on, What? you know… and thats a reality. When I learned something better I moved, and that’s what you’ve got to do. I think we must not, ever, take the position that we know it all. God may show you something you never knew yesterday,we’ve got to be ready for that” …Alan Yentob:
“Is there a message in these songs as you pick up this guitar again?”Yusuf Islam:
“There is certainly a change in the wind and the way in which there is now a chance for a new understanding of the moderate middle path of Islam because the extremes have been exposed. A lot of people have missed the whole point, including some Muslims, who have gone off on some kind of..their own..strategy of trying to improve the world through some kind of devious means that has nothing to do with Islam, and yet is supposed to be in the name of Islam. The word Islam itself comes from the word ‘peace’ now that is the heart and soul of this religion. I discovered that, I’ve done that journey and perhaps I can help others to feel a bit more assured that in fact a lot of Muslims in this world, the vast majority just want to live a happy life and be at peace with the rest of the world”
I think there’s something wonderfully uplifting in his words, and in his music. His sentiments are nothing new to many muslims yet sadly social the perception of Islam and Muslims seems to be growing more and more negative as the actions of an extremist minority are used to label all Muslims are radicals. In fact I remember storming off in a rage as I watched the European election results and listened to Nick Griffin, the leader of the BNP, explain that stopping the spread of radical Islam was one of the reasons people had voted for him.
After the interview ended the BBC aired a hour long ‘BBC Four Session’ featuring Yusuf singing a number of his songs, both old and new, from a concert in Porchester Hall several years ago. I stayed up and watched the show and found myself being moved more and more by his songs and their message. I even ended up downloading several of his recent albums on iTunes as I watched the performance on tv - although I’m not sure if my colleagues appreciated that since I was humming, and singing along to them as I worked in the office today
Rather than pick up the laptop and work this evening, I decided to see if I could find that interview and watch it all, sadly BBC iPlayer doesn’t have it, however it does still have the ‘BBC Four Session - Yusuf Islam‘ which is available to watch - it’s a wonderful concert, an inspired performance which I certainly recommend.
After searching on Google I did eventually find the Interview, there’s a copy hosted on Google Video ( disclaimer: it’s hosted by an organisation called ‘Turn To Islam’. I have no idea what this organisation is, I simply wanted to link to the video). I’m glad I watched it all Yusuf describes his early life, his celebrity status, his, his conversion to islam, and his return to performing. Perhaps the most moving part of the interview is when he describes his battle with tuberculosis - which will resonate with anyone who has ever found themselves lying in a hospital bed reflecting on their life, and where they are headed, particularly when he says “.. in that hospital I developed some insights which then later fed into my music … into my journey” … a poignant sentiment that touched me deeply given my own experience.
Yusuf Islam is an amazing man, who truly inspires.
inspiration, Personalby nadeem.shabir at 2009-06-11T21:25:34Z
by mauvedeity at 2009-06-11T21:14:00Z
Since the Tesco online grocery delivery started, several years ago, we generally use them about once a month to buy certain bulky items so that we don’t have to pick up as much when visiting the store. Over the years though we have changed what we do order from them as, increasingly, their inability ro deliver good quality meat, fruit and vegetables gets more pronounced.
These days we never usually order fresh produce from them – we always pick these ourselves at the store. We have had rotting fresh produce delivered on at least 5 occasions and would regularly have been sent produce right on the edge of ’sell by’ date. They’d probably deny that they try to get rid of items that is barely fresh through the online service, but that’s how it increasingly feels to us.
For the last few orders we haven’t ordered anything fresh but tonight we had a delivery including potatoes – these arrived and were soft, with several convered in mould. Ridiculous….
So (another) email of complaint has just gone out to Tesco and I’m sure I’ll get their standard email of apology back.
From this point forward though, absolutely no fresh produce will be ordered through their online service – you just can’t trust them to pick anything decent.
There are some hilarious quotes on their web site:-
Picking your fresh food
Our expertly trained shoppers always pick from the back of the shelves to ensure you get the freshest produce and the longest sell by dates. They also carefully select fruit and vegetables as if they were shopping for themselves. They ask themselves the question “would I buy it?” and therefore do not send out anything that is not of the highest quality.
Rubbish!
by andrew at 2009-06-11T18:21:15Z
by Sarah at 2009-06-10T23:35:21Z
by mauvedeity at 2009-06-10T20:00:00Z
by mauvedeity at 2009-06-10T19:51:00Z
I work on a system at Talis which posts MARC records from customer library databases into a MARC to RDF transformer. The resulting RDF generated from the MARC is sent into the Talis Platform, where it's used to power Prism.
Over the last day or so I've been working on a bug which has prevented some records going correctly through this process. Along the way, I noticed another bug occurring somewhere between the post from the customer site into our MARC to RDF transformer. It looked as if line break characters in the original MARC record were being lost somewhere in the process. Consequently, when the MARC was pushed into the transformer, the record got spat out as invalid, as the length specified in the MARC leader didn't correspond to the length of the record (now it had lost its line break characters). (By the way, working directly with byte streams is the only way to work with MARC, for precisely this reason.)
I had a sudden insight on the way home, triggered by remembering issues I'd had with curl (the command line HTTP client) working on another personal project. On that project, I'd been trying to post RDF triples in ntriple format into my application using curl. However, the application only seemed to recognise the first RDF triple in the posted file. I couldn't understand why.
Then, when I echoed the body of the HTTP request, as received by my app from curl, I realised the issue: curl was sending the body of the request WITHOUT LINE BREAKS. As line break characters act as the delimiter between triples in RDF ntriple format, my app was only seeing a single RDF ntriple. When I tried an alternative tool to send the posts (the extremely useful Poster add-on for Firefox), the ntriples were received correctly.
Once I remembered this, I decided to do some debugging of the kind of requests curl would send if it were posting MARC records. My hypothesis was that curl was stripping line break characters from the MARC record (which is bad, as they are valid characters in MARC), and hence causing the record to be shorter than the leader said it should be.
First step was to put together something to echo and/or save HTTP request bodies. Rack is ideal for this sort of thing, so I used this little Rack web server program:
require 'rubygems'
require 'rack'
def save_body(body)
File.open('last_raw_request', 'w') {|f| f.write(body)}
body
end
Rack::Handler::WEBrick.run(lambda {|e| [200, {}, save_body(e['rack.input'].read)]}, :Port=>7777)
This saves the raw request body to a file called "last_raw_request".
I first posted a MARC file with line breaks in it (attached) using Poster (with Content-Type set to application/marc21) through Firefox. The MARC file came through intact and still valid.
I then posted a MARC file with line breaks in it using curl:
curl -d @marcfile.mrc -H "Content-Type:application/marc21" http://localhost:7777/
Which produced an invalid MARC file with line breaks missing.
The solution is to use the --data-binary switch when using curl to send binary data, which we're not doing when sending MARC from the customer site. Mostly this doesn't matter, but it does when the MARC record contains line break characters.
Namely:
curl --data-binary @marcfile.mrc -H "Content-Type:application/marc21" http://localhost:7777/
by elliot at 2009-06-10T09:21:31Z
by mauvedeity at 2009-06-09T21:06:00Z
by mauvedeity at 2009-06-09T20:59:00Z
PhotoStock-Israel posted a photo:
Tifillin and elaborated decorated tfillin bag, Tifillin are either of two boxes containing Biblical verses and black, leather straps attached to them which are used in rabbinic Jewish prayer. They are an essential part of morning prayer services, and are worn on a daily basis (except the Sabbath and festivals) by religious Jewish males above the age of 13 years
by PhotoStock-Israel at 2009-06-09T10:24:07Z
The Guardian (19th May 2009) quoted Sir David Attenborough: this little creature is going to show our connection with all other mammals. Google changed it’s home page icon to reflect the find. On 21 May 2009, the Daily Mail trumpeted Scientists find the 'missing link': A 47million-year-old lemur that could revolutionise how we see human evolution.
But also on 21 May, the New Scientist published an article Why Ida fossil is not the missing link. On 24th May, the Times weighed in with Origin of the Specious: Ida the fossil was hailed as the ‘missing link’ in our evolution. Don’t believe the hype
Because it was hype. The early enthusiasm for the “missing link” idea was based on press releases and media rights rather than scholarly content and careful analysis. Ida was dug up in 1983 and reportedly one of the protagonists had bought her for a large sum of money – which he was presumably trying to recoup. She is an amazing fossil, but later and more sober assessment appears to have concluded that she adds almost nothing to our understanding of human evolution.
We can do without this kind of thing. If science is going to work at all it requires a critical mass of integrity. Once again, as with NASA climate change data, not only does that integrity appears to have been lacking, but also the perpetrators appear to have escaped any significant censorship
by John H at 2009-06-08T21:40:52Z
by mauvedeity at 2009-06-08T21:30:00Z
It's taken a while, but a feature request I logged 2 years ago has finally made it to Drupal trunk. (The basic idea was to put a timeout on Drupal HTTP requests to other systems, to prevent a whole Drupal site timing out if one of its requests to another site hung - prompted by working on AllConsuming and Last.fm modules for Drupal.) My original patch was promptly rejected, but it's been fascinating watching the discussion around the idea over the months, culminating in a well-rounded, properly-tested patch landing in CVS.
by elliot at 2009-06-08T15:39:14Z
For the last couple of weeks I’ve returned to working on Alto Jangle connector, at least part-time. I had shelved development on it for a while; I had a hard time finding anybody interested in using it and had reached a point where the development database I was working against was making it difficult to know what to expect in a real, live Alto system. After I got wind of a couple of libraries that might be interested in it, I thought I should at least get it in a usable state.
One of the things that was vexing me prior to my hiatus was how to get Sybase to page through results in a semi-performant way. I had originally blamed it on Grails, then when I played around with refactoring the connector in PHP (using Quercus, which is pretty slick by the way, to provide Sybase access via JDBC — the easiest way to do it) I realized that paging is just outside of Sybase’s capabilities.
And when you’re so used to MySQL, PostgreSQL and SQLite, this sort of makes your jaw drop (although, in its defense, it appears that this isn’t all that easy in Oracle, either — however, it’s at least possible in Oracle).
There seem to be two ways to do something like getting rows 375,000 – 375,099 from all of the rows in a table:
The first option isn’t really viable. You need write access to the database and it’s unclear how to make this work in most database abstraction libraries. I don’t actually know that cursors do anything differently than option 2 besides pushing the looping to the database engine itself. I was actually using cursors in my first experiments in JRuby using java.sql directly, but since I wasn’t aware of this problem at the time, I didn’t check to see how well it performed.
Option 2 is a mess, but this appears to be how GORM/Hibernate deals with paging in Sybase. Cursors aren’t available in Quercus’ version of PDO, so it was how I had to deal with paging in my PHP prototypes, as well. When I realized that PHP was not going to be any faster than Grails, I decided to just stick with Grails (”regular C-PHP” is out — compiling in Sybase support is far too heavy a burden).
This paging thing still needed to be addressed. Offsets of 400,000 and more were taking more than twelve minutes to return. How much more, I don’t know — I killed the request at the 12 minute mark. While some of this might be result of a bad or missing index, any way you cut it, it wasn’t going to be acceptable.
I was kicking around the idea of exporting the “models” of the Jangle entities into a local HSQLDB