6118 links
  • GuiGui's Show
  • Home
  • Login
  • RSS Feed
  • ATOM Feed
  • Tag cloud
  • Picture wall
  • Daily
Links per page: 20 50 100
◄Older  
page 99 / 306
Newer►
  • Quand un citoyen veut en savoir plus sur sa presse - GuiGui's Show

    J'ai mis à jour mon article qui vise à en savoir plus sur ce qui se cache derrière les journaux que je lis (ou que j'ai envisagé de lire (genre ça m'a passé l'envie de lire Le Monde, Marianne, Politis et Numerama) : actionnariat, aides financières, pub, flicage numérique, indépendance fonctionnelle, etc.

    Changements :

    • Ajout des dernières aides publiques et privées connues pour Fakir, Marianne, Le Monde, Les Jours, Basta !, Politis et La Revue Dessinée ;

    • Vérification et éventuelle mise à jour de l'indicateur de flicage numérique pour Le Canard enchaîné, Fakir, Siné mensuel, Mediapart, Numerama, Next INpact, Les Jours, Basta ! et Arrêt sur images ;

    • Ajout du journal satirique en PACA Le Ravi puisque je le lis depuis mi-2018.
    April 8, 2020 at 6:55:39 PM UTC - permalink - http://shaarli.guiguishow.info/?1LTOfw
  • Contrepèteries (quater)

    Des confinés ont du mal à piger
    Confinés pas prêts
    Des turnes sentent la bouffe
    Les confinés sont-ils à l'abri des pannes ?
    Ces parents ont bonne mine.
    Face aux ados dans les lycées, aux pions et aux confinés, Blanquer prétend réctifier le notions !
    Oh, des rapins toussent !
    Le feu à la Nièvre
    Contentieux évités : les débiteurs traquent !
    Que de kinés confus !



    Mes trouvailles :

    Des confinés ont du mal à piger
    Confinés pas prêts
    Des turnes sentent la bouffe
    Les confinés sont-ils à l'abri des pannes ?
    Ces parents ont bonne mine.
    Face aux ados dans les lycées, aux pions et aux confinés, Blanquer prétend réctifier les notions !
    Oh, des rapins toussent !
    Le feu à la Nièvre (Le nœud ‒ bout du zboub ‒ a la fièvre ?)
    Contentieux évités : les débiteurs traquent !
    Que de kinés confus ! (Que de culs nés confis ?)

    Dans le Canard enchaîné du 8 avril 2020.

    April 8, 2020 at 1:03:23 PM UTC - permalink - http://shaarli.guiguishow.info/?2lWW0Q
  • Réduire le flicage web avec Referrer-Policy

    Résumé : si t'es adminsys ou développeur d'un site web qui utilise des ressources externes (CSS, police de caractères, JS, frames vidéo / tweet / carte géographique, CAPTCHA etc.) à gogo hébergées chez les géants du net (Google, CloudFlare, Adobe, BootstrapCDN, jsDelivr, Youtube/Vimeo/Dailymotion) que tu ne peux pas virer, ajoute au moins l'entête HTTP « Referrer-Policy "no-referrer" » côté serveur ou dans le code. Cela limite un peu le flicage des visiteurs de ton site web par les quelques géants économiques sus-cités, y compris celui des visiteurs sans connaissances techniques (pour les autres, il y a Smart Referer pour Firefox). Ces acteurs ne seront plus en mesure de suivre tes visiteurs sur ton site (quelles pages il a consulté) ni entre les sites (leur position hégémonique le leur permet). Ça complète les récents blocages par défaut des traqueurs et des cookies tiers par les navigateurs web. Les sites web internes (intranet, webmail, messagerie web, lecteur de flux RSS, etc.) restent d'excellents clients de « Referrer-Policy "no-referrer" » afin d'éviter de dévoiler leur existence au monde.

    Il y a quelques mois, j'évoquais l'entête HTTP nommé « Referrer-Policy ». Je n'en avais pas capté tout le potentiel, donc revenons dessus.

    Quand il suit un lien (intra-site ou inter-sites web), un navigateur web indique, à la page web de destination, de quelle page de quel site web il vient. C'est l'entête HTTP « Referer ». Exemple : « Referer: https://www.mediapart.fr/journal/economie/130218/les-milliardaires-de-la-presse-gaves-d-aides-publiques-et-privees » signifie que le navigateur vient de cet article précis de ce journal précis et que l'utilisateur a cliqué sur un lien situé dans cette page.

    Cet entête est journalisé côté serveur web. C'est même la configuration par défaut du serveur web le plus utilisé, Apache httpd. Cela crée donc un journal qui associe une date, un Referer, une page web demandée et d'autres infos à une adresse IP. Exemple : « 2001:db8::1 - - [07/Apr/2020:16:09:03 +0200] "GET /?rc4hwA HTTP/1.1" "https://www.google.fr/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0" ». Le 07 avril 2020 à 16 h 09 m 43 s, l'adresse IP « 2001:db8::1 », utilisant un navigateur web Mozilla Firefox version 68 sur un système GNU/Linux, en provenance de Google Search, a demandé à consulter ma page web « /?rc4hwA ». Cette personne est donc arrivée sur mon site web après une recherche sur Google.

    Ce Referer est également transmis à chaque fois qu'un élément constitutif d'une page web (image, police de caractère, contenu encapsulé comme une vidéo, CSS, Javascript, etc.) est récupéré. Or, sur tout site web moderne, le CSS est récupéré depuis BootstrapCDN, la police de caractère depuis Google, le Javascript depuis CloudFlare, la vidéo encapsulée depuis Google Youtube, le CAPTCHA depuis Google, etc. et les statistiques sont envoyées à Google Analytics. Les noms sont des exemples parmi d'autres. Je le déplore, ce n'est pas le web authentique, mais c'est un fait.

    Cela signifie qu'une poignée d'acteurs économiques (Google, CloudFlare, BootstrapCDN, jsDelivr, etc.) consignent une association adresses IP + Referer. Comme tout le monde utilise leurs services, ils peuvent suivre notre navigation au sein d'un site web et entre les sites web. Untel a lu tels et tels articles dans le Figaro (il y a l'URL complète dans le Referer, voir ci-dessus), puis il a été sur tel site de rencontre et il y a regardé tels et tels profils (URL complète, toujours ;) ) puis il a consulté tel autre site web. Tout ce flicage se fait sans cookies (d'ailleurs, ces acteurs n'en déposent généralement pas quand on récupère CSS, police, etc.). Je ne dis pas que ces acteurs vont utiliser ces informations à mauvais escient, mais ils les collectent. Or, une collecte sans utilisation aujourd'hui peut conduire à une compromission de la vie privée demain (décision de la Cour de Justice de l'Union Européenne Digital Rights Ireland de 2014). C'est l'évidence même, comme une sextape sans utilisation malveillante aujourd'hui laisse la porte ouverte à un chantage demain.

    Si tu veux pinailler sur la technique (sinon saute au prochain paragraphe), je dois écrire qu'il y a des exceptions au point précédent.

    • Par défaut avec Mozilla Firefox, le Referer n'est pas envoyé quand on passe d'un site web HTTPS (chiffrement) à un site web HTTP (pas de chiffrement). C'est la politique dite « no-referrer-when-downgrade ». Ce comportement par défaut est modifiable dans la configuration avancée de Firefox mais le faire rend la navigation web parfois invivable ;

    • De même, si une police de caractères est chargée depuis un CSS, alors c'est l'URL du CSS qui est renseignée comme Referer. Si le CSS est externalisé, chez BootstrapCDN par exemple, alors c'est BootstrapCDN qui est consigné dans le Referer, pas le site web d'origine. D'autres ressources peuvent être dans cette situation.

    Pour se prémunir de ce flicage, il est possible d'installer l'extension Firefox Smart Referer. Elle permet de contrôler la diffusion du Referer, y compris de l'autoriser automatiquement sur les sites web qui ne fonctionnent pas sans lui (cela fonctionne avec une liste blanche). Par défaut (si le site web n'est pas dans une liste blanche), cette extension envoie l'URL de la destination comme Referer.

    Seule une minorité de personnes installera cette extension (ou équivalent) par manque de connaissances. Or, la vie privée est pour tout le monde. L'éditeur d'un site web (ou ses sous-traitants développeurs et hébergeurs) peut positionner l'entête « Referrer-Policy » sur son site afin d'indiquer au navigateur web de ses visiteurs de ne pas transmettre le Referer ou de le caviarder en fonction des situations. Cela peut se faire dans la configuration du serveur web, y compris celle déportée que constitue un fichier « htaccess », ou dans le code du site (PHP, XHTML, etc.).

    Exemple Apache httpd (y compris .htaccess) :

    Header set Referrer-Policy "same-origin"

    Exemple nginx :

    add_header Referrer-Policy "same-origin";

    On peut aussi le définir dans le code du site web. Exemple en PHP :

    header('Referrer-Policy: "same-origin"');

    Ou dans une balise XHTML (méthode retenue par Google Search + valeur « origin » afin que les sites visités à partir de lui voient que les visites viennent de Google mais ne voient pas les mots-clés recherchés) :

    <meta name="referrer" content="same-origin">

    Dans ces exemples, j'interdis l'émission du Referer en dehors du même site web. Pour être exact, je l'interdis dès qu'un des membres du triptyque protocole+domaine+port diffère, donc les sous-domaines d'un site web seront considérés comme des sites web externes, donc le Referer ne sera pas transmis.

    D'autres politiques sont possibles comme envoyer uniquement le domaine au lieu de l'URL complète (« origin ») comme le fait Google sur son moteur de recherche ou ne pas transmettre du tout le Referer (« no-referrer »).

    La politique du Referer n'a pas d'impact sur les outils de statistiques (Google Analytics, Xiti, Matomo ‒ anciennement Piwik ‒, etc.).

    • L'origine de la visite (moteur de recherche, site web, etc.) sera jamais perdue, même avec la valeur la plus stricte, « no-referrer ». C'est logique : la politique du site d'où l'on vient s'applique à la page web en cours, la politique de cette dernière s'applique aux éléments qui la constituent (images, CSS, etc.) et aux pages (internes et externes) sur lesquelles on ira par la suite en suivant un lien. Notons qu'avec « no-referrer », la requête HTTP récupérant le fichier JS qui constitue l'outil de statistiques (ga.js, matomo.js, etc.) ne contiendra pas de Referrer, mais le script sera autorisé à utiliser l'élement Javascript « document.referrer » afin de récupérer celui de la page web. Dit autrement : le Referer positionné (ou non) sur la requête de récupération de l'outil statistique a aucune importance ;

    • La fonctionnalité « pages les plus lues du site web » ne se base pas non plus sur le Referer. J'ai testé avec Matomo (instance auto-hébergée sur un sous-domaine, configuration par défaut, utilisation du traqueur Javascript).

    Il faut quand même prêter attention aux très vieux sites web qui utilisent le Referer pour valider l'envoi de formulaires web ou autre. Ça fait 15 ans que les bonnes pratiques commandent de ne pas faire ça car ça n'apporte pas de sécurité, mais bon… Au quotidien, au niveau mondial, la liste des sites qui cessent de fonctionner en l'absence de Referer est très maigre, la liste blanche de Smart referer en est l'illustration. Mais ça peut être plus touchy sur des sites web internes / maison.

    Évidemment, il y a des cas où cet entête ne fonctionne pas :

    • D'autres entêtes HTTP communiquent l'URL plus ou moins complète du site web sur lequel nous naviguons. C'est le cas de l'entête « Origin » positionnées dans les requêtes AJAX (XMLHttpRequest) ou dans les requêtes de récupération d'une police de caractères depuis un fichier CSS (« @font-face ») ou dans d'autres cas encore. Ces fuites ne peuvent être évitées (pas même avec l'extension Smart Referer) car elles participent à la politique de sécurité dite CORS ;

    • Les contenus encapsulés, comme une vidéo Youtube, sont autonomes, indépendants de la page web qui les incruste, donc ils appliquent leur propre politique de transmission du Referer ou celle par défaut du navigateur web (pour Firefox : transmettre sauf si passage de HTTPS à HTTP).

    Le mieux est donc d'internaliser tous les éléments qui composent ton site web, CSS, police de caractères, jquery, outil de statistiques (Matomo ‒ anciennement Piwik ‒ et son guide de configuration par la CNIL sont là pour ça, etc.) et de préférer un lien vers un contenu externe (vidéo, carte géographique, Twitter, etc.) à son inclusion sur la page sous forme de widget / gadget. Au moins, le visiteur ne se fait pas renifler le cul sans le savoir par les mêmes acteurs hégémoniques, et, s'il suit un lien, il le fait en connaissance de cause, en acceptant la politique du site web pointé, il a le choix.

    L'internalisation à d'autres avantages :

    • Pas de dépendances à des acteurs économiques avec lesquels tu n'as pas de contrat donc aucune assurance de pérennité ni garantie d'absence de panne (Google a déjà été en panne, CloudFlare aussi). C'est dommage de ne plus avoir de mise en forme sur son site car un acteur toussote à l'autre bout d'Internet… ;

    • Site web moins long à charger car moins de requêtes DNS+TLS+HTTP à effectuer.

    Comme un décideur ou un développeur aura toujours une bonne excuse pour ne pas internaliser (« pas la priorité », « pas le temps », « le gain est faible », « je ne connais pas assez mon framework pour savoir si c'est possible »), l'entête Referrer-Policy est un premier pas pour nettoyer un site web et protéger un poil plus la vie privée des visiteurs. Je recommande la valeur « no-referrer ».

    Je trouve qu'une politique du Referer ferme complète assez bien le récent blocage par défaut des traqueurs tiers par Mozilla Firefox et le très récent blocage par défaut de tout cookie tiers par Apple Safari. Les principaux traqueurs et les cookies tiers éliminés sans action de l'utilisateur, il reste le Referer, les traqueurs déguisés et les contenus externalisés. Avec une politique du Referer ferme, il reste les traqueurs masqués, dont uBlock Origin sait s'occuper depuis peu (mets-le à jour), et les contenus externalisés à outrance. On progresse. La vie privée progresse.

    Ce que j'ai écrit dans mon dernier shaarli sur Referrer-Policy reste valable : je recommande vivement son usage sur des sites web internes : intranet, webmail, messagerie web comme Mattermost (dès que quelqu'un envoie une image, vidéo, URL, le contenu est récupéré automatiquement et affiché), lecteur de flux RSS, etc. Cela évite les fuites, cela évite d'informer l'extérieur de l'existence de ressources internes (je simplifie, d'autres fuites restent possibles, au niveau DNS, par exemple, mais, pour en """"bénéficier"""", il faut être dans un cercle relativement fermé).

    April 7, 2020 at 11:23:30 PM UTC - permalink - http://shaarli.guiguishow.info/?cVuGzQ
  • Créer facilement et gratuitement des cartes géographiques

    Version courte : utilise Framacarte ou umap. Mode d'emploi. Guides vidéos.

    Tu veux une carte avec un marqueur aux couleurs de ton magasin afin d'en indiquer l'adresse et intégrer / utiliser cette carte sur ton site web ? Avec un éventuel message indiquant les horaires d'ouverture ? Plusieurs marqueurs, un par magasins ? Utilise Framacarte ou umap. Mode d'emploi. Guides vidéos.

    Tu veux une carte avec plusieurs marqueurs afin d'identifier tous les lieux d'un festival ou les points de diffusion d'un journal ou les AMAPs du coin ? Avec d'éventuelles informations et médias (photos, vidéos) pour chaque lieu ? Utilise umap ou Framacarte. Mode d'emploi. Guides vidéos.

    Tu veux cartographier un parcours de randonnée ? Un voyage ? L'enrichir avec des photos / vidéos de chaque étape ? Utilise Framacarte ou umap. Mode d'emploi. Guides vidéos.

    Tu veux cartographier un conflit local ou global ? Des événements historiques ? Les résultats par circonscription d'une élection ? Les câbles sous-marins d'Internet ? Utilise umap ou Framacarte. Mode d'emploi. Guides vidéos.

    Tu veux une carte personnalisable ? Choisir le fond de carte le plus adapté à ton besoin ? Choisir la forme, la couleur, l'opacité, le niveau de zoom, etc. de chaque élément ? Activer ou non la localisation de l'utilisateur ? Minicarte ou non ? Etc. Utilise Framacarte ou umap. Mode d'emploi. Guides vidéos.

    Tu veux que plusieurs personnes (élèves, bénévoles, etc.) collaborent pour créer une des cartes sus-mentionnées ? Tu veux partager une carte sur un site web, par email, etc. ? Utilise umap ou Framacarte. Mode d'emploi. Guides vidéos.

    Tu veux importer des données géographiques existantes (KML, GPX, GeoJSON, CSV, etc.) sur un fond de carte libre de droits ? Utilise Framacarte ou umap. Mode d'emploi. Guides vidéos.

    Tu veux une carte qui se mettra à jour toute seule en fonction d'une base de données distante pré-existante, comme celle des restaurants végan ou des stations vélo d'une ville ? Utilise umap ou Framacarte. Mode d'emploi. Guides vidéos.

    Le plus beau, c'est que cet outil est facile à utiliser et qu'il repose sur l'outil de cartographie libre de droit, communautaire et gratuit OpenStreetMap et le service de Framasoft, une association française qui œuvre pour des services numériques éthiques et respectueux des utilisateurs.

    April 6, 2020 at 10:36:25 PM UTC - permalink - http://shaarli.guiguishow.info/?rc4hwA
  • Construire une carte des câbles sous-marins d'Internet avec OpenStreetMap

    TL;DR : carte OpenStreetMap des câbles sous-marins d'Internet / Internet submarine cables map OpenStreetMap. Ci-dessous, pourquoi et comment construire une telle carte.

    ÉDIT DU 29/08/2023 : depuis le 15/11/2022, TeleGeography a supprimé son dépôt git et ne diffuse plus les données géographiques (« We no longer maintain and update a repository on GitHub for our data or our source code » dans l'infobulle « about » sur leur site web). :( Cette carte n'est donc plus à jour. Dernière version des données géographiques. FIN DE L'ÉDIT.


    Introduction

    Loin d'être virtuel, Internet repose sur des infrastructures physiques dont des câbles sous-marins en fibre optique (qu'il faut entretenir contre l'usure, les événements naturels ou humains, les sabotages, etc.).

    La liste de ces câbles, leurs stations d'atterrissement et leur tracé est environ public (environ car le tracé ne l'est pas de manière précise). Nous disposons de l'excellent site web Submarine Cable Map.

    Néanmoins, cet existant, cette carte, me pose deux problèmes :

    • Elle repose sur le service Maps de la multinationale Google. Ça pose les habituelles questions de dépendance vis-à-vis d'un acteur unique hors contrat, de pérennité et de respect de la vie privée ;

    • Elle est plutôt unique, donc elle peut disparaître promptement. À titre d'exemple, les repreneurs du site web historique en la matière, cablemap.info, demandent une inscription préalable, donc, en pratique, cette carte publique a disparu. J'ai vu que les sources du site web sont disponibles (donc que quiconque peut en héberger une copie), mais node.js, yarn et compagnie, ça sera sans moi (et ça ne résout pas la dépendance à Google Maps).

    Pour l'heure, les données (le tracé des câbles et les coordonnées géographiques des stations d'atterrissement) de la carte « Submarine Cable Map » sont disponibles dans un dépôt git public sous une licence environ libre (CC BY-NC-SA).

    Et si on les utilisait pour construire une carte basée sur OpenStreetMap, l'outil de cartographie libre et communautaire (OSM) ?

    C'est chose faite : carte OpenStreetMap des câbles sous-marins d'Internet / Internet submarine cables map OpenStreetMap.
    J'actualiserai cette carte au fil de l'eau, en me basant sur le dépôt git sus-cité.

    Ci-dessous, un retour sur la façon dont j'ai procédé pour construire cette carte.


    Que faut-il pour créer cette carte ?

    Pour réaliser cette carte, il faut deux choses.

    D'un côté, il faut pouvoir créer une carte personnalisée en utilisant un fond de carte OpenStreetMap, c'est-à-dire une carte sur laquelle on peut représenter ce que l'on veut : un itinéraire, un parcours de trail, un marqueur sur un lieu avec une éventuelle infobulle pour donner des infos, plusieurs marqueurs afin d'identifier plusieurs lieux (pour un festival décentralisé, par exemple), etc.

    Le site web officiel d'OpenStreetMap permet de tracer des itinéraires et de partager une carte avec un marqueur sur un lieu (sans infobulle, sans marqueur personnalisé), mais ça s'arrête là.

    Le logiciel web umap pemet tout le reste sus-cité. On peut installer sa propre instance ou utiliser celles qui existent. Exemples : instance umap OSM France, instance umap Framasoft.

    Vu mon maigre besoin, j'ai décidé d'utiliser une instance existante. J'ai choisi celle de Framasoft, une association française qui œuvre pour des services numériques éthiques et la culture libre.

    Pour débuter, je recommande vivement cet exellent tutoriel umap. D'autres tutoriels, et même des tutoriels vidéos sont disponibles sur le wiki officiel OSM France.

    D'un autre côté, il faut retravailler les données géographiques disponibles :

    • Les tracés des câbles sont dans un fichier JSON alors que les informations sur les câbles (nom, longueur, date de mise en service, etc.) sont stockées dans un autre fichier ;

    • On aimerait mettre en forme (gras, liste à puces, liens vers les stations d'atterrissement, etc.) le texte associé à un câble / une station ;

    • On aimerait conserver la coloration des câbles, mais l'attribut JSON utilisé n'est pas prise en charge par umap (et sa valeur n'est pas au format attendu ‒ # ‒).

    On pourrait faire ça à la main, mais de nouveaux câbles entrent régulièrement en service pendant que d'autres rendent leur tablier. Une mise à jour à la main ne serait pas gérable. Il faut donc qu'un programme informatique fasse cette transformation des fichiers d'origine prévus pour Google Maps en fichiers compréhensibles par OpenStreetMap en y ajoutant, au passage, nos desiderata de mise en forme.

    Dès que l'on évoque la manipulation de JSON, on pense forcément à la commande jq. J'ai écrit un tutoriel pour jq qui est rien de plus que le retour de l'expérience acquise pour construire cette carte des câbles sous-marins d'Internet.

    Voici le script que j'ai pondu : transform_carte_cables_sous-marins.sh.

    • Les logiciels git et jq doivent être installés ;

    • Il suffit de le lancer. Aucun argument attendu ;

    • Il va récupérer le dépôt git, créer un espace de travail temporaire, travailler, détruire l'espace de travail temporaire, indiquer où trouver les fichiers résultants de son traitement ;

    • Deux variables en début de script permettent d'ajouter des paramètres umap sur les câbles et les stations (opacité, forme, interaction, etc.). Pour l'instant, tous les paramètres peuvent être définis au niveau du calque, donc ces variables ne servent pas.


    Construire la carte

    Une fois que l'on a exécuté ce script afin de traiter les données, comment créer la carte et y importer les données ?

    • Créer une carte sur une instance umap ;

    • Dans l'entête, à côté de « Carte sans nom », il y a une icône en forme de crayon. Cliquer dessus :

      • Nom = « Submarine Cable Map » ;

      • Description = contenu du fichier summary.txt ;

      • Options d'interface :

        • Afficher le bouton de plein écran = jamais ;

        • Afficher le bouton de localisation = jamais ;

        • Afficher le bouton pour ouvrir l'éditeur d'OpenStreetMap = jamais (je ne souhaite pas donner de faux espoirs au pékin : ce ne sont pas les données relatives aux câbles qui seront modifiables par ce biais) ;

        • Afficher le bouton d'accès rapide aux couches de données = caché ;

        • Voulez-vous afficher un panneau latéral au chargement? = légende.
      • Limites géographiques (pour limiter les déplacements sur la carte aux endroits où il y a des câbles afin d'éviter les fausses manips) :

        • Sud = -90 ;

        • Ouest = -250 ;

        • Nord = 90 ;

        • Est = 250.
      • Crédits

        • Crédit = « CC BY-NC-SA 3.0 \n Original (Google Maps): [[https://www.submarinecablemap.com/|Submarine Cable Map]] by [[https://www2.telegeography.com/|TeleGeography]]. \n Data: [[https://github.com/telegeography/www.submarinecablemap.com|Github TeleGeography]]. ».
    • Cliquer sur le bouton « Enregistrer ». Garder impérativement le lien de modification (tant que le cookie est conservé par ton navigateur web, ça va, mais sinon il constitue le seul moyen de pouvoir modifier la carte) ;

    • Cliquer sur le bouton « calques » :

      • Supprimer le calque 1 ;

      • Ajouter un calque :

        • Nom = « landings » ;

        • Description = « Landing stations » ;

        • Propriétés de la forme :

          • Forme de l'icône = cercle (elle attire moins l'œil / monopolise moins l'espace disponible).
        • Options d'interaction :

          • Forme de popup = panneau latéral (plus pratique que les infobulles + comportement par défaut d'OSM).
      • Ajouter un calque :

        • Nom = « cables » ;

        • Description = « submarine cables » ;

        • Propriétés de la forme :

          • Opacité = 1 (curseur le plus à droite possible).
        • Options d'interaction :

          • Forme de popup = panneau latéral.
    • Cliquer sur le bouton « Enregistrer » ;

    • Cliquer sur le bouton « importer des données » :

      • Importer des données = choisir le fichier landings.json produit par le script sus-mentionné ;

      • Choisir le calque de données pour l'import = landings ;

      • Cliquer sur le bouton « Importer ».
    • Cliquer sur le bouton « Enregistrer » ;

    • Cliquer sur le bouton « importer des données » :

      • Importer des données = choisir le fichier cables.json produit par le script sus-mentionné ;

      • Choisir le calque de données pour l'import = cables ;

      • Cliquer sur le bouton « Importer ».
    • Cliquer sur le bouton « Enregistrer » ;

    • À la fin de l'URL, ajouter « #2/-0.2/0.0 » et valider ;

    • Cliquer sur le bouton « enregistrer le zoom et le centre actuels » ;

    • Cliquer sur le bouton « exporter et partager la carte » :

      • Télécharger les données = données complètes de la carte ;

      • Cliquer sur le bouton « télécharger les données ». Conserver ce fichier de sauvegarde.



    Je note quelques limites d'umap :

    • Contrairement à la version originale de la carte, je ne suis pas parvenu à créer un lien vers un câble sous-marin dans le panneau latéral d'une station d'atterrissement. De même, pour avoir un lien vers une station d'atterrissement dans le panneau latéral d'un câble, j'ai dû ruser en utilisant ses coordonnées géographiques plutôt que son nom afin de former une URL valide au sens OSM (#<niveau_de_zoom>/<latitude>/<longitude>). Dit autrement : je n'ai pas trouvé un moyen de faire un lien vers un objet. Sur OSM, les objets (le tracé d'une ligne de bus, par exemple) ont un identifiant interne public, donc on peut construire une URL de la forme « /relation/<identifiant> ». Avec umap, je n'ai pas trouvé d'identifiant, y compris dans l'export ;

    • Contrairement à la version originale de la carte, je n'ai pas trouvé comment mettre en évidence / surligner l'ensemble du tracé d'un câble quand on clique dessus, puisque, comme indiqué au point précédent, je n'ai pas trouvé comment pointer un objet par son nom afin de créer un lien pointant sur lui dans son intégralité.


    Annexe : premier script, méconnaissance de jq, optimisation et autocritique

    Le script présenté plus haut permettant de traiter les données géographiques avant importation dans umap n'est pas le premier que j'ai écrit. Le premier, c'est celui-ci : transform_carte_cables_sous-marins.original.sh.

    Quelles différences ?

    • Je n'avais pas compris que jq peut mettre le contenu d'un (ou plusieurs) fichier secondaire dans une (ou des) variable afin d'enrichir le fichier principal avec des informations du (des) fichier secondaire ;

    • Je ne voulais pas admettre qu'une fois qu'on a sélectionné / demander l'affichage d'un attribut qui contient un tableau (« '.monAttribut[]' »), alors on itère sur ce tableau jusqu'à la fin de la commande jq. Tout filtre ajouté à la chaîne sera exécuté autant de fois qu'il y a d'éléments dans le tableau parcouru. Cela signifie aussi que l'on perd tout le contenu JSON qui était autour de ce tableau. Oui, c'est aussi idiot que de se plaindre qu'avec un grep | xargs <maCommande>, maCommande n'accède pas à ce qui n'a pas été retenu par grep. Mais, du coup, ça me fait perdre l'entête et le pied du fichier JSON d'origine, donc ça produit un JSON invalide. Si je n'itère pas sur le tableau, je ne peux pas accéder aux attributs de chaque élément du tableau, donc il m'est impossible, par exemple, de transvaser la couleur d'un câble dans un attribut compréhensible par umap (genre jq '.features[].properties += { "_umap_options": { "color": .color } }' cables.json, ça ne fonctionne pas). Comme je n'avais pas compris que jq permet de travailler sur plusieurs fichiers, je n'avais pas perçu que l'on peut reconstruire le fichier JSON d'origine ;

    • Comme je n'avais pas compris non plus que l'on peut circonscrire une itération sur un tableau au sein d'une opération bornée / finie comme une affectation, je n'avais pas perçu que ça pouvait être une autre solution au problème du point précédent. C'est finalement la solution que j'ai retenue.

    Ces trois points sont détaillés dans mon shaarli dédié à la prise en main de jq par des exemples pratiques.

    En conséquence, je faisais une boucle « for » avec mon shell. La fin de l'itération était le nombre d'éléments dans le tableau - 1. Ainsi, j'avais un indice de tableau. Donc je pouvais accéder à l'élément que je voulais dans le tableau, récupérer son identifiant (permettant de récupérer ses infos dans le fichier JSON séparé) et le modifier.

    • L'inconvénient, c'est que je lançais plusieurs jq (récupérer l'identifiant d'un élément, récupérer les infos dans le deuxième fichier, modifier le JSON avec tout ça) ‒ ce qui implique des fork() et des exec() en pagaille ‒, que j'écrivais autant de fichiers temporaires qu'il y a d'éléments parcourus, et que jq renvoi l'intégralité du JSON à chaque passe. Tout ça consomme du CPU, de la RAM et des IO. Ce premier jet s'exécute en 1 minute 54 (moyenne sur 3 exécutions, récupération du dépôt git exclue). Et, encore, je suis en RAM (tmpfs).

    • L'avantage de cette première version, c'est que, puisque je récupère les informations (sur un câble ou une station) avec une commande jq distincte, je peux appliquer très facilement un grep -v 'null' afin de dégager de la sortie les attributs JSON non-remplis (genre un câble qui n'a pas de site web associé, par exemple). EDIT DU 21/08/2021 : pour afficher un texte pré-défini quand la valeur d'un attribut JSON est null, jq dispose d'un opérateur de remplacement, « // ». FIN DE L'ÉDIT.

    • Autre avantage : pour faire passer le temps d'exécution, j'affiche un joli compteur avec printf() genre « Working on cables: 001/469… […] 142/469… ». Ça fait bien longtemps que je n'avais pas écrit un code générant un affichage aussi kikoo. :D

    La version actuelle du script utilise une seule commande jq (mais avec des filtres supplémentaires) afin de réaliser l'itération, l'enrichissement du JSON et la modification du flux JSON.

    • Cette dernière version s'exécute en 3,6 secondes (conditions de test identiques). 31 fois plus rapide ! :O

    • Inconvénient : la commande jq commence à devenir touffue et très compliquée à comprendre, donc à maintenir dans le temps. Oui, je pourrais virer des variables, mais guère plus, je pense.

    • Le premier avantage de la première version devient un inconvénient : je ne peux plus virer aussi facilement les attributs JSON non-remplis. Probablement que ça peut se faire avec une condition jq mais au prix de la lisibilité. EDIT DU 21/08/2021 : pour afficher un texte pré-défini quand la valeur d'un attribut JSON est null, jq dispose d'un opérateur de remplacement, « // ». FIN DE L'ÉDIT.



    Merci Johndescs pour la relecture et la correction des scripts.

    April 5, 2020 at 9:15:14 PM UTC - permalink - http://shaarli.guiguishow.info/?UJyNPw
  • jq : gsub() échoue sur certains caractères Unicode

    Voir mon introduction à la prise en main de jq, le logiciel de manipulation de JSON en ligne de commande.

    Soit le fichier JSON africa-coast-to-europe-ace.json.

    Avec jq version 1.5.1 Debian GNU/Linux Buster, je veux récupérer la valeur de l'attribut « owners » sous la forme d'une unique chaîne de caractère. Je voudrais que la séparation entre chaque propriétaire ne soit plus « , », mais « \n * » (afin de produire une liste à puces).

    Facile, il suffit d'utiliser la fonction gsub(), greedy sub(), qui permet de remplacer des bouts de chaînes de caractères. Sauf que…

    $ jq -r '.owners | " * \(gsub(", ";"\n *"))"' africa-coast-to-europe-ace.json
     * Orange
     * Dolphin Telecom
     * Cote d’Ivoire Telec
     *
     * Gambia Submarine Cable Company
     * MTN
    […]

    Hum, il y a un raté pour Cote d'Ivoire Telecom.

    Je t'épargne l'identification du problème avec hexdump -C et jq -a (afficher le code séquence d'un caractère non-ASCII) : ce modèle d'apostrophe n'est pas un caractère ASCII mais Unicode.

    Normalement, ça ne devrait pas poser de problème puisque jq travaille, par défaut, en UTF-8 (d'après son manuel). De plus, file -i est formel, le fichier utilisé est bien encodé en UTF-8. Même si j'utilise iconv -t UTF-8 africa-coast-to-europe-ace.json -o africa-coast-to-europe-ace.json pour m'en assurer, ça change rien.

    J'ai essayé avec d'autres caractères Unicode : ça fonctionne avec « » » et des caractères Hangûl, mais pas avec le caractère « ⚧ »…

    J'en déduis que la fonction gsub() de jq foire avec certains caractères Unicode.

    J'ai rien trouvé de mieux que de remplacer l'aspostrophe problématique par l'apostrophe ASCII avec sed -i "s/’/'/" africa-coast-to-europe-ace.json avant son traitement par jq…

    Ce bug semble être corrigé dans la version 1.6 Debian GNU/Linux de jq.

    April 5, 2020 at 7:18:31 PM UTC - permalink - http://shaarli.guiguishow.info/?GQNU7A
  • Manipuler du JSON avec le logiciel jq

    jq (paquet logiciel du même nom) est un outil en ligne de commande pour manipuler du JSON (quelle idée !).

    Il m'apparaît que le meilleur moyen d'apprendre à utiliser jq, c'est de pratiquer. C'est ce que nous allons faire dans ce shaarli.

    Fichiers utilisés dans les exemples ci-dessous : cables.json et cablesDefs.json.



    L'usage le plus simple de jq est de rendre lisible (indentation, coloration syntaxique, etc.) un bout de JSON qui ne l'est pas (on dit aussi prettifyer, forrmatter) : jq '.' cables.json.

    • Note : « . » est l'identité. Elle désigne l'élément / l'objet courant. Au début, elle pointe sur l'objet racine du fichier JSON, mais ça peut évoluer : lors d'une itération dans un tableau, par exemple, l'identité pointera sur l'élément actuellement parcouru.



    Afficher la valeur / le contenu de l'attribut « features » de l'entité / objet racine : jq '.features' cables.json.

    • Comme la valeur de cet attribut est un tableau, tout son contenu est affiché. Si l'on avait afficher la valeur de l'attribut « type » de l'objet racine avec jq '.type' cables.json, le retour serait une unique chaîne de caractères.



    Afficher uniquement l'attribut « slug » de l'attribut « properties » de chaque élément du tableau features « features » : jq '.features[].properties.slug' cables.json.

    • Sorte de grep.



    Afficher l'attribut « name » de l'attribut « properties » de chaque élément du tableau « features ». Afficher « n/a » (not available) si l'attribut n'existe pas ou a « null » comme valeur : jq '.features[].properties.name // "n/a"'.

    • Il s'agit de l'opérateur de remplacement de jq.



    Notons que jq propose des paramètres intéressants.

    • « -r » (raw) permet de ne pas afficher les guillemets autour d'une chaîne de caractères ;

    • « -a » (ascii) remplace les caractères non-ASCII par leur séquence échappée, ce qui est pratique pour identifier un problème lié à l'encodage.



    Ce que nous avons mis entre apostrophes dans les exemples précédents se nomme un filtre. Il est possible d'enchaîner les filtres. Pour ce faire, deux opérateurs existent :

    • « , » exécute les deux filtres et concatène leur résultat (comme « ; » dans un shell). Afficher le contenu de l'attribut « slug » de chaque élément du tableau « features » puis afficher le contenu de leur attribut « color » : jq '.features[].properties.slug , .features[].properties.color' cables.json ;

    • « | » a le même rôle que dans un shell : la sortie du filtre de gauche est l'entrée du filtre de droite. Travailler sur le slug de chaque élément du tableau : jq '.features[].properties.slug | .' cables.json.



    Tout peut être stocké dans une variable à tout moment : jq '.features[].properties as $props | .' cables.json.

    • Plus loin dans l'enchaînement de filtres, on pourra utiliser la variable avec $props | <traitement_ici> ou $props.<nom_attribut> (exemple : « $props.color »).

    • Forcément, si le résultat d'un filtre est stocké dans une variable, alors ce filtre enverra rien sur l'entrée d'un filtre qui lui serait chaîné. C'est le résultat du dernier filtre sans stockage dans une variable qui sera injecté dans l'entrée du filtre chaîné.



    Si un filtre retourne plusieurs résultats et qu'un ou plusieurs filtres lui sont chaînés, ces derniers filtres s'appliqueront / seront exécutés pour chaque résultat retourné par le premier filtre. Il est donc possible de travailler sur chaque élément d'un tableau. Nous le faisons depuis le début : jq '.features[].properties.slug' cables.json = jq '.features[] | .properties.slug' cables.json. Il est donc possible d'exécuter un traitement sur chaque élément du tableau, comme une sorte de grep | xargs.

    • Comme c'est confusant, je conseille vivement d'écrire tranquillement son filtre sur un seul objet à la fois avec jq '.features[0] | .properties.slug' cables.json (« [0] » demande à travailler sur le premier élément du tableau) avant de le généraliser ;

    • Si l'on fait jq '.features[] | ., c'est-à-dire « affiche-moi chaque élément du tableau « features » », on se rend compte que l'on perd l'entête (« { "type": "FeatureCollection", "features": [ ») et le pied (« ] } ») de notre fichier. Il faut comprendre qu'on les retrouvera jamais, qu'on peut jamais remonter au niveau supérieur. Ce serait comme utiliser grep essai | xargs <maCommande> et vouloir que maCommande accède à ce qui n'a pas été grep-é (retenu par grep). Si l'on tente d'enregistrer la racine dans une variable (« . as $racine ») et que l'on tente de l'afficher dans une itération (exemple : jq '. as $racine | .features[] | .properties.slug | $racine' cables.json), l'ensemble du fichier JSON sera affiché autant de fois qu'il y a d'éléments dans le tableau « features », ce qui n'est pas ce que l'on veut. Bref, n'essaye pas. On ne sort pas d'une itération, tout enchaînement de filtres après un filtre qui émet plusieurs éléments JSON sera exécuté autant de fois qu'il y a d'éléments ;

    • En revanche, on peut contenir une telle itération au sein d'une opération bornée, comme une affectation. Ainsi, tout le résultat produit par l'enchaînement des filtres de l'itération sera affecté à une variable. Nous verrons selon un peu plus loin, car il nous manque encore des connaissances.



    Recherche sur la valeur d'un attribut / afficher l'élément du tableau « features » dont la valeur de l'attribut « slug » est « adria-1 » : jq '.features[] | select(.properties.slug=="adria-1")' cables.json.

    • Afficher uniquement la valeur de l'attribut « properties.color » de cet objet ? jq '.features[] | select(.properties.slug=="adria-1") | .properties.color' cables.json ou, plus simplement : jq '.features[] | select(.properties.slug=="adria-1").properties.color' cables.json.

    • Rechercher une sous-chaîne dans la valeur d'un attribut (même dans un tableau de chaînes de caractères) ? select(.nom | contains("Gui")).

    • Rechercher une sous-chaîne dans la valeur d'un attribut avec une regex ? jq '.features[] | select(.properties.slug | test("adria-1")). Il est possible de positionner des drapeaux pour des recherches gourmandes (greedy), pour des recherches insensibles à la case, etc. Exemple concret d'utilisation.

    • select() requiert une expression booléenne. On peut enchaîner des conditions avec and ou or : select(.anneeDebut==2026 and .nom=="Toto").



    On peut mettre en forme /formater la sortie (afficher plusieurs attributs, ajouter du texte libre, etc.). Pour chaque élément du tableau « features », je veux afficher une ligne de la forme \*\*SLUG\*\*: <slug> ~ \*COLOR\*: <color>.. Les « * » sont du formatage Markdown (**gras**, *italique*). Le texte en majuscule, le caractère « ~ » et le caractère final (« . ») sont des bouts de texte arbitraires que je souhaite afficher. jq '.features[] | "**SLUG**: \(.properties.slug) ~ *COLOR*: \(.properties.color)."' cables.json.

    • Les guillemets permettent de saisir des chaînes de caractères. « \() » est l'opérateur qui indique à jq d'interpréter une expression située au milieu d'une chaîne de caractères.

    • On peut aussi : […] select(.nom=="Toto") | .objet as $but | .observation as $obs | .tiers as $beneficiaires | " " as $delimiteur | $delimiteur , $but , $obs , $beneficiaires[].



    Et si je veux utiliser le contenu d'une variable shell dans un filtre ?

    • Normalement, on écrit un filtre jq entre apostrophes afin que le shell n'interprète pas la chaîne de caractères. Mais, on peut aussi l'écrire entre guillemets afin quil l'interpète. Exemple : maVariable='{ "test": "toto" }' ; jq ".features[].properties += $maVariable" cables.json. Cela signifie aussi que tu vas devoir échapper tout ce que le shell pourrait interpréter : le « $ » d'une variable interne à jq, les guillemets, etc. Pour peu que ton enchaînement de filtres jq soit un peu costaud, ça va le rendre illisible. Je déconseille ;

    • jq propose les arguments --arg <nom_variable_interne> <contenu> (le contenu sera enregistré comme une chaîne de caractères) et --argjson <nom_variable_interne> <bout_de_JSON> (attention : le bout de JSON doit avoir une syntaxe valide !). Reprise de l'exemple précédent : maVariable='{ "test": "toto" }' ; jq --argjson varInterne "$maVariable" '.features[].properties += $varInterne' cables.json.



    Et si l'on veut modifier le flux JSON ? Il existe les opérateurs « |= » et « += ». Le premier modifie la valeur d'un attribut en écrasant l'exisant. Le second ajoute un élément dans la valeur d'un attribut.

    • Je veux changer / remplacer la valeur de l'attribut « properties.color » de chaque élément du tableau « features » pour « yellow » : jq '.features[] | .properties.color |= "yellow"' cables.json ;

    • Je veux ajouter un attribut « toto » avec la valeur « titi » dans l'attribut « properties » de chaque élément du tableau « features » : jq '.features[] | .properties += { "toto": "titi" } ' cables.json ;

    • Je veux renommer l'attribut « properties.color » de chaque élément du tableau « features » en « properties.toto » tout en conservant sa valeur : jq '.features[] | .properties += { "toto": .properties.color } ' cables.json ;

    • Je veux déplacer l'attribut « properties.color » de chaque élément du tableau « features » dans un nouvel attribut « properties.toto » tout en conservant sa valeur : jq '.features[] | .properties += { "toto": { "color": .properties.color } }' cables.json.



    Normalement, si tu suis, tu me traites de tricheur : les deux dernières commandes du point précédent n'ont pas renommé / déplacé l'attribut, mais l'ont simplement copié. Pour finir le travail, jq propose la fonction native « del() » qui, comme son nom l'indique, permet de supprimer un attribut. Démo sur les deux exemples précédents : jq '.features[] | .properties += { "toto": .properties.color } | del(.properties.color)' cables.json et jq '.features[] | .properties += { "toto": { "color": .properties.color } } | del(.properties.color)' cables.json.

    • D'autres fonctions natives sont disponibles : select() qu'on a déjà vu, sub() (remplacer une portion de texte avec des expressions régulières ou non), split(), etc. On notera que la fonction gsub() (greedy sub) échoue lorsque certains caractères Unicode sont présents dans la chaîne de caractères à traiter (a priori, c'est corrigé dans la version 1.6 de jq).



    jq ne propose pas un argument (genre « -o ») permettant d'enregistrer le résultat de son traitement dans un fichier. Donc, si l'on veut enregistrer le résultat dans le fichier source / d'origine, il faut utiliser l'outil sponge (une redirection shell, >, viderait le fichier avant d'exécuter jq).



    Il est possible de travailler sur plusieurs fichiers JSON en même temps. Soit en les concaténant (cat fichier1 fichier2 | jq '.'). Oui, ça va générer un fichier JSON invalide (plusieurs entités racines…), mais jq est tolérant. Soit en ayant un fichier principal et des fichiers secondaires accessibles via des variables. Cette deuxième possibilité est très pratique quand on veut agrémenter / enrichir un fichier principal avec des informations disponibles dans un autre fichier (sans polluer le fichier principal avec une concaténation, donc).

    • Exemple pratique. Le fichier cables.json contient les coordonnées géographiques des éléments et le fichier cablesDefs.json contient des informations sur ces éléments (comme leur nom). Dans le fichier cablesDefs, on veut récupérer le nom de chaque élément du fichier cables.json afin de l'insérer dans un attribut « name » dans l'attribut « properties » de l'élément. On veut donc enrichir cables.json avec cablesDefs.json. Notons que les éléments ne sont pas forcément dans le même ordre dans les deux fichiers. Il y a une correspondance id = slug. Démo : jq --slurpfile maVariable cablesDefs.json '.features[] | . as $cable | $maVariable[] | select(.id==$cable.properties.slug).name as $cableName | $cable | .properties += { "name": $cableName }' cables.json.

    • Explication : pour chaque élément du tableau « features », on le stocke dans la variable $cable puis, dans le contenu de maVariable (donc du fichier cableDefs.json, dont chaque élément racine a été importé comme case d'un tableau), on cherche un objet dont l'attribut « id » correspond à l'attribut « slug » de notre élément, on stocke la valeur de l'attribut « nom » de cet objet dans $cableName. On affiche l'élément de notre tableau « features » et on ajoute un attribut dans son attribut « properties ».



    Plus haut, j'écris que si l'on itère sur le contenu d'un attribut avec jq, alors on perd les attributs qui entourent celui sur lequel on itère. Avec ce "mode multi-fichiers", on peut reconstruire le JSON d'origine (sauf si trop d'élements sont passés à la trappe, bien entendu). Exemple (je reprends le cas cité ci-dessus malgré son absence de représentativité) :

    jq '.features[] | .' cables.json > /tmp/json.tmp # dans json.tmp, on aurait donc uniquement les éléments du tableau « features », tout le reste aura disparu
    cat <<EOF > /tmp/minJSONStruct # dans ce fichier, on met l'entête et le pied du fichier d'origine (cables.json), précisement ce qui a disparu
    {
      "type": "FeatureCollection",
      "features": [
      ]
    }
    EOF
    jq --slurpfile featuresList /tmp/json.tmp '.features += $featuresList' /tmp/minJSONStruct > cables.json # on ajoute les ex-éléments du tableau « features » au tableau « features » de l'entête/pied JSON, donc on reconstitue notre fichier cables.json d'origine.

    Oui, je préfère passer par un fichier temporaire que par une variable (avec « --arg ») afin d'éviter les problèmes d'échappement de caractères pour le shell.

    On peut aussi préserver la structure JSON autour du tableau. Pour ce faire, il faut contenir l'itération sur le tableau au sein d'une affectation. Exemple : pour renommer l'attribut « properties.color » d'un objet membre d'un tableau en « properties.toto », il faut que j'itère sur ce tableau sinon je ne peux pas récupérer la valeur de l'attribut afin de la transvaser. Pour que cette opération ne soit pas destructrice, je l'encadre dans une affectation : jq '. as $racine | .featuresDup |= $racine.features | del(.features) | .features += [ .featuresDup[] | .properties += { "toto": .properties.color } | del(.properties.color) ] | del(.featuresDup)' cables.json. Si je n'avais pas dupliqué l'attribut « features », alors ce tableau contiendrait deux fois chaque élément : l'original et la version modifiée. Cette copie me permet de vider l'attribut « features » et d'utiliser sa copie pour itérer dessus et remplir « features » avec les objets modifiés.



    Appliquer le même traitement à tous les éléments d'un tableau. Pour chaque élément du fichier cablesDefs.json, je veux récupérer une unique chaîne de caractères contenant tous les éléments du tableau « landing_points » sous la forme * <nom1>: <latitude+longitude>\n * <nom2>: <latitude+longitude>\n […]. Premier essai : jq '.landing_points[] | " * \(.name): \(.latlon)"' cablesDefs.json. Bien vu, mais on ne peut pas obtenir une unique chaîne avec join() puisque ce qui ressort du filtre, c'est des chaînes de caractères et qu'un join() ne peut être appliqué sur ce type d'objets.

    • Comme dans beaucoup de langage de programmation (Python, Ruby, etc.), la fonction map() permet d'appliquer un même traitement à chaque élément d'un tableau, donc de produire un tableau en sortie… tableau sur lequel on pourra utiliser join(). Démo : jq '.landing_points | map(" * \(.name) :\(.latlon)") | join("\n")' cablesDefs.json.



    Taille d'un tableau aka nombre de cases / d'éléments ou taille d'une chaîne de caractère : length : select(.activites | length > 0).



    Convertir une chaîne de caractère en nombre pour s'en servir dans une comparaison au sein d'une condition : select(.timestamp | tonumber > 1787438544).



    Vérifier l'existence ou l'absence d'un attribut : select(has("text_only")) (présence) ou select(has("text_only") == false) (absence).



    Il reste encore beaucoup de choses à découvrir : les boucles, les conditions, les fonctions persos, etc. Voir le manuel officiel de jq. Pour ma part, j'ai pu réaliser ce que je voulais (construire une carte des câbles sous-marins d'Internet) donc je m'arrête là.

    April 5, 2020 at 6:47:42 PM UTC - permalink - http://shaarli.guiguishow.info/?KMmDNA
  • sponge(1): soak up stdin/write to file - Linux man page

    Qui n'a pas déjà voulu qu'une commande GNU/Linux enregistre son résultat dans le fichier d'origine, genre sort MonFichier > MonFichier ?

    Évidemment, ça ne fonctionne pas car, à cause de la redirection (« > »), le shell vide le fichier « MonFichier » puis l'ouvre avec l'identifiant « 1 » (stdout) dans la table des descripteurs de fichiers du processus, puis il se duplique avec l'appel système « fork() » (un fork() conserve la table des descripteurs de fichiers) puis remplace le code de sa copie par celui du programme demandé (sort, dans notre exemple) avec la famille d'appels système « exec() », ce qui en lance l'exécution. Donc, dès le début, le fichier d'origine est vidé.

    La plupart des commandes permettent d'écrire leur résultat dans un fichier genre sort -o <fichier> <fichier>. Mais pas toutes.

    C'est là que sponge intervient : cette commande du paquet moreutils attend la fin de l'écoulement des données sur stdin puis elle ouvre le fichier passé en argument et enregistre tout ce qu'elle a reçu depuis stdin.
    Pratique quand une commande ne permet pas d'enregistrer son travail dans un fichier (genre jq) et qu'on ne veut pas créer xxx fichiers temporaires (genre « commande fichierN > fichierN+1 »).

    Exemple d'utilisation : jq '.' monFichier | sponge monFichier.

    April 5, 2020 at 2:35:38 PM UTC - permalink - https://linux.die.net/man/1/sponge
  • Bloquer autre chose (des IPs, des ports, etc.) que des applications Android avec AFWall+

    Sur mon ordinateur de poche Android, j'utilise le pare-feu Android AFWall+ (en fait, c'est juste une interface graphique pour le pare-feu natif du noyau Linux, Netfilter).
    Ça me permet de contrôler quelles applications peuvent émettre et sur quel(s) réseau(x) (Wi-Fi, 4G, VPN) elles le peuvent.

    J'utilise également un VPN de confiance (avec le logiciel Android OpenVPN For Android qui n'est pas l'implémentation officielle du projet OpenVPN) afin de me protéger des craderies de mon opérateur mobile lorsque je suis en 4G (on a vu Bouygues Telecom modifier les réponses DNS, on a vu SFR modifier les réponses web, etc.) et des points d'accès Wi-Fi malveillants (notamment ceux tenus par des potes farceurs). Mais également pour ne pas dévoiler ma vie privée à des gens en qui je n'ai pas confiance (opérateurs mobiles, fournisseurs de Wi-Fi ouverts, etc.).

    Lorsqu'on utilise un VPN dans un tel contexte, le minimum est d'interdire tout trafic qui voudrait sortir en dehors du VPN, sauf le VPN lui-même et DHCP.
    De même, lorsqu'un VPN est établi, il convient d'interdire tout trafic DNS sortant vers les serveurs DNS récursifs de l'opérateur mobile / fournisseur Wi-Fi, car certaines applications les utilisent au lieu de ceux proposés par le service de VPN, ce qui fait fuiter une partie de la vie privée.



    AFWall+ permet uniquement d'autoriser / bloquer des logiciels. Le premier besoin est satisfait (bloquer tout en sortie, autoriser quelques logiciels via le VPN), pas le deuxième. Pour le satisfaire, il faut utiliser des scripts personnalisés.

    On peut saisir un script perso directement dans l'interface d'AFWall+, sauf que c'est pénible et long. Je choisis donc de l'écrire dans un fichier séparé. Voici mon script pour bloquer le trafic à destination des serveurs DNS récursifs de Numericable :

    #!/system/bin/sh
    
    # Necessary at the beginning of each script!
    IPTABLES=/system/bin/iptables
    
    # Now add your own rules...
    $IPTABLES -I "afwall-vpn" -d 89.2.0.1/32 -j "afwall-reject"
    $IPTABLES -I "afwall-vpn" -d 89.2.0.2/32 -j "afwall-reject"
    
    # Don't
    # exit 0

    Quelques commentaires :

    • Ne pas oublier le shebang ;

    • La variable « IPTABLES » (et son pendant IPv6 « IP6TABLES ») n'est pas obligatoire, elle ajoute de la simplicité si le chemin vers le binaire iptables change un jour ;

    • Par défaut, AFWall+ exécute le script avant d'insérer ses règles de blocage d'applications. Donc, les règles du script seront ajoutées dans une chaîne avant qu'une application soit autorisée par la même chaîne. C'est bien ce que nous voulons : si les règles étaient ajoutées après, elles seraient inefficaces, l'application ayant été autorisée à émettre par une règle précédente. Par défaut, tout est donc OK. Néanmoins, je décide d'insérer mes règles en début de chaîne (« -I ») plutôt qu'à la fin (« -A ») afin de me prémunir de tout changement futur de comportement d'AFWall+ qui rendrait caduque mon filtrage ;

    • La chaîne « afwall-vpn » s'applique uniquement à ce qui sort par un VPN. D'après la doc', il y existe également les chaînes « afwall-wifi », « afwall-3g », etc. Toutes ne sont pas documentées. Donc je recommande d'exécuter un « /system/bin/iptables -L -n -v » depuis un shell root (commande su) Android (j'utilise le classique Terminal Emulator pour y accéder) pour voir les chaînes disponibles à un instant T ;

    • Je pourrais être plus fin et bloquer uniquement le protocole DNS (udp/53 et tcp/53) à destination de 89.2.0.[1-2], mais ces machines Numericable n'ont probablement pas d'autres usages, et sûrement pas d'usages qui m'intéressent. Donc, autant faire simple et performant en bloquant par IP. Je pourrais aussi bloquer tout trafic DNS qui n'est pas à destination des serveurs DNS récursifs de mon fournisseur de VPN, ce qui serait beaucoup plus sain et sécurisé (aucun risque d'oubli, quel que soit le réseau auquel je suis connecté), sauf que je veux me laisser la possibilité d'utiliser d'autres récursifs DNS au besoin ;

    • Je rappelle que, dans ce contexte, pour un confort utilisateur, il vaut mieux rejeter explicitement le trafic plutôt que de le jeter silencieusement. L'utilisation de la chaîne « afwall-reject » permet en sus la journalisation, utile en cas de problèmes ;

    • set -e (voir ici) ne semble pas être disponible. Dommage. Plus surprenant, un « exit 0 » en fin de script pour signifier que tout s'est bien passé conduit AFWall+ à déclarer que l'application des règles de filtrage a échoué…



    Avec le gestionnaire de fichiers Android Ghost commander, je déplace ce script depuis ma carte SD vers le dossier /storage/emulated/0/afwall. Pourquoi ? 1) Je n'ai pas trouvé de dossier nommé à peu près afwall dans /data/data ; 2) C'est ici qu'AFWall+ stocke ses exportations de règles (menu -> « Export ») donc, c'est lui qui a créé le dossier, donc, en l'utilisant, je me prémunis de problèmes de droits d'accès.

    Plutôt qu'une carte SD, j'aurais pu utiliser adb, oui.

    Ne pas laisser ce script sur la carte SD, car, si elle n'est pas insérée lors d'un démarrage de l'ordiphone, alors les règles de filtrage ne seront pas appliquées, donc le pare-feu sera désactivé.

    Dans le menu d'AFWall+ -> « Set custom script » -> « Enter custom script below », je saisis . /storage/emulated/0/afwall/<nom_script>. Attention au point au début !

    Menu AFWall+ -> « Apply ». C'est terminé. \o/

    April 5, 2020 at 1:29:38 PM UTC - permalink - http://shaarli.guiguishow.info/?4yXBfA
  • How to increase the Android app VLC’s volume to 200% - Quora

    Autoriser l'amplification du volume audio sur la version Android de VLC : menu -> Preferences -> Video -> Audio boost.
    Durant la lecture d'un média, il suffira d'augmenter le volume comme d'habitude (glisser bas vers haut du côté droit), mais, cette fois-ci, il pourra dépasser 100 %, comme sur la version PC GNU/Linux de VLC.

    Attention, pour ce faire, il faut au moins la version 3.0 de VLC (source).
    Si vous avez installé VLC avec l'apk distribué sur le site web officiel (car VLC n'était plus disponible sur F-Droid à une époque, par exemple), F-Droid dira que le logiciel est à jour, ce qui n'est pas le cas. Il faut désinstaller VLC puis l'installer avec F-Droid.

    April 5, 2020 at 11:51:44 AM UTC - permalink - https://www.quora.com/How-can-I-increase-the-Android-app-VLC-s-volume-to-200
  • Copy the contents of a file into the clipboard without displaying its contents - Unix & Linux Stack Exchange

    Copier tout le contenu d'un fichier dans le presse-papier en ligne de commande : xsel -b < <fichier>

    April 5, 2020 at 11:27:27 AM UTC - permalink - https://unix.stackexchange.com/questions/211817/copy-the-contents-of-a-file-into-the-clipboard-without-displaying-its-contents
  • Contrepèteries (ter)

    Vache, pas simple, la livraison de la semaine ! :O

    Confinés empilés
    Les berges ne sont plus à vous !
    Pas de joug sans cuir !
    Sc/iure dans l'évêché
    On bosse à distance, à treize !
    Elle sent fort la verrine de paon
    Flairant des traces de biles dans leurs cotons, des clientes en lutte poussent leurs cris tôt : « Ce Véran nous accule ! » « On parle délais de carence »


    Confinés empilés
    Les berges ne sont plus à vous !
    Pas de joug sans cuir !
    Sc/iure dans l'évêché (chuire dans les WC)
    On bosse à distance, à treize ! (on baise à distance, atroce !)
    Elle sent fort la verrine de paon (elle sent fort[,] la pine de Véran)
    Flairant des traces de biles dans leurs cotons, des clientes en lutte poussent leurs cris tôt : « Ce Véran nous a/ccule ! » (ce Véra nous encule) « On parle délais de carence »



    Dans le Canard enchaîné du 1er avril 2020.

    April 1, 2020 at 12:41:28 PM UTC - permalink - http://shaarli.guiguishow.info/?ye25Qw
  • ToDo installation Windows 10

    Récemment, j'ai constaté que l'ordinateur portable Windows 8 (8.1 ?) d'une amie ramait à moooort. Pour donner une idée : elle a le temps de cliquer sur le raccourci d'un logiciel, de me faire la conversation, de trouver ça trop long, d'aller me chercher une binouze dans son frigo à l'autre bout de sa piaule pendant que le logiciel vient à peine de s'ouvrir. :O

    Il s'agit d'un ordinateur personnel dont un usage professionnel se fait de plus en plus grand. Comment peut-elle se concentrer dans ces conditions ? :O

    Je regarde un peu : CPU identique à mon ordinateur perso (2 cœurs 2,5 Ghz), quantité de RAM équivalente (8 Go), disque dur 5 400 tours/minute (ha, peut-être qu'on a trouvé l'une des causes). J'ai aussi constaté que certains bus sont sous-dimensionnés…

    Je soupçonne aussi la présence d'un virus vu les quelques comportements erratiques de la machine.

    J'ai la flemme de partir à la chasse aux virus (et, surtout, je ne sais plus faire…).

    Je propose une réinstallation complète de Windows. Et, tant qu'à faire, de passer à winwin 10 (même si winwin 8.1 bénéficiera de mises à jour de sécurité jusqu'en janvier 2023).

    En douce (cadeau), je lui achète un SSD. Un Samsung 860 Pro, produit qui remplace les excellents 850 Pro qui équipent mon ordinateur perso et un fournisseur d'accès à Internet alsacien, a ma faveur : ça marche bien et, en cas de pépin, la garantie Samsung 5/10 ans remplace à neuf sans faire chier. Winwin 10 sera installé dessus, ce qui permet de mettre le disque dur d'origine de côté afin de récupérer des fichiers si besoin. Au final, le gain est important mais moins ouf qu'avec un système Debian GNU/Linux…

    Ci-dessous, je propose un résumé de ce qui m'a marqué durant cette installation de winwin 10.


    Virer les mouchards Lenovo

    L'ordinateur étant de marque Lenovo, il faut virer les mouchards incorporés par cet assembleur. Dans quel monde vit-on ?!

    Le mouchard Computrace (voir aussi) n'apparaît pas dans l'UEFI, contrairement à mon ordinateur Dell.

    Le deuxième mouchard de Lenovo, qui résiste lui aussi à une (ré)installation de winwin, n'était pas non plus présent. Les binaires mentionnés par Numerama n'existent pas sur l'ordinateur et le modèle de cet ordinateur n'apparaît pas dans le communiqué de presse de Lenovo (merci à la machine à remonter le temps maintenue par archive.org d'avoir conservé ce document effacé par Lenovo, n'hésite pas à faire un don).

    Le troisième mouchard connu, SuperFish, n'était pas présent. Il ne résiste pas à une (ré)installation propre de winwin, mais je voulais voir. Pour diagnostiquer cela, j'ai suivi le tutoriel proposé par Lenovo lui-même. Si, comme moi, le menu démarrer refuse d'ouvrir le gestionnaire des certificats, utilise Windows+R puis tape « certlm.msc ».

    On notera que les deux derniers mouchards sont devenus des failles de sécurité qui peuvent être exploitées par n'importe qui. Voilà pourquoi ce genre de merde doit être refusée.


    Accéder à l'UEFI

    Mes notes de 2013 sont toujours valables.


    Désactiver Secure Boot

    Parce que changer uniquement la valeur de l'option « Secure Boot » dans l'UEFI, ça serait trop simple. Je copie les instructions afin de les pérenniser :

    Then scroll to the Security tab by using → . Then use ↓ to scroll to the Secure Boot entry. Press the Enter key and select Disabled. Follow that by navigating to the Reset to Setup Mode entry using the ↓ again. Press Enter, then select Yes on the popup to clear the PK, disable secure boot and enter setup mode. You’ll notice that the Platform Mode changes to Setup Mode and Secure Boot Mode becomes Custom. Press the Fn+F10 key to reboot.


    ISO d'installation librement disponible

    Microsoft propose l'ISO de winwin 10 en téléchargement libre. Attention, il faut se rendre sur le site web avec un système autre que winwin (ou trafiquer le user-agent de son navigateur web), sinon le site web ne propose pas l'ISO mais l'outil de MS pour créer un support d'installation.


    Créer un support d'installation

    Un collègue qui se tient à jour sur les technos MS m'a conseillé d'utiliser le logiciel Rufus. Aucune difficulté.


    Choisir l'édition de winwin

    D'une part, je voulais Bitlocker, la techno de Microsoft pour chiffrer un support de stockage car elle est plus transparente que VeraCrypt pour un utilisateur lambda (pas de code à saisir au démarrage, mais dépendance à une puce matérielle, le TPM). Bitlocker n'est pas disponible dans l'édition familiale. De plus, comme cet ordinateur va de plus en plus servir dans un contexte pro, je voulais être sûr que mon amie aurait tous les outils disponibles. Je voulais donc installer l'édition professionnelle de winwin 10.

    Or, durant l'installation, le choix de l'édition ne m'a pas été laissé. Tous les tutoriels indiquent que le choix se fait au début, juste après l'appui sur le bouton « Installer maintenant ». Moi, je passais directement à l'acceptation du contrat winwin.

    Winwin 8 édition familiale était préinstallé sur cet ordinateur. Donc la clé produit est stockée dans la table ACPI de l'UEFI. Donc l'installeur détectait cela et voulait installer l'édition familiale de winwin 10.

    Pour avoir le choix, il faut ajouter un fichier nommé « ei.cfg » dans le dossier nommé « Sources » présent à la racine du support d'installation de winwin. Le contenu doit être (source) le suivant :

    [Channel]
    _Default
    [VL]
    0

    Attention si tu utilises un système GNU/Linux pour créer ce fichier : la manière de terminer une ligne diffère entre Unix (LF) et winwin (CR+LF). Pense à convertir le fichier avec la commande unix2dos ei.cfg (la commande fait partie du paquet logiciel dos2unix).

    Évidemment, il faudra acheter une clé produit winwin 10 pro. Pense à connecter l'ordinateur à Internet avant d'activer winwin, sinon il est en mode démonstration et l'activation (KMS ou clé produit) n'est pas disponible. Lors de cette première connexion, winwin demandera, à nouveau, s'il faut lier le compte utilisateur local à un compte dans le cloud…


    Ne pas se connecter à Internet durant l'installation de winwin

    Cela permet de créer facilement un compte utilisateur local, non-lié à une identité dans le cloud de Microsoft. Sans ça, Microsoft essaye de te piéger et c'est plus compliqué de faire marche arrière. Dans quel monde vit-on ?!


    Questions secrètes

    Lors de la création d'un compte utilisateur, il faut saisir une réponse à trois questions secrètes. Oui, trois ! On marche sur la tête… Le mot de passe d'un utilisateur lambda de winwin est sa date de naissance ou « 1234 », donc bon… Sans compter l'inutilité démontrée des questions secrètes…


    Désactiver Fast Startup / démarrage rapide

    Il s'agit de démarrer rapidement un ordinateur en ne l'éteignant pas totalement. Winwin et les pilotes restent ouverts, le reste est fermé. L'état du système est stocké sur le disque dur.

    Je pense que cette fonctionnalité peut générer des ennuis. Quand le biniou ne termine pas sa mise en hibernation (ça arrive aussi sous GNU/Linux quand des pilotes / matériels font chier) et qu'il se réveille subitement dans ton sac en vidant la batterie. Quand le noyau winwin accumule de la merde. Quand les pilotes merdent. Etc.

    Avec un SSD, un démarrage à froid prend 27 secondes entre la pression sur le bouton et l'arrivée sur l'écran de connexion. C'est acceptable. Fast Startup ne se justifie donc pas.

    Tutoriel pour désactiver Fast Startup.


    Mises à jour

    Attention : si tu comptais cliquer sur « Rechercher les mises à jour » et faire autre chose en attendant que toutes s'installent : si une mise à jour nécessite un redémarrage, les autres mises à jour sont mises en attente (elles ne s'installent pas). De même, les mises à jour facultatives ne s'installent pas automatiquement, sans action.


    Pilotes

    Disponibles sur le site web de Lenovo. Évidemment, comme l'ordi n'est plus en vente, la page web n'est plus à jour, mais Windows Update mettra à jour les pilotes installés.

    Certains pilotes afficheront une erreur genre « Realtek machin ne peut pas s’exécuter sur cet ordinateur ». L'extracteur de Lenovo ne lance simplement pas le bon binaire… Il suffit d’aller dans le dossier d’extraction (c:\drivers, par défaut) et d’installer le pilote du bon constructeur parmi les sous-dossiers (généralement : Intel).

    Je sais qu'il existe des outils automatisés comme DriverCloud (anciennement « Ma-Config »), mais ce n'est pas mon kiff niveau vie privée (le logiciel peut aspirer ce qu'il veut, faire ce qu'il veut, son programmeur peut faire ce qu'il veut des données récupérées, etc.).


    Logiciels

    La plupart des logiciels utilisés par mon amie peuvent être installés avec ninite, sorte de gestionnaire de paquets minimaliste pour winwin. Pour les autres, ce sera installation manuelle en essayant d'identifier le site web officiel ou en utilisant Clubic. Comment peut-on encore en être à ce stade ?!


    Restaurer la configuration de Mozilla Firefox / Thunderbird

    • Ouvrir Firefox, fermer Firefox ;

    • Dans C:\Users\<nom>\AppData\Local\Mozilla\Firefox\Profiles\<chiffres_et_letttres.default>, tout supprimer et mettre le contenu de la sauvegarde ;

    • Même chose dans AppData\Roaming.

    Pour Thunderbird : même logique que pour Firefox sauf que c’est Local\Thunderbird et Roaming\Thunderbird.


    Restaurer la configuration de Google Chrome :

    • Ouvrir Chrome, fermer Chrome.

    • Dans C:\Users\<nom>\AppData\Local\Google\Chrome\User Data, tout supprimer et mettre le contenu de la sauvegarde.


    Vie privée

    Durant l'installation

    On en parle, de la masse de questions posées durant l'installation ?! Dans quel putain de monde vit-on ?!

    • Envoyer l'historique des activités à Microsoft ?

    • Autoriser Cortana à collecter des données ?

    • Désactiver toute reconnaissance vocale dans le cloud ?

    • Autoriser Microsoft à collecter la position géographique afin de propsoer des services ?

    • Envoyer des données de diagnostic ?

    • Envoyer des données de saisie manuscrite à Microsoft afin d'améliorer sa reconnaissance des caractères (OCR) ?

    • Autoriser Microsoft à proposer des conseils avec les données de diagnostic ?

    • Autoriser l'utilisation, par les applications, d'un identifiant publicitaire unique ?

    À chaque question, le choix favorable à Microsoft est bien présenté, comme s'il s'agissait du paradis : envoyer l'historique des activités, c'est pour reprendre vos activités depuis n'importe où ; Refuser l'utilisation, par les applications, d'un identifiant publicitaire unique est présenté comme « vous recevrez toujours autant d'annonces, mais elles peuvent être moins pertinentes pour vous » ; Impossible de désactiver l'envoi de données de diagnostic, on peut juste choisir un envoi « complet » ou « basic ». Le choix inverse est limite présenté comme l'enfer sur terre.

    À l'exception des trois premières questions (de mémoire), l'ergonomie est prévue pour embrouiller l'utilisateur. Genre le bouton se nomme « accepter » au lieu de valider. Donc quand tu réponds non + clic sur le bouton accepter, ça fait bizarre (j'accepte de refuser de me faire fliquer ou j'accepte le flicage tout court ?).

    Dire que les autorités administratives de protection des données personnelles (la CNIL en France) ont validé ça… Les libristes que nous sommes ne pouvons pas faire les malins : on parle des données collectées par Mozilla Firefox et de l'ex-partenariat Amazon-Canonical pour intégrer Amazon dans le menu Unity d'Ubuntu ?! Tout le monde fait n'importe quoi…


    Finir le ménage

    Korben pointe un logiciel libre qui permet de réduire encore un peu le flicage de winwin 10 : DisableWinTracking (fork maintenu ici).

    J'ai coché :

    • Services ;

    • Clear DiagTrack log ;

    • Telemetry ;

    • Block tracking domains ;

    • WifiSense ;

    • Uninstall OneDrive ;

    • Disable Xbox VR.

    Je n'ai pas modifié les autres paramètres (notamment le choix entre désactivation et suppression de services).

    Évidemment, il faut adapter cette liste à l'utilisateur : un joueur ne désactivera peut-être pas Xbox VR, par exemple.


    Virer les pubs et conseils parasites de l'écran de démarrage

    Il faut désactiver Spotlight : clic droit sur bureau → personnaliser → écran de verrouillage → arrière-plan = diaporama ou image, mais pas « Windows à la une ».

    Encore une fois : dans quel monde vivons-nous ?! Pourquoi acceptons-nous de nous faire maltraiter comme ça ?


    Lulz

    Après avoir répondu aux questions sur la collecte de nos données, l'installeur de winwin affiche « Nous préparons votre système » puis … … … « Laissez-nous tout ». Il n'y a pas de suite à cette phrase ! :O Aveu ? :)

    March 28, 2020 at 6:55:50 PM UTC - permalink - http://shaarli.guiguishow.info/?35Hfuw
  • Mon avis sur Black Mirror

    Ça fait des années que j'entends parler, en bien, de la série télévisée Black Mirror, que des gens me la recommande. J'ai visionné les cinq saisons existantes et… boarf…

    Dans le fond, il y a rien de nouveau : la très grande majorité de ce qui est dépeint existe déjà avec ou sans la technologie. Le côté dystopique à court-terme en prend un coup. Les angles d'attaque ne sont pas non plus novateurs.

    • Désensibiliser les militaires afin qu'autrui soit perçu uniquement comme une cible + propagande "c'est eux les méchants" (S03E05) ? Ce sont les principes millénaires de l'embrigadement militaire et de la propagande… ;

    • Société du spectacle qui nous endort et nous rend apathiques (S01E01, S02E03, S03E06, S05E03) même devant des formes de torture (S02E02, S04E06) ? C'est documenté depuis des décennies… ;

    • Réputation comme monnaie d'échange et si t'es à sec, t'es exclu de la société (S03E01) ? Ça a toujours existé et l'exclusion sociale a toujours été conçue comme une punition (réprobation sociale, prison, etc.). On nous apprend à être lisse, ne pas faire de vague, à toujours bien nous comporter en public. L'évaluation constante, genre les formulaires pour évaluer les comportements (du livreur, du vendeur, du traitement d'une demande, d'un commentaire sur un site web) n'est pas nouvelle non plus ;

    • Chantage avec des enregistrements sexuels (S01E01), même quand ils montrent des actes pédophiles (S03E03), ce n'est pas nouveau ;

    • L'existence de pervers narcissiques qui vont tout faire pour écraser autrui (S04E01) n'est pas nouvelle non plus ;

    • Le flicage d'un proche par prétendu amour / bienveillance (S04E02) ? Idem ;

    • La """"délation"""" par mégarde éventuellement assistée par la technologie (S04E03) ? Idem ;

    • Le questionnement à tout âge sur son orientation sexuelle / genre et la flexibilité de nos désirs (S05E01), c'est du classique ;

    • La technologie qui pourrait se retourner contre l'homme (S04E05), c'est abordé depuis plus de deux siècles en philosophie et depuis plusieurs décennies dans les arts (genre Terminator) ;

    • Surveillance vidéo permanente de l'ensemble de la population par des drones au nom de la sécurité (S03E06) ? Rien de neuf… ;

    • La recherche de l'immortalité (S03E04) ? Ça fait des millénaires que la philosophie s'y intéresse… ;

    • Avoir la mémoire courte pour être heureux (S01E03) ? Idem ;

    • Accroc au plaisir généré par la douleur d'autrui (S04E06) ? Idem ;

    • Retrouver un être proche décédé (S02E01) ? Pierre de résurrection dans Harry Potter ;

    La technologie permettrait d'aller plus loin dans la connerie et la malveillance ? Boarf, c'est même pas sûr.

    Dans les épisodes de Black Mirror, les conditions de vie et la capacité de la technologie semblent tellement éloignées de la réalité, que j'ai eu du mal à y croire, à entrer dans les histoires. Exemples : isolement travail/piaule + piaule qui est juste un box avec un lit (S01E02), transfert d'une conscience humaine dans plein d'objets (S03E04, S04E06, S05E03, etc.), robots-abeilles et ruches organisées en pair-à-pair + déplacement et transmission radio très longue distance sur de si petits appareils (S03E06), scanner d'ADN afin de créer un avatar numérique (S04E01) disposant des souvenirs (comme si les souvenirs étaient inscrits dans notre ADN…), etc. Si t'es un technophile, tu constates des incohérences dans quasiment tous les épisodes.

    En revanche, la psychologie et l'environnement sont sombres et permettent d'entrer dans le bain. Tous ces individus tristes, très isolés (exemple : S01E02), apathiques, occupés par leurs écrans (mémoriels, spectacle, flicage, etc.) qui sont d'une grande froideur en permanence… Je pense que c'est ça qui m'a fait adhérer à Black Mirror. Peut-être que les dérives technologiques sont la pointe émergée de l'iceberg ? Notre inhumanité actuelle est peut-être plus préoccupante…

    Je retiens que, dans le futur, nous continuons de baiser. À l'exception de la saison 1 et de rares exceptions dans les autres saisons, chaque épisode a sa scène de baise, même et surtout quand ça apporte rien à l'intrigue (genre S02E03)… … …

    Je l'avoue, quelques épisodes m'ont marqué, soit parce qu'ils m'ont fait réfléchir, soit par leurs personnages. Se souvenir de tout (S01E03). Retrouver un être cher décédé (S02E01). Immortalité virtuelle (S03E04). Torture-spectacle (S02E02, S04E06). Simulateur de rencontres amoureuses (S04E04). Confiance en soi / vie par procuration en matant une star (S05E03).

    Bref, Black Mirror est une série qui permet de passer le temps, mais sans plus. Peu originale, elle rate sa mise en exergue des dérives technologiques potentielles. Elle échoue à faire naître la compréhension des enjeux liés à la technologie chez les spectateurs par quasi absence d'arguments et ré-utilisation d'arguments faibles éculés. Y-a-t-il besoin de disserter sur la technologie pour se rendre compte que le monde va mal ?

    March 28, 2020 at 3:52:16 PM UTC - permalink - http://shaarli.guiguishow.info/?WVlmyQ
  • Câbles Internet sous-marins, coupure, réparation #telecomPorn

    Loin d'être virtuel, Internet repose sur des infrastructures physiques dont des câbles sous-marins. Parfois ces câbles se rompent à cause de l'usure, d'un événement naturel, d'un événement humain ou d'un sabotage. Quelques exemples ces deux dernières semaines sur le fil Twitter du « Directeur Réseaux et Services internationaux » d'Orange. Ces pannes ne datent pas d'hier. Exemple : en 1929, un tremblement de terre met KO un câble télégraphique transatlantique.

    Plus d'infos sur le financement des câbles sous-marins et les enjeux géopolitiques.

    Plus d'infos sur l'aspect physique d'Internet (câbles, locaux techniques, trous dans les trotoirs, etc.).

    Plus d'infos sur le financement des infrastructures physiques de l'Internet.



    https://twitter.com/jlvuillemin/status/1242890487754887169 :

    Et voila ! Reparation du SAT3 faite. Le câble était enfoui profondément sous des sédiments ce qui confirme l’éboulement du canyon du fleuve Congo en hte mer. Avec une tension de relevage croissante le câble a fini par se détacher du fond et a été remonté a bord pour inspection

    Visualiser le tracé du câble SAT-3. Éboulement du canyon = écoulement turbiditique.



    https://twitter.com/jlvuillemin/status/1243618627586269184 et https://twitter.com/jlvuillemin/status/1243791292913631233 :

    la situation globale des cables sous-marin entre l’europe et l’ocean indien est tres dégradée. Le SMW 3 et le SMW 4 sont tous les 2 coupés en 2 endroits différents. Nous avons actuellement 3 cabliers en mer sur ces opérations. […] Réparation du SMW3. Lors du relevage le câble s’est cassé dans la boite de jonction qui reliait le câble au répéteur.
    Il est donc très probable que le défaut était dans la boite nous en aurons la confirmation quand l’extrémité laissée au fond aura été remontée et testée.

    Visualiser le tracé du câble SMW-3. Visualiser le tracé du câble SMW-4.



    https://twitter.com/jlvuillemin/status/1238806688754470912 :

    Comme tous les gamers de la réunion l’ont constaté il y actuellement une double coupure sur les cables SMW4 et SMW5 qui impacte non seulement la réunion mais aussi plus généralement le trafic vers l’Asie, singapour et HK. Les équipes sont en train de réparer. Je précise que les coupures sont sur la partie égyptienne des deux cables a quelques km de la station de Zafarana.

    Visualiser le tracé du câble SMW-5.



    https://twitter.com/jlvuillemin/status/1243657525028929545 :

    Coupures qui entrent dans les statistiques des incidents habituellement constatés, svp ?
    Trés supérieures a la moyenne habituellement constatée.



    https://twitter.com/jlvuillemin/status/1243654077361381387 :

    […] Mais effectivement actuellement la situation est complexe. Entre l’Afrique, l’océan indien et la Méditerranée, nous avons un nombre de coupures particuliérement élevé.



    J'ai du mal à croire à une hausse significative des pannes sur les câbles sous-marins. J'attends que des informations provenant de plusieurs sources soient publiées avant de conclure.

    March 28, 2020 at 12:11:03 PM UTC - permalink - http://shaarli.guiguishow.info/?dmHFiQ
  • Si FAT16 et FAT32 sont grisés dans gparted : apt-get install dosfstools

    Si FAT16 et FAT32 sont grisés lors de la création d'une nouvelle partition ou le formatage d'une partition existante dans gparted : fermer gparted + apt-get install dosfstools + ouvrir gparted.

    March 27, 2020 at 10:37:51 PM UTC - permalink - http://shaarli.guiguishow.info/?0bjj0A
  • Bien vivre le digital [, utiliser du lubrifiant ]

    OMG, tout un site web du marchand Orange dédié au bien vivre le digital alors qu'une simple règle suffit : pour bien vivre le digital, utiliser du lubrifiant.

    Explication ici. Je cite : « L’adjectif digital en français signifie « qui appartient aux doigts, se rapporte aux doigts ». ».

    Merci Johndescs pour la blagounette du jour. :)

    March 25, 2020 at 3:14:54 PM UTC - permalink - https://bienvivreledigital.orange.fr/
  • Contrepèteries (bis)

    On se forme en paniquant ?
    Ma femme use de ses droits, j'ai l'habitude.
    Datez les tares !
    Ces maires font l'affiche.
    Erdogan emballe une folle de Chypre, l'emballe puis l'apaise.



    Mes trouvailles :

    On se forme en paniquant ?
    Ma femme use de ses droits, j'ai l'habit/ude.
    Datez les tares !
    Ces maires font l'affiche.
    Erdogan emballe une folle de Chypre, l'emballe puis l'apaise.



    Dans le Canard enchaîné du 11 mars 2020.

    March 12, 2020 at 9:45:25 PM UTC - permalink - http://shaarli.guiguishow.info/?ze4rEw
  • Fonction publique : recherche d'informations sur le non-respect du temps de travail par les personnels de l'ESR (Cour des comptes) et l'impossible différence de rémunération entre un fonctionnaire et un contractuel (CJUE)

    Quelqu'un a-t-il des infos liées à l'un de ces sujets ?

    • Les observations de la Cour des comptes de septembre 2019 concernant la non-application de la durée légale de travail aux personnels de l'enseignement supérieur et la recherche (ESR) ;

    • L'arrêt C‑72/18 du 20 juin 2019 de la Cour de Justice de l'Union européenne concernant l'impossible différence de rémunération, à travail, poste et responsabilités égaux, entre un fonctionnaire et un contractuel.



    Je cherche toutes les infos possibles, et, en particulier :

    • Quelles sont les suites possibles ? ;

    • Est-ce que les observations de la Cour des comptes peuvent rester à nouveau lettre morte comme elles l'ont été depuis 2015 ? ;

    • Est-ce cette décision impacte autre chose que le temps de travail ? J'ai entendu dire que cela remet en cause les "aménagements individuels" d'horaires genre untel fait 7 h 30 - 16 h tous les jours, untelle termine à 15 h trois jours par semaine en bossant de 8 h à 19 h les autres jours, etc. Vrai / faux ? ;

    • En 2018, avant ces observations de la Cour des comptes donc, l'université d'Aix-Marseille a régularisé sa situation en proposant un choix à ses personnels : soit une durée de travail hebdomadaire supérieure mais en conservant les jours de congés annuels, soit une durée de travail hebdomadaire moindre mais avec un nombre réduit de jours de congés annuels. Est-ce lié ou est-ce la régularisation d'un autre dossier ? Des universités ont-elles commencé la régularisation demandée par la Cour des comptes ? ;

    • L'arrêt de la CJUE est-il applicable à tous les contractuels ou uniquement aux enseignants vacataires (en CDD) ? ;

    • Suite à l'arrêt de la CJUE, un contentieux est-il déjà porté devant le Conseil d'État afin de lui faire réviser sa jurisprudence au regard de celle de la CJUE ? Est-ce que des syndicats sont sur le coup ? ;

    • Ce que je lis sur l'arrêt de la CJUE est contradictoire : d'un côté, une analyse évoque la fin de la différence de traitement liée à l'ancienneté (alors que les contractuels ont déjà une hausse de rémunération liée à l'ancienneté…), d'autres analyses estiment que les primes (qui, par chez moi, sont bien à l'origine de la différence de rémunération) sont aussi concernées ;

    • Comment agir ? Est-ce que, en tant que contractuel, je peux demander à mon service RH de m'appliquer les primes des fonctionnaires puis contester son refus au tribunal administratif puis au Conseil d'État ou est-ce prématuré ou est-ce que ça nécessite d'autres révisions législatives préalables ?
    February 29, 2020 at 1:19:55 AM UTC - permalink - http://shaarli.guiguishow.info/?y3G1EQ
  • L'insécurité routière - Groland - YouTube

    ‒ Merci, Lise. Je m'appelle Muguette et je veux te dire un énorme merci. Merci d'avoir répondu à ton téléphone quand tu conduisais et d'avoir roulé trop vite, car tu as quitté la route des yeux et tu m'as débarrassé de mon mari Fréchon qui me pourrit l'existence depuis qu'il est sénile.
    (Voix off) ‒ Sur la route, on a tous le pouvoir de sauver quelqu'un d'une vie affreuse. Insécurité routière. Vivre seule. Enfin.

    :D

    February 25, 2020 at 11:29:55 PM UTC - permalink - https://www.youtube.com/watch?v=vgryYA90HeE
Links per page: 20 50 100
◄Older  
page 99 / 306
Newer►
Mentions légales identiques à celles de mon blog | CC BY-SA 3.0

Shaarli - The personal, minimalist, super fast, database-free, bookmarking service by the Shaarli community