Time to unravel some tufts of the yak hair lying around from this weekend.
I wanted to work on making my GTD application (using CouchDB) a little more friendly.
I started out by learning GreaseMonkey so I could modify Trac pages to include a link converting the ticket into a thing in my application.
The basics of that were easy, but I need to learn a bunch more Javascript before it will actually work well. So, I switched to finally figuring out if desktopcouch might be a good solution for the general problem for users to set up a couchdb database.
desktopcouch’s tagline describes it nicely ‘A CouchDB for every desktop.’ From what I can tell, it has:
At this point I don’t know how intertwined this record concept is with the rest of desktopcouch. As at the moment I want to use desktopcouch simply as a reliable way to get a secure, per-user, replicated couchdb database, I’d prefer to not deal with records at all at this point.
In the process of getting acquainted with desktopcouch and packaging it for Fedora, I ran into a few little niggles:
As for the package, if you’re on Fedora 11, just install tao-release for F-11 i386 then type ‘yum -y install desktopcouch’
After that, you can start it by asking it for what port is running:
dbus-send --session --dest=org.desktopcouch.CouchDB --print-reply --type=method_call / org.desktopcouch.CouchDB.getPort
If all goes well that should come back with a number.
You can now access your desktopcouch through Futon with:
firefox $HOME/.local/share/desktop-couch/couchdb.html
Let me know if this worked for you or not !
I have a separate post about packaging ubuntuone stuff, which was much more complicated – and I’m still not sure if I will be able to use it as an online server for my couchdb app.
Now, for some questions to you desktopcouch-savvy people out there:
Is it possible to pair with a different user on the same machine ? I was on a laptop with no other linux computer around, so I was not able to test the pairing. I did set it up for a different user, but neither account seemed to see the other’s couchdb running.
It’s been said before, but a person’s first foray into free culture of any type is often to scratch an itch. For me, my first Wikipedia edit was undoing vandalism on the Hernando de Soto Polar page conflating him with the conquistador of the same name—replacing his actual birth date with 1500-something, etc.
It’s somewhat disappointing that real Wikipedia vandalism is as pointlessly childish as that…
Today while using bdist_rpm to build a quick package to test desktopcouch, the build failed on man pages. It took a while to figure out what to google for, but it turns out it’s this bug which will turn 7 years old come Friday.
That is a little embarassing. I don’t know if it’s because bdist_rpm hardly ever gets used or because it’s hard to figure out what the bug is or how to report it.
In any case, I attached a patch that worked for me today against python 2.6. I punted on actually rebuilding Python for Fedora for my repo since it’s a little bit overkill (the plan is to build a proper .spec file anyway for the package), but if you need the patch it’s in the bug report.
Self-portrait titled Weltschmerz and whisky, © Wouter Bolsterlee, 2009 (click for large version)
I haven't blogged for a long time, and I would have liked to be able to blog about my Gnome soc project, but unfortunately, I have other priorities. As part of my studies, I had to do some development for the android platform, and since the last summer, I can't use other development environment than Vim, I decided to find a way of using it for my android project.
So here is the description of my Vim environment for android applications development. I use vim 7.2, the version distributed with Ubuntu 9.10, the Vjde plugin, terminator as a terminal (which by the way is a great terminal emulator!!) and then last android JDK in order to develop application for android2.0 (eclaire).
First I installed the SDK (there are a few bugs on the emulator installation due to this bug and an this ssl problem. I fallowed this guide to set the sdk. Then, I installed the Vjde plug-in which is a Vim plug-in to get a Java development environment in Vi, this plugin permit to add intelligent completion for methods calls as well as for imports (You only need to unzip this in you ~/.vim directory). Afterward, you create your your android project (this page explains well how to do it). And then you need to create an vjde project, in vim:
:Vjdeas filename.prj
This is actually a text file which permit to save variables to you project. Then I set it Vjde to look at android class, methods and package, in vim:
:let g:vjde_lib_path='/path/to/android/sdk/platforms/android-2.0/android.jar:build.classes'
And save it
:Vjdesave
Thanks to it, I can have functions/imports completion available with the CTRL-X+CTRL-U key combination (I need to load the project(:Vjdeload filename.prj) every time I want to work on it, I think there must be a way of doing it automatically but didn't figure it out yet). It would also be possible to get the documentation integration thanks to the Vjde plugin, but I am used to have it in another window.
Then to try the program on the android emulator, I lunch the emulator, and in a terminal:
ant debug && adb install -r bin/yourAppName-debug.apk
You can then launch it in the android emulator menu (I looked for a way of lunching the program directly from the command line, but didn't find :( ). To debug the app, you can launch the ddms tool which is part of the android sdk.
I hope this could be useful for some people who want to develop for the android platform and don't want to use eclipse or netbeans IDE.
At GCDS Jamie told us that he wants to make a plugin for tracker-store that writes all the triplets to a CouchDB instance.
Letting a CouchDB be a sort of offline backup isn’t very interesting. You want triples to go into the CouchDB at the moment of guaranteed storage: at commit time.
For the purpose of developing this we provide the following internal API.
typedef void (*TrackerStatementCallback) (const gchar *graph, const gchar *subject, const gchar *predicate, const gchar *object, GPtrArray *rdf_types, gpointer user_data); typedef void (*TrackerCommitCallback) (gpointer user_data); tracker_data_add_insert_statement_callback (TrackerStatementCallback callback, gpointer user_data); tracker_data_add_delete_statement_callback (TrackerStatementCallback callback, gpointer user_data); tracker_data_add_commit_statement_callback (TrackerCommitCallback callback, gpointer user_data);You’ll need to make a plugin for tracker-store and make the hook at the initialization of your plugin.
Current behaviour is when graph is NULL, it means that the default graph is being used. If it’s not NULL, it means that you probably don’t want the data in CouchDB: it’s data that’s coming from a miner. You probably only want to store data that is coming from the user. His applications won’t use FROM and INTO for their SPARQL Update queries, meaning that graph is NULL.
Very important is that your callback handler works with bottom halves: put your expensive task on a queue and handle the queued item somewhere else. You can for example use a GThreadPool or a GQueue plus a g_idle_add_full with G_PRIORITY_LOW callback picking items one by one on the mainloop. You should never have a TrackerStatementCallback or a TrackerCommitCallback that blocks. Not even a tiny tiny bit of blocking: it’ll bring everything in tracker-store on its knees. It’s why we aren’t giving you a public plugin API with a way to install your own plugins outside of the Tracker project.
By the way: we want to see code instead of talk before we further optimize things for this purpose.
I love presentations where the audience has lots of questions and comments. Not only does it mean the audience is engaged but the audience's questions (and their answers!) make the presentation richer.
So I'm quite excited that the GNOME Asia Vietnamese conference attendees ask lots of questions. (It's quite different from other Asian countries I've been to.) I've been asked:
I’m home from UDS-Lucid, and it was a heck of a week. I’m still digesting a lot of session material and a lot of Texas-style BBQ.
It’s nice to come home to the house we bought last month and see familiar things like our front door; and next to it the illuminated sign with our house’s street number.
There are two points with which I’d like to begin:
A quick use of the Dictionary applet in GNOME provides the following definition of the word ‘translation’:
The act of rendering into another language; interpretation; as, the translation of idioms is difficult. [1913 Webster]
With each passing day innovative software is released under the umbrella of various Free and Open Source Software (FOSS) projects. For software that is to be consumed as a desktop application, the ability to be localized into various languages makes the difference in wide adoption and usage. Localization (or, translation) projects form important and integral sub-projects of various upstream software development projects.
In somewhat trivial off-the-cuff remarks which make translation appear easier than it actually is, it is often said that translation is the act of rendering into a target language the content available in the source language. However, localization and translation are not merely replacing the appropriate word or phrases from one language (mostly English) to another language. It requires an understanding of the context, the form, the function and most importantly the idiom of the target language ie. the local language. And yet, in addition to this, there is the fine requirement of the localized interface being usable, while being able to appropriate communicate the message to users of the software – technical and non-technical alike.
There are multiple areas that were briefly touched in the above paragraph. The most important of them being the interplay of context-subtext and inter-text. Translation, by all accounts, provides a referential equivalence. This is because languages and, word forms evolve separately. And, in spite of adoption and assimilation of words from languages, the core framework of a language remains remarkably unique. Add to this mix the extent with which various themes (technology, knowledge, education, social studies, religion) organically evolve and, there is a distinct chance that idioms and meta-data of words,phrases which are so commonplace in a source language, may not be relevant or, present at all in the target language.
This brings about two different problems. The first, whether to stay true to the source language or, whether to adapt the form to the target language. And, the second, as to how far would losses in translations be acceptable. The second is somewhat unique – translations, by their very nature have the capacity to add/augment to the content, to take away/subtract from the content thereby creating a ‘loss’ or, they can adjust and hence provide an arbitrary measure of compensation. The amount of improvement or, comprehension a piece of translated term can bring forward is completely dependent on the strength of the local language and, the grasp over the idiomatic usage of the same that the translator brings to the task at hand. More importantly, it becomes a paramount necessity that the translator be very well versed in the idioms of the source language in additional to being colloquially fluent in the target language.
The first problem is somewhat more delicate – it differs when doing translations for content as opposed to when translating strings of the UI. Additionally, it can differ when doing translations for a desktop environment like, for example, Sugar. The known user model of such a desktop provides a reference, a context that can be used easily when thinking through the context of words/strings that need to be translated. A trivial example is the need to stress on terms that are more prevalent or, commonly used. A pit-fall is of course it might make the desktop “colloquial”. And yet, that would perhaps be what makes it more user-friendly. This paradox of whether to be source-centric or, target-friendly is amplified when it comes to terms which are yet to evolve their local equivalents in common usage. For example, terms like “Emulator” or, “Tooltip” or, “Iconify”being some of the trivial and quick examples.
I can pick up the recent example of “Unmove” from PDFMod to illustrate a need to appreciate the evolution of English as a language and, to point to the need for the developers to listen to the translators and localization communities. The currently available tools and, processes do not allow a proper elaboration of the context of the word. In English, within the context of an action word “move” it is fairly easy to take a guess at what “Unmove” would mean. In languages where the usage of the action word “move” in the context of an operation on a computer desktop (here’s a quirk – the desktop is a metaphor that is being adopted to be used within the context of a computation device) is evolving, Unmove itself would not lend itself well to translation. Such “absent contexts” are the ones which create a “loss in translation”.
The singularity here is that the source language strings can evolve beautifully if feedback is obtained from the translated language in terms of what does improve the software. The trick is perhaps how best to document the context of the words and phrases to enable a much richer and useful translated UI. And, work on tooling that can include and incorporate such feedback. For example, there are enormous enhancements that can be trivially (and sometimes non-trivially) made to translation memory or, machine translation software so as to enable a much sharper equivalence.
(The above is a somewhat blog representation of what I planned to talk about at GNOME.Asia had my travel agent not made a major mess of the visa papers.)1920×1080 Theora | mp4
Via Nat Friedman.
After I released version 0.1.13 earlier this week and the Debian package got updated accordingly, I took the time to port the package to Ubuntu Karmic. I created a PPA containing the packages for Karmic. Add the PPA to your system and install gnome-dvb-client, gnome-dvb-daemon and totem-plugins-dvb-daemon.
Packages are available for Mandriva and Arch Linux, too. Obviously, packages for Fedora and OpenSUSE are still missing. Creating packages for one of these distributions is highly appreciated.
Update: I forgot to mention that you have to add the Vala PPA as well.
Since I am planning a project which relies on storing encrypted information on a potentially hostile host, I tried to design a cryptographic mode, called mode FMC. This mode should, when combined with AES, provide a higher security margin than AES alone would. Basically mode FMC is a try to defend your private data (like credit card numbers or password lists stored in the application I am going to write) against yet to be discovered weaknesses in AES. As with any cryptographic project, it would be great to get review.
I’ve written a paper and published the code under LGPL. The code is implemented in C++ and includes a python binding.
The GNOME Asia Summit has an awesome group of Vietnamese volunteers this year - over 50 of them! What distinguishes them from most free software events is that they are mostly women and mostly business students! They are also extremely enthusiastic, full of laughter and always eager to help or ask questions to learn more.
These students have been working hard to get the event ready, they show up at 7:30 every morning, they spend all day interpreting for the speakers and the foreign attendees and they are planning a party for speakers and volunteers this evening. They've been doing a great job of interpreting - especially given that they aren't familiar with free software and technical terms and given that most of us speakers are not used to working with interpreters and speak way too quickly and long. And they still have time to ask lots of questions, make the speakers feel welcome and to laugh a lot.
The GNOME community is a richer one, and GNOME Asia is a great event, because of them.
(As soon as Emily Chen or Andy Fitzsimmon's load their pictures of the volunteer meeting to Flickr, I'll add a picture of them.)
The other day I did a quick hack using Raindrop & Jetpack to get new mail notifications from Raindrop. In total it took me less than an hour. It’s no Joe Shaw hack, so I don’t expect to get in the paper for this but I figured I’d share anyway.
This Jetpack checks Raindrop to see if there are new messages and bubbles them up as notifications if there are. Here’s the source code:
var messages = {}; function checkMail() { var api="http://localhost:5984/raindrop/_api/inflow/conversations/home?limit=10"; jQuery.getJSON(api, function(data, textStatus){ jQuery.each(data, function(i,item){ if (item.unread) { if (!messages[item.id] || messages[item.id] != item.messages.length) { var n={title: item.subject, body : item.messages[0].schemas["rd.msg.body"]["body_preview"], icon : 'http://localhost:5984/raindrop/inflow/i/logo.png'}; jetpack.notifications.show(n); } messages[item.id] = item.messages.length; } }); }); } setInterval(checkMail, 10000);To try this out you’ll need Raindrop installed and running and Jetpack installed in Firefox.
Go to about:jetpack and copy the above code into the Develop tab, then click the try out this code link just below the Bespin editor.
If you don’t want to do all that you can just watch the video below (no sound, so you might want to play some music)
<object height="304px" width="650px"><param name="allowfullscreen" value="true"><param name="allowscriptaccess" value="always"><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7733464&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1"><embed allowfullscreen="true" allowscriptaccess="always" height="304px" src="http://vimeo.com/moogaloop.swf?clip_id=7733464&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" width="650px"></embed></object>Carl stayed true to his awesomeness from yesterday: He updated the hackfest notes with the things we did today. In particular, it includes “hacking ideas” that we’d like to work on.
I’ve spent a lot of time discussing the ideas of my gst-plugins-cairo design with all people. And I have to say I’m happy to say that the general approach has seen excitement from all sides and there doesn’t seem to be any big issues with it. THe best way to summarize it is probably an event from today: Edward ran a gst-launch pipeline as a benchmark for gst-plugins-cairo and it completed in 0.2 seconds.