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 ☺

Message de service

J’ai la chance et la joie de rejoindre dans quelques heures la formidable équipe qui travaille sur le non moins formidable projet CozyCloud.

Jusqu’à présent, il est rare que j’ai pu être fier de mes réalisations professionnelles, et mon expression publique ne pouvait être confondue avec celle de mes employeurs. La situation change, car Cozy est un projet auquel je crois, dont la philosophie rencontre mes valeurs. Je vais essayer de rester relativement neutre dans mes billets et gazouillis, mais je ne crois guère en l’objectivité de la parole humaine, et préfère dire clairement d’où elle émane. Les opinions que j’exprimerai resteront les miennes, et ce carnet ne va pas se transformer en prospectus sponsorisé par Cozy. Il n’empêche, le projet est enthousiasmant, donc je ne m’interdirai pas non plus de dire régulièrement tout le bien que j’en pense.

Inutile de délayer davantage, vous voici prévenus, vous saurez faire la part des choses. Trinquons plutôt à ma nouvelle aventure au pays des nuages douillets ☺

Fork me on GitHub