Acthésis : prothèse pour activités Web

Mozilla travaille d’arrache-pied pour faire du Web une plate-forme applicative de premier plan, c’est à dire pour permettre aux applications développées avec les technologies du Web et s’exécutant dans les navigateurs d’être aussi puissantes que les applications « natives ». À cet effet, Mozilla enrichit fréquemment la plateforme de nouvelles APIs, offrant des fonctionnalités avancées aux applications Web. Avec l’arrivée de Firefox OS et la volonté de transformer le navigateur en système d’exploitation complet, le nombre de nouvelles APIs a cru rapidement.

Malheureusement, la standardisation n’avance pas aussi rapidement que la technique, et la plupart des APIs créées pour Firefox OS n’ont pas encore été approuvées comme des standards, et ne sont implémentées par aucun autre navigateur. La plupart ne sont même disponibles que pour Firefox OS, et non dans Firefox. Ce qui pose un problème : les applications Web qui les utilisent ne peuvent fonctionner que sur Firefox OS. Ce sont donc pour l’instant non de vrais applications Web, avec ce que ça implique d’universalité, mais des applications spécifiques à Firefox OS, utilisant des technologies Web.

Cette situation n’est pas nouvelle, car c’est souvent ainsi qu’avance le Web : un navigateur implémente une fonctionnalité, elle est ensuite standardisée et implémentée par les autres navigateurs. Et comme le Web est une plateforme géniale, il dispose d’une technique permettant souvent de pallier les problèmes de compatibilité le temps qu’une technologie soit disponible dans tous les navigateurs : les prothèses, ou polyfill. Ce sont des bouts de code qui implémentent une nouvelle fonctionnalité en utilisant celles existantes.

Pour permettre aux nouvelles APIs proposées par Mozilla d’être utilisées partout, nous devons donc créer des prothèses qui les rendent disponibles dans les autres navigateurs. C’est ce à quoi je me suis modestement attelé avec une bibliothèque, Acthesis, qui essaie de rendre utilisable dans tous les navigateurs l’API Web Activity. Celle-ci permet à une application de déléguer certaines activités à une autre application. Chaque applications peut ainsi se concentrer sur une tâche et interagir avec d’autres pour tout ce qui n’est pas son cœur de métier. Par exemple, votre application de courrier électronique pourra communiquer via Web Activity avec celles qui gérent votre carnet d’adresses, vos fichiers, votre agenda…

Les programmes qui prennent en charge une activité l’indiquent à un registre central. Une application souhaitant déléguer une activité interroge ce registre, qui répond avec la liste des prestataires disponibles. L’utilisateur choisit un de ces prestataires, qui est alors lancé, et une réponse est éventuellement envoyée à l’application initiale. Dans le cas de Firefox OS, le registre central jouant l’intermédiaire entre les applications est l’OS lui-même. Pour ma prothèse, j’ai choisi de passer par un serveur Web. C’est la solution la plus portable, mais elle présente quelques inconvénients (en particulier elle ne fonctionne pas lorsque le navigateur est hors ligne). Une alternative serait de proposer la prothèse sous forme d’extension pour les navigateurs.

L’utilisation d’Acthésis implique donc de disposer d’un serveur et de configurer toutes les applications pour l’utiliser (WebFinger pourrait probablement être ici de quelqu’aide) Par ailleurs, je ne gère pour l’instant pas de notions de droits d’accès, donc le serveur doit être personnel.

Acthésis est avant tout une démonstration pour valider la possibilité de créer de créer des prothèses pour certaines des APIs développées par Mozilla pour Firefox OS. Je pense que le jeu en vaut la chandelle, mais j’attend à présent des retours.

Accessoirement, j’utilise aussi cette bibliothèque pour des démonstrations (tout ce que je sais faire) de communication entre les applications de Cozy Cloud. J’ai dans mes tiroirs un prototype fonctionnel de communication entre la messagerie et le gestionnaire des fichiers. Il permet d’attacher à un nouveau message des fichiers stockés dans dans son nuage personnel, et d’enregistrer dans son nuage les pièces jointes des messages reçus. Le gestionnaire de fichiers étant, grâce à ce module complémentaire, capable de recevoir et partager des fichiers via des Web Activities, toute autre application externe à Cozy peut utiliser ce mécanisme pour accéder à un de mes fichiers stockés dans le nuage.

À titre expérimental, j’ai commencé à implémenter d’autres APIs dans Acthésis :

  • MozAlarms permet de créer des alarmes qui lanceront une application et lui feront exécuter une tâche. Par exemple, une application de lecture de flux RSS pourra être réveillée toutes les heures pour récupérer les nouveaux articles parus dans les flux, les enregistrer, puis se rendormir ;
  • Simple Push permet d’envoyer à une application des informations sans qu’elle les ait demandées.

Ces deux APIs posent cependant un problème : la prothèse ne peut fonctionner que si l’application est déjà ouverte dans un onglet du navigateur. Pour résoudre ce souci, il faudrait soit avoir une application toujours ouverte qui jouerait un rôle d’intermédiaire et ouvrirait à la demande les autres applications dans de nouvelles fenêtres, soit implémenter la prothèse sous la forme d’une extension pour les navigateurs. Une solution moins portable et moins universelle, mais qui rendrait la prothèse plus proche des fonctionnalités émulées.

Voilà. Quelqu’un a un avis ?

Charlie

« J’essaie de me rassurer en me disant que lesgens pleurent davantage l’assassinat d’une partie de leur enfance (RécréA2) qu’un torchon réac ». J’espérais me débarrasser de mon malaise en 140 caractère et pouvoir retourner à mon code, mais comme je vois que tout le monde a retrouvé aujourd’hui le mode d’emploi de son carnet, je m’en voudrais de ne pas apporter ma voix à la cacophonie.

Les histoires d’A…

J’ai commencé à acheter Charlie Hebdo et le Canard Enchainé un mercredi matin au printemps 1994. Une élection approchant, j’avais décidé de m’intéresser un peu à la politique. Je n’ai plus la moindre idée de pourquoi mon choix s’est porté sur ces deux titres. Je leur ai de ce jour été fidèle tous les mercredis pendant des années.

J’ai acheté Charlie pour la dernière fois le 17 janvier 2001, date du mythique éditorial de Philippe Val décrivant les internautes comme « des tarés, des maniaques, des fanatiques, des mégalomanes, des paranoïaques, des nazis, des délateurs, qui trouvent là un moyen de diffuser mondialement leurs délires, leurs haines, ou leurs obsessions ».

Entre les deux… Charlie a très largement contribué à l’éclosion de ma conscience politique. Je suis à peu près sûr que c’est grâce à lui que j’ai découvert les contacts qui m’ont mis sur la voie d’une grosse décennie de militantisme politique. Une vraie histoire d’amour qui s’est mal finie. À mesure que je me formais une conscience, les leçons serinées par Val à longueur d’édito me paraissaient de plus en plus pesantes. Il y eut son soutien à l’OTAN pendant la guerre du Kosovo. Son lâchage dégueulasse de Patrick Font (quels que soient les crimes que celui-ci ait commis). D’autres trucs que j’ai oubliés. Et bien sûr son aversion pour le Net alors que la blogosphère vivait son âge d’or.

Un amour déçu, donc, par la faute d’un individu (je sais que toute le rédaction était loin de partager ses opinions, mais c’est lui qui tenait la barre et emmenait le navire vers des eaux qui ne m’intéressaient plus)

Ma relation à Charlie Hebdo est donc chargée d’émotion. Un amour de jeunesse qui m’a beaucoup déçu et auquel j’en veux, mais pour lequel je garde une vague affection en souvenir du bon vieux temps. Affection aussi pour quelques-un de ses piliers. Luz, heureusement réchappé du carnage, que j’avais croisé une fois ou l’autre à l’époque. Cabu surtout. Pas celui de Dorothée (je me suis toujours demandé ce qu’il foutait là), mais celui de Pilote et de Droit de réponse (souvenirs inventés, je ne suis quant même pas assez vieux pour avoir connu ça à l’époque, mais l’ai découvert et adoré bien plus tard), Cabu du Grand Duduche, Cabu dont, hormis le nouveau beauf, les dessins dans le Canard étaient toujours aussi frais… La mort de Cabu m’a fait beaucoup de peine.

Voilà pourquoi, malgré ce qui suit, le massacre de la rédaction de Charlie m’a bouleversé.

Je ne suis pas Charlie

L’humour, comme toute forme d’expression, est, ou peut être, politique. Humour de résistance sous une dictature, humour contribuant à la cohésion d’un groupe en moquant ceux qui n’en font pas partie. L’humour peut aussi être un instrument au service de l’oppression, une forme « douce », insidieuse, de l’oppression. Une blague misogyne, ça peut être drôle. Des blagues misogynes en continu, à longueur de journée, c’est un moyen, pas forcément conscient, d’entretenir l’ordre patriarcal, de rappeler aux femmes, aux homosexuels, aux arabes… qui a le monopole de la violence symbolique. Je suis donc en désaccord avec Luz quand, dans un récent entretient, il minimise la responsabilité des gribouilleurs de petits mickeys. Les humoristes ont pour moi une responsabilité dans le façonnage de l’opinion publique. Ils peuvent choisir de contribuer à consolider l’ordre symbolique, ou à le dynamiter. Le Charlie des années soixante-dix était probablement un dynamiteur. Le Charlie de 2014 contribue, de mon point de vue, à renforcer certaines discriminations.

Je suis anticlérical pratiquant. Je n’aime aucune religion, et combat leurs prosélytes. Mais si, dans l’absolu, je range toutes les religions dans la même poubelle, dans la pratique je fais quelques différences entre leurs adeptes. Non en me basant sur une analyse des textes, mais plutôt sur le contexte historique et politique. Le monde est dominé par l’« occident » dont le christianisme est la religion officielle. Avec beaucoup de nuances, mais globalement le christianisme est dans notre société la religion des dominants, des oppresseurs. Cette influence est sans doute en perte de vitesse en France, mais elle a tellement modelé notre société qu’elle ne peut être niée. Dans ce contexte, quelle que soit l’aversion que j’ai pour l’Islam, je ne peux faire abstraction que c’est la religion d’une partie de la population qui est encore aujourd’hui opprimée, et qu’en tant que telle, elle est pour ces gens une forme de résistance. S’ils préfèrent revendiquer une identité religieuse plutôt qu’une identité de classe, s’ils préfèrent s’en remettre à l’Islam plutôt qu’au Communisme, c’est en partie de notre faute, nous les militants de Gauche, qui n’arrivons plus à créer de l’espoir en une transformation de ce monde-ci pour en faire un truc un peu plus juste.

Aussi, je pense que si, dans l’absolu, l’Islam doit être la cible de nos attaques tout autant que le Christianisme, dans la pratique et compte tenu du contexte, un acharnement dans la satire des musulmans contribue au maintien des discriminations dont sont victimes nombre d’entre eux en france, non parce qu’ils sont musulmans, mais parce qu’ils ont de lointaines origines extra-européennes. Car c’est l’autre point. L’extrême droite a depuis fort longtemps troqué ses discours racistes pour des tirades contre l’Islam. La cible est toujours la même, et peu de gens sont dupes, mais cette mutation sémantique a contribué à un renouveau du racisme, sous les oripeaux de l’islamophobie. Critiquer l’Islam est donc devenu aujourd’hui extrêmement casse-gueule, tant le risque est grand de contribuer à renforcer le racisme ou les discriminations. Ça ne signifie pas qu’il faut s’abstenir de toute critique. Mais qu’il faut le faire en essayant de ne pas apporter des grains à moudre au moulin des fachos.

J’estime que Charlie a mal négocié ce virage. Peut-être par refus d’accorder une valeur politique au message véhiculé par le journal. Peut-être se sont-ils fait piéger par la publication des caricatures de 2007, et se sont sentis obligés de faire toujours plus fort pour ne pas être accusés de reculer. Je ne sais pas. Mais je sais que pour moi le Charlie de 2014 ne cherche plus à bousculer le désordre établi, mais bien plutôt à le renforcer. Et pour cette raison, je ne suis pas Charlie.

Malaise et beaucoup de questions

De cette analyse de ce qu’était Charlie découle mon malaise face au slogan « je suis Charlie ». Les gens qui l’affichent connaissent-ils et adhèrent-ils à la ligne éditoriale réactionnaire du journal ? Ou à un journal fantasmé, jamais lu mais faisant partie de la culture générale commune ? Et si c’est le cas, quelle est la tronche du fantasme ? L’héritier de Hara Kiri (que, soit dit en passant, pas grand monde ne doit connaitre de première main) ? Le défenseur auto-proclamé de la Liberté de la Presse qui a publié les caricatures ? Les mots ont un sens. Exprimer sa compassion aux proches des victimes, défendre la liberté d’expression, ce n’est pas la même chose que de se revendiquer de la ligne éditoriale d’un journal. Je ne peux m’empêcher de me demander ce qui se serait passé si la cible des fanatiques bas du plafond n’avait pas été Charlie Hebdo mais Valeur Actuelle ou Minute.

Dernier point, je m’interroge sur l’ampleur des mobilisations en réaction au massacre du 7. Je ne comprend pas.

Je ne crois pas que le massacre nous choque à ce point à cause de la proximité. Bien d’autres faits divers tragiques nous atteignent moins, alors qu’ils serait plus simple de s’identifier. N’importe quel accident impliquant des enfants devrait nous remuer en tant que parents. Ça n’est pas le cas. Je ne crois pas non plus qu’il s’agisse directement de défendre la liberté d’expression. D’abord parce que l’attaque du 7, pour horrible qu’elle soit, n’aura que très peu d’impact sur le degré de liberté d’expression dans ce pays. Elle aura une influence, je ne le nie pas, mais comme de nombreux autres faits. Chaque fois que la liberté d’expression est attaquée, par exemple parce que Facebook ou Apple censurent un contenu, notre réaction est dérisoire. Certes, les actions des GAFA sont moins horribles qu’un bain de sang, mais leurs conséquences sont bien plus surement funestes. J’ai l’impression que quelque chose d’autre se joue, mais je peine à l’identifier. Ou refuse de le faire.

Pour que tant de personnes se sentent aussi touchées, sans-doute l’attentat a-t-il touché à quelque chose d’intime, à une identité inconsciente. À certaines valeurs que l’éducation et la propagande ont réussi à inscrire profondément en nous. Des saloperies petites-bourgeoises que nous n’avons pas encore réussi à extirper de notre crane. Oui, justement, notre identité de petit-bourgois. Bon, là c’est très flou donc je ne m’enfoncerai pas davantage.

Dernier dernier tiret, je crains que les rassemblements de soutien à Charlie Hebdo ne soient surtout un nouveau marqueur renforçant un clivag au sein de la société. On nous somme de choisir notre camp. Y aller c’est être avec les Bons. Ne pas y aller, c’est être dans le camp des barbares. Il en est de même des minutes de silence nationales. Refuser de s’y associer, c’est être aussitôt soupçonné de ne pas suffisamment condamner le massacre, donc en devenir complice. J’ai horreur qu’on m’impose ce genre de choix sans nuance. Et je pense que beaucoup de gens, parce qu’ils ne se sentent pas concernés par les deuils officiels, vont se sentir rejetés encore davantage, vont se sentir encore un peu moins égaux.

Mais tout cela est encore obscur, je vais aller butiner un peu ailleurs pour essayer d’y voir plus clair.

Ni logiciel démocratique, ni loi libre

J’essayais récemment d’expliquer le concept de logiciel libre à des gens qui s’y connaissent autant en informatique que moi en… n’importe quel autre domaine, c’est à dire qu’ils savent tourner le minuteur du micro-onde, mais ne comprennent aucun mot de la phrase « compiler le code source du logiciel ».

Et j’ai réalisé une fois de plus qu’en définitive, le logiciel est libre pour moi qui, de par ma culture, suis théoriquement capable de le modifier pour l’adapter à mes besoins, mais sûrement pas pour eux, qui auront toujours besoin de l’aide d’un tiers (oublions les autres libertés, droits d’usage et de redistribution, le néophyte est persuadé que comme pour n’importe quel outil acheté à la quincaillerie du coin, il peut utiliser et distribuer des copies de « ses » logiciels à sa guise).

Finalement, pour l’utilisateur final, qu’est-ce qui distingue un logiciel libre d’un logiciel privateur ? Dans le premier cas, c’est un logiciel conçu par des ingénieurs, dans le second par des marketeux. S’il veut une nouvelle fonctionnalité dans son logiciel, il devra dans un cas s’adresser à des geeks, dans l’autre à des commerciaux. Pour mon néophyte, la différence s’arrête là (au regard de ce critère, on remarquera que Firefox n’est pas un logiciel libre, ce qui explique sans doute son succès).

Aujourd’hui, au détour d’un gazouillis, j’ai vu quelqu’un considérer qu’une loi serait moins démocratique si elle était rédigée par des ingénieurs que par des juristes. Le parallèle m’a sauté aux yeux. Une loi rédigée par des juristes payés par un quelconque lobby n’est, à mes yeux de citoyen, pas plus représentative de ma volonté qu’un texte rédigé par des professionnels de l’informatique ou de la pâtisserie. Mais les juristes sont sans doute persuadés du contraire, comme les libristes de la liberté des utilisateurs de leur code.

Qu’il s’agisse d’écrire le code source d’une loi ou d’un logiciel, tant que l’usager ne sera pas le pilote, on ne pourra pas parler de liberté ni de démocratie, juste de guéguerre de pouvoir entre techniciens de disciplines différentes.

Installer une application Web statique sur CozyCloud

Je l’ai déjà expliqué, je rêve de pouvoir faire de Cozy le pendant serveur de Firefox OS, une plateforme applicative libre et personnelle hébergeant des applications purement Web. J’ai donc essayé d’y installer certaine application Web conçue pour Firefox OS. Pour l’instant, ça n’est pas possible directement, car Cozy ne sait pas encore héberger des pages Web statiques. Une application Cozy nécessite un composant serveur. J’ai donc écrit rapidement un adaptateur pour transformer une application Web statique en application Cozy.

Écrire cet adaptateur s’est révélé être très simple.

Pour simplifier la gestion de dépendances entre l’adaptateur et mon application, j’ai d’abord rendu cette dernière disponible via npm. Il suffit pour cela de créer un fichier package.json (npm init permet de le faire de façon interactive) puis de le publier avec npm publish.

Pour ce qui est de l’adaptateur, Cozy est capable d’installer une application dotée d’un fichier package.json depuis un dépôt Git public. J’ai donc créé un dossier et l’ai initialisé :

mkdir toto
cd toto
git init
npm init
npm install --save express
npm install --save myapp

Pour des raisons de simplicité, j’utilise Express, qui fait tout ce que je veux en deux lignes de code. Il est probablement possible de réduire la taille de l’application installée et son empreinte en se passant d’Express et utilisant directement l’API Node.js. Toute contribution en ce sens sera la bienvenue ☺

Normalement, votre application devrait avoir été installée dans le dossier node_modules/myapp. Il suffit donc de demander à Express de servir les fichiers présents dans ce dossier :

var express = require('express');
var app  = express();
var port = process.env.PORT || 9250;
var host = process.env.HOST || "127.0.0.1";
// Serve static content
app.use(express.static(__dirname + '/node_modules/myapp'));
// Starts the server itself
http.createServer(app).listen(port, host, function() {
  console.log("Server listening to %s:%d within %s environment", host, port, app.get('env'));
});

Et c’est tout, il ne vous reste plus qu’à publier cet adaptateur, et vous devriez pouvoir utiliser vos applications Web statiques dans votre instance Cozy. Pour cela, il suffit de saisir l’URL du dépôt dans le formulaire en bas du gestionnaire d’applications de Cozy et de cliquer sur Installer.

Si vous voulez personnaliser l’icône de l’application dans Cozy, ajoutez le chemin d’une image dans le fichier package.json de l’adaptateur :

{
  "name": "cozy-myapp",
  "version": "0.0.1",
  "description": "CozyCloud wrapper for MyApp",
  "main": "server.js",
  "dependencies": {
    "myapp": ">= 0.0.1",
    "express": "^4.10.1"
  },
  "scripts": {
    "start": "node server.js"
  },
  "author": "Clochix",
  "license": "GPLv3",
  "icon-path": "myapp.png"
}

Adaptez votre application pour Cozy

L’application que j’ai portée permet de synchroniser des données avec un serveur remoteStorage. Or, vous pouvez installer un tel serveur dans votre Cozy. D’où l’idée de pousser un peu l’intégration et de préconfigurer mon application pour qu’elle utilise le serveur RS installé sur l’instance.

J’ai donc légèrement modifié mon application pour qu’elle utilise un fichier default.js contenant quelques valeurs par défaut. Je ne concatène pas ce fichier avec les autres fichiers javascript, obligeant le navigateur à faire une requête spécifique pour le récupérer. Je peux ainsi demander à Express d’intercepter cette requête et de renvoyer en lieu et place du fichier de mon application un autre fichier, contenant des options spécifiques à l’installation sur Cozy :

app.get('/js/default.js', function (req, res) {
  res.setHeader('Content-Type', 'text/javascript');
  res.sendFile('customConfig.js');
});

Le code étant plus parlant que les longues tirades, si le sujet vous intéresse je vous invite à jeter un œil au code de mon adaptateur, et n’hésitez pas à essayer de l’installer sur votre instance Cozy.

How to port a static Web App to Cozy Cloud

I wanted to try to install a static Web Application on my CozyBox. Unfortunately, Cozy is not able for now to serve static Web pages. So I wrote a tiny wrapper around my application. It proved to be very easy. Here’s the simple steps I took :

First, I created a npm package from my application, to reference it from the wrapper. It’s as easy as running npm init then npm publish inside your application repository. Then, the wrapper itself. Create a new directory, initialize the git repository and the package.json. Then dependencies to express.js and your application :

mkdir toto
cd toto
git init
npm init
npm install --save express
npm install --save myapp

Your application should be in node_modules/myapp. All you have to do is use Express to serve this static directory : var express = require(‘express’); var app = express(); var port = process.env.PORT || 9250; var host = process.env.HOST || “127.0.0.1”; // Serve static content app.use(express.static(__dirname + ‘/node_modules/myapp’)); // Starts the server itself http.createServer(app).listen(port, host, function() { console.log(“Server listening to %s:%d within %s environment”, host, port, app.get(‘env’)); });

Congrats, you’re done !

Now, publish the fruit of your efforts to Github, then go to the home of your CozyBox, and at the bottom the of application manager, just type the URL of the repository of your wrapper. Click install, wait a few seconds… Enjoy !

Bonus: Configure your application for Cozy

My application allows to synchronize data with a remoteStorage server. Good news, my CozyBox can host a remoteStorage server. So I’d like to let the application know the parameters to connect to this instance (in fact, all remoteStorage needs is a login).

So I hacked my application to use a default.js file with some default values. When building the application, I don’t concatenate it with others JavaScript files, so browser has to perform a specific query to fetch this file. Then, in the Express server, I just had to add a route to override this file with another one containing specific configuration values:

app.get('/js/default.js', function (req, res) {
  res.setHeader('Content-Type', 'text/javascript');
  res.sendFile('customConfig.js');
});

If you want to see the result of my week-end experiments, just take a look at the code of my Cozy Wrapper for Àlire, or try installing it inside your CozyBox

Bonus: Add an icon

In the package.json file of the wrapper, add the path of the icon of your application :

{
  "name": "cozy-myapp",
  "version": "0.0.1",
  "description": "CozyCloud wrapper for MyApp",
  "main": "server.js",
  "dependencies": {
    "myapp": ">= 0.0.1",
    "express": "^4.10.1"
  },
  "scripts": {
    "start": "node server.js"
  },
  "author": "Clochix",
  "license": "GPLv3",
  "icon-path": "myapp.png"
}
Fork me on GitHub