subversion svn banner

MacOS : Subversion (SVN) ne répond plus

Aujourd’hui, je mets à jour un de mes plugins WordPress sur le dépôt officiel et subversion ne répond plus sous MacOS:

svn stat
-bash: svn: command not found

Ah tiens, il y avait longtemps. Cela doit être dû à une des mises à jour Mac ou alors d’homebrew.

Installer Subversion avec homebrew

On installe donc subversion avec homebrew:

brew install subversion

Une fois subversion installé, je relance la commande:

svn stat
-bash: svn: command not found

Oh! Je le réinstalle une nouvelle fois. Nouveau message d’erreur:

svn stat
dyld[62247]: Symbol not found: _apr_crypto_block_cleanup
  Referenced from: /usr/local/Cellar/subversion/1.14.2/lib/libsvn_subr-1.0.dylib
  Expected in: /usr/lib/libaprutil-1.0.dylib
Abort trap: 6

La solution de cette erreur est toute simple, il faut réinstaller le paquet apr-util :

brew reinstall apr-util

Résultat:

==> Downloading https://ghcr.io/v2/homebrew/core/apr-util/manifests/1.6.1_3
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/apr-util/blobs/sha256:4459e0d3d15a973db35fb64b1da85d2185afc41e77d2989186db5574d3c75234
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:4459e0d3d15a973db35fb64b1da85d2185afc41e77d2989186db
######################################################################## 100.0%
==> Reinstalling apr-util
==> Pouring apr-util--1.6.1_3.monterey.bottle.tar.gz
🍺  /usr/local/Cellar/apr-util/1.6.1_3: 54 files, 851.6KB
==> Running `brew cleanup apr-util`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

Si l’on relance de nouveau notre commande svn, tout fonctionne:

svn stat
M       trunk/better-comments.php
M       trunk/changelog.txt
M       trunk/composer.lock
M       trunk/includes/options.php
M       trunk/readme.txt
M       trunk/vendor/composer/ClassLoader.php

Et voilà, problème réglé – subversion est de nouveau opérationnel.

ubuntu 2204 jammy jellyfish

Serveur: migration d’Ubuntu 20.04 à 22.04 LTS

Aujourd’hui, nous mettons le serveur à jour et passons d’Ubuntu Server 20.04 (Focal Fossa) à la version 22.04 LTS (Jammy Jellyfish).

Chaque nouvelle mise à jour d’Ubuntu en version LTS (Long Time Support) permet de bénéficier des mises à jour de sécurité et de maintenance pendant 5 ans, c’est à dire jusqu’en 2027 pour la version Jammy Jellyfish.

Lecture des changements apportés

Je vous conseille fortement de lire le changelog de la version 22.04 pour avoir un aperçu des changements apportés au niveau du kernel, openSSL, certains services.

Sont maintenant disponibles:

  • Apache 2.4.52
  • BIND 9.18
  • Linux kernel v5.15.0-25
  • MySQL 8.0.28
  • NetworkManager 1.36
  • nftables est le backend par défaut pour le parefeu
  • Perl v5.34.0
  • PHP 8.1.2
  • PostgreSQL 14.2
  • Python 3.10.4
  • Ruby 3.0
  • ssh-rsa est maintenant désactivé par défaut dans OpenSSH.

Cela donne aussi une idée des potentielles complications qui pourraient subvenir à la suite de la mise à jour, ainsi que leur remédiation.

Sauvegarde des données du serveur

Je ne vous apprends rien : il va falloir sauvegarder les données importantes du serveur avant de commencer la mise à jour de l’OS.

Pensez-donc au dossier /home et /var/www mais aussi aux fichiers de configuration dans /etc et /root.

Vérification des pré-requis

Vérification de la version actuelle

On vérifie notre noyau actuel:

uname -mrs

> Linux 5.4.0-109-generic x86_64

On vérifie notre version actuelle:

lsb_release -a


No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.4 LTS
Release:	20.04
Codename:	focal

Mise à jour des paquets de la version actuelle

On met à jour la version actuelle avec les derniers paquets et les derniers noyaux:

apt update && apt upgrade

Redémarrage du serveur

On redémarre le serveur pour appliquer les changements et partir sur une base propre:

shutdown -r now

Lire la suite

bac oral epreuve de specialite llcer anglais

Bac : épreuve orale de spécialité LLCER Anglais

Nature de l’épreuve orale de LLCER Anglais au bac

La partie orale de l’épreuve de spécialité compte pour 50% de la note finale et se tient en mars (en mai pour la session 2022). L’épreuve dure 20 minutes, sans temps de préparation.

Le support autorisé est le « dossier personnel présenté par le candidat et visé par son professeur de l’année de terminale ». Le dossier n’est pas évalué, il sert d’appui à la prise de parole.

Le candidat remet un exemplaire de son dossier à l’examinateur au début de sa prise de parole et en conserve un qu’il utilise selon ses besoins durant l’évaluation.

Le candidat présente son dossier dans la langue cible pendant 10 minutes au plus pour en justifier les choix et en exprimer la logique interne, puis interagit avec l’examinateur dans la langue cible pendant 10 minutes.

Rappel de la structure de l’épreuve orale :

  • Expression Orale en Continu (EOC) : présentation du dossier et de sa logique interne (maximum 10 minutes)
  • Expression Orale en Interaction (EOI) : interaction avec l’examinateur (maximum 10 minutes)

Le niveau attendu est B2/C1 (C1 pour LLCER anglais, monde contemporain).

Si le candidat ne présente pas de dossier, l’examinateur lui remet trois documents de natures différentes en lien avec une des thématiques du programme de première. Le candidat commente ces documents.

Le portfolio pour l’épreuve de LLCER Anglais du bac

Le dossier à présenter doit être construit en lien avec une ou plusieurs des thématiques des programmes de première et de terminale.

Il ne s’agit pas simplement de présenter les documents les uns après les autres, il faut les relier par une problématique.

Afin de formuler la problématique, vous devez prendre appui sur vos connaissances. Votre problématique évoluera au fur et mesure de la constitution du dossier.

Attention, le nombre de documents a changé depuis le BO du 13 juillet 2021, il faut maintenant 4 à 6 documents en Anglais LLCER (ce changement ne concerne pas Anglais Monde Contemporain).

Lire la suite

Group photo of all devs at Cloudfest Hackathon 2022

Le Hackathon du CloudFest 2022

Cette année, j’ai eu la chance et le grand honneur d’être invité au CloudFest 2022 pour le hackathon: 3 jours de code sur un projet web en mode open-source pour faire avancer les choses.

Le Cloudfest

Le Cloudfest est une convention de développeurs et d’acteurs du web qui peuvent être extrêmement variés: cela va des hébergeurs web aux plateformes comme Codeable mais aussi avec de gros acteurs comme Airbus, Intel, Automattic, HP, Cpanel, Plesk…

Les conférences sont très variées: intelligence artificielle, business… et il est très facile de rencontrer des gens très connus sur le web pour se faire un réseau.

Le Cloudfest se tient à Rust, en Allemagne, à l’Europa Park.

Le Hackathon

Cette année le hackathon proposait plusieurs projets mais j’ai opté pour travailler sur wp-cli pour ajouter une nouvelle commande qui permettre de sécuriser 80% des attaques contre les instances WordPress, en appliquant simplement les meilleures pratiques de sécurité courantes.

Les devs du Hackathon 2022
Les devs du Hackathon 2022

Concrètement, nous avons identifié les problèmes de sécurité courants et nous avons développé une extension de l’interface de ligne de commande WordPress (wp-cli) pour offrir une alternative sécurisée et facile à utiliser aux plugins de sécurité WordPress généralement non sécurisés.

Avec la simple commande wp secure all, les meilleures pratiques courantes sont appliquées automatiquement à votre instance WordPress, et en moins de 60 secondes, vous attenuez la grande majorité des vecteurs d’attaque WordPress actuels : permissions de fichiers et de dossiers, entêtes de sécurité, bloquer l’accès aux fichiers sensibles…

Lire la suite

retrouver son nas synology

Retrouver son NAS Synology sur le réseau local

Aujourd’hui, j’ai rebranché mon vieux Synology DS212, pour récupérer des fichiers dont les liens avaient expirés sur Internet et que je voulais remettre en ligne sur mon article Sons of Anarchy Wallpapers.

Le DS212 a été configuré du temps de la Freebox Révolution, qui gère les adresses IP locales depuis 192.168.0.x. Le problème est qu’aujourd’hui, avec la Freebox Pop, les adresses sont en 192.168.1.x.

Résultat: le DS212 est inaccessible car son DHCP a été configuré manuellement: il possède l’IP 192.168.0.12 alors que sur le réseau, ce devrait être 192.168.1.12. Impossible de le joindre donc.

Voici comment retrouver son NAS Synology sur le réseau local et changer son IP dans le DHCP de DSM, sans y avoir accès.

Trouver son Synology

Vous pouvez facilement trouver vos Synology depuis votre navigateur à l’adresse find.synology.com

Trouver son NAS Synology avec l'assistant web
Trouver son NAS Synology avec l’assistant web

Si l’IP du DHCP du NAS avait été correcte, j’aurais pu me connecter sans problème avec le bouton Connecter, mais ce n’est pas le cas.

Utiliser Synology Assistant pour changer les paramètres réseau du Synology

La solution est toute simple: nous devons utiliser l’utilitaire Synology Assistant, à installer sur votre machine, pour éditer la configuration réseau du Synology et lui assigner la bonne adresse IP.

Lire la suite

tableau vert à craies

Éducation Nationale : le NUMEN en détail

Le NUMEN (NUMéro d’identification Éducation Nationale) est un identifiant associé à tout employé de la fonction publique dépendant du Ministère de l’Éducation nationale française (enseignants, inspecteurs, administration, services, etc.).

Le NUMEN a été créé durant le mandat de René Monory en tant que Ministre de l’Éducation nationale (1986 – 1988).

Il a été utilisé comme identifiant principal dans les fichiers de gestion interne en 1992, à la suite de l’action entreprise par la CNIL pour dissuader les administrations de recourir au NIR ou convaincre celles qui l’utilisaient sans y être autorisées de se doter d’un numéro spécifique.

Obtenir son NUMEN

Si vous ne connaissez pas votre Numen, adressez-vous au secrétariat de votre établissement, ou à votre service gestionnaire, seuls habilités à vous le transmettre.[

Structure du NUMEN

Chaque NUMEN se compose de 13 caractères, toujours en majuscules, qui ont tous une signification.

Voici le NUMEN fictif que nous allons utiliser et découper en quatre blocs distincts : « 17 E 05 01234ABC ».

  1. « 17 » : les deux premiers caractères représentent un code géographique caractérisant l’académie d’immatriculation : la numérotation va de 01 à 33 – mais notez le 26 et 33 n’existent plus, à la suite de plusieurs modifications.
01 Paris02 Aix-Marseille03 Besançon04 Bordeaux05 Caen
06 Clermont-Ferrand07 Dijon08 Grenoble09 Lille10 Lyon
11 Montpellier12 Nancy-Metz13 Poitiers14 Rennes15 Strasbourg
16 Toulouse17 Nantes18 Orléans-Tours19 Reims20 Amiens
21 Rouen22 Limoges23 Nice24 Créteil25 Versailles
27 Corse28 Réunion29 Détachés (TOM)31 Martinique32 Guadeloupe
33 Guyane43 Mayotte
Liste des codes des académies

2. « E » : une lettre caractérisant le système d’information:

  • G pour le premier degré,
  • E pour le second degré public (collège, lycée, enseignant(e), AESH…)
  • P pour le second degré privé,
  • A pour les agents administratifs, gestion par Agora
  • B pour les bibliothécaires
  • S pour les universitaires
  • N : gestion par SIRHEN
  • I : gestion par Imag’in
  • K : KHEOPS
  • : ITRF

3. « 05 » : année du 1er recrutement, sur les deux derniers chiffres (ici 2005 donc). Tous les personnels recrutés avant 1992 ont obligatoirement 92 comme année de recrutement (le NUMEN date de 1992).

4. « 01234ABC » : suite alphanumérique aléatoire de 8 caractères, dont cinq chiffres et trois lettres, attribué à l’agent au sein de son système de gestion initial, pour générer un code-identifiant unique et individuel à chaque personnel.

Un numéro personnel et confidentiel

Attention: vous gardez toujours le même NUMEN même si vous avez déjà été fonctionnaire d’état (AED…) dans un autre département ou une autre académie.

Il s’agit d’un numéro considéré comme confidentiel : il ne doit jamais apparaître dans vos courriers-courriels y compris avec les autorités administratives comme l’IEN, la DSDEN, le Rectorat ou votre service gestionnaire.

Speech Bubble Vector

CSS : des notes de bas de page sous forme de popup

Lorsque nous écrivons de longs articles, nous avons souvent besoin d’ajouter des notes de bas de pages – footnotes en anglais – pour donner une référence ou apporter un complément d’informations.

Il existe un moyen d’ajouter une note de bas de page en CSS, avec un effet popup.

Survolez le numéro qui s’affiche ici à pour voir la démo: ¹Voici un example de note de bas de page qui apparaît dans une popup, grâce à CSS :)

Une popup CSS pour vos notes de bas de page

Code HTML

Commençons par le code HTML. Nous avons besoin principalement d’un lien HTML et d’une balise span qui contiendra le contenu de notre footnote :

   <p>Voici un premier paragraphe avec une note de bas de page. <a class="footnote">&sup1<span>Coucou, je suis la note de bas de page numéro 1</span></a>
   </p>

   <p>Voici un deuxième paragraphe avec une note de bas de page. <a class="footnote">&sup1<span>Coucou, je suis la note de bas de page numéro 2 :)</span></a>
   </p>

Code CSS

Et voici notre code CSS pour créer la popup et afficher le contenu de nos notes de bas de page à l’intérieur, au survol de la souris:

a.footnote {
   text-decoration:none;
   background-color: #FEF6BB;
   padding-left: 2px;
   padding-right: 2px;
   margin-right: 2px;
   transition: all 2s ease;
} 

a.footnote span {
   z-index: -1;
   opacity: 0;
   position: fixed;
   left: 15px; 
   bottom: 20px;
   margin-left: 0px;
   margin-right: 18px;
   padding:14px 20px;
   border-radius:4px; box-shadow: 5px 5px 8px #CCC;
   border:1px solid #DCA;
   background-color: #FEF6BB;
   transition: all 2s ease;
}

a.footnote:hover span {
   z-index: 9;
   opacity: 1;
   transition: all 2s ease;
}

Dès que la souris n’est plus au-dessus du numéro de la note de bas de page, cette dernière disparaît avec un effet de fondu.

Résultat

Voilà ce que le code nous donne:

Voici un premier paragraphe avec une note de bas de page. ¹Coucou, je suis la note de bas de page numéro 1

Voici un deuxième paragraphe avec une note de bas de page. ²Hello World, je suis la note de bas de page numéro 2 :)

Matt

Et voilà, c’est très simple, en CSS pur mais c’est efficace et ne prend pas de ressources externes (pas de JS) – cela peut toujours servir!

Word Motivation Of Cut Letters

Créer et soutenir la motivation des élèves du cycle central en classe d’Anglais

Voici mon mémoire professionnel accompli à l’IUFM des Pays de la Loire.

La problématique soulevée – comment créer et soutenir la motivation des élèves du cycle central en classe d’Anglais – découle d’une situation de classe que j’ai connue dès mes débuts en PLC2.

There are three things to remember about education.
The first one is motivation. The second one is motivation. The third one is motivation.

Terrell H. Bell

Il n’existe pas de langue où rien ne soit motivé.

Ferdinand de Saussure

Introduction

Une classe est une entité. Chaque fois que l’enseignant se trouve face à elle, il sait que le défi sera de susciter chez ses élèves le désir d’acquérir des savoirs et des savoir-faire et, surtout en classe de langues, d’avoir envie de comprendre, de s’exprimer, de réussir et d’être libre d’agir par eux-mêmes.

Or toute “aide technique serait inopérante si le professeur n’avait constamment le souci de susciter chez les élèves l’envie, le désir de parler” [Instruction Officielles de 2001, p.57]. Donc, sous-jacents à ces paramètres, entre en jeu l’autonomie de l’élève car celui-ci a un rôle déterminant à jouer dans son apprentissage.

Quelque soit le contexte, citadin ou rural, l’enseignant des classes du cycle central se trouve de plus en plus confronté à un public multiculturel riche dans sa diversité, certes, mais qui, en tant que génération ‘zapping’, pose des problèmes d’assiduité, de concentration, de désintérêt, d’instabilité. Nous interpellant à plus d’un titre, ce phénomène nous amène à nous pencher sur le concept de la motivation et de son soutien en classe.

A cet effet, la classe de quatrième angliciste qui m’a été confiée au collège répond à cette problématique à divers niveaux : psychologique, sociologique et pédagogique.

En effet, quel constat pouvons-nous dresser pendant les cours d’anglais ? Qui se cache donc derrière les élèves que nous accueillons ? Quels leviers suffisamment puissants pourraient agir sur la volonté, l’intérêt et l’enthousiasme des élèves, en d’autres termes comment susciter et maintenir la leur motivation ? Comment les étonner pour faire naître une curiosité, moteur indispensable à l’autonomie et les mener sur les chemins de la réussite dans le respect d’eux-mêmes et d’autrui ? La motivation ne consiste-t-elle pas à inscrire l’élève dans une dynamique de projet utile et de résolution de défis ?

C’est au fil de nos réflexions et de nos lectures sur le sujet que nous essaierons de tracer un bilan des mises en œuvre qui confirmeront ou non nos hypothèses de départ et d’envisager d’autres pistes à explorer peut-être mieux adaptées au monde dans lequel ces jeunes vivent, plus ajustées à leur vécu quotidien et qui favoriseraient une appétence, une appropriation active des apprentissages, un plaisir à participer et à s’exprimer, en un mot un mieux-être au sein de la microsociété qu’est une classe.

Lire la suite

WordPress : rediriger la page d'attachement vers l'article auquel les fichiers médias appartiennent photo

WordPress : rediriger la page d’attachement vers l’article parent

WordPress publie par défaut une page d’attachement pour chaque fichier média que vous publiez sur votre site.

En règle générale, un fichier média (image, vidéo, autre) appartient à un article: on attache souvent ce type de fichier lors de la rédaction des articles, pour les insérer dans le corps des billets.

Le problème est donc que WordPress crée gentiment une page dédiée à chaque média publié. Cette page ne contient aucun contenu, à part afficher le média en question, ce qui n’est pas vraiment idéal au point de vue SEO puisque l’on se retrouve avec énormément de pages mais qui ne seront jamais indexées au vu du contenu inexistant. S’il est donc superflu d’avoir ces pages, autant s’en séparer!

C’est là que nous allons tenter d’être malin : pourquoi ne pas rediriger ces pages d’attachement vers l’article auquel ces fichiers media appartiennent?

Jusqu’à très récemment, j’utilisais le module Origin de The SEO Framework, qui fonctionne très bien si le média a été uploadé sur un article. La page d’attachement est alors automatiquement redirigée vers l’article.

Le hic, c’est que si le fichier média a été uploadé directement depuis la page WP Admin > Média, alors nous sommes redirigé vers /wp-admin, ce qui ne fait aucun sens.

Voici donc la solution que j’utilise sur le site:

<?php
/*
Script Name: Redirect attachment page to parent post.
Script URI: https://www.skyminds.net/?p=32314
Description: Redirects attachment to parent post (if it exists), or redirects to the homepage otherwise.
Version: 2.6.0
Author: Matt Biscay
Author URI: https://mattbiscay.com
*/
add_action( 'template_redirect', 'sky_redirect_attachment_to_post' );
function sky_redirect_attachment_to_post(){
  // if not an attchment, bail out early
  if( !is_attachment() ) {
    return;
  }
  // check if parent post is defined
  if( isset( $post ) && isset( $post->post_parent ) && is_numeric( $post->post_parent ) && ( $post->post_parent != 0 ) ) :
    // redirect to parent post
    wp_redirect( esc_url( get_permalink( $post->post_parent ) ) ); exit;
  else: // media has been uploaded through the Media page or is unattached to a specific post
    // redirect to homepage
    wp_redirect( esc_url( home_url( '/' ) ) ); exit;
    // or redirect to the media itself
    // wp_redirect( esc_url( wp_get_attachment_url() ) ); exit;
  endif;
}

Ce code est à copier-coller dans le fichier functions.php de votre thème enfant. Vous pouvez également l’enregistrer en tant que plugin.

Une fois activé, si vous visionnez l’adresse d’une page d’attachement, vous devriez être redirigé sur l’article parent.

Notez que je vous ai mis 2 possibilités pour la redirection lorsque le media n’a pas été attaché à un article: une redirection vers la page d’accueil ou alors vers le fichier média directement.

A vous de choisir ce qui vous correspond le mieux :)

Installer LineageOS (Android 9.0 Pie) sur le OnePlus One photo

Installer LineageOS (Android 11) sur le OnePlus One

Aujourd’hui, j’ai installé LineageOS (Android 11) sur mon OnePlus One, histoire de lui redonner un second souffle et de bénéficier des dernières mises à jour de sécurité Android.

Le OnePlus One (OPO) est sorti en mai 2014, il a donc quelques années derrière lui et tourne sous CyanogenMod 13, c’est-à-dire Android 6.0.1 (Marshmallow). Autant dire qu’il n’a pas vu de correctifs de sécurité depuis quelques années!

Si votre téléphone possède déjà LineageOS, vous pouvez vous rendre directement à l’étape 5.

Étape 1: activer le mode développeur

Sur le téléphone, on commence par activer le mode développeur:

  1. Ouvrez Paramètres > A propos du téléphone.
  2. Tapez 7 fois sur le numéro de build.
  3. Vous venez d’activer le mode développeur!

Grâce au mode développeur, vous avez maintenant accès à des options qui n’étaient pas visibles auparavant et qui vont nous être nécessaires.

Étape 2 : activer le mode déboggage USB

Pour activer le débogage USB:

  1. Ouvrez Paramètres > Système > Options pour les développeurs
  2. Activez l’option Débogage Android

Étape 3 : installation d’ADB

Android Debug Bridge (adb) est un outil de développement qui facilite la communication entre un appareil Android et un ordinateur. Cette communication s’effectue soit par câble USB, soit en WiFi.

Branchez votre OnePlus One en USB.

Téléchargez les derniers pilotes ADB issus du SDK Android puis décompressez l’archive.

Ouvrez le terminal, rendez-vous dans le répertoire platform-tools et listez ensuite votre téléphone avec cette commande:

./adb devices

Résultat:
List of devices attached
b4be4c53	device

Notre OnePlus One est bien détecté. On reboot en mode fastboot:

./adb reboot bootloader

On liste les appareils détectés par fastboot:

./fastboot devices

Résultat:
b4be4c53    fastboot

Attention, la commande suivante va effacer vos données donc pensez à sauvegarder les données importantes de votre téléphone avant!

On déverrouille le bootloader avec:

./fastboot oem unlock
                                                    OKAY [  0.168s]
 Finished. Total time: 0.168s

Lire la suite

Javascript : afficher le contenu d'un bloc HTML après un délai variable photo

JavaScript: sélectionner et désélectionner toutes les cases à cocher d’un coup

Il nous arrive souvent d’avoir toutes les cases (checkboxes) d’un formulaire ou d’un tableau à cocher.

Parfois, la fonctionnalité Sélectionnez tout / Désélectionner tout n’est pas implémentée donc voici comment faire, à l’aide de JavaScript.

Cocher toutes les cases

Supposons que toutes les cases à cocher de notre tableau se nomment post[], voici comment cocher toutes les cases, en utilisant vanilla JS :

var ele=document.getElementsByName('post[]');  
for(var i=0; i<ele.length; i++){  
  if(ele[i].type=='checkbox')  
    ele[i].checked=true;  
}  

Décocher toutes les cases

Inversement, on peut modifier le code précédent avec checked=false si l’on souhaite décocher toutes les cases:

var ele=document.getElementsByName('post[]');  
  for(var i=0; i<ele.length; i++){  
    if(ele[i].type=='checkbox')  
      ele[i].checked=false;  
  }

Fonction et bouton : Sélectionner tout

Maintenant, voyons comment nous pouvons intégrer notre code dans une fonction, que nous pourrons associer à un bouton “Sélectionner tout”:

function SelectAll(){  
  var ele=document.getElementsByName('post[]');  
  for(var i=0; i<ele.length; i++){  
  if(ele[i].type=='checkbox')  
    ele[i].checked=true;  
  }  
}  

Et notre bouton pourra être intégré comme ceci:

<input type="button" onclick='SelectAll()' value="Select All"/>  

Fonction et bouton : Désélectionner tout

Et le pendant: la fonction et le bouton qui permettent de désélectionner toutes les cases à cocher:

function deSelectAll(){  
  var ele=document.getElementsByName('post[]');  
  for(var i=0; i<ele.length; i++){  
    if(ele[i].type=='checkbox')  
      ele[i].checked=false;  
  }  
}      

Et voici le code HTML du bouton:

<input type="button" onclick='deSelectAll()' value="Deselect All"/>  

J’utilise souvent le premier bout de code sans les fonctions, ni le HTML (sauf si je développe une page d’options particulière), directement dans la console JavaScript du navigateur. C’est un gain de temps considérable sur certaines pages.

Bonnes sélections!

macos monterey wallpaper

Installer composer et PHP sous MacOS Monterey

Depuis la mise à jour MacOS Monterey (v12+) et pour toutes les versions à venir, Apple ne fournit plus de binaire PHP installé par défaut.

Si vous utilisez composer par exemple pour l’un de vos scripts ou plugin, voici le message d’erreur que vous pouvez obtenir:

composer update --no-plugins --no-scripts
env: php: No such file or directory

J’ai tenté pas mal de solutions, comme installer PHP avec brew mais cela n’a pas résolu le problème.

Error: Permission denied @ apply2files

C’est l’une des erreurs obtenues lors de l’installation de paquets avec brew, directement après la mise à jour vers Monterey:

Error: Permission denied @ apply2files - /usr/local/lib/node_modules/npm/node_modules/.bin/node-gyp

Si cela vous arrive, c’est un problème de permissions sur le répertoire /user/local, la solution est simple, il faut redonner les bonnes permissions à votre utilisateur avec cette commande:

sudo chown -R $(whoami):admin /usr/local/* \
&& sudo chmod -R g+rwx /usr/local/*

Voilà déjà un problème réglé.

Installer composer sous MacOS Monterey

La véritable solution, toute simple finalement, est de réinstaller composer, qui se charge alors d’installer la version idoine de PHP.

On installe composer avec brew:

brew install composer

Résultat:


==> Downloading https://ghcr.io/v2/homebrew/core/php/manifests/8.1.0
Already downloaded: /Users/matt/Library/Caches/Homebrew/downloads/6dba7b955c116a258cc340994e9e9ed7dfdfe3ab7668f0f9adb5dfcdaaf303a2--php-8.1.0.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/php/blobs/sha256:dbbf3f0e595af9a72f6dcf7fef1890c6152bf9fb1be83f166b467393176c4aa5
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:dbbf3f0e595af9a72f6dcf7fef1890c6152bf9fb1be83f166b4
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/composer/manifests/2.1.14
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/composer/blobs/sha256:02f5fed3d67b82fb827078ffcd486a4a455d1f94e94d0701d779238d4e10903e
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:02f5fed3d67b82fb827078ffcd486a4a455d1f94e94d0701d77
######################################################################## 100.0%
==> Installing dependencies for composer: php
==> Installing composer dependency: php
==> Pouring php--8.1.0.monterey.bottle.tar.gz
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set php_ini /usr/local/etc/php/8.1/php.ini system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set php_dir /usr/local/share/pear system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set doc_dir /usr/local/share/pear/doc system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set ext_dir /usr/local/lib/php/pecl/20210902 system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set bin_dir /usr/local/opt/php/bin system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set data_dir /usr/local/share/pear/data system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set cfg_dir /usr/local/share/pear/cfg system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set www_dir /usr/local/share/pear/htdocs system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set man_dir /usr/local/share/man system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set test_dir /usr/local/share/pear/test system
==> /usr/local/Cellar/php/8.1.0/bin/pear config-set php_bin /usr/local/opt/php/bin/php system
==> /usr/local/Cellar/php/8.1.0/bin/pear update-channels
🍺  /usr/local/Cellar/php/8.1.0: 512 files, 79.9MB
==> Installing composer
==> Pouring composer--2.1.14.monterey.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/composer
Target /usr/local/bin/composer
already exists. You may want to remove it:
  rm '/usr/local/bin/composer'

To force the link and overwrite all conflicting files:
  brew link --overwrite composer

To list all files that would be deleted:
  brew link --overwrite --dry-run composer

Possible conflicting files are:
/usr/local/bin/composer
==> Summary
🍺  /usr/local/Cellar/composer/2.1.14: 3 files, 2.2MB
==> Running `brew cleanup composer`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

Comme vous pouvez le constater dans les résultats précédents, le lien symbolique n’a pas été créé correctement donc nous allons le corriger à la main.

On teste notre commande avec --dr-run d’abord:

brew link --overwrite --dry-run composer
Would remove:
/usr/local/bin/composer

Tout semble bon, on crée le lien symbolique:

brew link --overwrite composer
Linking /usr/local/Cellar/composer/2.1.14... 1 symlinks created.

On reteste maintenant notre mise à jour de plugin via composer:

composer update --no-plugins --no-scripts

Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Writing lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Generating autoload files

Impeccable, composer et php sont de nouveau opérationnels sous Monterey.