La route vers le multimédia libre sur Android avec GStreamer

Comme plusieurs d’entre vous le savez déjà, Android est un écosystème au code source ouvert, mais pas tellement ouvert d’esprit ou de culture. Pour décrire succintement le phénomène, je qualifie typiquement Android de « read-only open-source » (du libre en « lecture seule »). Bien qu’une réussite incontestée dans l’industrie, cette plateforme n’a généralement presque rien en commun avec une distribution Linux conventionnelle (mais ça c’est une discussion pour un autre jour).

Ce qui change aujourd’hui, c’est que notre cher GStreamer supporte maintenant Android, grâce à la nouvelle version du SDK GStreamer. Naturellement, cette trousse de développement est non seulement gratuite et documentée, elle est entièrement libre!

C’est qu’un premier coup de hache dans les ronces qui fragmentent l’écosystème du libre: il est maintenant possible de développer des applications multimédia sur toutes les plateformes majeures (Linux, Windows, Mac OS, Android) sans s’arracher les cheveux, sans devoir tout réapprendre et réinventer à chaque fois.

Un jour vous verrez, nous verrons sûrement le dernier bastion des « jardins privés », iOS, succomber au charme de GStreamer.

The new GStreamer SDK is out, with Android support

Time flies! It’s been only a few months since the first release, and yet my pals at Collabora and Fluendo have just announced the availability of another major release of the GStreamer Software Development Kit.

Following up on the 2012.9 “Amazon” release, this SDK release, codenamed “Brahmaputra”, reveals a natural pattern: akin to the river of the same name, it streams down from the Himalayas, brings the coolness downstream, keeps flowing and breathes life onto the lands.

Evening on the Brahmaputra River, by Vikramjit Kakati

A particularly interesting piece of land that now gets irrigated by the flow of GStreamer is the Android plateau (some say platform, but that’s less geographically-fitting!).

Yep, you heard that right, pioneers of the open world! The land of Android is now fertile, free and wide open to rapid development of multimedia applications with GStreamer. Go ahead and try it out today, let us know how it helps you Get Things Done—and how GStreamer can be made even better!

The SDK currently supports a bunch of Linux distributions, Windows (from XP to 8), Mac OS, and Android 2.3.1 and newer (some features such as hardware acceleration will require Android 4.1 or newer). It is fully documented, free as in both, and has a sexy website (what more could you ask for?).

Getting Things GNOME 0.3: retour vers le futur

J’aimerais tout simplement saluer le travail de l’équipe de développement derrière GTG, mon logiciel favori (si si, logiciel favori, point final ! Il est essentiel à ma survie).

Pour vous donner le contexte, j’écrivais cette note personnelle dans Tomboy en 2006, suite à la lecture de Getting Things Done:

Nostalgie? Tout à fait. Maintenant, retour vers le futur, où ce problème est résolu par GTG.

Avec la version 0.3, GTG vient de se sortir de la pire crise de development de son existence. En effet, la version 0.2.4 datait de 2010 (faisons fi de la version intermédiaire 0.2.9 qui n’a pas vraiment eu le temps d’être reprise par plusieurs distributions Linux). Un très long cycle de réingéniérie—pas qu’un simple réusinage, non mossieur !—s’est effectué entre 0.2.4 et 0.3. Le résultat est une application qui performe mieux, est plus facile à développer et lave plus blanc. Je vous laisse constater les prouesses de la nouvelle mouture. La liste de bugs réglés par la série 0.3 (incluant les améliorations de 0.2.9) est tellement longue qu’elle fait planter Launchpad. Selon mes estimations, le total se situe à environ 400 bugs résolus (excluant les doublons, invalides, etc).

Puisque je suis maintenant un vieux crouton après toutes ces années d’utilisation intensive de 0.2.4 (malgré ses petits défauts), je ne suis pas encore passé à 0.3 sur ma machine principale—j’attends que ça vienne avec ma distribution Linux. Toutefois, selon mes quelques tests, le tout me semble solide. Je vous invite donc, jeunes chenapans, à utiliser cette nouvelle version de toute urgence, et m’en donner des nouvelles.

Évidemment, je vous invite également à contribuer au projet. Ploum et ses comparses vous aideront certainement à vaincre les monstres de l’espace qui pourraient croiser votre chemin.

Bug 1010724: Why doesn't dnsmasq listen on both IPv4 and IPv6?

Dnsmasq currently only listens on 127.0.0.1; that's done on purpose. If the only nameserver you have is 127.0.0.1, both IPv4 and IPv6 queries will go through it. It doesn't listen on an IPv6 address. We'll likely change the actual address to '127.0.1.1' as soon as this is possible with dnsmasq, there are changes coming up upstream that should support this.

Letting dnsmasq listen on IPv6 is definitely something I wouldn't mind to see working; but it's unfortunately not as simple as adding '--listen-address=::1' to the parameters passed to dnsmasq by NetworkManager. (Actually, it could be, see below)

I understand some may want to disable all IPv4 on their systems, but that's not advisable, at least for the time being and for the loopback interface and dnsmasq specifically. You absolutely can have an IPv6-only system with no IPv4 addresses on any of the physical interfaces, yet retain the use of 127.0.0.1 on the loopback interface for dnsmasq and others -- DNS resolution will still work for both IPv4 and IPv6 without issues, and you will simply not be able to access IPv4 addresses (since it would be an IPv6-only system for the physical interfaces).

The reason just '--listen-address' can't be used is because we've already had reports about dnsmasq listening on 127.0.0.1 being an issue. It's one we want to address. When installed from the 'dnsmasq' package on Ubuntu/Debian; dnsmasq ships an init script that listens on that loopback IPv4 address as well; causing issues for those who genuinely want to run a system-wide instance of dnsmasq that can be interrogated via loopback (thus serving the local machine), or users who haven't changed any of the default configuration for dnsmasq.

In the case of 127.0.0.1, the fix is relatively simple because we can switch to using 127.0.0.2 or 127.0.1.1; but for IPv6, there doesn't seem to be any such thing other than ::1 specifically meant to be used as a loopback address. In IPv4, it's actually a whole subnet that is available to the loopback interface; while in IPv6 you only have one address (::1/128) (see http://tools.ietf.org/html/draft-smith-v6ops-larger-ipv6-loopback-prefix-00).

I'm very open to suggestions; at this point I'm looking for great ideas on how to best fix this and avoid concurrency issues with other applications; but given the rather minimal return of enabling it vs. the impact on other software running on the machine, and because we ran into precisely this kind of issue (multiple applications listening on the same address on port 53) already, I'd be inclined to have a real good alternative before changing things.

Consider the following two strace outputs for 'ping6 www.google.com'. The first one was run with dnsmasq started (manually, for testing purposes, but with the same parameters as NetworkManager uses) to listen on IPv4:

read(3, "# Dynamic resolv.conf(5) file fo"..., 4096) = 183
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f45cba80000, 4096)            = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\r\347\1\0\0\1\0\0\0\0\0\0\3www\6google\3com\0\0\34\0\1", 32, MSG_NOSIGNAL, NULL, 0) = 32
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [90])                = 0
recvfrom(3, "\r\347\201\200\0\1\0\2\0\0\0\0\3www\6google\3com\0\0\34\0\1"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 90
close(3)                                = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(1025), inet_pton(AF_INET6, "2001:4860:800a::93", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable)


The network is unreachable only because I didn't have IPv6 access at the time. You can see that the request was sent and the address was properly discovered as "2001:4860:800a::93". The most important part is the first connect() using AF_INET as family, and "127.0.0.1" as the address -- that was libc trying to reach the nameserver defined in /etc/resolv.conf.

Now consider the following strace output, which is for the same request sent while dnsmasq was configured to listen only on ::1; and with ::1 defined as the nameserver in /etc/resolv.conf:

socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\220]\1\0\0\1\0\0\0\0\0\0\3www\6google\3com\0\0\34\0\1", 32, MSG_NOSIGNAL, NULL, 0) = 32
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [90])                = 0
recvfrom(3, "\220]\201\200\0\1\0\2\0\0\0\0\3www\6google\3com\0\0\34\0\1"..., 1024, 0, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 90
close(3)                                = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(1025), inet_pton(AF_INET6, "2001:4860:800a::93", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable)


Very much the same behavior as above. This time, the entry in /etc/resolv.conf was ::1, so that's what was used for the first connect(); and because that's an IPv6 address, AF_INET6 was used as sa_family.

Both IPv4 and IPv6 queries were the first to run, and returned pretty much instantly.

One alternative to allow dnsmasq to listen on both IPv4 and IPv6 could be adding a loopback interface (or a tap interface) and using a limited scope IPv6 address, but there remains gotchas with this particular course of action -- for instance, dnsmasq currently appears to bind to *both* the specified link-local address added to lo as well as the "primary" IPv6 address defined for lo (::1/128).

Furthermore, it seems rather clumsy to me to include both the IPv4 and IPv6 addresses in /etc/resolv.conf when they refer to the same software instance. It's not going to bring much.

If you don't care at all about these details, whether ::1 shows up in /etc/resolv.conf automatically, don't run other instances of dnsmasq and want to experiment with custom configurations; in Quantal you'll be able to add configuration settings to files in /etc/NetworkManager/dnsmasq.d and tweak the settings as required.

Enabling IPv6 Privacy Addresses

At the last UDS, we once again discussed the state of IPv6 support in Ubuntu. We're in the process of making Ubuntu really rock with IPv6, and this comes with decisions and hard work.

One of these decisions was to enable IPv6 Privacy Extensions by default. In other words, rather than having an IPv6 address that is derived directly from your network device's MAC address, you'll now have that, but supplemented with time-based temporary addresses, randomly created, used to establish outgoing connections to systems. This leads to higher privacy; because it makes it harder for an eavesdropper to identify whether different addresses really refer to the same node (that's because the *prefix*, which network you come from, would change, but never the last part of the address, unless using privext). How all of this works is described in more details in RFC 4941.


And leading to this, the hard work. We've recently enabled IPv6 privacy extensions through a new file shipped by procps: /etc/sysctl.d/10-ipv6-privacy.conf. Sysctls are parsed early on in the boot process, but perhaps not early enough; which lead to an issue: on some systems, one would see some interfaces with privext enabled, and some others without. This appears to be because some interfaces (eth0 on my system) are initialized early enough in the boot process that it comes up before the sysctl settings are applied.

With this, another issue: there are three types of sysctl settings for ipv6: default, all, and per-interface entries. According to kernel documentation and help strings; default is meant as the ... default for future interfaces that would get created. At least, that's how I get it. Per-interface entries are obvious: you're just changing the setting for that particular interface. But what about all?

Well, it turns out net.ipv6.conf.all.anything doesn't really do anything, except for forwarding and disable_ipv6. These two options are already handled specially by kernel code. The particular setting that interested me was use_tempaddr though, and isn't being propagated (to the per-interface entries) or use globally to enable privacy addresses on all interfaces; which is something you'll likely want if you are looking to enable privacy extensions at all. Take this example: if you're using a mobile system, you might have wired and wireless connected at the same time, and may want to get up, unplug wired, and move around to a different spot, with or without suspending. While NetworkManager will in time allow toggling privacy extensions per connection, you shouldn't need to manually change this for a default install, on a typical, mobile worker day.

So I started writing my first ever kernel patch: having the net.ipv6.conf.all.use_tempaddr sysctl propagate its value to all the other interfaces already present on the system when the value is changed. It's currently being reviewed before I work towards having it included in the kernel proper. Reviews for that patch are welcome on the kernel-team mailing list.

I've now tested that this solves the issue of applying that particular sysctl at boot time; much like it appears to be expected to work by just about everyone if I'm to believe research I've done on the web on that subject. If there are brave souls wanting to test this, head over to my NM PPA. You'll need to be running Precise, and the package you'll want is linux 3.2.0-4.11~mtrudel2. Since this is a custom hacked up kernel package (but I tried hard to follow the Kernel Team's procedures), standard warnings of caution and the usual "if your system gets broken you get to keep both pieces" apply... but I'm running that package too ;)


GNOME Women: work on PiTiVi!

Do you love Python (or C)? Interested in video editing? Then you should definitely consider working on PiTiVi as part of the GNOME Outreach Programme for Women! Feel free to email me or Thibault about it, or catch us on IRC (some details about the program and how to get in touch with us are on this page)

Wait, let me give you an even better incentive. If you feel like email or IRC is too dry to carry complex discussions/questions, and would like a more personalized approach, I (and/or Thibault) will be glad to make an appointment with you for a live audio/video call over Empathy (through Jabber/XMPP/GTalk), Google Plus or even Skype. Just ask and we’ll make sure to be available to discuss every concern you may have.

PiTiVi is currently in a heavy state of flux and it is a bit tricky to list out the exact features that you could work on for the time being. This is one of the reasons why I’m offering an audio call. In the meantime you could take a quick look at the roadmap, pitivi love, but keep in mind that some of these items may be outdated or blocked by the transition to GES. The feature that we probably need the most right now is completing the implementation of the user interface for editing text/titles in PiTiVi: the work is partly done, your mission (if you accept it) would be to finish the UI and integrate it with our new GES backend.

Get in touch with us ASAP, there’s loads of stuff to be done and you only have until Halloween to apply for the GNOME Outreach Programme for Women!

Note that you will have to make a small patch/fix as part of your application, but we’ll gladly help you with it.

Changer les icônes dans Gnome 3 sous Oneiric

Je suis un peu allergique à l’orange, donc en passant sous Gnome 3, j’ai essayé de trouver un moyen d’ajouter la pack d’icônes que j’utilisais sous Gnome 2 (le pack « Dropline Neu! » ). Alors voici comment j’ai procédé.

1 – Changer un thème d’icônes.

Pour changer un thème d’icônes nous avons besoins de l’utilitaire gnome-tweak-tool, s’il n’est pas installé il suffit de taper dans un terminal:

sudo apt-get install gnome-tweak-tool

On peut ensuite le lancer en tapant gnome-tweak-tool dans un terminal ou bien dans le menu Applications->Autre->Advanced Settings.

On peut ensuite changer le thème d’icônes dans la section Theme:

2 – Ajouter un thème d’icônes.

Le choix étant assez limité, on se demande rapidement comment ajouter un thème d’icônes. Heureusement quelques pack d’icônes fonctionnent sous Gnome 3. Il suffit de créer le répertoire .icons à la base notre répertoire personnel.

mkdir ~/.icons

Et y placer notre répertoire contenant notre pack d’icônes. On peut ensuite changer le thème d’icônes dans la section Theme de gnome-tweak-tool.

Boston Summit in Not Boston

This week-end:

  • Trapped Olivier Crète and Guillaume Desmottes into fixing their stack to make video/audio calls work again in Empathy 3.2
  • Spoke at length with Robert Ancell at the Collabora party on Sunday.
    • Good to have an elaborate counter-argument to Matthew Garrett’s famous rebuttal of LightDM: it seems that Robert wishes to make it a compelling-enough replacement for gdm (and all the others) before bringing it up again; in other words, bring the living proof of the superiority of your replacement, such that there are pratically no more reasons for upstream not to adopt it. We will see how this pans out in the next few cycles, it should be interesting.
    • It was a pleasure to discuss  various fashionable subjects of recent times such as the strategic positioning of Canonical/Ubuntu, turning points in the type of userbase (I forgot what exact terminology he used, but to me it basically translated to leaping over a ravine with a giant rocket-propelled lobster), CLAs, Pitivi, etc.
  • Managed to catch Karen Sandler, discuss the workings of the GNOME Foundation and the challenges to face in dealing with project-specific funds. Impressed by her background and moved by her personal story; she literally embodies down to her very heart the struggle of free vs proprietary software.
  • Briefly discussed the women outreach program with Marina. Hopefully I’ll find some time soon to write a dedicate blog post to invite participants to get in touch with the Pitivi project.
  • Hung around with Stéphane, Nohemi, and many others I’m forgetting to mention here. A bit sad I could not follow them onto a leisurely walk in the old town yesterday, I had to go back to the venue to continue investigating bugs in Empathy.
    • I’m not entirely convinced that file transfers work correctly with gtalk and jabber accounts. They sometimes work, sometimes don’t (it seems to vary wildly with huge combinations of version numbers, account types, network/router types, etc.)… one thing I’m very certain of is that I haven’t seen them working reliably in years, and I always have to apologize to friends for that.
  • Ate a lot of apples and mandarines
  • Took absolutely no pictures or videos, for a change.

All in all, it seems to me that the atmosphere this year was the same as last year. I did not know what to expect from a smaller attendance at first, but I’m happy of the outcome and I’d definitely like for more events such as the “Boston Summit” to happen in Montréal.

Installer Gnome Shell (Gnome 3) dans Ubuntu 11.10

En voulant écrire un billet sur l’installation de Gnome 3 dans Oneiric, je suis tombé sur ce billet de Daylinux qui reprend le même thème:

Ubuntu 11.10, la prochaine mouture de Canonical, outre l’environnement par défaut proposant Unity, permet l’installation de Gnome Shell de façon très simple puisque celui-ci est disponible via la logithèque Ubuntu. Si vous souhaitez installer et tester Gnome Shell sur Oneiric suivez les instructions ci-dessous.

Ouvrez la logithèque Ubuntu puis, dans le champ de recherche, tapez ‘gnome’ (ou gnome shell).

Installez le paquet ‘Gnome Shell’

Déconnectez-vous de votre session puis dans le gestionnaire de session LightDM, cliquez le petit engrenage correspondant à votre nom. Dans le menu apparaissant, selectionnez ‘GNOME’ puis loguez vous.

Pour respecter le travail de l’auteur du billet original, celui-ci est placé sous la licence suivante: Paternité – Pas d’Utilisation Commerciale – Pas de Modification 2.0 France (CC BY-NC-ND 2.0)

Source

Antidote RX v8 dans Ubuntu 11.10

Le correcteur d’orthographe Antidote dans sa version huit n’est officiellement supporté que pour Ubuntu 8.04. Mais jusqu’à la version 10.10, je n’ai eu aucun souci avec l’installation de celui-ci. Je n’avais même pas remarqué le problème avec 11.04 (ma 11.04 était une 10.10 mises à jour), mais lors d’une nouvelle installation de 11.04, pas possible d’y arriver sans bidouiller un brin.

Antidote n’est pas un logiciel libre, j’aurais pu aussi intituler ce billet : « c’est compliqué quand ce n’est pas libre », mais puisque que ça se passe dans Ubuntu, je publie.

Alors, voici ce que j’ai appliqué afin de pouvoir utiliser ma version d’Antidote RX v8 (la H60).

Les manipulations qui suivent nécessitent des manipulations à effectuer avec des droits superutilisateurs (root) dont le mauvais usage peut engendrer des effets néfastes pour votre système. Je ne suis donc pas responsable de vos erreurs.

Tout d’abord, j’ai installé normalement Antidote v7 et ensuite j’ai appliqué le patch pour la v8. Jusqu’à 10.10 c’était terminé, un sudo antidote et on pouvait utiliser la chose.

Depuis Ubuntu 11.10

Sous 11.10 on obtient le message d’erreur suivant:

antidote: error while loading shared libraries: libssl.so.6: cannot open shared object file: No such file or directory

La librairie libssl.so.6 semble avoir été remplacée par la libssl.so.1.0.0, pour y remédier j’ai crée le lien symbolique suivant dans les dossiers d’Antidote:

sudo ln -s /lib/i386-linux-gnu/libssl.so.1.0.0 /usr/local/Druide/Antidote/lib/libssl.so.6

Mais un problème semblable existe aussi pour le fichier libcrypto.so.6 puisqu’on obtient le message d’erreur suivant:

antidote: error while loading shared libraries: libcrypto.so.6: cannot open shared object file: No such file or directory

La librairie libcrypto.so.6 semble aussi avoir été remplacée par la libcrypto.so.1.0.0, pour y remédier j’ai également crée le lien symbolique suivant dans les dossiers d’Antidote:

sudo ln -s /lib/i386-linux-gnu/libcrypto.so.1.0.0 /usr/local/Druide/Antidote/lib/libcrypto.so.6

Il faut maintenant remédier à l’erreur suivante:

antidote: symbol lookup error: /usr/lib/i386-linux-gnu/libdbus-glib-1.so.2: undefined symbol: dbus_watch_get_unix_fd

Nous aurons besoin d’une version de libdbus-glib datant de l’époque de la sortie d’Antidote. Il faudra télécharger cette version (ne pas l’installer), la décompresser et ensuite copier les fichiers vétustes dans les répertoires d’Antidote.

wget http://security.ubuntu.com/ubuntu/pool/main/d/dbus-glib/libdbus-glib-1-2_0.74-2ubuntu0.1_i386.deb
dpkg -x libdbus-glib-1-2_0.74-2ubuntu0.1_i386.deb .
sudo cp usr/lib/* /usr/local/Druide/Antidote/lib/.

Et pour terminer, nous aurons à gérer l’erreur suivante:
D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open "/usr/local/var/lib/dbus/machine-id": Aucun fichier ou dossier de ce type

Le fichier machine-id existe dans /var/lib/dbus/. Il nous faudra donc créer un lien, mais d’abord assurons-nous que l’arborescence existe.

cd /usr/local/
sudo mkdir var
cd var/
sudo mkdir lib
cd lib/
sudo mkdir dbus
sudo ln -s /var/lib/dbus/machine-id /usr/local/var/lib/dbus/machine-id

Et voilà, ça devrait fonctionner…..

Bonne erreur de grammaire…