I made some documentation about our SPARQL-IN feature that we recently added. I added some interesting use-cases like doing an insert and a delete based on in values.
For the new class signal API that we’re developing this and next week, we’ll probably emit the IDs that tracker:id() would give you if you’d use that on a resource. This means that IN is very useful for the purpose of giving you metadata of resources that are in the list of IDs that you just received from the class signal.
We never documented tracker:id() very much, as it’s not an RDF standard; rather it’s something Tracker specific. But neither are the class signals a RDF standard; they are Tracker specific too. I guess here that makes it usable in combo and turns the status of ‘internal API’, irrelevant.
We’re right now prototyping the new class signals API. It’ll probably be a “sa(iii)a(iii)”:
That’s class-name and two arrays of subject-id, predicate-id, object-id. The class-name is to allow D-Bus filtering. The first array are the deletes and the second are the inserts. We’ll only give you object-ids of non-literal objects (literal objects have no internal object-id). This means that we don’t throw literals to you in the signal (you need to make a query to get them, we’ll throw 0 to you in the signal).
We give you the object-ids because of a use-case that we didn’t cover yet:
Given triple <a> nie:isLogicalPartOf <b>. When <a> is deleted, how do you know <b> during the signal? So the feature request was to do a select ?b { <a> nie:isLogicalPartOf ?b } when <a> is deleted (so the client couldn’t do that query anymore).
With the new signal we’ll give you the ID of <b> when <a> is deleted. We’ll also implement a tracker:uri(integer id) allowing you to get <b> out of that ID. It’ll do something like this, but then much faster: select ?subject { ?subject a rdfs:Resource . FILTER (tracker:id(?subject) IN (%d)) }
I know there will be people screaming for all objects, also literals, in the signals, but we don’t want to flood your D-Bus daemon with all that data. Scream all you want. Really, we don’t. Just do a roundtrip query.
I recently stumbled upon this marvelous piece. I title the quote “making an excuse“:
Saying that you’re forced to do something when you really aren’t is a failure to take responsibility for your actions. I generally don’t think users of proprietary software are primarily to blame for the challenges of software freedom — nearly all the blame lies with those who write, market, and distribute proprietary software. However, I think that software users should be clear about why they are using the software. It’s quite rare for someone to be compelled under threat of economic (or other) harm to use proprietary software. Therefore, only rarely is it justifiable to say you have to use proprietary software. In most cases, saying so is just making an excuse.
I’ll translate this for you to Catholicism. You can definitely adapt this to most religions (for some, add death penalties like stoning here and there):
Saying that you’re forced by your nature to masturbate when you really aren’t is a failure to take responsibility for your actions. The church generally doesn’t think masturbaters are primarily to blame for the challenges of sexuality — nearly all the blame lies with pornography. However, I think that people who masturbate should be clear about why they have sex with themselves: It’s quite rare for someone to be compelled under the desire of sexual pleasure. Therefore, only rarely is it justifiable to say you have to masturbate. In most cases, saying so is just making an excuse.
But then it wasn’t yet possible to queue a query while Tracker’s RDF store is busy. We’re making this possible following next unstable release. Yeah I know you guys hate that Tracker’s RDF store can be busy. But you tell us what else to do while restoring a backup, or while replaying a journal?
While we are replaying the journal, or restoring a backup, we’ll accept your result-hungry queries into our queue. Meanwhile you get progress and status indication over a DBus signal. Some documentation about this is available here.
SPARQL 1.1 Draft features: IN and NOT IN
We had a feature requests for supporting SPARQL IN and NOT IN. As usual, we’re ahead of the SPARQL Draft specification. But I don’t think IN and NOT IN will look much different in the end. Anyway, it was straightforward so I just implementedboth.
It goes like this:
SELECT ?abc { ?abc a nie:InformationElement ;
nie:title ?title .
FILTER (?title IN ('abc', 'def')) }
SELECT ?abc { ?abc a nie:InformationElement ;
nie:title ?title .
FILTER (?title NOT IN ('xyz', 'def')) }
It’s particularly useful to get metadata about a defined set of resources (give me the author of this, this and that file)
Direct access
This work is progressing nicely. Most of the guys on the team are working on this, and it’s going to be awesome thanks to SQLite’s WAL journal mode. SQLite’s WAL mode is still under development and probably unstable here and there, but we’re trusting the SQLite guys with this anyway.
What is left to do for direct-access is cleaning up a bit, getting the small nasty things right. You know. The basics are all in place now.
We’re doing most of the library code in Vala, but clever people can easily imagine the C API valac makes from the .vala files here. That’s the abstract API that client developers will use. Unless you use a higher level API like libqttracker, QSparql, Hormiga or sparql-glib.
All of which still need to be adapted to the direct-access work that we’re doing. But we’re in close contact with all of the developers involved in those libraries. And they’re all thrilled to implement backends for the new stuff.
Plans
We plan to change the signals-on-changes or class-signals feature a bit so that the three signals are merged into one. The problem with three is that you can’t reliably identify a change-transaction this way (a rename of a file, for example).
Another thing on our list is merging Zeitgeist’s ontology. To the other team members at Tracker: guys, Zeitgeist has been waiting for three months now. Let’s just get this done!
I wonder when, if ever, we go in feature freeze. Hehe. I guess we’ll just have very short feature-freeze periods. Whatever, it’s fun.
MeeGo in cars
Hey BMW & co, if you guys want to learn how to write music players and playlists for car entertainment on MeeGo, get in touch! This Tracker that I’m talking about is on that MeeGo OS; being the Music’s metadata database is among its purposes.
I can’t wait to have a better music player playlist my car.
Or maybe some integration with the in-car GPS and the car owner’s appointments and meetings? With geo-tagged photos on the car owner’s phone? Automatic and instant synchronization with Nokia’s future phones? Sounds all very doable, even easy, to me. I’d want all that stuff. Use-cases!
Een zelfstandige in België hoort zijn sociale bijdrage (bv. per kwartaal) vooraf te betalen. Je bent een debiel als je dat niet doet, want dan vragen ze na vier jaar lekker veel interest op het hele bedrag.
Iedereen die je tegen het lijf loopt wanneer je je firma opstart zal het je ook opnieuw zeggen. De mensen bij Unizo, op de cursus boekhouden, mijn boekhouder, de mensen van de bank en zelfs mijn notaris was het aan het uitleggen bij de oprichting. En allemaal met een dringende toon: doe dit, vergeet dat niet. Vergeet dat écht niet. Écht niet!
Je bent dus onwenselijk dom als je het toch niet doet. Maarja, dat er domme mensen bestaan is geen nieuws.
Wat weinig mensen weten is dat je het zelfs kan omdraaien: in tegenstelling tot voorafbetalingen van vennootschapsbelastingen, krijg je voor voorafbetalingen van je sociale bijdrage wél interest op het teveel betaalde bedrag.
En dat is een interest die momenteel hoger ligt dan wat je op een ferme spaarrekening krijgt.
Uiteraard moet je gokken wat je zoal gemiddeld zal verdienen op vier jaar. Dus uiteraard mag je dat vrij hoog inschatten. Weet jij misschien precies hoeveel meer winst je over enkele jaren zal maken? Nou ik niet. En ik geef mezelf uiteraard meer salaris wanneer er meer winst is, meneer de controleur. Maar ik kon het niet weten dat er na vier jaar toch niet zoveel winst was! Tja!
Dus, schat je dat vrij hoog in. En betaal je vier jaar lang te veel sociale bijdrage. Na vier jaar storten ze het teveel terug, mét een hoge interest.
Netjes toch?
Ik denk dat ik dit ga moeten vieren!
Nu niet teveel van jullie freelancers dit gaan doen he! Ik wil nog een paar jaartjes genieten van hun “probleem” ;-)
I try to avoid posting about the same subject twice in a row. But I also really think that Wikileaks is worth violating about any such rule in existence. Maybe I should make a category on my blog just for Wikileaks?
Today is the day the world is witnessing the most significant military leak in the history of mankind, so I have a feeling that today ’s gonna be a good day.
To all the people at Wikileaks, and to all whistle blowers in past, present and future: you are heroes. You guy’s ideas will be with us for centuries ahead of us. You’ll be remembered in history books. Let’s make sure you guys will.
It wasn’t the first time that I saw the movie; I think the third time or something. But I’m still convinced that the movie is even better than Dogville, about which I wrotea few years ago that it’s the best movie I ever saw.
Don’t listen to the U.S. critics. In their struggle not to see the world from a U.S. point of view, they don’t understand what it’s about (it’s not really about slavery). I guess Lars Von Trier carefully selects his audience.
The movie Manderlay, like Dogville, has a (hidden) morality. Even more than Dogville, which is basically about the moral necessity of assertiveness, is Manderlay a movie that tries to make you think. In my case about the failure of only using assertiveness to educate people (about) a new reality. Also about the failure of using democratic voting for every issue (ownership of a tool). And about the necessity of a law system: no matter how moral, or, immoral; it’s still better than absolute freedom - people need a law -. But with “freedom” being some sort of piece of shit ideological word among many readers of my blog, I’m sure many wont understand what I mean with that. I try to carefully select my audience. I’m not against “freedom”, just against its naive interpretations. Especially the “anarchy”-ones.
So Manderlay dances with the morals in Dogville. Both movies are part of a trilogy, so I guess that makes sense.
I’m grateful that Lars carefully selects his audience. You don’t create art by appeasement.
Looking forward to Wasington, the last part of this trilogy.
There are no open source companies. There are companies and there are open source projects.
Some companies work on open source projects, some parent open source projects, some don’t.
Some of those companies are good at fostering a community that contributes to these open source projects. Others are unwilling and some don’t yet understand the process. And again others have many open source projects being done by teams that do get it and have at the same time other projects being done by teams that don’t get it. Actually that last dual situation is the most common among the large companies. You know, the ones that often sponsor your community’s main conference and the ones that employ your heros.
If you do a quick reality-check then you’ll conclude there are no black / white companies. Actually, nothing in life nor in ethics is black / white. Nothing at all.
What you do have is a small group of amazingly disturbing purists who do zero coding themselves (that is, near zero) but do think black / white, and consequently write a lot of absurd nonsense in blog post-comments, on slashdot in particular, forums and mailing lists. These people are the reason numéro uno why many companies quit trying to understand open source.
It’s sad that the actual (open source) developers have to waste time explaining companies, for whom they do consultancy, that these people can be ignored. It’s also sad that these purists have turned so vocal, even violent, that they often can’t really be ignored anymore: people’s employers have been harassed.
“You have to fire somebody because he’s being unethical by disagreeing with my religious believe-system that Microsoft is evil!”. Maybe it’s just me who’s behind on ethics in this world? Well, those people can still get lost because I, in ethics, disagree with them.
Now, let’s get back to the projects and away from the open source vs. open core debates. We have a lot of work to do. And a lot of companies to convince opening their projects.
Open source developers succeeded in (for example) getting some software on phones. The people who did aren’t the religious black / white people. Maybe the media around open source should track down the people who did, and write quite a bit more about their work, ideas and passion?
Finally, the best companies are driven by the ideas and passions of their best employees. Those are the people who you should admire. Not their company’s open core PR.
In 4.57 billion years our solar system went from creating simple bacteria to a large group of species. Several of which highly capable of making fairly intelligent decisions, one of which capable of having the indulgence of believing that it can think. That’s us.
The sun has an estimated 5 billion years to go before it turns into a Red Giant that in its very early stages will wipe out truly every single idea that exists inside at least our own solar system.
Unless radio waves that our planet started emitting since we invented radio are seen and understood (which requires a recipient in the first place), that will be the ultimate end of all of our ideas and culture. Unless we figure out a way to let the ideas cultivate outside of our solar system. Just the ideas would already be an insane achievement.
But imagine going from bacteria to beings, colonized by bacteria, that think that they can think, in far less time than the current age of our sun. Unless, of course, bacteria somehow arrived into our solar system from outside (unlikely, but perhaps equally unlikely than us ever exporting our ideas and culture to another solar system).
Imagine what could happen in the next 5 billion years …
The support for domain specific indexes is, awaiting review / finished. Although we can further optimize it now. More on that later in this post. Image that you have this ontology:
nie:InformationElement a rdfs:Class .
nie:title a rdf:Property ;
nrl:maxCardinality 1 ;
rdfs:domain nie:InformationElement ;
rdfs:range xsd:string .
nmm:MusicPiece a rdfs:Class ;
rdfs:subClassOf nie:InformationElement .
nmm:beatsPerMinute a rdf:Property ;
nrl:maxCardinality 1 ;
rdfs:domain nmm:MusicPiece ;
rdfs:range xsd:integer .
With that ontology there are three tables called “Resource”, “nmo:MusicPiece” and “nie:InformationElement” in SQLite’s schema:
The “Resource” table has ID and the subject string
The “nie:InformationElement” has ID and “nie:title”
The “nmm:MusicPiece” one has ID and “nmm:beatsPerMinute”
That’s fairly simple, right? The problem is that when you ORDER BY “nie:title” that you’ll cause a full table scan on “nie:InformationElement”. That’s not good, because there are less “nmm:MusicPiece” records than “nie:InformationElement” ones.
SELECT ?title WHERE {
?resource a nmm:MusicPiece ;
nie:title ?title
} ORDER BY ?title
We translate that, for you, to this SQL on our schema:
SELECT "title_u" FROM (
SELECT "nmm:MusicPiece1"."ID" AS "resource_u",
"nie:InformationElement2"."nie:title" AS "title_u"
FROM "nmm:MusicPiece" AS "nmm:MusicPiece1",
"nie:InformationElement" AS "nie:InformationElement2"
WHERE "nmm:MusicPiece1"."ID" = "nie:InformationElement2"."ID"
AND "title_u" IS NOT NULL
) ORDER BY "title_u"
OK, so with support for domain indexes we change the ontology like this:
nmm:MusicPiece a rdfs:Class ;
rdfs:subClassOf nie:InformationElement ;
tracker:domainIndex nie:title .
Now we’ll have the three tables called “Resource”, “nmo:MusicPiece” and “nie:InformationElement” in SQLite’s schema. But they will look like this:
The “Resource” table has ID and the subject string
The “nie:InformationElement” has ID and “nie:title”
The “nmm:MusicPiece” table now has three columns called ID, “nmm:beatsPerMinute” and “nie:title”
The same data, for titles of music pieces, will be in both “nie:InformationElement” and “nmm:MusicPiece”. We copy to the mirror column during ontology change coping, and when new inserts happen.
When now the rdf:type is known in the SPARQL query as a nmm:MusicPiece, like in the query mentioned earlier, we know that we can use the “nie:title” from the “nmm:MusicPiece” table in SQLite. That allows us to generate you this SQL query:
SELECT "title_u" FROM (
SELECT "nmm:MusicPiece1"."ID" AS "resource_u",
"nmm:MusicPiece1"."nie:title" AS "title_u"
FROM "nmm:MusicPiece" AS "nmm:MusicPiece1"
WHERE "title_u" IS NOT NULL
) ORDER BY "title_u"
A remaining optimization is when you request a rdf:type that is a subclass of nmm:MusicPiece, like this:
SELECT ?title WHERE {
?resource a nmm:MusicPiece, nie:InformationElement ;
nie:title ?title
} ORDER BY ?title
It’s still not as bad as now the “nie:title” is still taken from the “nmm:MusicPiece” table. But the join with “nie:InformationElement” is still needlessly there (we could just do the earlier SQL query in this case):
SELECT "title_u" FROM (
SELECT "nmm:MusicPiece1"."ID" AS "resource_u",
"nmm:MusicPiece1"."nie:title" AS "title_u"
FROM "nmm:MusicPiece" AS "nmm:MusicPiece1",
"nie:InformationElement" AS "nie:InformationElement2"
WHERE "nmm:MusicPiece1"."ID" = "nie:InformationElement2"."ID"
AND "title_u" IS NOT NULL
) ORDER BY "title_u"
We will probably optimize this specific use-case further later this week.
It’s not popular to be critical about a (the leader of a) popular idea. This is illustrated by the intellectually absurd criticisms David Schlesinger receives.
Yet is the critic who monitors the organs of a society key to that organ either producing for its stakeholders, or failing and dragging the entire society it serves down with it.
Acknowledging the problem and changing course is what I seek in a candidate this year.
Yesterday we optimized the crawler’s query that gets the modification time of files. We use this timestamp to know whether or not a file must be reindexed.
Originally, we used a custom SQLite function called tracker:uri-is-parent() in SPARQL. This, however, caused a full table scan. As long as your SQL table for nfo:FileDataObjects wasn’t too large, that wasn’t a huge problem. But it didn’t scale linear. I started with optimizing the function itself. It was using a strlen() so I replaced that with a sqlite3_value_bytes(). We only store UTF-8, so that worked fine. It gained me ~ 10%; not enough.
So this commit was a better improvement. First it makes nfo:belongsToContainer an indexed property. The x nfo:belongsToContainer p means x is in a directory p for file resources. The commit changes the query to use the property that is now indexed.
The original query before we started with this optimization took 1.090s when you had ~ 300,000 nfo:FileDataObject resources. The new query takes about 0.090s. It’s of course an unfair comparison because now we use an indexed property. Adding the index only took a total of 10s for a ~ 300,000 large table and the table is being queried while we index (while we insert into it). Do the math, it’s a huge win in all situations. For the SQLite freaks; the SQLite database grew by 4 MB, with all items in the table indexed.
PDF extractor
Another optimization I did earlier was the PDF extractor. Originally, we used the poppler-glib library. This library doesn’t allow us to set the OutputDev at runtime. If compiled with Cairo, the OutputDev is in some versions a CairoOutputDev. We don’t want all images in the PDF to be rendered to a Cairo surface. So I ported this back to C++ and made it always use a TextOutputDev instead. In poppler-glib master this appears to have improved (in git master poppler_page_get_text_page is always using a TextOutputDev).
Another major problem with poppler-glib is the huge amount of copying strings in heap. The performance to extract metadata and content text for a 70 page PDF document without any images went from 1.050s to 0.550s. A lot of it was caused by copying strings and GValue boxing due to GObject properties.
Table locked problem
Last week I improved D-Bus marshaling by using a database cursor. I forgot to handle SQLITE_LOCKED while Jürg and Carlos had been introducing multithreaded SELECT support. Not good. I fixed this; it was causing random Table locked errors.
I’m not supposed to but I’m proud. It’s not only me who’s doing it.
Adrien is one of the new guys on the block. He’s working on integration with Tracker’s RDF service and various web services like Flickr, Facebook, Twitter, picasaweb and RSS. This is the kind of guy several companies should be afraid of. His work is competing with what they are trying to do do: integrating the social web with mobile.
Oh come on Steve, stop pretending that you aren’t. And you better come up with something good, because we are.
Not only that, Adrien is implementing so-called writeback. It means that when you change a local resource’s properties, that this integration will update Flickr, Facebook, picasaweb and Twitter.
You change a piece of info about a photo on your phone, and it’ll be replicated to Flickr. It’ll also be synchronized onto your phone as soon as somebody else made a change.
This is the future of computing and information technology. Integration with social networking and the phone is what people want. Dear Mark, it’s unstoppable. You better keep your eyes open, because we are going fast. Faster than your business.
I’m not somebody trying to guess how technology will look in a few years. I try to be in the middle of the technical challenge of actually doing it. Talking about it is telling history before your lip’s muscles moved.
At the Tracker project we are building a SPARQL endpoint that uses D-Bus as IPC. This is ideal on Nokia’s Meego. It’ll be a centerpiece for information gathering. On Meego you wont ask the filesystem, instead you’ll ask Tracker using SPARQL and RDF.
To be challenged is likely the most beautiful state of mind.
I invite everybody to watch this demo by Adrien. It’s just the beginning. It’s going to get better.
For returning the results of a SPARQL SELECT query we used to have a callback like this. I removed error handling, you can find the original here.
We need to marshal a database result_set to a GPtrArray because dbus-glib fancies that. This is a lot of boxing the strings into GValue and GStrv. It does allocations, so not good.
The test is a query on 13500 resources where we ask for two strings, repeated eleven times. I removed a first repeat from each round, because the first time the sqlite3_stmt still has to be created. This means that our measurement would get a few more milliseconds. I also directed the standard out to /dev/null to avoid the overhead created by the terminal. The results you see below are the value for “real”.
There is of course an overhead created by the “tracker-sparql” program. It does demarshaling using normal dbus-glib. If your application uses DBusMessage directly, then it can avoid the same overhead. But since for both rounds I used the same “tracker-sparql” it doesn’t matter for the measurement.
$ time tracker-sparql -q "SELECT ?u ?m { ?u a rdfs:Resource ;
tracker:modified ?m }" > /dev/null
Wetten gaan anno 2010 veelal over ethiek. Verschillende filosofen uit onze tijd leggen dit uit. Het is niet nodig de intellectueel uit te hangen, deze filosofie is algemeen aangenomen in West Europa.
Ik sprak daarnet met een vriend over de volgende stelling:
Als we stellen dat democratie niet almachtig is en dat de wetten van een gemeenschap moeten gerespecteerd worden (je kan geen Burgemeester zijn als je de Vlaamse wetten en decreten niet respecteert) dan kan je ook stellen dat democratie niet almachtig is wanneer wij federale verkiezingen houden en die onwettig zouden zijn.
Dit is, mijns inziens, een onjuiste redenering. Maar waarom dan? Ik leg het uit.
De wet gaat veelal over ethiek. Moest U niet akkoord zijn, schrijf dan een boek. In de ethiek vind ik dat de meest juiste benadering van wat fout is, dat is waar de intentie fout is.
In het geval van verkiezingen is de intentie van de politiek in België niet fout. De intentie is immers om het land te regeren. Aldus is het onmogelijk dat deze verkiezing onwettig is. Hier kan de democratie dus gewoon haar gang gaan.
In het geval van die Burgemeesters is het hun intentie om de taalwetten te omzeilen. Hun intentie is het verzieken van de situatie. Daarom kunnen ze niet, nooit, benoemd worden. Hier kan de democratie niet gewoon haar gang gaan.
Ik was een week geleden een maand in Zwitserland. Ik heb daar aan een resem mensen uit Zürich gevraagd: Hoe zou U erover denken moesten Dietikon, Dietlikon en Kloten een voor 70% Italiaanse bevolking hebben en daarbij een Burgemeester hebben die weigert om Duits te spreken in de gemeenteraden?
Alle Zwitsers hun Zwitserse frank viel meteen. Ze vertelden me meteen en onmiddellijk dat dit gewoonweg oorlog zou betekenen. Dit zou absoluut en in alle talen onaanvaardbaar zou zijn. Zij zouden eisen, jazeker, eisen van de mensen die er wonen dat ze de Duitse taal zouden leren. Niemand van hen vond het vreemd dat die Burgemeesters niet benoemd konden worden.
At six in the morning the girl who was working her first day at the bar, after she and the bartender and owner got a Leffe from me, played Ne me quitte pas by Jacques Brel. I didn’t request it, they even asked me to shut the fuck up for the song.
I realized that although I’m coming from that insignificant country, insignificance doesn’t matter.
And this is why I like Europe’s many cultures. Why I like Switzerland, too. We don’t but we do understand each other.
Every (good) developer knows that copying of memory and boxing, especially when dealing with a large amount of pieces like members of collections and the cells in a table, are a bad thing for your performance.
More experienced developers also know that novice developers tend to focus on just their algorithms to improve performance, while often the single biggest bottleneck is needless boxing and allocating. Experienced developers come up with algorithms that avoid boxing and copying; they master clever pragmatical engineering and know how to improve algorithms. A lot of newcomers use virtual machines and script languages that are terrible at giving you the tools to control this and then they start endless religious debates about how great their programming language is (as if it matters). (Anti-.NET people don’t get on your horses too soon: if you know what you are doing, C# is actually quite good here).
Once Jürg and Carlos have finished the work on parallelizing SELECT queries we plan to let the code that walks the SQLite statement fill in the DBusMessage directly without any memory copying or boxing (for marshalling to DBus). We found the get_reply and send_reply functions; they sound useful for this purpose.
I still don’t really like DBus as IPC for data transfer of Tracker’s RDF store’s query results. Personally I think I would go for a custom Unix socket here. But Jürg so far isn’t convinced. Admittedly he’s probably right; he’s always right. Still, DBus to me doesn’t feel like a good IPC for this data transfer..
We know about the requests to have direct access to the SQLite database from your own process. I explained in the bug that SQLite3 isn’t MVCC and that this means that your process will often get blocked for a long time on our transaction. A longer time than any IPC overhead takes.
It used to be in Tracker that you couldn’t just change the ontology. When you did, you had to reboot the database. This means loosing all the non-embedded data. For example your tags or other such information that’s uniquely stored in Tracker’s RDF store.
This was of course utterly unacceptable and this was among the reasons why we kept 0.8 from being released for so long: we were afraid that we would need to make ontology changes during the 0.8 series.
So during 0.7 I added support for what I call modest ontology changes. This means adding a class, adding a property. But just that. Not changing an existing property. This was sufficient for 0.8 because now we could at least do some changes like adding a property to a class, or adding a new class. You know, making implementing the standard feature requests possible.
Last two weeks I worked on supporting more intrusive ontology changes. The branch that I’m working on currently supports changing tracker:notify for the signals on changes feature, tracker:writeback for the writeback features and tracker:indexed which controls the indexes in the SQLite tables.
But also certain range changes are supported. For example integer to string, double and boolean. String to integer, double and boolean. Double to integer, string and boolean. Range changes will sometimes of course mean data loss.
Plenty of code was also added to detect an unsupported ontology change and to ensure that we just abort the process and don’t do any changes in that case.
It’s all quite complex so it might take a while before the other team members have tested and reviewed all this. It should probably take even longer before it hits the stable 0.8 branch.
We wont yet open the doors to custom ontologies. Several reasons:
We want more testing on the support for ontology changes. We know that once we open the doors to custom ontologies that we’ll see usage of this rather sooner than later.
We don’t yet support removing properties and classes. This would be easy (drop the table and columns away and log the event in the journal) but it’s not yet supported. Mostly because we don’t need it ourselves (which is a good reason).
We don’t want you to meddle with the standard ontologies (we’ll do that, don’t worry). So we need a bit of ontology management code to also look in other directories, etc.
The error handling of unsupported ontology changes shouldn’t abort like mentioned above. Another piece of software shouldn’t make Tracker unusable just because they install junk ontologies.
We actually want to start using OSCAF’s ontology format. Perhaps it’s better that we wait for this instead of later asking everybody to convert their custom ontologies?
We’re a bunch of pussies who are afraid of the can of worms that you guys’ custom ontologies will open.
But yes, you could say that the basics are being put in place as we speak.
MSNBC: You have more tapes like this? Julian Assange: Yes we do. Assange: I won’t go into the precise number. But there was a rumor that the tape that we were about to release was about a similar incident in Afghanistan, where 97 people were bombed in May last year. We euhm, have that video. MSNBC: Do you intent to release that video as well? Assange: Yes, as soon as we have finished our analysis, we will release it.
Thank you Wikileaks. Thank you Julian Assange. You are bringing Wikileak’s perspective calm and clear in the media. You’re an example to all whistleblowers. Julian, you’re doing a great job.
I understand more people are involved in this leak; thanks everybody. You’re being respected.
Information technology is all about information. Information for humanity.
Don’t you guys stop believing in this! We now believe in you. Many people like me are highly focused and when intelligence services want a battle: we’ll listen. People like me are prepared to act.
I understand you guys like Belgium’s law that protects journalist’ sources. As the owner of a Belgian Ltd. maybe I can help?
I’m not often proud about my country. Last week I told my Swiss friends here in Zürich that I have about 3000 reasons to leave Belgium and a 1000 reasons to come to Switzerland. I wasn’t exaggerating.
I’m a guy with principles and ethics. So thank you.
Today after I brought Tinne to the airport I drove around Zürichsee. She can’t stay in Switzerland the entire month; she has to go back to school on Monday.
While driving on the Seestrasse I started counting luxury cars. After I reached two for Lamborgini and three for Ferrari I started thinking: Zimmerberg Sihltal and Pfannenstiel must be expensive districts too… And yes, they are.
I was lucky today that it was nice weather. But wow, what a nice view on the mountain tops when you look south over Zürichsee. People from Zürich, you guys are so lucky! Such immense calming feeling the view gives me! For me, it beats sauna. And I’m a real sauna fan.
I’m thinking to check it out south of Zürich. But not the canton. I think the house prices are just exaggerated high in the canton of Zürich. I was thinking Sankt Gallen, Toggenburg. I’ve never been there; I’ll check it out tomorrow.
Hmmr, meteoswiss gives rain for tomorrow. Doesn’t matter.
Actually, when I came back from the airport the first thing I really did was fix coping with property changes in ontologies for Tracker. Yesterday it wasn’t my day, I think. I couldn’t find this damn problem in my code! And in the evening I lost three chess games in a row against Tinne. That’s really a bad score for me. Maybe after two weeks of playing chess almost every evening, she got better than me? Hmmrr, that’s a troubling idea.
Anyway, so when I got back from the airport I couldn’t resist beating the code problem that I didn’t find on Friday. I found it! It works!
I guess I’m both a dreamer and a realist programmer. But don’t tell my customers that I’m such a dreamer.