notes·de·pitParfois j'apprends à pêcher à des gens qui n'aiment pas le poisson2023-06-13T11:41:09+02:00PiTurn:md5:45526db4e4cfb511098640352c276065DotclearVrac #16urn:md5:ac6ab7af0234077bfa302fae1d1573b12023-05-25T10:19:00+02:002023-05-25T11:25:48+02:00PiTMes doigts dans le clavierinutilevrac<p><img src="https://blog.namok.be/public/images/divers/2023/16-michael-jasmund-b3-7ncjxic8-unsplash-1200x.jpg" alt="16-michael-jasmund-b3-7ncjxic8-unsplash-1200x.jpg, mai 2023" style="margin: 0 auto; display: block;" title="une proue de bateau avec 16 écrit dessus" /></p>
<p>Il semble que j'écrive un <em>vrac</em> tous les 4 ans.</p>
<p>Je place des liens dans un fichier et lorsqu'il y en a assez, je publie. Ici, je commence par revérifier si les liens existent encore. <em>Ce blog serait-il mort ?</em></p>
<p><a href="https://pytition.org/"><strong>Pytition</strong></a>, un outil de pétitions libre, écrit en Python à autohéberger. <a href="https://framablog.org/2019/10/25/framapetitions-est-mort-vive-pytition/">Framasoft en parlait «<em>récemment</em> »</a>.</p>
<p><a href="https://joinmobilizon.org/"><strong>Mobilizon</strong></a> est une alternative — à <em>Eventbrite</em> et consorts pour ne pas le citer — pour la publication d'évènements et la gestion des inscriptions. L'outil a bien évolué ces dernières années, il est <em>acentralisé</em> et plusieurs instances existent — recensées sur <a href="https://mobilizon.rog">mobilizon.org</a>. On y trouve par exemple <a href="fttps://mobilizon.fr">mobilizon.fr</a>…</p>
<p>Si vous avez besoin d'un correcteur d'orthographe (<em>spoiler alert</em> on en a tous besoin), <a href="https://languagetool.org/fr">Languagetool</a> vérifie l'orthographe et la grammaire. Il propose aussi un <em>plugin</em> Firefox. Plus d'excuse.</p>
<p>À la <a href="https://jamstack.org/generators/">longue liste de <strong>générateurs de sites</strong></a> s'ajoutent</p>
<ul>
<li><p><a href="https://www.getlektor.com/"><strong>Lektor</strong></a> découvert dans LinuxPratique 101 et dont la particularité est d'avoir une interface web pour rédiger. C'est du Python et voici le <a href="https://github.com/lektor/lektor">dépôt Github</a></p></li>
<li><p><a href="https://honkit.netlify.app/"><strong>Honkit</strong></a> est plutôt dédié à la génération de documentation (c'est plus basique. Moins beau). C'est du nodejs, voici le <a href="https://github.com/honkit/honkit">dépôt Github</a> et un <a href="https://tutorial.djangogirls.org/fr/">exemple chez Django Girls</a></p></li>
</ul>
<p>Tu te demandes si tu as une bonne <strong>vitesse de frappe</strong> au clavier ? Tu voudrais te comparer à tes camarades ? José, un <em>student</em> a développé <a href="https://dactylo.bruxelles.dev">dactylo.bruxelles.dev</a>.</p>
<p>Un nième outil de tableau blanc ? <a href="https://browserboard.com"><strong>Browserboard</strong></a>.</p>
<p>Un <strong>terminal</strong>, si tu n'en n'as pas un <em>bon</em>. <a href="https://tabby.sh/"><strong>Tabby</strong></a>. C'est peut-être lourd, il faut tester. Voici le <a href="https://github.com/Eugeny/tabby">dépôt Github</a>.</p>
<p>Un dernier pour jouer est un site créant <strong>différentes sortes de cadenas</strong> permettant d'ouvrir un texte, une image, un son, une vidéo ou un lien. <a href="https://lockee.fr/"><strong>Lockee</strong></a>. Un <a href="https://lockee.fr/o/i38depnX">essai</a> ?</p>
<p><br/><br/></p>
<p><em>Crédit photo chez par <a href="https://unsplash.com/fr/@jasmund">Michael Jasmund</a></em></p>
Juste un film, pas un documentaireurn:md5:18c12ce250cbe2de4ce03f3dc7d80b2b2022-10-05T11:45:00+02:002022-10-05T10:49:06+02:00PiTUn arbre vertalternativesbuzzclimat<p><img src="https://blog.namok.be/public/images/divers/2022/idiocracy.jpg" alt="idiocracy.jpg, oct. 2022" style="margin: 0 auto; display: block;" /></p>
<p>Ces jours-ci et avec 10 ans de retard, des voix s'élèvent contre la catastrophe écologique qu'est l'organisation de la coupe du monde de foot 2022 au Quatar. Il fait chaud — très chaud — et les stades — en plein air — sont climatisés. Tout ça sans parler des conditions de travail déplorables des ouvriers qui ont vu plusieurs décès d'ailleurs. Chacun et chacune se forgera son opinion.</p>
<p>— Est-ce que tu crois qu'ils l'ont fait ?<br />
— Est-ce que tu crois qu'ils l'ont fait ?<br />
— Oui, ils l'ont fait !<br />
— Mais ils se sont arrêtés là.</p>
<p>Au café du coin, les sages se demandent si tant qu'à faire on n'organiserait pas les jeux olympiques d'hiver dans un pays chaud. Au point où l'on en est en Absurdie, ce ne serait que normal. La bonne blague.</p>
<p>(Retour de notre ami Ben)<br />
— Est-ce que tu crois qu'ils l'ont fait ?</p>
<p><em>Oui, ils l'ont fait !</em> Presque. Ce sont les <a href="https://www.lesoir.be/469190/article/2022-10-04/les-jeux-asiatiques-dhiver-2029-seront-organises-en-arabie-saoudite">jeux Asiatiques d'Hiver</a> qui seront organisés en Arabie Saoudite en 2029.</p>
<p>Dormons tranquille quelques années. Envoyons 2, 3 <em>tweets</em> fin 2028 pour dire que c'est nul et en attendant, je vais aller revoir <a href="https://fr.wikipedia.org/wiki/Idiocracy">Idiocracy</a>.</p>
<p><em>Just a film. Not a documentary.</em></p>
<p><br/></p>
<p><em>Crédit photo chez <a href="https://fr.wikipedia.org/wiki/Idiocracy">Wikipedia</a>.</em><br />
<em>Outre la référence à « Idiocracy », il y a aussi une référence (cachée) à « <a href="https://fr.wikipedia.org/wiki/C%27est_arriv%C3%A9_pr%C3%A8s_de_chez_vous">C'est arrivé près de chez vous</a> »</em></p>
Technologie. Aller dans le bon sens.urn:md5:31905724ca8cd79ee7643ea87f65b9c02022-08-22T09:26:00+02:002022-08-22T08:43:23+02:00PiTUn arbre vertinutilepolitique<p><img src="https://blog.namok.be/public/images/divers/2022/arc-vector.jpg" alt="arc-vector.jpg, août 2022" style="margin: 0 auto; display: block;" /></p>
<p>Sur l'autoroute des vacances, j'ai croisé<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2022/08/22/technologie-aller-dans-le-bon-sens#fn:f1" rel="footnote">1</a></sup> pas mal de camions. Ces « bons vieux » camions pleins de rétroviseurs — et d'angles mort d'ailleurs qui sont de mieux en mieux signalés — et d'autres ne semblant avoir qu'un tout petit rétro. Il s'agit d'un ensemble de caméras remplaçant les simples miroirs habituels. La <strong><a href="https://www.mercedes-benz-trucks.com/fr_BL/brand/news/press-releases/des-cameras-plutot-que-des-retroviseurs-est-ce-possible-tout-ce-que-vous-avez-toujours-voulu-savoir-sur-le-mirrorcam.html">mirrorcam</a></strong>.</p>
<p>La technologie — vendue comme plus sécurisée et économique — remplace un miroir peu cher, facile à produire et qui ne souffre jamais de pannes par plusieurs caméras et un écran qu'il faut alimenter, produire, réparer ou jeter… Est-ce utile ? <em>Spoiler alert</em>, je pense que non.</p>
<p>Dans mon lecteur de nouvelles ce matin, je vois passer l'annonce de sortie de dix exemplaires de la <a href="https://www.journaldugeek.com/2022/08/20/la-moto-electrique-arc-vector-et-ses-couteux-accessoires-connectes-bientot-sur-la-route/"><strong>nouvelle moto électrique anglaise Arc</strong></a>. Un modèle tout sorti de <em>Tron</em> (mais qui connait encore <a href="https://fr.wikipedia.org/wiki/Tron">ce film</a> ?), elle est fournie avec l'équipement <em>qui va bien</em>. C'est beau. Ça a de la gueule.L'équipement constitué d'un casque et d'une veste, est connecté. Un écran dans le casque affichant la vitesse… et celles des autres véhicules alentour, l'itinéraire et le flux vidéo de la caméra arrière. La veste quant-à elle propose des vibrations haptiques lorsqu'un autre véhicule entre dans le périmètre de la moto.</p>
<p>La technologie, remplace ici la capacité intrinsèque de la ou du pilote de <em>sentir</em> son environnement extérieur. Elle réduit l'humain. Ses capacités. Elle va induire une baisse d'attention à la route. C'est vendu pour accroitre la sacro-sainte sécurité. Des caméras, des écrans, des capteurs, du wifi… Est-ce utile ?</p>
<p>Ma part joueuse — ou <em>geek</em> si tu préfères — aime l'IOT (<em>internet of thinks</em>, les objets connectés). C'est excitant et intéressant de jouer avec la technologie, de mettre en place des objets qui communiquent… Ma part humaine dans un monde qui <a href="https://www.lalibre.be/debats/opinions/2022/08/21/nest-il-pas-temps-de-preparer-un-pacte-ecologique-2RIRPQYQUJCIVKDAOLRQNM6GSM/">doit réfléchir à sa transition écologique</a>… moins.</p>
<p>Toutes les personnes qui travaillent dans l'IT doivent — devraient car je n'impose rien, je parle et c'est tout — se demander si ce qu'elles mettent en place <em>va dans le bon sens</em>. Le bon sens, c'est le mien ;-) Plus sérieusement, le bon sens c'est celui qui permettra à tous et toutes de vivre sur une terre habitable… pour l'instant, plein d'initiatives ne vont pas dans ce bon sens.</p>
<p><br/><br/></p>
<p><em>Crédit photo <a href="https://electrek.co/2022/01/04/120000-arc-vector-electric-motorcycle-back-from-the-dead-preparing-for-deliveries/">electrek.co</a></em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Que l'on se rassure, bien que je dise croisé, il s'agissait de dépassement et « j'étais dans le bon sens ». <a href="https://blog.namok.be/?post/2022/08/22/technologie-aller-dans-le-bon-sens#fnref:f1" rev="footnote">↩</a></p>
</li>
</ol>
</div>
Sobriété numériqueurn:md5:b11daee16793fa74ee9bd719d11e81092022-01-11T10:23:00+01:002022-01-11T10:32:13+01:00PiTUn arbre vertalternativesenseignementlogiciellibre<p><img src="https://blog.namok.be/public/images/divers/2022/ampoule-livermore.jpg" alt="ampoule-livermore.jpg, janv. 2022" style="margin: 0 auto; display: block;" /></p>
<p>Nous regardions un peu par hasard dans la salle des profs <a href="https://programmation.developpez.com/actu/253829/Programmation-une-etude-revele-les-langages-les-plus-voraces-en-energie-Perl-Python-et-Ruby-en-tete-C-Rust-et-Cplusplus-les-langages-les-plus-verts/">quel est le langage
de programmation le plus écologique</a>. Un rapide coup d'œil nous montre
que <a href="https://en.cppreference.com/w/c">C</a> est en tête des langages les moins énergivores suivi de près par
<a href="https://www.rust-lang.org/fr">Rust</a> (que je vous conseille mais c'est une autre histoire)… et qu'en queue
de peloton se trouvent <a href="https://formation-perl.fr/guide-perl.html">Perl</a> et <a href="https://www.python.org/">Python</a> deux langages très répandus. Que
faire ?</p>
<p>Depuis lors, cette idée de <em>sobriété numérique</em> me trotte un peu plus dans la
tête et me pose plusieurs questions. Outre le langage de programmation utilisé
— ce qui est, somme toute, une question de développeur et développeuse —
<strong>est-ce que mon usage du numérique peut être écologique ?</strong> La réponse est bien
sûr non. Je reformule donc un peu. Est-ce que je peux avoir un usage du
numérique sobre ? Sans excès ? Raisonnable ?</p>
<ul>
<li>Quelle est ma consommation de bande passante dans ma vie de tous les jours ? </li>
<li>Avec Deezer (Spotify, c'est pareil) j'augmente la bande passante que j'utilise. Faudrait-il retourner à un système où ma musique est locale. Mais comment ? </li>
<li>De combien de serveurs est-ce que je dépends ? </li>
<li>À quelle fréquence est-ce que je change de smartphone ?</li>
<li>… </li>
</ul>
<p>En recevant le <a href="https://connect.ed-diamond.com/linux-pratique/lp-129">Linux Pratique n°129</a>, je me rends compte que je ne
suis pas le seul à me poser la question. C'est déjà ça.</p>
<blockquote>
<p>Olivier le processeur de l'ordinateur a lâché. Oui, 5 ans c'est énorme. Bon, ben, je commande un nouvel ordinateur…</p>
</blockquote>
<p>Cette mise en situation proposée par Olivier Delhomme me rend malade bien que l'on en soit tous et toutes — vraiment pas sûr — conscientes.
Je ne peux m'empêcher de penser <a href="https://fr.wikipedia.org/wiki/Ampoule_centenaire">à la plus vieille ampoule du monde chez les pompiers de Livermore</a> signe de notre capacité à produire des objets « qui durent » et que l'obsolescence est, par essence, programmée. Que faire ?</p>
<p>Les maitres mots sont <strong>recyclage</strong> et <strong>réparabilité</strong>… et on en est malheureusement encore loin.</p>
<p>Au sujet du <strong>matériel</strong>, la base c'est d'essayer d'acheter d'occasion et du matériel réparable. Un pas plus loin, l'auteur propose de ne pas posséder le matériel que nous utilisons peu mais de le partager. Peut-on envisager de demander l'ordinateur de son voisin alors qu'aujourd'hui presque chacun a le sien ? Quand il n'en a qu'un ! Ai-je besoin d'un <em>desktop</em>, d'un <em>laptop</em>, d'une tablette et d'un smartphone ? </p>
<p>Pour commencer tout doucement, lorsque tu as besoin d'un nouveau smartphone — mais en as-tu réellement besoin ? Ne peut-il pas « tenir » un an encore ? — va d'abord voir sur <a href="http://backmarket.be">backmarket.be</a><sup id="fnref:f1"><a href="https://blog.namok.be/?post/2022/01/11/sobriete-numerique#fn:f1" rel="footnote">1</a></sup> pas exemple, s'il n'y en a pas un de seconde main.</p>
<p>Au sujet de l'<strong>énergie</strong>, nous avons lu et entendu qu'il ne fallait pas laisser de lampes allumées dans les pièces où l'on ne se trouve pas, qu'il est bon de ne pas laisser les appareils en veille mais de les éteindre… mais que consomment-ils lorsque nous les utilisons ?<sup id="fnref:f2"><a href="https://blog.namok.be/?post/2022/01/11/sobriete-numerique#fn:f2" rel="footnote">2</a></sup>.</p>
<p>Il me semble mieux de <a href="https://geeko.lesoir.be/2021/08/06/le-mode-sombre-na-que-peu-dimpact-sur-lautonomie-du-smartphone/">limiter la luminosité de son écran que d'utiliser le mode sombre</a>. C'est sans doute automatique sur son smartphone mais pas sur son <em>laptop</em> ni sur sa TV mais ça se fait facilement. À propos, faut-il se préparer à ne pas pouvoir recharger son appareil quand on veut mais quand on peut ?</p>
<p>Au sujet du <strong>logiciel</strong>, ne sont pas concernées uniquement les personnes qui
développent les logiciels. Les usagers et usagères peuvent aussi faire des
choix. Au risque de se répéter les <strong>logiciels libres</strong> ont quelques avantages en termes de recyclage et réparabilité :</p>
<ul>
<li><em>linux</em> permet d'utiliser des machines plus anciennes là où <em>MS Windows</em> encourage le changement de matériel après quelques mise à jour ; </li>
<li>les logiciels libres sont réparable et non-obsolètes puisque l'accès au code permet à des développeurs ou développeuses de reprendre le projet.</li>
</ul>
<p>Dans la même veine, l'auteur de l'article propose que la machine du développeur ou de la développeuse soit assez modeste afin de l'encourager à développer du code pour une machine modeste (taille d'écran, ressource de calcul (CPU), ou espace disque).</p>
<p><a href="https://eco-conception.designersethiques.org/guide/fr/">Le guide d’éco-conception de services numériques de <em>designers éthiques</em></a> et <a href="https://walloniedesign.be/dossiers/eco-conception-web/">celui de <em>wallonie design</em></a> sont sans doute
de bonnes lectures.</p>
<p>Bref, nous ne savons pas vers où nous allons mais nous y allons… et sans une volonté politique qui ne se laissera pas guider par les constructeurs, on peut dire que l'on va dans le mur… <strong>bonne année !</strong></p>
<p><br/></p>
<p><em>Crédit photo au hasard du web, l'ampoule à Livermoore.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Non, cet article n'est pas sponsorisé (lol) et il doit exister d'autres sites d'articles <em>it</em> de seconde main. <a href="https://blog.namok.be/?post/2022/01/11/sobriete-numerique#fnref:f1" rev="footnote">↩</a></p>
</li>
<li id="fn:f2">
<p>Perso quand j'ai acheté ma TV — elle doit avoir 15 ans maintenant — j'ai regardé quelle était sa consommation. Pas par soucis d'économie mais par soucis d'<em>écolonomie</em>. <a href="https://blog.namok.be/?post/2022/01/11/sobriete-numerique#fnref:f2" rev="footnote">↩</a></p>
</li>
</ol>
</div>
Les gars et les garcesurn:md5:93f14d42d4adacfc46d7b43c4f4d02712021-11-24T19:09:00+01:002021-11-25T13:32:04+01:00PiTMes doigts dans le clavierecriture-inclusiveinternetinutile<p><img src="https://blog.namok.be/public/images/divers/2021/criatura__by_cristina_otero_d3imedp_1200.jpg" alt="criatura__by_cristina_otero_d3imedp_1200.jpg, nov. 2021" style="margin: 0 auto; display: block;" /></p>
<p>Dans un soucis d'inclusion j'écris souvent et je dis « Salut à tous et à toutes ».</p>
<p>L'écriture inclusive m'intéresse beaucoup parce que c'est à la mode sans doute. Parce que ça m'amuse de jouer avec la langue surtout. Pas vraiment parce qu'elle permet d'inclure car je ne suis pas (encore) convaincu que c'est l'écriture inclusive qui inclut. Je crois qu'il est bon d'être attentif à toutes nos différences et essayer d'accueillir l'autre avec les siennes, avec les miennes. Essayer d'être accueillant, ce n'est pas tenter, à priori, de n'oublier personne. De les citer toutes. Mais aujourd'hui, ça parle principalement d'une seule différence. On parlera de masculin / féminin (ou féminin / masculin si l'on préfère) dans l'écriture et le langage.</p>
<p>Rappel : l'écriture inclusive, ce n'est pas <em>que</em> le point médian '<code>·</code>'. Le point médian est le dernier recours lorsque l'on écrit. Je préfère donc d'abord utiliser « tous et toutes » (la double flexion) et parfois, s'il le faut, si c'est obligé, s'il n'y a rien d'épicène, écrire alors « toustes » ou « tous·tes » (jamais « tou·te·s » car <em>trop de points médians tuent le point médian</em>). Pour en savoir plus, un article auquel j'agrée en tous points.</p>
<p>Écriture inclusive : faisons le point autour de la cheminée<br />
<a href="https://www.24joursdeweb.fr/2017/ecriture-inclusive-faisons-le-point-autour-de-la-cheminee/">https://www.24joursdeweb.fr/2017/ecriture-inclusive-faisons-le-point-autour-de-la-cheminee/</a></p>
<p>Bref, si je disais « salut à tous » — ou « salut <em>tertous</em> » dans le patois local — que j'ai remplacé par « salut à tous et à toutes », j'aime bien changer parfois et dire « salut les gars ». Ça fait <em>coooool</em>, moins sérieux, un peu plus familier… Dans un soucis d'inclusion <em>bla bla</em>, et en étant (un peu) moins sérieux, j'ose donc :</p>
<p>« <strong>Salut les gars et les garces</strong> ».</p>
<p>Les réactions sont diverses :</p>
<ul>
<li>un sourire quand on accepte cet humour ; </li>
<li>un sourire nerveux que l'on force parce que c'est sans doute mieux de <em>faire bien</em> par rapport à l'injonction machiste et que l'on est prise de court ; </li>
<li>un froncement de sourcil qui dit : « heu, c'est pas drôle » ;</li>
<li>un haussement de sourcil qui dit : « <em>seriously</em> » ;</li>
<li>aucune, j'ai le nez dans mon smartphone.</li>
</ul>
<p>Finalement est-ce de l'humour — que l'on peut trouver déplacé ou pas — ou être en avance (ou en retard) sur son temps ? (Comme beaucoup je me plais à croire être un précurseur, un lanceur… d'idioties…). Hier, je regardais <a href="https://orthogrenoble.net/mots-nouveaux-dictionnaires/">les nouveaux mots qui arrivent dans le dictionnaire</a> et je vois qu'il s'y trouve des mots qui existent déjà mais dont le sens s'est étoffé. Par exemple, <a href="https://www.projet-voltaire.fr/divers/nouveaux-mots-du-petit-larousse-et-du-petit-robert-2022-que-disent-ils-de-nous/">cluster, écouvillon ou confinement</a>.</p>
<p>Je regarde aussi la définition de garce en cherchant les plus gentilles,</p>
<ol>
<li><p>dans <a href="https://dictionnaire.lerobert.com/definition/garce">Le Robert</a>, le sens 1 dit</p>
<blockquote>
<p><em>Vieux</em> Femme, fille</p>
</blockquote></li>
<li><p>dans le <a href="https://www.larousse.fr/dictionnaires/francais/garce/36082">Larousse</a>, le sens 3 dit</p>
<blockquote>
<p> Jeune fille ou femme en général, souvent avec une nuance admirative pour son aspect physique : Une belle garce.</p>
</blockquote></li>
<li><p>dans le centre national de ressources textuelles et lexicales (<a href="https://www.cnrtl.fr/definition/garce">cnrtl</a>) le sens A1 dit </p>
<blockquote>
<p>I. − Subst. fém.
A. − [Les subst. masc. corresp. sont garçon et gars] Synon. (jeune) fille. Vx. Adolescente.<br />
Elle (...) retrouva des jambes de jeune garce, s'occupa des papiers de sa nièce (Zola, Terre,1887, p. 384).<br />
De son temps encore, les petits gars et les petites garces du village venaient faire, en manière de jeu, le diable et la belle Orberose (A. France, Île ping.,1908, p. 178).</p>
</blockquote></li>
</ol>
<p>Bon, c'est pas gagné !</p>
<p>Je décide de me baser sur… les définitions qui m'arrangent, celle du <a href="https://dictionnaire.lerobert.com/definition/garce">Robert</a> et celle du <em><a href="https://www.cnrtl.fr/definition/garce">cnrtl</a></em>. Je citerai même Anatole France s'il le faut pour essayer que l'an prochain, les dictionnaires étoffent le mot <em>garce</em> d'une nouvelle définition basée sur la <a href="https://www.cnrtl.fr/definition/gars">définition de <em>gars</em></a>.</p>
<blockquote>
<ol>
<li>GARCE <em>[ɡaʁs]</em> n.f. (Nom masculin correspondant, <em>gars</em>) Fille, jeune femme. Fille qui inspire la sympathie, qui ne fait pas d'histoires. <em>Une bonne, une brave garce; une jeune garce</em>. Familier : <em>Salut les garces !</em></li>
</ol>
</blockquote>
<p>À la lumière de cette nouvelle définition, que personne ne soit surpris<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2021/11/24/les-gars-et-les-garces#fn:f1" rel="footnote">1</a></sup> si je lance un tonitruant « Salut les gars et les garces » c'est que les personnes concernées m'inspirent la sympathie…</p>
<p><br/></p>
<p><em>Crédit photo par <a href="https://www.deviantart.com/cristina-otero/art/criatura-212676685">Christina</a>. À défaut d'un haussement de sourcil, un œil réprobateur.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Je remplace « ne soyez pas surpris » que j'aurais du <em>double-flexer</em> ou affubler d'un point médian par « Que personne ne soit surpris ». Pour moi, c'est ça une écriture inclusive. <a href="https://blog.namok.be/?post/2021/11/24/les-gars-et-les-garces#fnref:f1" rev="footnote">↩</a></p>
</li>
</ol>
</div>
JDK13 - JDK14 - JDK15 - JDK16 - JDK17, quelques nouveautésurn:md5:e8574cacb0f2a65ff35ddb1a889a0b2e2021-09-24T10:37:00+02:002021-09-28T23:51:47+02:00PiTCartable au dosenseignementesigeekjava<p><img src="https://blog.namok.be/public/images/divers/2021/champignons.jpg" alt="champignons.jpg, sept. 2021" style="margin: 0 auto; display: block;" /></p>
<p>TL;DR : c'est long !</p>
<p>Je savais qu'avec le changement — l'accélération plutôt — des cycles de sortie
des versions de Java, je ne parviendrais plus trop à suivre. Je m'étais promis de suivre les versions LTS… c'est ce que j'essaie de faire.</p>
<p>Ce billet est la suite des billets
« <a href="https://blog.namok.be/?post/2011/07/11/jdk7">Java 7 is out, quel est son lot de nouveautés ?</a> »,
« <a href="https://blog.namok.be/?post/2014/06/03/jdk8">JDK8, les nouveautés</a> »,
« <a href="https://blog.namok.be/?post/2018/03/22/JDK9">JDK9, les nouveautés</a> » et
« <a href="https://blog.namok.be/?post/2019/04/06/JDK10-11-12">JDK10, 11 et 12, quelques nouveautés</a> »</p>
<p>Ce billet, comme les précédents, ne se veut pas exhaustif, je prends ce que je
trouve intéressant (et comprends) dans les articles d'<em>openjdk</em> sur le sujet ;
<a href="https://openjdk.java.net/projects/jdk/13/">JDK13</a>,
<a href="https://openjdk.java.net/projects/jdk/14/">JDK14</a>,
<a href="https://openjdk.java.net/projects/jdk/15/">JDK15</a>,
<a href="https://openjdk.java.net/projects/jdk/16/">JDK16</a> et
<a href="https://openjdk.java.net/projects/jdk/17/">JDK17</a>. J'aborde parfois les <em>preview</em> et les <em>second preview</em> mais en général, je n'en parle que lorsqu'elles sont inclues dans le JDK.</p>
<h1>JDK 13</h1>
<p>Le <em>switch expression</em> (présenté dans « <a href="https://blog.namok.be/?post/2019/04/06/JDK10-11-12">JDK10, 11 et 12, quelques nouveautés</a> ») est toujours en <em>preview</em> mais ça arrive avec JDK14. .</p>
<p>En <em>preview</em> également, les <strong>blocs de texte</strong> (<em>text blocks</em>, <a href="https://openjdk.java.net/jeps/355">JEP355</a>). Ils arrivent vraiment avec JDK15.</p>
<p>L'implémentation de l'API « socket » est réimplémentée (<a href="https://openjdk.java.net/jeps/353">JEP353</a>). Il s'agit de la classe utilisée par <code>java.net.Socket</code> et <code>java.net.ServerSocket</code>. L'ancienne implémentation contient du vieux code C et Java. Par défaut, ce n'est plus la classe <code>PlainSocketImpl</code> qui implémente <code>java.net.SocketImpl</code> mais <code>NioSocketImpl</code>. L'ancienne implémentation reste disponible dans le JDK et peut être activée par une propriété du système (<em>system property</em>).</p>
<h1>JDK 14</h1>
<h2><em>Switch expression</em></h2>
<p>Arrivée officielle du <strong><em>switch expression</em></strong> défini dans <em>JDK Enhancement Proposal</em> (<strong>JEP</strong>) <a href="https://openjdk.java.net/jeps/361">JEP361</a>. C'est toujours présenté dans « <a href="https://blog.namok.be/?post/2019/04/06/JDK10-11-12">JDK10, 11 et 12, quelques nouveautés</a> ».</p>
<p>Pour rappel, il est maintenant possible d'écrire : </p>
<pre><code class="language-java">
Season s = // a season
String message = switch(s){
case SPRING, SUMMER -> "It's hot";
case WINTER, AUTUMN -> "It's cold";
};
</code></pre>
<h2><em>Helpful NullPointerExceptions</em></h2>
<p>Amélioration du message associé à une <code>NullPointerException</code> (<a href="https://openjdk.java.net/jeps/358">JEP358</a>). Là où le message était lacunaire, il précise maintenant quelle variable est nulle. Exemples extraits de <a href="https://openjdk.java.net/jeps/358">JEP358</a>, là où l'on avait :</p>
<pre><code class="language-java">
a.i = 99;
Exception in thread "main" java.lang.NullPointerException
at Prog.main(Prog.java:5)
</code></pre>
<p>… maintenant, le message pourrait être (en fonction de la situation bien sûr)</p>
<pre><code class="language-java">
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
</code></pre>
<p>À ceci s'ajoutent :</p>
<ul>
<li>des modifications au sujet des <em>garbage collector</em> ;</li>
<li>des suppressions de classes annoncées dans les précédentes _release__; </li>
<li>la seconde <em>preview</em> de <em>text blocks</em> qui arrive dans JDK15 ;</li>
<li>la première <em>preview</em> du <em>pattern matching</em> pour l'opérateur <code>instanceof</code> et de la notion de <em>records</em>. On en reparle plus bas avec JDK16. </li>
</ul>
<h1>JDK 15</h1>
<h2><em>Text blocks</em></h2>
<p>Commençons par la <a href="https://openjdk.java.net/jeps/378">JEP378</a> qui concerne <em>text blocks</em>. Les blocs de textes sont simplement des littéraux de type <code>String</code> qui s'étendent sur plusieurs lignes sans devoir s'embarrasser d'ouvrir et fermer des guillemets ou d'ajouter des séquences d'échappement. Les blocs de texte sont formatés comme ils sont écrits.</p>
<p>Un <em>text block</em> commence par 3 guillemets (<code>"""</code>) suivi de 0 ou plusieurs espaces blancs (<em>white space</em>) et d'1 passage à la ligne (<em>line terminator</em>). Il se termine par 3 autres guillemets suivi de 0 ou plusieurs espaces blancs (<em>white space</em>).</p>
<p>Il représente un <strong>littéral de type String</strong> (<em>string literal</em>) à part entière. Il est considéré comme une constante de type <code>String</code> et se retrouve dans la <em>pool</em> des constantes de la classe comme les autres littéraux <code>String</code>.</p>
<p>Voici deux exemples assez parlant (± issu de <a href="https://openjdk.java.net/jeps/378">JEP378</a>) montrant le gain pour les séquences d'échappement et les passage de ligne et à la ligne : </p>
<pre><code class="language-java">
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
</code></pre>
<pre><code class="language-java">
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
</code></pre>
<pre><code class="language-java">
var query = "SELECT \"EMP_ID\", \"LAST_NAME\" FROM" +
" \"EMPLOYEE_TB\"\n" +
"WHERE \"CITY\" = 'INDIANAPOLIS'\n" +
"ORDER BY \"EMP_ID\", \"LAST_NAME\";\n";
</code></pre>
<pre><code class="language-java">
var query = """
SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
WHERE "CITY" = 'INDIANAPOLIS'
ORDER BY "EMP_ID", "LAST_NAME";
""";
</code></pre>
<h2><em>Hidden class</em></h2>
<p>JDK15 introduit (<a href="https://openjdk.java.net/jeps/371">JEP371</a>) les <strong>classes cachées</strong> (<em>hidden class</em>) qui sont des classes qui ne peuvent être utilisées directement par (le <em>bytecode</em>) d'autres classes. Le but est qu'elles soient utilisées par des frameworks qui génèrent des classes au <em>runtime</em> et les utilisent <em>via</em> la réflexion. Du point de vue du développeur ou de la développeuse lambda, cette fonctionnalité a peu d'intérêt.</p>
<p>Lorsqu'une classe, <code>MyClass</code>, est compilée, un fichier <code>MyClass.class</code> lui est associé et contient le <em>bytecode</em> de la classe. Lorsqu'il s'agit d'une classe interne anonyme (<em>inner anonymous class</em>), un fichier <code>MyClass$i.class</code> est créé et contient le <em>bytecode</em> de cette classe interne anonyme. Avec l'avènement des <em>lambdas</em> qui sont une manière d'instancier une classe interne anonyme qui implémente une interface fonctionnelle, le <em>bytecode</em> est généré au <em>runtime</em> sans lui dédier un fichier <code>.class</code>.</p>
<p>Un <em>bytecode</em> généré à l'exécution (<em>runtime</em>) ou à la compilation (<em>compile time</em>) n'est pas différencié par l'API et le <em>bytecode</em> d'une classe pourrait être réutilisé pendant le cycle de vie de l'application alors que ce n'est pas désiré par le ou la développeuse. Les classes cachées (<em>hidden class</em>) semblent adresser ce problème… et ça sort du cadre de cet article… et de ma compréhension actuelle ;-)</p>
<h2><em>Reimplement the Legacy DatagramSocket API</em></h2>
<p>Réécriture de l'API pour les classes <code>java.net.DatagramSocket</code> et<br />
<code>java.net.MulticastSocket</code> (<a href="https://openjdk.java.net/jeps/373">JEP373</a>)</p>
<p>À ceci s'ajoutent :</p>
<ul>
<li>l'ajout d'un algorithme (<em>Edwards-Curve Digital Signature Algorithm (EdDSA)</em>) cryptographique pour le chiffrement elliptique ;</li>
<li>la première <em>preview</em> des classes scellées (<em>sealed class</em>) qui arrivent dans JDK17 (voir ci-dessous) ;</li>
<li>les <em>garbages collector</em> ZGC et Shenandoah ne sont plus expérimentaux. G1, reste le « ramasse miettes » par défaut ;</li>
<li>une partie du code RMI (<em>remote method invocation</em>) est déprécié : RMI Activation ; </li>
<li>… </li>
</ul>
<h1>JDK 16</h1>
<h2><em>Pattern matching for instanceof</em></h2>
<p>La « correspondance de schema » nous dirons <em>pattern matching</em> pour l'opérateur <code>instanceof</code> vise à optimiser (raccourcir) l'usage de cette structure. Structure souvent utilisée en Java lorsque l'on reçoit un objet et que l'on veut tester son type avant de l'utiliser… pour accéder à ses attributs.</p>
<pre><code class="language-java">
if (o instanceof String) {
var s = (String) o;
// do something with string s
}
</code></pre>
<p>Cette structure pourra être raccourcie, pour directement déclarer et instancier une variable dès lors que la condition est vraie, en (noter l'apparition d'un petit <code>s</code> dans les parenthèses) :</p>
<pre><code class="language-java">
if (o instanceof String s) {
// do something with string s
}
</code></pre>
<p>Quelques remarques et définitions car cette notion de <em>pattern matching</em> risque d'être appliquée à d'autres structures.</p>
<p>Un <em>pattern</em> (modèle ?) est un prédicat (un test) qui peut être effectué sur une valeur (une cible, <em>target</em>). Les <em>patterns</em> apparaissent comme les opérandes d'instructions et d'expressions qui fournissent les valeurs à tester. Les <em>patterns</em> déclarent des variables locales appelées <em>pattern variables</em>.</p>
<p>Tester une valeur par rapport à un <em>pattern</em> s'appelle le <em>pattern matching</em> (la comparaison de modèle ?). Le <em>pattern matching</em> est différent de l'exécution d'une instruction et de l'évaluation d'une expression.</p>
<p>Si le prédicat est vrai, le <em>pattern matching</em> initialise la variable locale, la <em>pattern variable</em>. Cette variable locale n'existe que si le prédicat est vrai.
(voir <a href="https://docs.oracle.com/javase/specs/jls/se17/jls17.pdf">JLS17</a> section 14.30)</p>
<p>Le scope d'une <em>pattern variable</em> est tel qu'elle ne peut exister que si le prédicat est vrai. Les deux cas de figures les plus fréquents (et simples) sont les suivants :</p>
<ul>
<li><p>une <em>pattern variable</em> est introduite lorsqu'une expression est <strong>vraie</strong> :</p>
<pre><code class="language-java">
if (o instanceof String s) {
// s in scope and you can do something with string s
} else {
// s not in scope
}
// s not in scope
</code></pre></li>
<li><p>une <em>pattern variable</em> est introduite lorsqu'une expression est <strong>fausse</strong> :</p>
<pre><code class="language-java">
void test(Object o) {
if (!(o instanceof String s)) {
throw new IllegalArgumentException();
}
// this point is only reachable if the pattern match
// succeeded thus, s is in scope for the rest
// of the block and you can do something with string s
}
</code></pre></li>
</ul>
<p>Remarque que la grammaire prend le temps de définir la notion de <em>« introduce by »</em> (section 14.30).</p>
<h2><em>Records</em></h2>
<p>Un enregistrement (<em>record</em>) (<a href="https://openjdk.java.net/jeps/395">JEP395</a>) est une classe représentant, sans <em>bla bla</em>, des données immuables. Là où l'on reproche à Java d'être trop verbeux, les <em>records</em> répondent présents.</p>
<p>Prenons l'exemple classique d'une classe représentant un <code>Point</code> dans le plan. Elle ressemblerait probablement à ceci (et pourrait être presque complètement générée par un IDE) : </p>
<pre><code class="language-java">
class Point {
private final int x;
private final int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
int getX() { return x; }
int getY() { return y; }
@Override
public boolean equals(Object o) {
if (!(o instanceof Point other)) return false;
return other.x == x && other.y == y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
@Override
public String toString() {
return String.format("Point[x=%d, y=%d]", x, y);
}
}
</code></pre>
<p>Avec un <em>record</em>, il suffit d'écrire :</p>
<pre><code class="language-java">
record Point(int x, int y) {}
</code></pre>
<p><em>C'est plus concis.</em></p>
<ul>
<li><p>Sans constructeur explicite dans l'enregistrement (<em>record</em>), on ne dit pas dans la classe puisque ce n'en n'est pas une à proprement parler, un constructeur canonique (<em>canonical constructor</em>) existe. Un constructeur canonique assigne la valeur des paramètres aux attributs (comme le constructeur <code>Point</code> ci-dessus).</p>
<p>À ne pas confondre avec un constructeur par défaut qui initialise les attributs à zéro.</p></li>
<li><p>Les méthodes <code>equals</code>, <code>hashCode</code> et <code>toString</code> sont automatiquement réécrites.</p></li>
<li><p>Les accesseurs existent et portent le même nom que l'attribut (pas de <em>get</em> devant donc).</p></li>
<li><p>Si nécessaire, il est possible d'adapter le constructeur. Par exemple (extrait de <a href="https://openjdk.java.net/jeps/395">JEP395</a>) :</p>
<pre><code class="language-java">
record Range(int lo, int hi) {
Range {
if (lo > hi)
throw new IllegalArgumentException(
String.format("(%d,%d)", lo, hi));
}
}
</code></pre>
<ul>
<li>notons qu'il est inutile de réécrire <code>this.lo = lo…</code></li>
</ul></li>
</ul>
<p>Tous les <em>records</em> héritent de <code>java.lang.Record</code>.</p>
<p>Quelques différences avec une classe normale :</p>
<ul>
<li><p>pas d'<code>extends</code> pour un <em>record</em>. Un <em>record</em> hérite toujours de <code>java.lang.Record</code> ; </p></li>
<li><p>un <em>record</em> est implicitement <code>final</code> et ne peut pas être abstrait (<code>abstract</code>). L'idée étant qu'un enregistrement représente un état qui ne peut être modifié par la suite ; </p></li>
<li><p>les attributs du <em>record</em> sont <code>final</code>. Les <em>records</em> sont immuables par défaut ;</p></li>
<li><p>pas d'attributs statiques (<em>instance fields</em>) ni de bloc d'initialisation (<em>instance initializers</em>)_; </p></li>
<li><p>toute déclaration explicite d'un membre qui serait généré par défaut (accesseurs, <code>equals</code>,…), doit correspondre en type et bien préserver la sémantique du <em>record</em> ;</p></li>
<li><p>un <em>record</em> ne peut pas déclarer de méthodes natives (<em>native method</em>) qui impliquerait, par définition, que le <em>record</em> devienne dépendant d'un état externe.</p></li>
</ul>
<p>… et quelques similitudes : </p>
<ul>
<li>les instances sont créées <em>via</em> <code>new</code> ; </li>
<li>un <em>record</em> peut être déclarée <em>top level</em> ou interne (<em>nested</em>) et peut-être générique (<em>generic</em>) ; </li>
<li>un <em>record</em> peut déclarer des méthodes statiques (« de classe », <em>static method</em>), attributs statiques (<em>static field</em>) et bloc d'initialisation (<em>static initializer</em>) ;</li>
<li>un <em>record</em> peut également déclarer des méthodes d'instances (<em>instance method</em>) ;</li>
<li><p>un <em>record</em> peut implémenter des interfaces.</p>
<p>A record class can implement interfaces. A record class cannot specify a superclass since that would mean inherited state, beyond the state described in the header. A record class can, however, freely specify superinterfaces and declare instance methods to implement them. Just as for classes, an interface can usefully characterize the behavior of many records. The behavior may be domain-independent (e.g., Comparable) or domain-specific, in which case records can be part of a sealed hierarchy which captures the domain (see below).</p></li>
<li><p>un <em>record</em> peut déclarer des types internes y compris des classes enregistrements internes (<em>nested record classes</em>). Si une classe enregistrement est elle même interne, elle est implicitement <code>static</code> ;</p></li>
<li><p>il peut y avoir des annotations dans une classe enregistrement (<em>record</em>) ;</p></li>
<li><p>les instances peuvent être sérialisées et désérialisées. Cependant, ce sont les attributs qui déterminent la sérialisation et le constructeur canonique, la désérialisation. Il n'est pas question d'ajouter des méthodes comme <code>writeObject</code>, <code>readObject</code>, <code>readObjectNoData</code>, <code>writeExternal</code>, ou <code>readExternal</code>.</p></li>
</ul>
<h2><em>Unix-Domain Socket Channels</em></h2>
<p>Support des sockets Unix (<code>AF_UNIX</code>) et <em>server socket</em>(<a href="https://openjdk.java.net/jeps/380">JEP380</a>) utilisés dans les communications inter-processus (IPC, <em>inter-process communication</em>) sur un hôte. Ces sockets sont semblables aux sockets TCP/IP (<code>AF_INET</code>) mais ne reposent pas sur IP et utilisent un nom de fichier.</p>
<p>Ce support se fait par, entre autre, l'ajout de la classe<br />
<code>java.net.UnixDomainSocketAddress</code> à l'API et d'une valeur <code>UNIX</code> à l'énumération <code>java.net.StandardProtocolFamily</code>. Voir <a href="https://openjdk.java.net/jeps/380">JEP380</a>.</p>
<h2><em>Warning for value-based classes and designate primitive wrapper classes as value-based</em></h2>
<p>Les classes englobantes pour les types primitifs (<em>primitive wrapper classes</em>) comme <code>java.lang.Integer</code> deviennent des <em>value-based</em> classes (<a href="https://openjdk.java.net/jeps/390">JEP390</a>) ce qui entraine que leurs constructeurs sont dépréciés (ils l'étaient depuis longtemps) et seront supprimés dans une future <em>release</em>.</p>
<p>Une <em>value-based</em> classe (voir la <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/doc-files/ValueBased.html">définition chez Oracle</a>) a les propriétés suivantes :</p>
<ul>
<li>tous les attributs sont constants (<em>final</em>) ;</li>
<li>les implémentation de <code>equals</code>, <code>hashCode</code> et <code>toString</code> se basent uniquement sur la valeur des attributs ;</li>
<li>les méthodes de la classe traitent les instances comme librement échangeables (<em>freely substituable</em>) lorsqu'elles sont égales (au sens <em>equals</em>). Donc, échanger deux instances qui sont égales (<em>equals</em> et donc pas spécialement <em>==</em>) ne produit aucun changement visible dans le comportement de la méthode ;</li>
<li>la classe ne fait aucune synchronisation ; </li>
<li>la classe n'a pas de constructeurs accessibles. (Par exemple <code>java.lang.Integer</code> va perdre ses constructeurs au profit de <code>Integer.valueOf(int)</code> et <code>Integer.parseInt(String)</code>) ; </li>
<li>la classe ne propose aucun mécanisme d'instanciation garantissant qu'une instance retournée soit unique, par exemple une méthode <em>factory</em> appelée deux fois et retournant deux fois la même valeur (au sens <em>equals</em>) peut retourner deux valeurs identiques (au sens <em>==</em>) ; </li>
<li>la classe est <code>final</code> et hérite de <code>Object</code> ou d'une hiérarchie d'objects ne contenant que des classes abstraites ne déclarant aucun attributs ni <em>instance initializers</em> et dont les constructeurs sont vides.</li>
</ul>
<h2><em>Packaging tool</em></h2>
<p>Ajout d'une nouvelle commande <code>jpackage</code> fournissant le nouvel outil de <em>packaging</em> Java.</p>
<p>Pour fournir une application, il n'est pas suffisant de fournir un <code>jar</code> qu'il faudrait placer <em>à l'endroit qui va bien</em> et ayant accès aux librairies éventuelles. <code>jpackage</code> permet de diffuser un paquet installable pour la plateforme cible (Linux, MS Windows, mac OS).</p>
<p>Par exemple une commande à l'allure suivante :</p>
<p></code></pre>bash
jpackage --name myapp --input lib --main-jar main.jar
</code></pre></p>
<p>À ceci s'ajoutent :</p>
<ul>
<li>la migration du dépôt d'OpenJDK de Mercurial vers Github ;</li>
<li>la seconde <em>preview</em> des classes scellées (voir JDK17 ci-dessous) ;</li>
<li>…</li>
</ul>
<h1>JDK 17</h1>
<h2>Sealed class</h2>
<p>Java 17 introduit les <strong>classes et interfaces scellées</strong> (<em>sealed class and interfaces</em>). Cette introduction fait suite (comme d'habitude maintenant) à deux <em>preview</em> dans le JDK16 et JDK15. Ces classes et interfaces restreignent la possibilité pour d'autres classes ou interfaces d'en hériter ou de les implémenter.</p>
<p>Un classe scellée peut être étendue uniquement par les classes explicitement autorisées. De même pour les interfaces et l'implémentation. Il suffit d'énoncer les classes avec leur « petit nom » si l'on est dans le même <em>package</em> ou avec le nom longs sinon.</p>
<p>Par exemple (issu de <a href="https://openjdk.java.net/jeps/409">JEP409</a>) :</p>
<pre><code class="language-java">
package com.example.geometry;
public abstract sealed class Shape
permits Circle, Rectangle, Square {
// write some code
}
</code></pre>
<p>Avant les classes scellées, les seules manières de limiter l'héritage ou l'implémentation étaient</p>
<ul>
<li>l'usage de <code>final</code> pour empêcher complètement l'héritage ;</li>
<li>limiter la visibilité de la classe ou des constructeurs aux packages pour n'autoriser l'héritage ou l'implémentation qu'aux packages.</li>
</ul>
<p>Il est possible d'omettre le mot clé <code>permits</code> lorsque l'on définit les classe autorisées directement dans la classe scellée. Dans l'exemple suivant (issu de <a href="https://openjdk.java.net/jeps/409">JEP409</a>), la classe <code>Root</code> est scellée et n'autorise que les classes <code>A</code>, <code>B</code> et <code>C</code>.</p>
<pre><code class="language-java">
abstract sealed class Root { ...
final class A extends Root { ... }
final class B extends Root { ... }
final class C extends Root { ... }
}
</code></pre>
<p>Une classes scellée (<em>sealed class</em>) impose trois contraintes :</p>
<ol>
<li><p>la classe scellée et ses sous-classes autorisées doivent se trouver dans le même module et, si le module n'est pas nommé, dans le même package ;</p></li>
<li><p>chaque sous-classe autorisée doit étendre directement la classe scellée ;</p></li>
<li><p>chaque sous-classe autorisée doit utiliser un <em>modifier</em> précisant comment se propage le sceau :</p>
<ul>
<li>elle peut être déclarée <code>final</code> et l'héritage s'arrête là. (Pour rappel, un <code>Record</code> est implicitement <code>final</code>) ; </li>
<li>elle peut être déclarée <code>sealed</code> et permettre l'héritage mais restreint ; </li>
<li>elle peut enfin être déclarée <code>non-sealed</code> et permettre l'héritage en enlevant le sceau pour les classes sous elle. Une classe scellée ne peut empêcher l'un de ses enfants d'enlever son sceau. </li>
</ul></li>
</ol>
<p>Ces trois <em>modifiers</em> sont évidemment exclusifs. Voici l'exemple de <a href="https://openjdk.java.net/jeps/409">JEP409</a> illustrant ces 3 situations :</p>
<pre><code class="language-java">
package com.example.geometry;
public abstract sealed class Shape
permits Circle, Rectangle, Square, WeirdShape {
// some code
}
public final class Circle extends Shape {
// some code
}
public sealed class Rectangle extends Shape
permits TransparentRectangle, FilledRectangle {
// some code
}
public final class TransparentRectangle extends Rectangle {
// some code
}
public final class FilledRectangle extends Rectangle {
// some code
}
public final class Square extends Shape {
// some code
}
public non-sealed class WeirdShape extends Shape {
// some code
}
</code></pre>
<p>L'utilisation est tout à fait semblable pour les interfaces</p>
<pre><code class="language-java">
package com.example.celestial;
sealed interface Celestial
permits Planet, Star, Comet { ... }
final class Planet implements Celestial { ... }
final class Star implements Celestial { ... }
final class Comet implements Celestial { ... }
</code></pre>
<p>et pour les classes enregistrements (<em>records</em>)</p>
<pre><code class="language-java">
package com.example.expression;
public sealed interface Expr
permits ConstantExpr, PlusExpr, TimesExpr, NegExpr { ... }
public record ConstantExpr(int i) implements Expr { ... }
public record PlusExpr(Expr a, Expr b) implements Expr { ... }
public record TimesExpr(Expr a, Expr b) implements Expr { ... }
public record NegExpr(Expr e) implements Expr { ... }
</code></pre>
<h3><em>Sealed classes and pattern matching</em></h3>
<p>Les classes scellées vont <em>bien se mettre</em> avec le <em>pattern matching</em> (j'avais dit que l'on en reparlerait !). JDK17 propose en <em>preview</em> le <em>pattern matching</em> pour le <code>switch</code> (<em>pattern matching for switch</em>). L'idée est d'étendre les types autorisés dans un switch (actuellement les types numériques, les énumérations et les <code>String</code>) à d'autres « choses » ayant un nombre limité et connu de valeurs… et c'est le cas des classes scellées puisque le nombre d'enfants est fixés (même si le nombre de petit-enfants ne l'est pas).</p>
<p>En reprenant l'exemple des formes ci-dessus, on pourrait actuellement écrire ceci (l'exemple est un peu discutable, il n'utilise pas de <em>pattern matching</em> pour <code>instanceof</code>… qui ne serait pas très utile puisque le polymorphisme fait le boulot pour <code>Rectangle</code> et <code>Square</code>) :</p>
<pre><code class="language-java">
Shape rotate(Shape shape, double angle) {
if (shape instanceof Circle) return shape;
else if (shape instanceof Rectangle) return shape.rotate(angle);
else if (shape instanceof Square) return shape.rotate(angle);
else throw new IncompatibleClassChangeError();
}
</code></pre>
<p>Le compilateur ne peut être sûr que les tests (<code>if</code>) couvrent toutes les sous-classes de <code>Shape</code>. Le dernier <code>else</code> est inatteignable mais le compilateur ne peut pas le savoir et s'il « manque » un test, ce ne sera pas détecté.</p>
<p>Si la <em>preview</em> du <em>pattern matching for switch</em> est maintenue, on pourra écrire :</p>
<pre><code class="language-java">
Shape rotate(Shape shape, double angle) {
return switch (shape) { // pattern matching switch
case Circle c -> c;
case Rectangle r -> r.rotate(angle);
case Square s -> s.rotate(angle);
// no default needed!
}
}
</code></pre>
<p>… mais c'est une autre histoire…</p>
<p>À ceci s'ajoutent :</p>
<ul>
<li>une nouvelle implémentation des générateurs de nombres pseudoaléatoires (<a href="https://openjdk.java.net/jeps/356">JEP356</a>) ; </li>
<li>l'API <code>Applet</code> est dépréciée et appelée à être retirée. Les fournisseurs de navigateurs internet (<em>web browsers</em>) ayant retirés, ou annoncés que ce serait fait, le support des applets Java. S'en rappelle-t-on d'ailleurs ? </li>
<li>la suppression annoncée de plusieurs classes dépréciées. </li>
</ul>
<p>Et là, on a fait le tour de certains changements et nouvelles fonctionnalités de la version 12 à 17… en ± 3 ans. En espérant que ça vous aide…</p>
<p><br/></p>
<p><em>Crédit photo perso au détour d'une balade</em></p>
Livre #5 - Mon cerveau est hyperurn:md5:316193bfbceeeaa29a8d6314d788c7c02021-06-12T07:44:00+02:002021-06-12T06:52:35+02:00PiTMoibienveillance<p><img src="https://blog.namok.be/public/images/divers/2021/tamas-pap-EwJwfOj-wA0-unsplash-960.jpg" alt="tamas-pap-EwJwfOj-wA0-unsplash-960.jpg, juin 2021" style="margin: 0 auto; display: block;" /></p>
<p>Dans la section « présenter un livre » commencée il y a bientôt 10 ans et ne
contenant que quatre livres : deux dont je parle encore très souvent — <a href="https://blog.namok.be/?post/2013/04/19/le-livre-vert">Le
livre vert</a> et <a href="https://blog.namok.be/?post/2015/03/23/cessez-etre-gentil-soyez-vrai">Cessez d'être gentil, soyez vrais</a> — et qui restent
des <em>livres à lire</em> et deux d'informatique, quasi obsolètes maintenant, voici :</p>
<p><strong>Mon cerveau est Hyper</strong> de <a href="https://emotionalcare.be/">Cathy Assenheim</a></p>
<p>Il ne s'agit plus ici de communication non violente ou de <a href="https://blog.namok.be/?post/2016/05/25/gueuler-avec-bienveillance">gueuler avec
bienveillance</a> — bien que le livre en parle. De la bienveillance. —
mais de comprendre l'<em>hyper</em> que tu as dans ton entourage. Il y en a forcément
un puisque ceci touche 10 à 20% de la population.</p>
<p>— L'hyper quoi ?<br />
— Le seul et unique « hyperpouvoir »…</p>
<p>Non, le livre parle d'<strong>intelligences</strong> et de <strong>sentiments</strong>. Il parles des
personnes <em>hyperintelligentes</em> (les hauts potentiels, « HP » ou encore,
zèbres…) et des personnes <em>hypersensibles</em>. On peut être l'un <strong>ou</strong> l'autre…
ou <strong>les deux</strong>. On nait « comme ça » et c'est tout. Les deux ont un cerveau
qui ne fonctionne pas « comme les autres ». Il fonctionne tout aussi bien mais
différement.</p>
<p>Le livre s'adresse premièrement aux personnes qui pensent être <em>hyper</em> et qui
cherchent à savoir si elles le sont avant de faire éventuellement un test.
Souvent, elles n'osent pas (ça vient avec le <em>package</em> <em>hyper</em>). En second
lieu, il s'adresse aux personnes <em>hyper</em> qui le savent et qui parfois en
souffrent ou s'interrogent ou fatiguent… Le livre leur propose des solutions.
Il s'adresse enfin aux personnes qui cotoient des « hyper » — parents,
partenaire de vie<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2021/06/12/livre-5-mon-cerveau-est-hyper#fn:f1" rel="footnote">1</a></sup>, amies<sup id="fnref:f2"><a href="https://blog.namok.be/?post/2021/06/12/livre-5-mon-cerveau-est-hyper#fn:f2" rel="footnote">2</a></sup> — et veulent apprendre à les comprendre ou
tout au moins à comprendre leurs réactions.</p>
<p>La première partie <strong>« Pour comprendre mon cerveau »</strong> présente les
particularités et les différences des deux types d'<em>hyper</em>. Elle permet de dire
« ha oui, je suis comme ça »…ou pas. La seconde partie <strong>« Pour retrouver le
contrôle de mon cerveau »</strong> présente des solutions pour prévenir le risque
d'épuisement — les <em>hypers</em> ont un cerveau qui fonctionne plus (Pas mieux.
Différement) que les autres et iels<sup id="fnref:f3"><a href="https://blog.namok.be/?post/2021/06/12/livre-5-mon-cerveau-est-hyper#fn:f3" rel="footnote">3</a></sup> ont un risque plus élevés d'épuisement,
voire de burnout — calmer le cerveau hyperintellectuel et modérer
l'hypersensibilité cérébrale.</p>
<p>Le livre se lit facilement.<br />
Bonne lecture.</p>
<p><br/></p>
<p><em>Crédit photo par <a href="https://unsplash.com/@tamasp?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Tamas</a> chez Unsplash. Les cerveaux hypers tournent plus vite ,ils consomment plus de magnésium… qui se trouve dans le chocolat.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Un p'tit coup d'écriture inclusive. « Partenaire de vie » — <em>so 2021</em> —
évite de dire mari ou femme pour les personnes qui vivent ensemble mais ne
sont pas mariées. Elle évite aussi de dire conjoint… car il faudrait écrire
conjoint ou conjointe, voire conjoint·e mais le point médian fait peur. Bouh.
Je devrais peut-être mettre un 's' entre parenthèse… <a href="https://blog.namok.be/?post/2021/06/12/livre-5-mon-cerveau-est-hyper#fnref:f1" rev="footnote">↩</a></p>
</li>
<li id="fn:f2">
<p>Et là, inutile d'écrire amis et amies, voire ami·es (<em>re bouh</em>) puisque je parle de personnes. <a href="https://blog.namok.be/?post/2021/06/12/livre-5-mon-cerveau-est-hyper#fnref:f2" rev="footnote">↩</a></p>
</li>
<li id="fn:f3">
<p><em>Rerebouh</em> :-) <a href="https://blog.namok.be/?post/2021/06/12/livre-5-mon-cerveau-est-hyper#fnref:f3" rev="footnote">↩</a></p>
</li>
</ol>
</div>
fzf, fuzzy finder ou comment faire des recherches plus efficaces dans son terminalurn:md5:c0e3e9320d984859824ab4d57524fb6c2021-06-08T17:04:00+02:002021-06-08T16:19:35+02:00PiTMes doigts dans le clavieralternativesdebianlinuxpratique<p><img src="https://blog.namok.be/public/images/divers/2021/98__magnifying_glass____vii_by_salihagir_d2nyby1-fullview.jpg" alt="98__magnifying_glass____vii_by_salihagir_d2nyby1-fullview.jpg, juin 2021" style="margin: 0 auto; display: block;" /></p>
<p><code>fzf</code> pour <em>command line fuzzy finder</em>… qui ne veut rien dire pour moi<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2021/06/08/fzf%2Cfuzzy-finder-ou-comment-faire-des-recherches-plus-efficaces-dans-son-terminal#fn:f1" rel="footnote">1</a></sup> mais
continuez de lire, c'est pratique.</p>
<p><em>First at all</em>, ça s'installe d'un simple coup de <code>apt install fzf</code>.</p>
<p><a href="https://github.com/junegunn/fzf">Sur la page du projet</a>, on peut voir que c'est un <strong>filtre unix</strong> qui
peut utiliser toutes sortes de listes. Pas uniquement une liste de fichiers,
mais aussi l'historique, une liste de processus, de noms de domaines…</p>
<p><code>fzf</code> lit la liste à partir de l'entrée standard <code>STDIN</code> et affiche l'élément sélectionné (ou les éléments sélectionnés) sur la sortie standard (<code>STDOUT</code>).</p>
<pre><code class="language-bash">
find * -type f | fzf [-m]
fzf
</code></pre>
<p>cet exemple envoie la liste de tous les fichiers du répertoire courant (sans les
fichiers cachés) à la commande fzf et la recherche peut commencer. Sans
paramètre la commande <code>fzf</code> a ce comportement par défaut.</p>
<p>Par défaut le recherche est étendue (<em>extended search mode</em>) et se fait en
entrant des mots séparés par des espaces. Certains caractères sont spéciaux et
signifient : <code>^</code> au début de la chaine, <code>$</code> à la fin, <code>!</code> inverse et <code>'</code> pour
<em>exact match</em>.</p>
<p>Par exemple : <code>^music mp3$ 'exact oui !non</code> retourne les éléments
qui commence par « music », se termine par « mp3 », contiennent la chaine
« exact », les lettres de « oui » et pas celles de « non ».</p>
<p><img src="https://blog.namok.be/public/images/divers/2021/fzf/fzf-1.gif" alt="fzf-1.gif, juin 2021" style="margin: 0 auto; display: block;" /></p>
<ul>
<li><code>[Up]</code> et <code>[Down]</code> pour voyager dans la liste ; </li>
<li><code>[Enter]</code> pour sélectionner l'élément ;</li>
<li>l'option <code>-m</code> permet de faire une recherche multiple. La sélection se fait avec la touche <code>[Tab]</code> et la validation avec <code>[Enter]</code> ;</li>
<li>l'option <code>-e</code> (<em>exact match</em>) désactive la recherche étendue.</li>
</ul>
<p>Il est possible de faire une recherche dans l'historique tout aussi facilement</p>
<pre><code class="language-bash">
history | fsf +s --tac
</code></pre>
<ul>
<li><code>+s</code> ne trie pas la liste ;</li>
<li><code>--tac</code> la montre dans l'ordre inverse.</li>
</ul>
<p>Plutôt que d'envoyer sur <em>STDOUT</em> (ce qui n'est pas pratique), il est possible
de rediriger la commande avec un bon vieil <code>xargs</code> :</p>
<p><img src="https://blog.namok.be/public/images/divers/2021/fzf/fzf-2.gif" alt="fzf-2.gif, juin 2021" style="margin: 0 auto; display: block;" /></p>
<p>… ou d'utiliser un sous-shell <code>vim -o $(fzf)</code>.</p>
<p>Plutôt que d'utiliser un sous-shell, il est possible d'utiliser <strong><code>**[Tab]</code></strong> pour lancer <code>fzf</code> à partir d'un répertoire.</p>
<pre><code class="language-bash">
vim /elsewhere/**[Tab]
cd /**[Tab]
</code></pre>
<p><img src="https://blog.namok.be/public/images/divers/2021/fzf/fzf-4.gif" alt="fzf-4.gif, juin 2021" style="margin: 0 auto; display: block;" /></p>
<p>Pour que le lancement de <code>fzf</code> se fasse avec <code>**[Tab]</code>, il faut éduquer bash en ajoutant ceci à son <code>.bashrc</code>.</p>
<pre><code class="language-bash">
source /usr/share/bash-completion/completions/fzf
</code></pre>
<p>La <em>magie des deux étoiles</em> fonctionne également pour une liste d'hôtes accédés en <code>ssh</code> ou pour des identifiants de processus (<em>pid</em>). Essayez:</p>
<pre><code class="language-bash">
ssh [Tab]
ssh **[Tab]
kill -9 [Tab]
</code></pre>
<p>Pour les personnes qui le préfèrent, il existe des touches de raccourcis (<em>key
binding</em>) que l'on peut définir en incluant le fichier d'exemple (ou en écrivant
le sien).</p>
<pre><code class="language-bash">
source /usr/share/doc/fzf/examples/key-bindings.bash
</code></pre>
<p>… par défaut <code>[Ctrl-T]</code> lancera <code>fzf</code>.</p>
<p><code>[Ctrl-r]</code> remplacera la recherche dans l'historique par une recherche dans
l'historique avec <code>fzf</code>. Beaucoup plus facile.</p>
<p><code>[Alt-c]</code> permettra de faire un changement de répertoire (<code>cd</code>) vers le répertoire sélectionné par <code>fzf</code>.</p>
<p>Il est maintenant temps de s'occuper des paramètres que l'on peut passer à la
commande. En voici quelques uns issus de la présentation officielle que je
trouve pratiques.</p>
<ul>
<li><code>--height 50%</code> pour limiter la hauteur de fzf à 50% du terminal ; </li>
<li><code>--multi</code> (<code>-m</code>) en mode multi-sélection ;</li>
<li><code>--inline-info</code> pour gagner une ligne, la recherche et le nombre de fichiers se trouvent sur la même ligne ; </li>
<li><code>--preview cat {}</code> pour afficher une fenêtre de prévisualisation du fichier. La documentation propose un peu mieux avec: </li>
</ul>
<pre><code class="language-bash">
--preview '[[ $(file --mime {}) =~ binary ]] && echo {} is a binary file \
|| cat {} 2>/dev/null | head -300`
</code></pre>
<ul>
<li><code>--preview-window='hidden'</code> qui n'affiche pas la fenêtre de prévisualisation… <em>heu !</em></li>
<li>… <code>--bind='f2:toggle-preview'</code> qui associe à la touche <code>[F2]</code> l'affichage, ou pas, de la prévisualisation ;</li>
</ul>
<p><img src="https://blog.namok.be/public/images/divers/2021/fzf/fzf-5.gif" alt="fzf-5.gif, juin 2021" style="margin: 0 auto; display: block;" /></p>
<ul>
<li><code>--bind='ctrl-a:select-all+accept</code> en combinaison avec <code>--multi</code> bien sûr ;</li>
</ul>
<p>…ce qui peut s'ajouter dans son fichier de configuration <em>bash</em> (ou autre <em>shell</em>):</p>
<pre><code class="language-bash">
export FZF_DEFAULT_OPTS="--height 50% \
--multi \
--inline-info \
--preview '[[ \$(file --mime {}) =~ binary ]] \
&& echo {} is a binary file \
|| bat --color=always --style=plain,changes {} \
2>/dev/null | head -300 ' \
--preview-window='hidden' \
--bind='f2:toggle-preview,ctrl-a:select-all+accept'"
</code></pre>
<p>Si l'on veut une prévisualisation d'un répertoire, cela peut se faire <em>via</em> : </p>
<pre><code class="language-bash">
export FZF_ALT_C_OPTS="--preview 'tree -C {} | head -100'"
</code></pre>
<p>Si vous avez des <em>tips and tricks</em>, n'hésitez pas à les partager…</p>
<p><br/></p>
<p><em>Sources, la <a href="https://github.com/junegunn/fzf">page officielle du projet</a> et la <a href="https://www.youtube.com/watch?v=qgG5Jhi_Els">vidéo associée</a> ainsi que <a href="https://sim590.github.io/fr/outils/fzf/">cet article</a>.</em><br />
<em>Crédit photo <a href="https://www.deviantart.com/salihagir/art/98-Magnifying-Glass-VII-161165305">salihagir</a>.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p><a href="https://blog.namok.be/?post/2021/06/08/deepl.com">deepl</a> traduit <em>fuzzy finder</em> par « détecteur de fausses pistes » ou encore « chercheur de flou ». <a href="https://blog.namok.be/?post/2021/06/08/fzf%2Cfuzzy-finder-ou-comment-faire-des-recherches-plus-efficaces-dans-son-terminal#fnref:f1" rev="footnote">↩</a></p>
</li>
</ol>
</div>
Un prix libre & conscient, qu'est-ce que c'est et pourquoi ?urn:md5:cadf38594fe6ffebc73eb52b624451ff2021-05-09T15:14:00+02:002021-05-09T14:21:23+02:00PiTUn arbre vertalternativesbienveillancesimplicité<p><img src="https://blog.namok.be/public/images/divers/2021/exchanged_souls_by_mayed86_doyyys_cut800.jpg" alt="exchanged_souls_by_mayed86_doyyys_cut800.jpg, mai 2021" style="margin: 0 auto; display: block;" /></p>
<p>Certaines personnes ont parfois des difficultés à fixer un prix pour un objet
ou une prestation.</p>
<p>— Parce que ça n'a pas de valeur !</p>
<p>Sûrement pas. <a href="http://ploum.net/le-prix-libre-une-impossible-utopie/">La valeur n'est pas le prix. Le prix, n'est pas la
valeur</a>. Ce qui est simple pour moi est peut-être difficile pour toi,
je peux t'apprendre. Je suis formé dans ce domaine et mon expertise ou ma
pratique t'intéresse. J'ai peut-être un syndrôme de l'imposteur dans ce que je
propose. L'objet ou l'activité proposée est nouvelle et l'on ne sait pas encore
quel est le retour du public (parce qu'aujourd'hui c'est parfois le public qui
fixe le prix). Ce n'est pas dans mon tempérament que d'estimer la valeur de ce
que je propose. Ma valeur ? Parfois c'est simplement une manière de permettre à
chacun et chacune de participer en fonction de ses moyens. L'un donnera plus et
l'autre moins. C'est alors un moyen d'inclusion, un moyen de donner un accès
équitable aux savoirs — savoir, savoir-faire et savoir-être. C'est un autre
rapport à l'argent. Que suis-je prêt à donner… et à recevoir.</p>
<p>Le prix est libre. Il est conscient.</p>
<p>Ce n'est pas gratuit.</p>
<p>Un <strong>prix libre et conscient</strong> est la somme en euros ou l'échange en nature
qu'une personne peut ou veut donner en échange d'un service rendu, d'une
activité suivie, d'un travail effectué ou d'un objet reçu. C'est <strong>obligatoire</strong>
car ce n'est pas gratuit.</p>
<p>Choisir en conscience, c'est choisir en pensant aux prix pratiqués sur le marché
et aussi au besoin de la personne offrant le service d'être, à minima, rémunérée
voire valorisée dans son travail ou cette activité. C'est penser aux coûts liés
à l'activité (location, matières premières, investissement, taxes, charges…).
C'est faire avec ses moyens ; situer l'activité, le service ou l'objet sur une
échelle d'importance par rapport aux autres dépenses que l'on veut ou doit faire.</p>
<p>Il y a quelques règles (proposées par l'université du nous) :</p>
<ol>
<li>La rémunération est obligatoire. </li>
<li>La démarche est expliquée — partagée — en début de séance.</li>
<li>La remise se fait :
<ul>
<li>en fin de séance ;</li>
<li>de façon non-anonyme ;</li>
<li>sans justification. </li>
</ul></li>
</ol>
<p>L'exercice n'est pas toujours confortable. Surtout les premières fois. C'est
plus facile de voir un prix et pouvoir dire oui, non, c'est trop cher. Acheter
ou passer son chemin. Sans réflexion. Ici, il faut réfléchir:</p>
<ul>
<li>Quelle était la richesse de l'activité ? </li>
<li>Combien de temps cette personne nous a consacré ? </li>
<li>À combien j'estime une heure de son temps (de mon temps) ?</li>
<li>À-t-elle du payer quelque chose pour proposer l'activité ? </li>
<li>Est-ce que le service répond à mes attentes ? </li>
<li>Quels sont les tarifs habituels ?</li>
<li>Est-ce que je veux soutenir la personne dans ce qu'elle propose ? </li>
</ul>
<p>Et s'il est difficile de choisir, pourquoi ne pas en parler avec la personne
concernée qui pourra nous aider à choisir ce que je désire donner.</p>
<p><br/></p>
<p><em>Crédit photo par <a href="https://www.deviantart.com/mayed86/art/Exchanged-Souls-41942404">Mayed86</a>.</em></p>
Donne-moi ton adresse echaturn:md5:b522470fe5bc291783eda4acbe823b7a2021-04-12T08:39:00+02:002021-04-12T08:39:00+02:00PiTMes doigts dans le clavieralternativesdiversgafamgeekinternetlogiciellibre<p><img src="https://blog.namok.be/public/images/divers/2021/mike-meyers--haAxbjiHds-unsplash.jpg" alt="mike-meyers--haAxbjiHds-unsplash.jpg, avr. 2021" style="margin: 0 auto; display: block;" title="un téléphone (vieux modèle) jaune sur fond jaune" /></p>
<p>— Donne moi ton adresse echat, s'il-te-plait.<br />
— Voici : pit@example.chat</p>
<p>Ce devrait être aussi simple de donner son adresse <em>echat</em> (pour <em>eletronic chat</em>) que l'adresse d'un site web à consulter ou que son adresse <em>email</em> (<em>electronic mail</em>) voire que son numéro de téléphone.</p>
<p>L'email fonctionne très bien depuis plus de 20 ans. Tout le monde y est — y était — habitué. Il suffit de choisir deux choses: premièrement, une adresse email et donc un fournisseur et deuxièmement un programme pour lire et écrire ses mails.</p>
<p>Il existe pléthore de fournisseurs de mails (les <em>gafam</em> et d'autres), et quelques programmes pour les lire (les <em>gafam</em> et les autres). Aujourd'hui, malheureusement, beaucoup de personnes utilisent une adresse <em>gmail</em> et le programme <em>gmail</em>. Oui, ça porte le même nom… pour apporter de la confusion. <a href="https://fr.wikipedia.org/wiki/Don%27t_be_evil"><em>Don't be evil</em> qu'ils disaient !</a> Si le mail n'était pas si résistant, Google l'aurait déjà mangé.</p>
<p>Pour le <em>chat</em>, ce qui était avant la communication instantanée et qui est maintenant une « communication instantanée qui peut être asynchrone et plus du tout instantanée », c'est un peu plus compliqué même s'il s'agit toujours d'une question de <strong>choix</strong>. Il faut choisir trois choses : en plus de l'adresse (et donc d'un fournisseur) et du programme, il faudra choisir le protocole. Là où pour le mail, le protocole est unique, pour le <em>chat</em>, il y en a plusieurs et c'est là que le bât blesse. C'est parce qu'il y a plusieurs protocoles que je ne peux pas à partir de <em>Whatsapp</em> t'envoyer un message sur <em>Messenger</em>.</p>
<p>— De toute façon, on m'a dit d'utiliser <em>Signal</em> !<br />
— Oui et on en revient à cette question de <strong>choix</strong>.</p>
<p>L'être humain est tel que s'il ne peut pas choisir, il râle… et quand il doit choisir, il ne sait pas choisir ! La personne humaine est compliquée. J'en suis une.</p>
<p>L'inconvénient de cette histoire de protocole, c'est que tu ne peux pas choisir un programme pour tes messages quels que soient les choix de tes amis et amies. <em>Amis politiques, il faudrait forcer les gros (<em>aka</em> les GAFAM) a utiliser un protocole commun (<em>XMPP</em> ou <em>Matrix</em> ou…)</em>. Certains de tes amis et amies te forcent à utiliser un programme particulier. « Libre » à toi de l'accepter ou pas. De les convaincre ou pas et l'on sait très bien que c'est difficile.</p>
<p>Revenons a cette histoire de <strong>choix</strong>.</p>
<p>Si le choix se porte sur un « ± gros centralisé », il ne faudra faire qu'un seul choix et les autres seront alors imposés. Une fois l'application (le programme) choisie (<em>Whatsapp</em>, <em>Facebook</em>, <em>Messenger</em>, <em>Instagram</em>… <em>Signal</em>), le choix du protocole et du fournisseur suivent.</p>
<p>Pour un choix acentralisé, pour ne pas choisir un gros (<em>aka</em> GAFAM), il faudra porter plusieurs choix… et ça c'est difficile !</p>
<ul>
<li>choisir un protocole: XMMP ou Matrix ou… </li>
<li>choisir le fournisseur et son adresse. Où ? Comment trouver ?</li>
<li>choisir une application. Laquelle est « la mieux » ? </li>
</ul>
<p>… bref… à l'heure où j'écris ces lignes, je conseille <a href="https://signal.org/fr/"><em>Signal</em></a>. Un seul choix. Le moins pire.</p>
<p><br/></p>
<p><i>Photo by <a href="https://unsplash.com/@mike_meyers?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Mike Meyers</a> on <a href="https://unsplash.com/s/photos/communication?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></i></p>
Envoyer les mails pendant les heures du bureau : fausse bonne idée.urn:md5:214e8be5dd1f59d79aa3ae4b1cc162cc2021-04-11T12:29:00+02:002021-04-11T11:48:44+02:00PiTCartable au dosenseignementesi<p><img src="https://blog.namok.be/public/images/divers/2021/cabine-53e1cb8a35702004f7dc5301.jpg" alt="cabine-53e1cb8a35702004f7dc5301.jpg, avr. 2021" style="margin: 0 auto; display: block;" title="une ancienne cabine téléphonique" /></p>
<p>Je lisais dans le <a href="https://www.lacsc.be/csc-enseignement/publications/csc-educ/csc-educ-2020-2021">CSC-EDUC 148</a> d'avril 2021 un article sur le droit à la déconnexion.</p>
<p>(<em>Je me permets de vous le partager comme si je vous le prêtais dans la salle des profs ou si je le laissais trainer dans le train après l'avoir lu. <a href="https://blog.namok.be/public/documents/csc-educ-148.pdf">[PDF]</a></em>)</p>
<p>Poser un cadre pour la communication électronique <em>prof-prof</em>, <em>prof-direction</em>
et <em>prof-élève</em> ou <em>prof-étudiant.e</em> est une bonne idée. La proposition
s'appelle <strong>Garantir un droit à la déconnexion pour chaque membre du
personnel</strong>. Même si j'aurais préféré lire un titre comme : <strong>Cadre pour la
communication électronique entre les différentes personnes intervenant dans
l'école</strong> parce que la communication va dans les deux sens et que je trouve que
nous avons aussi un <em>devoir de connexion</em>, il est important de poser cette
question.</p>
<p>La position de la CSC me semble sensée et pas surprenante. Bien sûr, j'y lis un
rappel bienvenu de la différence entre <em>répondre</em> et <em>prendre connaissance</em> mais
je ne m'attarderais que sur un seul point qui me semble être une fausse bonne
idée. Il s'agit de :</p>
<blockquote>
<p>Obliger l'envoi des mails pendant les heures de travail grâce à la fonction d'envoi différé.</p>
</blockquote>
<p><a href="https://blog.namok.be/public/images/divers/2021/csc-educ-148-extrait.png" title="csc-educ-148-extrait.png, avr. 2021"><img src="https://blog.namok.be/public/images/divers/2021/csc-educ-148-extrait.png" alt="csc-educ-148-extrait.png, avr. 2021" style="margin: 0 auto; display: block;" /></a></p>
<p>Premièrement, cette proposition est <em>GAFAM-webmail-centrée</em>.</p>
<p>Sans préjuger de l'intention des rédacteurices, les clients <em>gmail</em> et <em>outlock</em>
proposent la fonctionnalité d'envoi mais plein d'autres non. Par exemple ;
<em>Thunderbird_<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2021/04/11/envoyer-les-mails-pendant-les-heures-du-bureau-fausse-bonne-idee#fn:f1" rel="footnote">1</a></sup>, Sogo, Roundcube<sup id="fnref:f2"><a href="https://blog.namok.be/?post/2021/04/11/envoyer-les-mails-pendant-les-heures-du-bureau-fausse-bonne-idee#fn:f2" rel="footnote">2</a></sup>, Nextcloud (avec le _plugin</em> mail)…
Cette proposition est donc trop réductrice. Si j'étais d'humeur chagrine, je
dirais qu'elle m'impose l'utilisation d'un outil particulier pour lire et écrire
mes mails.</p>
<p>Ma deuxième remarque n'est pas technique. Le mail est asynchrone depuis toujours.</p>
<p>J'écris et je lis mes mails <strong>quand je veux</strong>, <strong>quand ça m'arrange</strong> et mæ
interlocuteurice aussi (cfr. <a href="https://blog.namok.be/?post/2016/12/19/bon-anniversaire-netiquette">Netiquette
2.0</a> 10 et
25). Je ne vois aucune raison d'obliger l'envoi du mail pendant les heures de
travail.</p>
<p>La plupart d'entre nous avons choisi l'enseignement pour la souplesse que le
métier offre dans le choix des périodes de travail. Par exemple, c'est tellement
pratique lorsque la personne à qui j'envoie ma question à 23h a l'envie de me
répondre à 6h pendant que je dors, ce qui me permettra d'avancer sur le boulot
pendant qu'elle fait une balade au bois l'après-midi. Ce serait dommage de se
priver de cette souplesse.</p>
<p>Je pratique <em>inbox zéro</em> c'est-à-dire la partie <em>inbox</em> (mails entrants) de ma
boite mail contient peu de mails (en général moins de 15). Je fonctionne plus ou moins comme ceci : à la réception d'un mail</p>
<ul>
<li>si c'est rapide, je le traite ; </li>
<li>si c'est long, je le laisse dans mon <em>inbox</em> jusqu'au traitement ; </li>
<li>si « ça fait longtemps qu'il est là », je ne le traiterai pas et j'archive. L'expéditeurice reviendra vers moi si c'est important. (Je n'ai pas souvent besoin de le faire).</li>
</ul>
<p>Je n'ai donc pas envie d'être assailli par moult mails le lundi à 8h alors que
j'aurais pu traiter certaines demandes rapides au fil des heures du week-end par
exemple. Si j'avais voulu tout traiter le lundi à 6h parce que je suis un
lève-tôt et que je préfèrais que ce soit fait avant mon cours de 8h… perdu. Je
ne peux pas.</p>
<p>J'ai l'impression — toujours sans jugement — que cette proposition est faite par
des personnes hyper-connectées ou gérant mal leurs notifications. Je ne reçois
<strong>aucune notification</strong> de ma boite mail professionnelle. Je ne vois donc mes
mails professionnels que lorsque <strong>je décide de consulter mes mails</strong>. Avec le
mail, je me déconnecte donc quand je veux.</p>
<p>Le mail correctement géré permet la déconnexion.</p>
<p><br/></p>
<p><em>Crédit photo <a href="https://www.lalibre.be/regions/bruxelles/les-cabines-telephoniques-vivent-leurs-derniers-instants-53e13fb43570667a6390ee7f">La libre</a>.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Il y a bien un plugin qui enverra le mail au moment demandé (<strong>si ma machine est allumée</strong>) mais qui ne fonctionne pas/plus avec ma version de Thunderbird. <a href="https://blog.namok.be/?post/2021/04/11/envoyer-les-mails-pendant-les-heures-du-bureau-fausse-bonne-idee#fnref:f1" rev="footnote">↩</a></p>
</li>
<li id="fn:f2">
<p>Il semble exister un plugin payant. <a href="https://blog.namok.be/?post/2021/04/11/envoyer-les-mails-pendant-les-heures-du-bureau-fausse-bonne-idee#fnref:f2" rev="footnote">↩</a></p>
</li>
</ol>
</div>
Bouffer du curéurn:md5:013ed0eb2508ecc47959505397ba667c2021-03-26T13:07:00+01:002021-03-26T13:09:11+01:00PiTMoibienveillancebuzzenseignementpolitique<p><img src="https://blog.namok.be/public/images/divers/2021/thechurch-sirault-1200x.jpg" alt="thechurch-sirault-1200x.jpg, mar. 2021" style="margin: 0 auto; display: block;" /></p>
<p>En ce dimanche matin, je me rends à l'église parce que mes parents veulent que je participe à la messe. Je me mets au fond de l'église avec mes potes et nous attendons que ça passe. Ensuite, nous nous retrouverons au café du village pour boire quelques bières avec ceux<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fn:f1" rel="footnote">1</a></sup> qui ont été à la messe et les autres. Tout le monde s'en fout un peu que l'on aille à la messe ou pas, l'important c'est de se retrouver après. Au café, ça parle fort. De tout. De rien.</p>
<p>À l'époque, tout le monde est un peu catholique ou s'en fout… enfin presque.</p>
<p>Certaines personnes bataillent pour plus de laïcité. Leur combat est compréhensible. Dès lors que la religion ne m'intéresse pas, je ne veux pas qu'elle soit omniprésente: école catholique, église dans chaque village… Ces personnes bataillent<sup id="fnref:f2"><a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fn:f2" rel="footnote">2</a></sup> pour une plus grande laïcité de l'État. Bien que la constitution belge sépare « les choses »<sup id="fnref:f3"><a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fn:f3" rel="footnote">3</a></sup>, l'État finance les cultes, organise des cours de religions dans l'enseignement obligatoire et la religion garde une place dans l'espace publique que d'aucun trouve trop importante.</p>
<p>En général, tout se passe bien, l'<a href="https://blog.namok.be/?post/2016/03/08/etre-du-troisieme-millenaire">Être</a> humain aspirant à vivre serein. Mais parfois <em>ça frotte</em> et <em>ça gueule au café</em>. Des personnes s'expriment parfois en criant et tout ça n'est pas grave. <em>Désaccord n'est pas désamour.</em> Exprimer ses sentiments, ses opinions dans le respect de l'autre, même en criant parfois est même très sain. Bref, parmi les personnes qui s'affichent comme étant laïques<sup id="fnref:f4"><a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fn:f4" rel="footnote">4</a></sup> certaines sont <strong>militantes</strong>. Jadis, on aurait dit les <strong>bouffeurs de curé</strong>.</p>
<p>Les militanteurices<sup id="fnref:f5"><a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fn:f5" rel="footnote">5</a></sup> de tout poil — qu'iels peuvent raser ou pas d'ailleurs — sont par leur militantisme <em>toujours aux aguets</em>. Étant convaincu que leur combat est le bon et l'ayant sans doute maintes fois répété, ces personnes<sup id="fnref:f6"><a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fn:f6" rel="footnote">6</a></sup> ont parfois tendance à grogner voire à montrer les dents. Les combats sont divers et chaque personne a les siens. Aujourd'hui je pense à la laïcité et au droit de porter des signes convictionnels parce que ce sont des combats sensibles et épidermiques. Ce n'est pas trop mon combat. Mon combat, c'est plutôt la défense des logiciels libres, de linux et la lutte contre les GAFAM. Cette sensibilité reste et restera mais je ne milite plus. J'informe, j'explique, je réponds aux questions mais n'essaie plus de convaincre à tout prix.</p>
<p>— Et les bouffeurs de curé !<br />
— D'accord. D'accord.</p>
<p>D'abord, j'écris l'expression avec gentillesses et même affection. Ensuite, le militantisme trop combattant me fait parfois peur ou m'agresse si je me sens forcé. Ceci dit, c'est le militantisme qui fait bouger les choses. Il dérange et fait donc réfléchir. Hier, les militanteurices laïques auraient — et ont d'ailleurs — bataillé contre l'église catholique. Il suffit de faire une recherche d'images dans un moteur de recherche avec les mots clés « caricature église catholique » pour s'en rendre compte<sup id="fnref:f7"><a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fn:f7" rel="footnote">7</a></sup>. Aujourd'hui, la religion n'est plus unique en Belgique et leur combat est toujours le même. Leur lutte contre la religion catholique se déplace contre la religion musulmane et malheureusement les sensibilités étant différentes aujourd'hui qu'hier ça <em>passe mal</em>. Une personne militante laïque se battra tout autant contre le port du voile que contre le port d'une croix dans une école.</p>
<p>Aujourd'hui le militantisme laïque se heurte au militantisme musulman et je prie<sup id="fnref:f8"><a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fn:f8" rel="footnote">8</a></sup> pour que le débat puisse se faire en parlant voire en criant mais surement pas en insultant ou en tuant.</p>
<p>C'est pas gagné.</p>
<p><br/></p>
<p><em>Crédit photo <a href="https://alegendarytrip.wordpress.com/2014/09/04/holy-ghost/">alegendaryptrip</a>, « Le church » ancienne église transformée en discothèque jadis.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>J'écrirais bien <em>celleux</em> mais ce n'était pas d'usage à l'époque bien que nous étions filles et garçons au café. C'était d'ailleurs, il y a tellement longtemps que toutes mes connaissances étaient binaires. C'est dire comme c'est vieux ;-) <a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fnref:f1" rev="footnote">↩</a></p>
</li>
<li id="fn:f2">
<p>Aujourd'hui, il faudrait sans doute écrire « luttent » et lever le point. <a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fnref:f2" rev="footnote">↩</a></p>
</li>
<li id="fn:f3">
<p>Je reste résolument flou parce que je ne maitrise absolument pas le sujet… ce qui ne m'empêche pas de m'exprimer… ah <a href="https://blog.namok.be/?post/2013/03/26/je-suis-homme-blanc-hetero">l'homme blanc</a> ;-) <em>#humour</em> <a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fnref:f3" rev="footnote">↩</a></p>
</li>
<li id="fn:f4">
<p>Et l'on peut afficher ses opinions si l'on veut, je peux dire que je suis catholique, que je suis laïque, que je suis athée ou que je suis musulman… sauf que je dois trouver une tournure de phrase sans le « Je suis » ^^ <a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fnref:f4" rev="footnote">↩</a></p>
</li>
<li id="fn:f5">
<p>T'as vu ? Plus de point médian ! Est-ce que je cherche à faire ami-amie avec les « inclusifves » ou bien ennemi avec l'académie française ? En vrai, en général j'aurais écrit « les militants et les militantes »… mais je suis d'humeur taquine. <a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fnref:f5" rev="footnote">↩</a></p>
</li>
<li id="fn:f6">
<p>Quand j'écris « ces personnes » ce n'est pas du dédain ou de la distance, c'est pour éviter d'écrire « ils ou elles » ou « iels ». <a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fnref:f6" rev="footnote">↩</a></p>
</li>
<li id="fn:f7">
<p>En général ces — toutes les — caricatures me font rire, sinon sourire. <a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fnref:f7" rev="footnote">↩</a></p>
</li>
<li id="fn:f8">
<p>Tête d'ange <a href="https://blog.namok.be/?post/2021/03/26/bouffer-du-cure#fnref:f8" rev="footnote">↩</a></p>
</li>
</ol>
</div>
Un voile et un t-shirturn:md5:ffb30fbadcec8db692255c82af1a48cb2021-01-16T16:21:00+01:002021-01-16T16:25:36+01:00PiTCartable au dosenseignementesipolitique<p><img src="https://blog.namok.be/public/images/divers/2021/lescapricesdiris.com.jpg" alt="lescapricesdiris.com.jpg, janv. 2021" style="margin: 0 auto; display: block;" /></p>
<p>Je pars pour l'école avec mon t-shirt <em>Tux</em>.</p>
<p>Je suis toujours un peu stressé quand j'arbore ce t-shirt représentant la
mascotte linux. D'ailleurs en entrant dans l'école, je me fais interpeller :</p>
<p>— Que signifie ce pingouin sur ton t-shirt ?<br />
— Ben, ce n'est pas un pingouin, c'est un manchot et c'est simplement un t-shirt
que j'aime bien.<br />
— Ok. C'est bon.</p>
<p>Je sais très bien ce que je dois répondre.</p>
<p>Il y a quelque jours, mon pote est arrivé à l'école avec un t-shirt montrant <em>un
tux avec une tapette à mouche voulant écraser un papillon aux couleurs window</em>
et il a du rentrer chez lui parce qu'il est interdit de se « permettre toute
publicité ou toute propagande pour un mouvement politique, philosophique ou
religieux ». Comme il avait répondu que « windows c'est de la m°@$e » (<em>sic</em>),
on lui a dit que c'était de la propagande philosophique et qu'il contrevenait au
règlement des études. Il a donc du rentrer se changer.</p>
<p><em>Fin de la fiction.</em></p>
<p><a href="https://www.lalibre.be/belgique/enseignement/le-voile-sera-massivement-autorise-en-septembre-dans-l-enseignement-superieur-l-interet-general-doit-primer-6001eabb9978e227df936a0d">À la rentrée de septembre 2021, les signes convictionnels seront autorisés dans
les écoles supérieures dépendantes de WBE (Wallonie-Bruxelles
Enseignement)</a>. Les filles qui le désirent pourront porter le voile
islamique. Par extension — même si l'article ne le dit pas — d'autres signes
convictionnels pourront être portés. Il sera donc normalement possible de porter
une kippa, un turban, une croix ou encore le crâne rasé et une tenue orange…</p>
<p>La règle est assez bien respectée et je peux compter sur le doigt (<em>si si</em>) d'une main le nombre de fois où
il a fallu rappeler que le port du voile était interdit dans l'enceinte de l'école.</p>
<p>Évidemment, personne ne s'est vu refuser l'entrée de l'école pour t-shirt
inapproprié. Si je peux afficher mes convictions religieuses, j'estime pouvoir
afficher mes convictions aussi simples qu'elles soient. Plus d'inquiétude pour
les t-shirt avec un message. Nous voilà rassurés. Me voilà rassuré.</p>
<p>Outre les t-shirt « <em>de geek</em> » qui sont plus souvent des t-shirts de <em>nerds</em>
pour ma part, ce sera <em>open bar</em> pour vos messages convictionnels. Vous pouvez
sortir vos t-shirts : <em>Che Guevara</em>, 100% bio, Non à la THT, Le nucléaire tue, I
love N-VA, La terre est plate, 5G non merci, BÉPO > AZERTY…</p>
<p>Je m'en vais de ce pas refaire un stock de t-shirts en attendant le décret.</p>
<p><br/></p>
<p><em>Crédit photo par <a href="http://www.lescapricesdiris.com/look-geek/">Iris</a>. Je cherchais une photo d'une fille avec un t-shirt de geek. Je ne trouvais pas puis, j'ai trouvé <a href="http://www.lescapricesdiris.com/look-geek/">Iris</a></em></p>
Le temps des blogs est-il revenu ?urn:md5:76b36f904b415f05e446e48518f9cb362021-01-12T15:30:00+01:002021-01-12T15:36:34+01:00PiTMoiblogfiction<p><img src="https://blog.namok.be/public/images/divers/2021/blackbirds-_dsc0066__19__by_placi1_dec3zi2-fullview.jpeg" alt="blackbirds-_dsc0066__19__by_placi1_dec3zi2-fullview.jpeg, janv. 2021" style="margin: 0 auto; display: block;" /></p>
<p>Le temps des blogs était révolu.</p>
<p>Tout le monde avait oublié comme il était simple — mais pas assez — de louer un
hébergement et d'y installer son moteur de blog. Ça ne coutait pas grand chose
— mais trop — pour réserver un nom de domaine et être indépendant. Libre. Libre
d'écrire un billet sur n'importe quel sujet ! En deux clics, je pouvais donner
mon avis sur une recette de cuisine, présenter un livre que j'ai bien aimé,
discuter politique, sensibiliser à une idée, à un logiciel, partager mes
expériences, mettre en garde, plaisanter…</p>
<p>Pas de censure et une liberté d'expression quasi totale. Quasi car ce qui est
interdit dans l'espace publique l'était tout autant sur mon blog. <a href="https://www.belgium.be/fr/justice/victime/plaintes_et_declarations/discrimination">La
discrimination est interdite par la loi et punissable</a>. Si l'on
dérapait, la justice faisait son devoir et punissait. C'était entre elle et moi.
Pour le reste la personne détentrice d'un blog y écrit ce qu'elle veut. C'est
chez elle. Elle n'est même pas obligée de laissé un ou une internaute passant
par là déposer son commentaire. Elle peut le supprimer à vue. C'est chez elle.
Elle accueille le passant ou la passante comme elle veut.</p>
<p>Bien sûr notre <a href="https://namok.be/blog/?post/2013/07/23/ce-besoin-de-reconnaissance">éternel besoin de reconnaissance</a>, notre égo,
nous pousse à augmenter notre lectorat. Je veux être lu. À n'importe quel prix ?
Alors je me crée un compte, d'abord Twitter, puis Facebook et enfin Instagram.
<a href="https://namok.be/blog/?post/2014/04/25/comment-acheter-des-amis">Je vais jusqu'à me payer des amis</a> pour que ce que j'écris soit lu par
le plus grand nombre. S'il faut réduire mon texte pour qu'il tienne en 140
caractères, je le fais. Et j'empile des tweets en oubliant mon blog. En
supprimant mon blog car il est <em>tellement</em> simple d'écrire un <em>tweet</em>. Je
n'écris pas, je <em>tweete</em>. Je ne <em>tweete</em> pas, je fais un (long) <em>thread</em>.</p>
<p>Je ne sais pas — ou pire, je le sais très bien — que ces <a href="https://namok.be/blog/?post/2016/02/19/pourquoi-faut-il-lutter-contre-les-societes-privees">plateformes sont
privatrices de liberté</a>, qu'elles ne m'appartiennent pas. Je dépose ma prose sur
les serveurs d'une société privée aux états-unis alors qu'elle pourrait être sur
une machine proche. Chez un hébergeur belge. D'ailleurs ma prose n'en a plus que
le nom, je n'écris plus. Je ne réfléchis plus, je réagis. Je surjoue. Je
m'indigne. Des jours. Un jour. Une heure.</p>
<p>Avant j'adaptais parfois mon discours à mon public. Gentiment. Doucement.
Maintenant, je prends le pouls de ma bulle et pense comme elle. Mes amis.
Plutôt mes contacts — inconnus et inconnues pour la plupart — m'influencent en
140 caractères. Non ! En quelques émojis.</p>
<p>Hier, Twitter m'a bloqué, ensuite Facebook et, comme par hasard aujourd'hui,
Instagram. Mon compte a été supprimé. Définitivement.</p>
<p>Je voudrais crier quelque part « SALAUDS ». Je vaudrais leur dire qu'ils me
musellent, que nous sommes en démocratie et que j'ai le droit de parler. « À
MORT LA DICTATURE ! » Je ne trouve que des « on te l'avait bien dit ! ». Comme si
tout le monde laissait sa porte ouverte à l'inconnu ou l'inconnue qui voudrait
entrer donner son avis ou l'insulter. Oui, c'est vrai. J'avais bien lu — quelque
part, en diagonale, rapidement — qu'il existe des <a href="https://namok.be/blog/?post/2017/04/09/un-service-decentralise-c-est-quoi">alternatives
acentralisées</a> et fédérées comme, par exemple, Mastodon. Je
pourrais décider d'en installer une instance et, avec un peu de chance, être
fédéré avec les autres. Je pourrais aussi décider d'arrêter de crier et de
réagir en quelques mots. Décider d'utiliser les émojis avec parcimonie et
(re)commencer d'écrire des billets dépassant les 140 caractères. Dire autour de
moi que <a href="https://namok.be/blog/?post/2015/05/06/facebook-est-un-mauvais-moyen-de-communication-pour-une-association">les réseaux sociaux sont de mauvais moyen de communication</a> et
qu'il faut les laisser faire ce qu'ils font bien… relayer un bon vieux billet de
blog que l'on pourra citer, retrouver, lire…</p>
<p>Je cherche désespérément sur Twitter, Facebook, Instagram… comment installer un
blog mais je ne trouve rien. Pas un <em>thread</em>, aucune <em>story</em> sur le sujet.</p>
<p>J'échoue sur un billet de blog.</p>
<p>Le temps des blogs est-il revenu ?</p>
<p><br/></p>
<p><em>Crédit photo par <a href="https://www.deviantart.com/placi1/art/Dsc0066-19-866867834">placi1</a>. Cette <strong>fiction</strong> fait suite à l'actualité de ce
mois de janvier qui voit les comptes de Donald Trump (45<sup>e</sup> président des états-unis) sur les réseaux sociaux suspendus définitivement.</em></p>
Deux coups de ciseauxurn:md5:50548f5b0dd6880d1847629f39fe704d2021-01-11T09:53:00+01:002021-01-11T09:57:54+01:00PiTMoialternativesfamilleutile<p><img src="https://blog.namok.be/public/images/divers/2021/cutting_dawn_by_alltelleringet_da0lold.jpg" alt="cutting_dawn_by_alltelleringet_da0lold.jpg, janv. 2021" style="margin: 0 auto; display: block;" /></p>
<p>Il y a quelques années déjà, j'ai fait une <strong>vasectomie</strong>. Principalement parce
que je trouvais que <em>c'était mon tour</em> de m'occuper de notre contraception.</p>
<p>La contraception féminine — comme je la perçois — est lourde et intrusive.
Habituellement, il faut penser à prendre une pilule bourrée d'hormones tous les
jours où s'introduire quelque chose dans le vagin… probablement diffuseur
d'hormones aussi. Alors, bien sûr, c'est bien pratique lorsque l'on désire avoir
des enfants par la suite<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2021/01/11/deux-coups-de-ciseaux-vasectomie#fn:f1" rel="footnote">1</a></sup> mais dès que l'on est sûr que l'on n'en veut pas
ou plus, je ne vois absolument aucune raison de ne pas faire de vasectomie. Pire
! J'ai des difficultés à comprendre<sup id="fnref:f2"><a href="https://blog.namok.be/?post/2021/01/11/deux-coups-de-ciseaux-vasectomie#fn:f2" rel="footnote">2</a></sup> ceux qui ne franchissent pas le pas.
Pour peu que sa partenaire soit sensible aux hormones, j'en arrive à me dire que
ce n'est pas respectueux de ne pas le faire. Bref, je milite pour que les
copains se <em>coupent les couilles</em>.</p>
<p>À ce sujet, comme l'objet de ce billet est de rassurer un peu et répondre aux
questions que d'aucun se posent… les coups de ciseaux se donnent aux canaux
déférents et rien ne tombe ! Ça se fait en hôpital de jour et en une ½ journée,
c'est plié. <a href="https://fr.wikipedia.org/wiki/Vasectomie">Pour les détails techniques <em>cfr.</em> Wikipedia</a>.</p>
<p>Pour la blague, sachez que ça ne change pas le gout… mais que l'on n'a pas un
plus gros pénis pour autant.</p>
<p>— Ça fait mal ?<br />
— Non. non.<br />
— …<br />
— Oui, un tout petit peu sur le moment juste histoire de serrer un peu les
dents. Pas de quoi crier ou pleurer.</p>
<p>— C'est réversible ?</p>
<p>On peut ligaturer les canaux déférents ou les couper et les cautériser. Chez
moi c'est coupé et dans ce cas, c'est difficilement restaurable mais possible.
Mais comme je suis sûr de ne plus vouloir d'enfants. C'est bon<sup id="fnref:f3"><a href="https://blog.namok.be/?post/2021/01/11/deux-coups-de-ciseaux-vasectomie#fn:f3" rel="footnote">3</a></sup>.</p>
<p>Pour l'anecdote, une fois sur le billard, l'assistante du chirurgien m'a demandé
quelles étaient mes motivations à faire une vasectomie. Ma réponse, « C'est mon
tour ! » l'a surprise alors que c'est aussi simple que ça. Tu ne veux, plus
d'enfants, tu fais une <em>vasectomie</em>. C'est tout. Facile. Pas de questions. Plus
d'emmerdes.</p>
<p>En fait, vous pouvez poser vos questions en commentaires car je suis assez
curieux de savoir quelles questions l'on se pose.</p>
<p><br/></p>
<p><em>Crédit photo par <a href="https://www.deviantart.com/alltelleringet/art/Cutting-Dawn-605673409">alltelleringet</a>. Pour être sûr de ne pas se louper autant
prendre une grande paire de ciseaux !</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Quoiqu'on pourrait « les faire à l'usine » ! <em>Poke</em> <em>Le meilleure des
mondes</em>. <a href="https://blog.namok.be/?post/2021/01/11/deux-coups-de-ciseaux-vasectomie#fnref:f1" rev="footnote">↩</a></p>
</li>
<li id="fn:f2">
<p>Je vous aime quand même hein ! Je sais que vous avez… peur ;-) <a href="https://blog.namok.be/?post/2021/01/11/deux-coups-de-ciseaux-vasectomie#fnref:f2" rev="footnote">↩</a></p>
</li>
<li id="fn:f3">
<p>Si l'on se croise, on pourra discuter du désir d'enfants, de séparation…
Mais c'est trop personnel pour être exposé publiquement ;-) <a href="https://blog.namok.be/?post/2021/01/11/deux-coups-de-ciseaux-vasectomie#fnref:f3" rev="footnote">↩</a></p>
</li>
</ol>
</div>
tmux à l'usage d'un profurn:md5:f155fb22d2c87d3ed06de5e04a0a573a2020-12-03T14:14:00+01:002020-12-03T20:19:43+01:00PiTMes doigts dans le clavieresiinutilelinuxlogiciellibre<p><img src="https://blog.namok.be/public/images/divers/2020/cadres_by_thoum_d2458vb.jpg" alt="cadres_by_thoum_d2458vb.jpg, déc. 2020" style="margin: 0 auto; display: block;" /></p>
<p><a href="https://github.com/tmux/tmux/wiki"><code>tmux</code></a> est un multiplexer de terminal — oui, ce billet est un tout petit
peu technique — permettant d'ouvrir une session sur une machine et de s'en
détacher en laissant la session ouverte (un peu comme <code>screen</code>).</p>
<p>Dans l'usage quotidien<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2020/12/03/tmux-a-l-usage-d-un-prof#fn:f1" rel="footnote">1</a></sup> de ma machine, j'utilise régulièrement un terminal
et j'ai un répertoire par « activité » : un répertoire pour tel cours, un
répertoire pour telle organisation… Un peu comme tout le monde j'imagine excepté
les personnes qui <em>mettent tout sur le bureau</em> !</p>
<p>Lorsque je me consacre à un cours par exemple, je peux être dans le répertoire
du cours pour trouver un énoncé, dans un autre terminal, être dans le répertoire
pour les corrections… j'utilise donc plusieurs terminaux pour un même cours.
Comme je travaille tantôt sur un cours, tantôt sur un autre cours et que j'ai
plusieurs bureaux virtuels, ça devient vite désorganisé.</p>
<p>Pendant tout un temps, je retenais que le premier bureau, c'est pour tel cours,
le second pour un autre, le cinquième pour les navigateurs internet, le sixième
pour la communication instantanée et mail, etc. Depuis quelques temps,
j'utilise <code>tmux</code> pour les terminaux et je conserve cette habitude de laisser
dans mon bureau virtuel 6 le mail et irc et dans le 5, les navigateurs internet.</p>
<p><code>tmux</code> me permet d'ouvrir une session par cours. Dans cette session, je peux
ouvrir plusieurs terminaux. Les intérêts de <code>tmux</code> sont pour moi :</p>
<ul>
<li>la possibilité de pouvoir me détacher et attacher une session. Ce qui me
permet de ne plus être lié à un bureau virtuel pour une activité ;</li>
<li>la possibilité de <em>découper</em> ma fenêtre en plusieurs ;</li>
<li>…</li>
</ul>
<p>Bref, voici mon aide-mémoire de commandes.</p>
<p><code>tmux</code> lance une session (numérotée) mais c'est mieux de directement la nommer
avec l'option <code>-t</code> :</p>
<pre><code class="language-">
tmux new -t <name>
</code></pre>
<p>Pour lister les sessions existantes :</p>
<pre><code class="language-">
tmux ls
</code></pre>
<p>Pour rejoindre — s'attacher à — une session existante :</p>
<pre><code class="language-bash">
tmux a [-t <name>]
tmux a [-t <number>]
</code></pre>
<p>Pour tuer toutes les sessions <code>tmux</code>, il suffit de tuer le serveur. Il est aussi
possible de n'en tuer qu'une par son nom ou son numéro :</p>
<pre><code class="language-">
tmux kill-server
tmux kill-session -t <name>
tmux kill-session -t <number>
</code></pre>
<p>Dès lors que l'on se trouve dans une session <code>tmux</code>, un préfixe défini permet de
lancer une commande. <code>Ctrl-b</code> est le préfixe par défaut. Dans la suite, <em>prefix</em>
signifie chez moi <code>Ctrl-b</code>. Vous pourrez le redéfinir mais pour moi — en bépo —
c'est accessible.</p>
<ul>
<li><em>prefix</em> <code>d</code> se détache de la session courante ;</li>
<li><em>prefix</em> <code>:</code> permet d'écrire une commande <em>tmux</em> ;</li>
<li><em>prefix</em> <code>$</code> (re)nomme la session courante ;</li>
<li><em>prefix</em> <code>)</code> passe une autre session (la suivante « à droite ») ;</li>
<li><em>prefix</em> <code>(</code> passe une autre session (la suivante « à gauche ») ;</li>
<li><em>prefix</em> <code>s</code> liste les sessions (comme <code>tmux ls</code> mais en étant attaché) et
permet de passer d'une session à l'autre ;</li>
</ul>
<h3>Fenêtre</h3>
<p>Une session <code>tmux</code> se compose d'une ou plusieurs fenêtres. Une fenêtre occupe
tout l'écran du terminal.</p>
<ul>
<li><em>prefix</em> <code>,</code> renommer la fenêtre ;</li>
<li><em>prefix</em> <code>c</code> créer une nouvelle fenêtre ;</li>
<li><em>prefix</em> <code>n</code> aller à la fenêtre suivante ;</li>
<li><em>prefix</em> <em>X</em> aller à la fenêtre <em>X</em> ;</li>
<li><em>prefix</em> <code>w</code> liste les fenêtres et permet de les parcourir et d'en choisir
une ;</li>
<li><em>prefix</em> <code>esperluette</code> supprime la fenêtre courante (et tous ses panels) ;</li>
</ul>
<h3>Panels</h3>
<p>Une fenêtre peut être découpée en <em>morceaux</em> / carrés / <em>panels</em>.</p>
<ul>
<li><em>prefix</em> <code>%</code> scinde le panel en deux verticalement ;</li>
<li><em>prefix</em> <code>=</code> scinde le panel en deux horizontalement (par défaut c'est <code>"</code>
mais j'ai changé) ;</li>
<li><em>prefix</em> <em>flèche</em> passe d'un panel à l'autre dans la direction de la flèche ;</li>
<li><em>prefix</em> <code>Ctrl-</code><em>flèche</em> redimensionne le panel courant dans le sens de la
flèche ;</li>
<li><em>prefix</em> <code>o</code> échange les panels ;</li>
<li><em>prefix</em> <code>;</code> retourne au dernier panel ;</li>
<li><em>prefix</em> <code>x</code> supprime le panel courant</li>
</ul>
<p>Il est possible d'exécuter les mêmes actions dans tous les panels en même temps.
Pour ce faire, entrer la commande <code>:setw synchronize-panes on</code> (et <code>off</code> quand
c'est terminé).</p>
<p>Ensuite, on s'amuse à écrire un fichier de configuration en fonction des
habitudes que l'on a. Le <a href="https://github.com/Pinkilla/dotfiles">mien se trouve là</a>.</p>
<ul>
<li>quand je ferme un <em>pane</em> ou une fenêtre, je n'ai pas besoin de confirmer ;</li>
</ul>
<pre><code class="language-">
# kill pane without confirm
bind-key x kill-pane
# new window in some directory
bind-key c new-window -c "#{pane_current_path}"
</code></pre>
<ul>
<li>je redéfinis le <em>split</em> horizontal en demandant d'ouvrir le nouveau panel dans
le répertoire courant ;</li>
</ul>
<pre><code class="language-">
# split window verticaly and horizontaly
bind-key = split-window -v -c "#{pane_current_path}"
bind-key % split-window -h -c "#{pane_current_path}"
</code></pre>
<ul>
<li>j'augmente la taille du buffer pour l'historique ;</li>
</ul>
<pre><code class="language-">
# big history (default is 2000)
set -g history-limit 5000
</code></pre>
<p>Voilà, pour le reste, nous verrons à l'usage…</p>
<p><br/></p>
<p><em>Crédit photo chez DeviantArt par <a href="https://www.deviantart.com/thoum/art/Cadres-127895591">Thoum</a></em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Je sais que le mot est un peu tombé en désuétude au profit de
<em>journalier</em>… que je trouve beaucoup moins joli. Oui les mots peuvent être
beaux. <a href="https://blog.namok.be/?post/2020/12/03/tmux-a-l-usage-d-un-prof#fnref:f1" rev="footnote">↩</a></p>
</li>
</ol>
</div>
Des résultats médiocresurn:md5:2c548411e5fddc133ee45c5ca8ab39422020-06-14T15:27:00+02:002020-06-14T14:32:17+02:00PiTMoialternativesbienveillanceinutile<p><img src="https://blog.namok.be/public/images/divers/2020/gratisography-141H-1200x.jpg" alt="gratisography-141H-1200x.jpg, juin 2020" style="margin: 0 auto; display: block;" /></p>
<blockquote>
<p><strong>Médiocrité, n.f.</strong></p>
<p>XIVe siècle. Emprunté du latin <em>mediocritas</em>, « état moyen, juste milieu ».</p>
<ol>
<li><p>Caractère de ce qui est médiocre, moyen, de ce qui tient le milieu entre
deux extrêmes. La médiocrité de son rang, de sa fortune.
Absolument. Vivre dans la médiocrité, dans un état de fortune qui tient le
milieu entre la richesse et la pauvreté.</p></li>
<li><p>Par extension et péjoratif, insuffisance en ce qui regarde l'esprit, le
mérite, le cœur.
Cet homme est d'une grande médiocrité. En parlant de la
valeur morale ou intellectuelle d'un ouvrage de l'esprit. Ce livre, ce
tableau est d'une rare médiocrité.</p></li>
</ol>
<p><a href="https://www.cnrtl.fr/definition/academie9/m%C3%A9diocrit%C3%A9">Académie 9<sup>e</sup> édition</a></p>
</blockquote>
<p>Commençons pas les définitions de l'académie 9<sup>e</sup> édition qui nous montre que le
mot « <strong>médiocrité</strong> » se définit par ce qui est moyen, juste au milieu avant de
montrer sa définition péjorative sans doute plus connue. L'usage du mot médiocre
n'est donc pas nécessairement irrespectueuse ou négative.</p>
<p>Pour beaucoup de choses, <strong>je suis médiocre</strong> et je m'en accommode. Pourtant
j'aimerais être un peu plus heureux, gagner un peu plus d'argent, être un peu
plus intelligent, avoir ce don là et peut-être celui-là aussi… Je suis médiocre
parce que j'ai ces limites qui m'empêchent de faire mieux. Je ne suis pas
médiocre par paresse ou parce que c'est ce que je vise. Mon objectif de vie
n'est pas d'être médiocre.</p>
<p>D'après le <a href="https://www.cnrtl.fr/definition/m%C3%A9diocrit%C3%A9">centre national de ressources textuelles et lexicales</a>, le
premier sens est vieux et littéraire. Aujourd'hui par contre, ce qui est
médiocre est <em>en-dessous de la moyenne</em>, montre une <em>insuffisance</em> en quantité,
en qualité, en valeur ou encore en intensité. Il montre un manque de talents,
d'aptitudes, de capacités, de résultats. C'est plat. C'est pauvre. Peu
important. <a href="https://fr.wiktionary.org/wiki/m%C3%A9diocrit%C3%A9">Peu digne d'être remarqué</a>.</p>
<p>Ce second sens pour moi est aussi une affaire d'<strong>intention</strong>. </p>
<p>— Avant d'agir, quel est ton objectif ? Quel résultat vises-tu ?</p>
<p>La médiocrité prend ce second sens — son sens un peu plus péjoratif — lorsque je
décide d'emblée de m'en satisfaire. Lorsque je ne cherche pas à faire de mon
mieux et que je vise le « c'est juste assez », « ça suffira ». Mon propos n'est
pas de faire ici une campagne passéiste sur le sens de l'effort et sur
l'excellence — à ne pas confondre avec le perfectionnisme — mais de simplement
rappeler la satisfaction du travail bien fait.</p>
<p><strong>Je ne suis pas médiocre</strong>. Je le sais parce que je fais de mon mieux, je
m'applique à obtenir un bon résultat. Parfois le résultat est en dessous de
la moyenne et je sais que ce mauvais résultat ne signifie pas que je <em>suis</em>
médiocre. Je l'accepte, je recommence ou je fais autre chose avec mes autres qualités.</p>
<p>Je vous invite à ne pas faire de la médiocrité le leitmotiv de votre vie mais de
faire de votre mieux. Toujours. En acceptant avec humilité que parfois, le
résultat n'est pas à la hauteur de vos attentes.</p>
<p><br/></p>
<p><em>Crédit photo chez <a href="https://gratisography.com/photo/retro-athlete/">Gratisograpfy</a>.</em></p>
Commento pour gérer les commentairesurn:md5:3c06dcb80dd3bafeb728c2ea81b089592020-06-08T22:09:00+02:002020-06-08T21:26:57+02:00PiTMes doigts dans le clavieralternativesblogdebiandisqusinutilelogiciellibre<p><img src="https://blog.namok.be/public/images/divers/2020/grue-arcenciel-20200605-cut.jpg" alt="grue-arcenciel-20200605-cut.jpg, juin 2020" style="margin: 0 auto; display: block;" /></p>
<p>Une fois tous les 10 ans, je repasse sur le système de commentaires disponible
sur mon blog (non, un blog, ce n'est pas <em>hasbeen</em>).</p>
<p>Au début, j'utilisais le système de commentaires de <a href="//dotclear.org">Dotclear</a> que j'ai
abandonné pour mauvaise gestion des spams et pour suivre la mode de <a href="//disqus.com">Disqus</a>.
Depuis, <a href="https://open-time.net/tag/antispam">Frank a fait pas mal de boulot pour la gestion des
spams</a> mais le mal était fait. <a href="//example.org/blog/?post/2013/01/02/disqus-pour-les-commentaires">J'ai
installé Disqus</a> qui a deux défauts assez importants : c'est
propriétaire et centralisé. Disqus est même doublement centralisé : il n'y a
« qu'un seul » serveur et tous les commentaires que fait un utilisateur ou une
utilisatrice se retrouvent au même endroit. Il est donc assez facile de savoir
que j'ai commenté <em>example.com</em>, le site du boulot et <em>example.org</em>, le site de
pétanque du village. C'est (encore) plus facile pour profiler<sup id="fnref:f1"><a href="https://blog.namok.be/?post/2020/06/08/commento#fn:f1" rel="footnote">1</a></sup>.</p>
<p>Ensuite, comme quasi personnes ne commentent sur mon blog, j'ai désactivé les
commentaires et personne ne s'est plaint. C'est dire ;-)</p>
<p><em>Il pleut.</em></p>
<p>Je décide donc d'installer <a href="//commento.io"><strong>Commento</strong></a>. C'est la version <em>logiciel
libre</em> de Disqus. Il est possible de souscrire un hébergement chez eux ou de
l'installer. Je l'installe. Vous me direz ce que vous en pensez.</p>
<p>Je suis <em>grosso-merdo</em> la <a href="//docs.commento.io/installation/self-hosting/on-your-server/release-binaries.html">documentation
officielle</a>
qui m'a posé quelques soucis. Voici la procédure .</p>
<p>Le site a besoin de <strong>PostgreSQL</strong>.</p>
<pre><code class="sh">
# apt install postgresql
</code></pre>
<p>C'est une bonne pratique de créer un utilisateur spécifique pour l'application,
je crée donc un utilisateur <code>commento</code> qui aura les droits qui vont bien — et
pas plus — sur la base de données (BD) :</p>
<pre><code class="sh">
# sudo -u postgres psql
postgres=# create database commento;
CREATE DATABASE
postgres=# create role commento;
CREATE ROLE
postgres=# alter role commento with login;
ALTER ROLE
postgres=# \password commento
</code></pre>
<p><a href="https://docs.commento.io/getting-started/self-hosting/releases.html">Je télécharge
Commento</a>
et commence l'installation.</p>
<ol>
<li><p>désarchiver dans <code>/opt/commento</code><sup id="fnref:f2"><a href="https://blog.namok.be/?post/2020/06/08/commento#fn:f2" rel="footnote">2</a></sup></p></li>
<li><p>l'idée du logiciel est d'utiliser les variables d'environnement pour le
configurer, je décide d'écrire un script qui positionnera les variables
d'environnement et qui lancera le service.</p>
<p>C'est un service qui tourne sur un certain port. Il faudra donc un serveur
web et un <em>virtual host</em>.</p>
<pre><code class="sh">
root@momos:~# cat /opt/commento.sh
#!/bin/bash
export COMMENTO_ORIGIN=https://commento.example.org
export COMMENTO_PORT=8081
export COMMENTO_POSTGRES=postgres://commento:secret@localhost:5432
/commento?sslmode=disable
export COMMENTO_CDN_PREFIX=$COMMENTO_ORIGIN
export COMMENTO_SMTP_HOST=relay.example.org
export COMMENTO_SMTP_PORT=25
export COMMENTO_SMTP_FROM_ADDRESS=commento@example.org
export COMMENTO_FORBID_NEW_OWNERS=true
/opt/commento/commento &
</code></pre>
<p><br/></p></li>
<li><p>mise en place d'un virtual host pour que le service réponde à l'adresse
<code>commento.example.org</code>. (J'utilise <code>dehydrated</code> pour la gestion du certificat
SSL avec <em>LetsEncrypt</em>.)</p>
<pre><code class="apache">
<VirtualHost *:80\>
ServerName http://commento.example.org
ServerAdmin webmaster@example.org
ProxyRequests Off
ProxyPass / http://127.0.0.1:8081/
ProxyPassReverse / http://commento.example.org:8081/
# Dehydrated
Alias /.well-known/acme-challenge
/var/lib/dehydrated/acme-challenges
<Directory /var/lib/dehydrated/acme-challenges>
Options None
AllowOverride None
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/
commento.example.org-error.log
CustomLog ${APACHE_LOG_DIR}/
commento.example.org-access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName https://commento.example.org
ServerAdmin webmaster@example.org
ProxyRequests Off
ProxyPass / http://127.0.0.1:8081/
ProxyPassReverse / https://commento.example.org:8081/
SSLEngine on
SSLCertificateFile /var/lib/dehydrated/certs/
commento.example.org/fullchain.pem
SSLCertificateKeyFile /var/lib/dehydrated/certs/
commento.example.org/privkey.pem
# Dehydrated
Alias /.well-known/acme-challenge
/var/lib/dehydrated/acme-challenges
<Directory /var/lib/dehydrated/acme-challenges>
Options None
AllowOverride None
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
</Directory>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/
commento.example.org-error.log
CustomLog ${APACHE_LOG_DIR}/
commento.example.org-access.log combined
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
</code></pre>
<p><br/></p></li>
<li><p>pour terminer, ce serait bien que <code>systemd</code> se charge du service.</p>
<pre><code class="sh">
# cat /lib/systemd/system/commento.service
[Unit]
Description=Commento daemon service
After=multi-user.target
[Service]
User=commento
Type=forking
WorkingDirectory=/tmp
ExecStart=/opt/commento.sh
[Install]
WantedBy=multi-user.target
</code></pre></li>
</ol>
<p>Et tout roule. Vous pouvez laisser un commentaire. Normalement ;-)</p>
<p><br/></p>
<p><em>Crédit photo perso. Hier une grue et un arc-en-ciel devant la maison.</em></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:f1">
<p>Choisis un <a href="https://disqus.com/by/meenuspeenus/comments/">un profil au
hasard</a> et observe. On peut voir
les sites sur lesquels le profil commente régulièrement et ce qu'il y dit. <a href="https://blog.namok.be/?post/2020/06/08/commento#fnref:f1" rev="footnote">↩</a></p>
</li>
<li id="fn:f2">
<p>En fait, je désarchive dans <code>/opt/commento-1.8.0</code> et je fais un lien soft
<code>commento</code>. <a href="https://blog.namok.be/?post/2020/06/08/commento#fnref:f2" rev="footnote">↩</a></p>
</li>
</ol>
</div>
Monitoring Moodle : script pour telegraf et dashboard pour Grafanaurn:md5:72e385aed047331a76549a8b1f70fb682020-06-07T16:21:00+02:002020-10-07T07:50:08+02:00PiTMes doigts dans le clavierdebianenseignementesigeeklogiciellibremoodle<p><img src="https://blog.namok.be/public/images/divers/2020/xiaolong-wong-9gpERFdyDW4-unsplash-1200x.jpg" alt="xiaolong-wong-9gpERFdyDW4-unsplash-1200x.jpg, juin 2020" style="margin: 0 auto; display: block;" /></p>
<p>Pour monitorer la machine et le service de <em>elearning</em> <strong>Moodle</strong>, il existe
moult manières de faire. L'une d'entre elles est d'utiliser la pile
<strong>telegraf-InfluxDB-Grafana</strong> :</p>
<ul>
<li><em>telegraf</em> pour la récolte d'informations sur la machine faisant tourner
<em>moodle</em> ;</li>
<li><em>InfluxDB</em> pour stocker ses informations et ;</li>
<li><em>Grafana</em> pour l'aspect visuel et les beaux graphiques. </li>
</ul>
<p><a href="https://blog.namok.be/public/images/divers/2020/Firefox_Screenshot_2020-06-07T08-56-27.765Z.png" title="Firefox_Screenshot_2020-06-07T08-56-27.765Z.png, juin 2020"><img src="https://blog.namok.be/public/images/divers/2020/.Firefox_Screenshot_2020-06-07T08-56-27.765Z_m.png" alt="Firefox_Screenshot_2020-06-07T08-56-27.765Z.png, juin 2020" style="margin: 0 auto; display: block;" /></a></p>
<p><a href="https://blog.namok.be/public/images/divers/2020/Firefox_Screenshot_2020-06-07T09-01-08.267Z.png" title="Firefox_Screenshot_2020-06-07T09-01-08.267Z.png, juin 2020"><img src="https://blog.namok.be/public/images/divers/2020/.Firefox_Screenshot_2020-06-07T09-01-08.267Z_m.png" alt="Firefox_Screenshot_2020-06-07T09-01-08.267Z.png, juin 2020" style="margin: 0 auto; display: block;" /></a></p>
<p>L'objet de cet article est <em>l'affichage du nombre d'utilisateurs et
d'utilisatrices connectées</em> à la plateforme et, en cadeau, le <em>dashboard</em> que
j'utilise pour <em>Moodle / PostgreSQL</em>.</p>
<h3>Aller chercher le nombre d'utilisateurs et utilisatrices connectées et remplir la BD</h3>
<p>À ma connaissance, il n'y a pas de moyen d'obtenir le nombre de personnes
connectées au temps <em>t</em> mais bien entre le temps <em>t1</em> et <em>t2</em>. Comme je n'ai pas
trouvé évident d'utiliser l'API pour ce faire, suivant <a href="https://moodle.org/mod/forum/discuss.php?d=404772">un conseil sur le forum
Moodle</a>, j'ai choisi d'aller chercher l'info dans la base de données
(BD).</p>
<p>C'est dans la table <code>mdl_user</code> que se trouvent les informations de connections.
Il suffit de compter les personnes qui se sont connectées « avant maintenant »
et « après maintenant moins un peu de temps ».</p>
<p>Un script <code>bash</code> pourrait ressembler à :</p>
<pre><code class="sh">
$ cat moodleusers.sh
#!/bin/bash
timestamp_now=$(date --utc +"%s")
timestamp_start=$(($timestamp_now - 60))
QUERY="SELECT COUNT(*) FROM mdl_user
WHERE deleted=0 AND lastaccess > "${timestamp_start}"
AND lastaccess < "${timestamp_now}" ;"
RESULT=$(psql -d 'moodle' -c "${QUERY}" 2>/dev/null)
RESULT_CUT=$(echo $RESULT | cut -d ' ' -f 3)
echo "nUsersMoodle nUsersMoodle=${RESULT_CUT}"
</code></pre>
<ul>
<li>les <em>timestamps</em> sont donnés en GMT ;</li>
<li>le script affiche le résultat qui sera compréhensible par <em>InfluxDB</em></li>
<li>je ne suis pas parvenu à obtenir le résultat dans une seule variable (je ne
suis pas assez bon avec <em>bash</em>). j'ai donc fait <em>RESULT</em> puis <em>RESULT_CUT</em>.</li>
</ul>
<p>C'est <em>telegraf</em> qui va lancer le script. C'est donc l'utilisateur <code>telegraf</code>
qui devra avoir les droits de lecture dans la BD pour la table <code>mdl_user</code>. Ce
qui peut se faire comme suit :</p>
<pre><code class="sh">
# sudo -u postgres psql -d moodle
moodle =# create role telegraf
moodle =# alter role telegraf with login
moodle =# grant telegraf to moodle
moodle =# grant select on mdl_user to telegraf
</code></pre>
<p>Après vérification que le script est bien fonctionnel et que l'utilisateur
<code>telegraf</code> peut le lancer, il reste à l'ajouter à <code>telegraf</code> comme suit :</p>
<pre><code class="sh">
# vim /etc/telegraf/telegraf.conf
[[inputs.exec]]
# ## Commands array
commands = [
"/elsewhere/moodleusers.sh"
]
# ## Timeout for each command to complete.
timeout = "5s"
data_format = "influx"
interval = "60s"
</code></pre>
<ul>
<li>demander à <em>telegraf</em> de recharger son fichier de conf ;</li>
<li>vérifier que tout fonctionne bien ;</li>
<li>attendre un peu que la BD InfluxDB se remplisse. </li>
</ul>
<h3>Faire de beaux graphes</h3>
<p>Il reste à récupérer cette information via <em>Grafana</em> et l'inclure dans son
<em>dashboard</em>. J'en ai profité pour proposer <a href="https://grafana.com/grafana/dashboards/12418">un dashboard Moodle with
postgres</a>.</p>
<p>Nous verrons à l'usage, s'il est fonctionnel.</p>
<p>Je suis preneur de tous vos retours et corrections.
<em>Enjoy !</em></p>
<p><br/></p>
<p><em>Crédit photo par <a href="https://unsplash.com/photos/9gpERFdyDW4">Xiaolong Wong</a> chez Unsplash. Une orange bien découpée
fait un beau camembert.</em></p>
Pictogramme, au plus simple au mieuxurn:md5:185fee43643443dd69ff2252ed7067382020-05-13T16:03:00+02:002020-05-13T15:09:28+02:00PiTMoialternativesinutile<p><img src="https://blog.namok.be/public/images/divers/2020/where_is_the_toilette___by_recycleit_dr4uwn.jpg" alt="where_is_the_toilette___by_recycleit_dr4uwn.jpg, mai 2020" style="margin: 0 auto; display: block;" /></p>
<p>Parlons un peu pictogrammes et communication visuelle.</p>
<p>Hier <a href="https://www.rtbf.be/info/monde/detail_geneve-feminise-ses-panneaux-de-circulation?id=10411542">il s'agissait de féminiser les pictogrammes dans la ville de Genève</a>
qui est pour moi (aussi) une <a href="http://sexes.blogs.liberation.fr/2020/01/20/faut-il-tomber-dans-le-panneau/">fausse bonne idée</a> et aujourd'hui
apparaissent des pictogrammes montrant qu'<a href="https://graphism.fr/coronavirus-et-deconfinement-vers-un-design-de-lautorite/">il faut porter un masque</a>.</p>
<p>Un pictogramme doit être le plus simple possible pour qu'il soit lisible et
compréhensible.</p>
<blockquote>
<p>Dans mon éducation au design, j’ai appris que pour faire un bon design, il
faut retirer, retirer, retirer… et c’est quand il n’y a plus rien à retirer ni
à ajouter qu’on arrive à un bon design.</p>
<p><a href="https://graphism.fr/coronavirus-et-deconfinement-vers-un-design-de-lautorite/">Geoffrey Dorne</a></p>
</blockquote>
<p>En ce sens, il n'y a aucune raison de féminiser, « colorer » au sens <em>raciser</em>,
proposer un <em>picto</em> pour « gros » et un pour « maigres », pour « petits » et
pour « grands »… Si un pictogramme doit représenter une personne, le plus
simple, c'est de représenter un tronc, une tête, des bras et des jambes. Le tout
sans forme. Pour une tête, un rond suffit. J'aime donc beaucoup le <em>picto</em>
proposé par la <em>sncf</em> pour représenter une personne portant un masque :</p>
<ul>
<li>un rond pour la tête sans s'embarrasser de cheveux longs ou courts ou <em>coupe
mulet</em> ni de nez long, court ou « crochu avec un gros bouton »;</li>
<li>une forme avec élastique pour le masque;</li>
<li>c'est tout.</li>
</ul>
<p><img src="https://blog.namok.be/public/images/divers/2020/picto-masque-sncf.png" alt="picto-masque-sncf.png, mai 2020" style="margin: 0 auto; display: block;" /></p>
<p>Le seul point difficile pour moi dans la communication avec pictogrammes est
lorsqu'il <em>faut</em> différencier le genre ou le sexe.</p>
<p><strong>Différencier le genre ou le sexe ?</strong></p>
<p>Comme je le comprends, <a href="https://www.who.int/gender/whatisgender/fr/">le sexe se réfère plus aux caractéristiques biologiques
et physiologiques qui différencient les hommes et les femmes tandis que le genre
évoque plutôt le rôle que l'on associe généralement à un sexe</a>.
L'excellente question du jour pour penser à autre chose qu'au coronavirus sera :</p>
<blockquote>
<p>Veux-tu faire une différence homme/femme (le sexe) ou masculin/féminin (le
genre) ?<br />
Dans l'affirmative, quel pictogramme utiliser ?</p>
</blockquote>
<p>Prenons l'<strong>exemple des toilettes</strong>.<br />
<em>Préalable : je suis un ardent défenseur des toilettes mixtes.</em></p>
<p>Quelles sont les raisons que l'on pourrait avancer pour
proposer des toilettes hommes/femmes ou masculines/féminines ? Lesquelles vous
semblent défendables ?</p>
<p>Il faut différencier les toilettes hommes/femmes parce que l'odeur et les bruits
sont différents, les femmes sont plus propres, les femmes ont besoin d'une
poubelle, la présence d'urinoirs est gênante ? Ou bien, il est nécessaire
d'avoir des toilettes masculines/féminines parce qu'il est socialement accepté
que les hommes sont sales et que les femmes se maquillent… d'ailleurs, elles
ch…nt des paillettes.</p>
<p><a href="https://blog.namok.be/public/images/divers/2020/picto-hf.png" title="picto-hf.png, mai 2020"><img src="https://blog.namok.be/public/images/divers/2020/.picto-hf_s.png" alt="picto-hf.png, mai 2020" style="float: right; margin: 0 0 1em 1em;" /></a></p>
<p>Je ne trouve définitivement aucune raison défendable.</p>
<p>Si vraiment tu insistes, tes pictogrammes différenciant le sexe pourraient
être comme çi-contre. Par contre, si tu t'obstines à vouloir différencier le
genre, n'hésite pas et vas-y à grands coups de robe et de cravate voire de rose
et de bleu.</p>
<p><br/></p>
<p><em>Crédit photo chez DeviantArt par <a href="https://www.deviantart.com/recycleit/art/Where-is-the-toilette-45576311">recycleit</a> pour l'illustration de l'article. La photo « sncf » provient de l'article de <a href="https://graphism.fr/coronavirus-et-deconfinement-vers-un-design-de-lautorite/">Geoffrey Dorne</a> et le super-picto est de moi.</em></p>