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"
}

My (Cozy ?) Firefox Cloud OS

Il serait temps que je me souvienne que ce fatras est un carnet d’esquisse, et que je m’en serve pour esquisser des bribes d’inspirations pas finies, des fois que quelqu’un ait une idée pour faire avancer la réflexion.

Donc j’ai écrit une appli Web pour Firefox OS. Je dis « pour Firefox OS » car elle utilise un certain nombre de fonctionnalités qui n’existent pour l’instant que sur cette plateforme. Mais, comme je prêche que le Web est la plateforme universelle, je me suis senti obligé de faire en sorte qu’elle fonctionne également, en mode légèrement dégradé, dans tout navigateur moderne. J’ai utilisé pour cela divers types de rustines. Et je me dis que serait fort pratique un service fournissant des rustines à la demande, pour combler les manques actuels des agent utilisateurs Web.

Quelques exemples de telles rustines :

Disposer d’une meilleure connectivité réseau. Mon application intègre un lecteur de flux ATOM. Elle effectue donc des requêtes à destination de divers domaines. En Web classique, c’est interdit du fait de la politique d’origine identique. Dans Firefox OS, cette restriction peut être levée, en accordant explicitement à l’application le droit d’effectuer de telles requêtes. Pour les applications s’exécutant dans un autre environnement, lever la restriction est également faisable, en passant par un proxy CORS. Un tel proxy est l’exemple type de fonctionnalité qu’un service de rustines à la demande pourrait fournir.

Plus généralement, la plateforme Web n’a pas encore pour l’instant accès à de vrais sockets. C’est à dire qu’elle ne peut pas communiquer directement avec d’autres protocoles. Je travaille actuellement sur une application de messagerie, le client ne peut pas dialoguer directement avec des serveurs IMAP/SMTP, etc, et a donc besoin là encore d’un serveur intermédiaire. En attendant que l’API TCPSocket soit standardisée et implémentée, un service fournissant une rustine, par exemple au travers d’un pont Web Socket ↔ TCP Socket, serait le bienvenu.

La communication inter-applicative est aujourd’hui un des plus gros manques de la plateforme Web. Plusieurs propositions existent, Web Intents et Web Activities, mais ni la spécification ni les implémentations ne semblent promettre quelque chose d’utilisable dans un futur proche. En attendant, une solution utilisant un serveur et des Web Hooks me semble assez simple à mettre en œuvre et serait particulièrement utile. J’attend donc d’un service de rustines qu’il me propose une telle solution.

Parmi les fonctionnalités manquantes côté client, on peut encore par exemple citer un planificateur de tâches, capable de déclencher, à l’heure dite ou périodiquement, une fonction d’une application. Et bien évidemment, la synchronisation des données entre les instances d’une application installées sur plusieurs terminaux.

Je suis partisan d’un modèle où nos applications et nos données seraient au plus près de nous, idéalement directement dans nos terminaux. Hébergées sur chacun de nos périphériques disposant d’un navigateur. Malheureusement, une telle solution ne sera pas possible avant plusieurs années, le temps que les navigateurs implémentent les fonctionnalités qui leur manquent. En attendant, nos applications Web auront encore besoin de serveurs pour palier les manques des clients. Ces services, je ne les imagine évidemment qu’auto-hébergés, afin de pouvoir les modeler au plus proche de nos besoins et en garder le contrôle. J’imagine un monde où chaque navigateur aurait son serveur compagnon, les deux travaillant main dans la main.

Un tel projet existe, qui fournit aux applications Web les fonctionnalités aujourd’hui uniquement disponibles côté serveur : c’est Hoodie. Mais je me demande si à côté d’Hoodie, un autre service n’aurait pas sa place. Un service qui, outre ces rustines, hébergerait lui-même des applications Web statiques. Je me demande à quoi ressemblerait une version serveur de Firefox OS, si ce concept même de Firefox Server OS a un sens. Et je me demande si ce Firefox Cloud OS pourrait être un des usages de CozyCloud (le projet pour lequel je travaille). CozyCloud est un serveur hébergeant des applications Web et leur offrant des services transverses. On peut déjà installer un serveur remoteStorage dans sa CozyBox, pour synchroniser des données entre plusieurs instances d’une application. Porter sur Cozy un proxy CORS, Hoodie, ou des équivalents, ne devrait pas poser de problèmes. L’architecture actuelle utilise encore le paradigme d’applications mixtes, mi-client, mi serveur, mais rien n’interdit d’exposer les fonctionnalités spécifiques au serveur comme de réels services accessibles aux applications clientes. Cozy pourrait ainsi devenir le pendant « serveur » de Firefox OS : une plate-forme personnelle d’exécution d’applications Web offrant des fonctionnalités avancées.

Tout cela n’est qu’une intuition, et j’ai du mal à réaliser si je délire complètement ou si c’est une voie à creuser. Vos avis sont les bienvenus ☺

Fork me on GitHub