Liste de partage de Grorico


La semaine dernière je suis allé à la “conférence débat” “Les actifs immatériels publics, leviers de création de richesse et de modernisation de l’Etat” de l’APIE (Agence du Patrimoine Immatériel de l’État). J’avoue que j’étais assez excité à l’idée d’aller voir de plus près ce qui se trame en matière d’Open Data en France. Je n’en ai été que plus déçu à la fois par la totale absence du débat annoncé, et par le peu de vision claire ou prometteuse fournie.
Il est difficile de tirer les grandes lignes de ce qui a été présenté dans la première partie, étant celle qui m’intéresse ici (la seconde étant sur les marques, principalement une publicité pour l’INPI, où l’on appris que les Français étaient champions du monde du nombre d’enregistrements de marque par tête, et que c’est là un indicateur fort du bon état de notre économie). La présentation n’était pas tant un débat qu’une accumulation de personnes parlant de leur propre petit bout de sujet, et ces îlots mêmes n’étaient abordés que très superficiellement.
Le choix des participants était d’entrée de jeu étrange: que faisait l’AFP — qui est indépendante et ne produit pas de données gouvernementales — autour de cette table alors que n’y étaient pas par exemple l’INSEE ou l’IGN ? Il semblerait que leur rôle étaient principalement d’abonder dans le sens de l’APIE en disant le plus de mal possible de la gratuité sur Internet.
Que l’AFP ne désire pas fournir ses contenus gratuitement, c’est là une chose parfaitement normale, voire louable. Elle est en effet sensée obéir à des impératifs commerciaux afin de s’assurer un maximum d’indépendance. En outre, les problèmes de la presse par rapport à la gratuité sont bien connus, même si irrésolus, mais n’ont aucun rapport direct avec ceux de la gratuité des données gouvernementales.
L’obsession Google
La première chose qui se dégage cependant des positions des divers intervenants est une incroyable obsession vis à vis de Google. On croirait, à les entendre, que si ce n’était pour Google, la France ferait deux points de PIB annuel en plus, que les réunions de rédaction se feraient au champagne, et que d’un seul homme, d’une seule femme, l’économie française dans son intégralité, du textile aux visagistes et de la métallurgie aux boulangers, se réveillerait d’un pied radicalement innovant.
Je ne puis retranscrire ici le point auquel cette obsession m’a semblé manifeste — “Google” aurait été un mode de ponctuation oral de la langue française qu’il n’eût pas été cité plus souvent. Sur place, j’ai eu l’impression d’assister à un déraillement ferroviaire au ralenti. Je pensais à la campagne pour Paris de Françoise de Panafieu qui n’a parlé que de Bertrand Delanoë, ou à cette partie de la gauche qui ces dernières années ne discute de rien d’autre que de Sarkozy.
L’obsession est une stratégie de défaite. Je me fous, cher lecteur, du pays dont vient le plus gros ceci ou cela de telle ou telle industrie. Peu me chaut que certains membres de l’administration s’entichent d’une psychose inutile. Mais j’aimerais bien que là où j’habite, travaille, et entreprends on évite d’inhiber de par trop l’innovation au nom d’illusions protectionnistes. J’aimerais, surtout, pouvoir participer au renouvellement d’une confiance citoyenne en l’État — laquelle passe désormais par une réelle transparence de son fonctionnement.
L’Open Data payant: “un open bar où l’on paie ses coups à boire”
Et c’est là que le bât me blesse. Car le résultat de cette obsession sur Google est que l’APIE semble déterminée à faire payer pour les données gouvernementales. Oui, de l’Open Data payant. C’est un peu comme un open bar où l’on paie ses coups à boire. Non. C’est comme un open bar où l’on amène ses propres bières pour ensuite devoir les payer.
Quelle est la logique supputée de cette approche? Eh bien, comme Google n’est pas imposé en France sur la plupart de ses revenus, il faut lui faire payer pour accéder à nos données parce qu’ils pourraient les exploiter et gagner de l’argent avec.Si les facteurs en jeu se limitaient à ceux énoncés au paragraphe précédent, ça pourrait presque faire sens. Mais ça n’est pas le cas.
Lors de la conférence, tout le monde se targuait de ne surtout pas vouloir créer de barrière à l’entrée pour l’exploitation de ces données, en dépit de leur caractère payant. Une idée suggérée était de les rendre gratuites aux JEI (Jeunes Entreprises Innovantes) pendant deux ans, les faisant payer par la suite en fonction de leur chiffre. Ce genre de proposition a toujours l’air rassurant — ça tient en une phrase, ça semble énoncer une solution, ça cause jeunesse et innovation. Mais il suffit de détailler l’approche au-delà de l’idée en l’air pour y voir toutes les barrières. Premièrement, il faut être une entreprise. Ça élimine déjà tous les bricoleurs citoyens. Ensuite, il faut être une JEI. Ça élimine (à ma connaissance) tous les indépendants et les auto-entrepreneurs, toutes les PMEs de plus de huit ans qui pourraient vouloir s’intéresser à un nouveau domaine sans pour autant avoir beaucoup de ressources de R&D. Ça demande de passer le temps qu’il faut à obtenir le label, temps qui est une barrière en elle-même dans toute PME dont les capacités administratives sont limitées. Finalement, ça pose une barrière à des sociétés étrangères qui pourraient faire bénéficier les citoyens français de diverses innovations en matière de transparence gouvernementale.
En bref, autant que je puisse le concevoir il est impossible de faire de l’Open Data payant sans créer une entrave à la participation.
Ceci étant, si ces barrières sont effectivement un problème pour les acteurs les plus petits, elles ne sont qu’un détail pour les plus gros. Remplir divers formulaires administratifs? On a du personnel pour ça. Payer? On a des sous pour ça. Suivant ce raisonnement, une seule conclusion s’impose: non seulement toute forme de contrôle d’accès administratif aux données gouvernementale présente une barrière pour les petits entrants, mais elle ne présente aucun problème aux gros existants.
Une politique d’Open Data payant non seulement musèle l’innovation locale, mais favorise donc directement la Némésis de l’APIE: Google. Son effet est exactement l’inverse de celui escompté.
Il faut donc mettre un terme à ces absurdités. Un véritable effort Open Data français permettrait le développement de projets locaux, avantagés précisément du fait de leur localité, et se rémunèrerait tout simplement sur l’impôt prélevé sur une plus grande valeur produite. Je ne parle même pas des avantages citoyens qui découlent de ce type de projet, tant ils semblent avoir échappé à nos amis de l’APIE.
Article initialement publié sur Berjon.com
Illustration CC FlickR par jwyg
Cet article a pour vocation de présenter la programmation orientée objet du langage JavaScript. Il est nécessaire pour suivre cet article de connaître les bases du langage JavaScript car je ne reviendrai pas sur les notions extérieures au système de prototype.
Si vous n’avez pas de bases dans ce langage, je vous conseille de suivre le tutorial du site du zéro que vous pourrez trouver à l’adresse suivante : http://www.siteduzero.com/tutoriel-3-8158-tout-sur-le-javascript.html.
Également un tutorial sur le DOM en JavaScript (dont nous n’aurons pas besoin lors de ce tutorial) que vous trouverez ici : http://www.siteduzero.com/tutoriel-3-4564-dhtml-et-javascript.html.
Commençons par un petit rappel sur JavaScript.
Petits rappels sur JavaScript
JavaScript est un langage utilisé dans le monde du développement d’applications web afin de rendre le contenu d’un site dynamique. Il permet d’intéragir avec la page affichée et le navigateur, vous pouvez par exemple réaliser des tests permettant de vérifier les champs d’un formulaire avant l’envoi d’une requête au serveur, afficher un menu déroulant lors du passage de la souris, réaliser des systèmes de drag-and-drop…
Le JavaScript est un langage orienté objet qui est exécuté au niveau du client, il diffère des langages orientés objets classiques comme le C++ ou le Java par le fait d’être un langage orienté objet par prototype. Nous verrons dans cet article les différences que cela implique et comment utiliser ce mode de programmation en JavaScript qui encore aujourd’hui n’est principalement utilisé sans mise en place de prototypes.
La programmation orientée objet par prototype
La programmation orientée prototype est une forme de programmation orientée objet n’utilisant pas de classe et basée sur la notion de prototype. Un prototype est une définition de la structure de l’objet permettant de créer des objets de ce type par clonage. L’ensemble des attributs et méthodes d’un objet sont appelés slots car il n’existe pas de différence entre les slots de données et les slots de code. Je parlerais cependant de méthodes et attributs dans mes exemples afin d’avoir une meilleure vision des éléments que nous sommes en train de manipuler.
La grande différence avec la programmation objet utilisant un système de classe est la possibilité offerte au développeur de pouvoir ajouter des slots ou changer la hiérarchie d’héritage de l’objet prototype. Le fait de changer les slots d’un objet prototype impactera directement sur l’ensemble des clones de l’objet. En revanche, il est également possible de modifier la valeur d’un slot mais l’impact de cette modification ne sera alors que locale à l’objet en question et n’influera pas sur les clones de cet objet.
Pour faire simple, un prototype peut être vu comme un exemplaire d’une famille d’objet ayant une influence directe sur l’ensemble de ces objets.
L’intérêt des prototypes est de permettre un héritage dynamique lors de l’exécution.
JavaScript, un langage orienté prototype
Nous allons voir dans cette section le fonctionnement des prototypes proposés par le langage JavaScript.
Comme vous le savez certainement il existe des objets natifs au langage JavaScript, on y trouve des objets tels que String, Number ou encore Array.
Il existe d’autres objets propres au navigateur (c’est la raison pour laquelle tous les scripts JavaScript ne fonctionnent pas forcément d’un navigateur à l’autre), c’est notamment le cas des objets Window ou Document que vous avez très certainement déjà rencontrés.
Comme nous l’avons dit il est possible de modifier les objets dans un langage orienté objet par prototype, nous allons travailler directement sur l’objet Array pour vous donner une idée de comment cela fonctionne.
Ajout d’un attribut dans un objet
Dans ce premier exemple nous allons ajouter un attribut à notre objet Array.
L’objet Array du langage JavaScript classique ne possède pas d’attribut maxWidth permettant de définir une taille maximale aux tableaux.
Ajoutons donc un attribut maxWidth a notre objet Array.
Array.prototype.maxWidth = 15; // Ajout d’un attribute maxWidth de valeur 15 dans les objets de type Array name_tab = new Array(); alert(name_tab.maxWidth);
Une fenêtre d’alerte devrait vous afficher la valeur 15. Comme je vous ai expliqué durant l’introduction les attributs et les méthodes sont en programmation orientée prototype des slots, leur manipulation se fait de la même manière. Si cet exemple vous semble un peu flou ne restez pas ici, je donnerai plus d’explication pour le fonctionnement d’ajout des méthodes dans les objets.
Ajout d’une méthode dans un objet
Un objet Array ne possède pas de méthode (slot) print, pour vous en convaincre, essayez ce bout de code qui ne fonctionne pas.
phone_tab = new Array(); phone_tab.push("03 55 22 23 78"); phone_tab.print();
Vous obtenez alors l’erreur : phone_tab.print is not a function.
Ajoutons donc une méthode print() à notre objet Array!
Créons tout d’abord une fonction affichant simplement l’arrivée dans une méthode print() de l’objet Array :
// Exemple 2 (Ajout d’une méthode à notre Objet Array) function ArrayPrint() { alert("I will print the array for you!"); } Array.prototype.print = ArrayPrint; name_tab = new Array(); name_tab.print();
Vous ne devriez plus avoir d’erreur maintenant, une fenêtre d’alerte vous indique que « I will print the array for you ! ».
Explication de l’exemple :
Nous avons donc dans un premier temps créé une fonction classique en JavaScript puis nous avons créé un slot print dans l’objet Array possédant l’identifiant print et associé à la fonction ArrayPrint. En termes plus clairs, nous avons ajouté une méthode print() à notre l’objet Array en utilisant la ligne : Array.prototype.print = ArrayPrint;
Maintenant allons plus loin en créant une fonction affichant les éléments de notre Array. La fonction que nous allons créer est un peu plus difficile à créer car il faut coder cette fonction comme si nous nous trouvions dans l'objet Array. C’est-à-dire que nous allons pouvoir utiliser le mot-clé this pour accéder au slots de l’objet Array.
// Exemple 3 (Création d’une méthode permettant l’affichage d’un Array()) function ArrayPrint() { var result = ""; for (var i = 0; i < this.length; ++i) result += this[i] + '\n'; // this[i] permet d’accéder à un élément du tableau alert(result); // Affichage du résultat } Array.prototype.print = ArrayPrint; // Ajout de la method print au objet de type Array // Cette méthode reprend le code de la fontion ArrayPrint. name_tab = new Array(); // Création d’un Array name_tab.push("Toto"); name_tab.push("Gerard") ; name_tab.print(); // Appel de la méthode print()
Quand vous lancez ce script dans votre navigateur vous devrez voir cette fenêtre d’alerte apparaître.
Explication de l’exemple :
La fonction ArrayPrint()
Le mot-clé this fait référence à l’objet Array, un objet Array natif au langage JavaScript possède un attribut length permettant de connaître la taille du tableau.
L’accès à cette valeur se fait comme dans l’exemple en utilisant ‘this.length’ (accès à l’attribut length de l’objet Array représenté par this).
Les symboles ‘[‘ et ‘]’ sont surchargés dans l’objet Array et nous permettent d’accéder directement à une valeur du tableau. Il nous suffit donc de faire un ‘this[i]’ pour accéder à l’élément i de notre tableau.
Le script
Le script se contente comme dans l’exemple précédent de créer une méthode print dans les objets de types Array.
Nous avons réussi à implémenter une méthode dans notre objet Array.
Impact d’ajout de slots
Nous allons dans cette partie mettre en avant l’impact de l’ajout des slots dans des prototypes. Je vous rappelle que le fait de changer les slots d’un objet prototype impacte directement l’ensemble des clones de l’objet.
Voici un petit exemple pour mettre en avant cette propriété.
// Exemple 4 (Mise en avant de l’impacte) var result = ""; function ArrayPrint1() { alert("I will print the array for you!"); } function ArrayPrint2() { for (var i = 0; i < this.length; ++i) result += this[i] + '\n'; alert(result); } name_tab = new Array(); // Création d'un Array avant l'assignation Array.prototype.print = ArrayPrint1; // Ajout de la méthode print() name_tab.print(); Array.prototype.print = ArrayPrint2; // Ajout de la méthode print() phone_tab = new Array(); // Création d'un Array après l'assignation name_tab.push("Toto"); name_tab.push("Gerard"); name_tab.print(); phone_tab.push("03 55 22 23 78"); phone_tab.push("01 34 74 74 63"); phone_tab.print();
Quand vous lancez ce script dans votre navigateur vous devrez voir une première fenêtre affichant « I will print the array for you! », une seconde fenêtre mettant en avant les éléments de l’Array name_tab puis cette fenêtre d’alerte devrait apparaître.
Explication de l’exemple :
La différence avec le précédent exemple est le fait que l’on associe dans un premier temps la fonction ArrayPrint1 au prototype aux objets du type Array. Nous créons alors l’objet name_tab, la méthode print() lancera donc une méthode ayant le fonctionnement de ArrayPrint1 affichant par conséquent « I will print the array for you! ».
Nous associons ensuite une nouvelle fonction ArrayPrint2 à la méthode print(). Or comme nous avons dit, changer un slot impacte directement l’ensemble des clones des objets de même type. L’objet name_tab était un clone de l’objet Array, il va donc être directement impacté par cette modification tant bien même qu’il ait été instancié avant la modification du prototype. Ainsi l’utilisation de la méthode print() de name_tab utilisera la fonction ArrayPrint2 tout comme celle de l’objet phone_tab créé après la modification du prototype.
L’appel à ces 2 méthodes va donc permettre d’afficher les éléments contenus dans les 2 Arrays lors de l’appel à la méthode phone_tab.print().
Conclusion
Vous avez maintenant les bases de la compréhension de la programmation prototypée et vous êtes capable d’utiliser les prototypes pour vous permettre d’ajouter ou modifier des objets en JavaScript.
Références
http://www.w3schools.com/jsref/default.asp
http://www.siteduzero.com/tutoriel-3-8158-tout-sur-le-javascript.html
http://fr.wikipedia.org/wiki/Programmation_orientée_objet
http://fr.wikipedia.org/wiki/Programmation_orientée_prototype


