Fonctions-utiles ( 20 / 21 articles - Voir la liste )

Astuce Qui utilise le port ?

Sous Windows, pour savoir quel processus utilise un port, lancez la commande Get-Process dans Powershell :

Exemple pour le port 5433 :

Get-Process -Id (Get-NetTCPConnection -LocalPort 5433).OwningProcess

Astuce Analyser l’occupation de l’espace disque

Sous Linux, l’utilitaire ncdu (pour NCurses Disk Usage) permet de trouver quel fichier ou répertoire vous bouffe tout votre espace disque.

Il est disponible sur les dépôts officiels Debian et Ubuntu et donc facile à installer.

sudo apt install ncdu
ncdu

Note : ncdu a été réécrit dans une v2 encore récente. Selon la version des dépôts, c’est peut-être la v1 qui sera installée.

Astuce Supprimer les images/conteneurs/volumes docker

Pour supprimer tous les conteneurs docker :

docker rm $(docker ps -a -q)

Pour supprimer toutes les images docker :

docker rmi $(docker images -q)

Pour supprimer tous les volumes docker :

docker volume prune

Astuce Savoir quel processus utilise un port

Sous Linux, vous pouvez utiliser la commande suivante pour savoir quel processus utilise un port :

# Pour le port 80
netstat -tlnp | grep 80

Cela retournera par exemple :

tcp6       0      0 :::80                   :::*                    LISTEN      32198/apache2

L'ID du processus étant ici 32198.

Remarque : Pour voir tous les processus, il sera peut-être nécessaire de lancer la commande en tant que root (ou avec sudo).

Astuce Les nouveaux opérateurs introduits par PHP 7

PHP 7 introduit 2 nouveaux opérateurs : ?? et <=>, nommés respectivement Null coalescent et Spaceship.

Null coalescent

Cet opérateur permet de simplifier l'affectation des valeurs par défaut via les opérateurs ternaires :

$value = (isset($x) && $x !== null) ? $x : $defaultValue;

peut maintenant s'écrire :

$value = $x ?? $defaultValue;

Comme l'indique la documentation, il permet de vérifier si une variable existe et est non nulle.

Remarque : Il ne faut pas le confondre avec l'opérateur ternaire "abrégé" (depuis PHP 5.3), à savoir ?:. Celui-ci permet juste d'omettre la partie centrale, sans vérifier l'existence de la variable.

$value = $x ?: $valueIfXIsFalse;

$value devient $x si $x est considéré comme "vrai" . $value devient $valueIfXIsFalse si $x est considéré comme "faux".
Contrairement au null coalescent, il reverra un warning si $x n'est pas défini.

Spaceship

Cet opérateur permet de simplifier la comparaison entre deux variables :

$comparison = ($a < $b) ? -1 : (($a > $b) ? 1 : 0);

peut maintenant s'écrire :

$comparison = $a <=> $b;

Comme l'indique la documentation, cet opérateur retourne donc -1, 1 ou 0 selon la différence entre $a et $b.

Astuce Connaître le poids et le nombre de fichiers d'un répertoire

Poids total

Pour connaître le poids total des fichiers (et sous-répertoires) que contient un répertoire, vous pouvez utiliser la commande du :

du -shL mon/repertoire

Explication :

Les options s, h et L permettent respectivement de faire la somme, afficher un poids lisible par un humain (en Ko, Mo, ...) plutôt qu'en octets et suivre les liens symboliques (plutôt que de compter le poids du lien).

Nombre de fichiers

Pour connaître le nombre de fichiers il faut cette fois composer avec plusieurs commandes :

find -L mon/repertoire -type f | wc -l

Explications :

  • La commande find avec l'option -type f permet de lister les fichiers
  • L'option -L permet de suivre les liens symboliques
  • La commande wc -l compte le nombre de lignes (ici celles retournées par find)

Astuce Rechercher un paquet

Si vous êtes sous une distribution avec apt d'installé, vous pouvez rechercher un paquet avec la commande suivante :

apt-cache search terme1 terme2

Remarques :

  • Si vous indiquez plusieurs termes, seuls les résultats avec chacun d'eux seront retournés
  • Les regexp sont gérées (au moins en partie). Ex : apt-cache search php.*memcach.

Si vous avez aptitude d'installé, une commande plus simple à mémoriser existe :

aptitude search terme1 terme2

Astuce Créer un lien symbolique

Pour créer un lien symbolique sou linux, il suffit d'utiliser la commande suivante :

ln -s chemin/vers/la/cible/du/lien chemin/vers/lien

Le premier paramètre contient le répertoire ou fichier à cibler, et le second le chemin/nom du lien à créer.

Les chemins peuvent-être relatifs ou absolus.

Astuce Connaître l'espace disque restant

Sous linux, vous pouvez rapidement connaître l'espace disque restant grâce à la commande :

df -h

Note : comme pour beaucoup d'autres commandes Linux, l'option -h permet un affichage plus humain, notamment pour le poids des fichiers (ie. 1.2mo au lieu de 1200000).

Astuce Sauvegarder/Importer une base de données PostgreSQL

Se connecter

Pour pouvoir exporter/importer une base de données PostgreSQL vous devrez sans doute vous connecter avec l'utilisateur système postgres.

Ex:

sudo su - postgres

Sauvegarder

Pour créer un dump de votre base de données utilisez la commande suivante :

pg_dump -U username -h localhost dbname > path/to/dump.sql

Par défaut :

  • l'hôte utilisé est localhost
  • le port utilisé est 5432

D'autres options sont possibles.

Remarque :

Même si c'est la valeur par défaut, il est parfois nécessaire de préciser l'hôte dans la commande, pour indiquer au client postgres que vous accédez à la base via une connexion TCP et non PEER.

Importer

La commande d'import est similaire à celle de dump :

psql -U username -h localhost dbname < path/to/dump.sql

Par défaut :

  • l'hôte utilisé est localhost
  • le port utilisé est 5432

Astuce Connaitre sa version de Linux

Pour connaitre votre distribution et sa version, utilisez la commande suivante :

lsb_release -a

Remarque :

Cette commande n'est pas forcément installée par défaut sur votre machine. Elle se trouve sûrement dans le dépôt officiel et peut être ajoutée grâce à yum ou apt.

Astuce Créer un lien symbolique entre deux répertoires sous Windows

Pour créer un lien symbolique sous Windows, il faut utiliser la commande symlink :

mklink [[/D] | [/H] | [/J]] <Lien> <Cible>

Pour cela, lancez une invite de commande :

  • Menu démarrer
  • Exécuter...
  • Tapez cmd et validez

Si par exemple vous souhaitez pouvoir accéder au répertoire C:\Windows\System32\drivers\etc directement via C:\etc, tapez cette commande :

mklink /J C:\etc C:\Windows\System32\drivers\etc

Remarques :

  • Selon le lien que vous souhaitez créer, vous devrez peut-être être admin de votre machine (ou lancer l'invite de commande en mode administrateur).
  • Si vous voulez créer un lien vers un répertoire qui n'existe pas (encore) sur votre système, utilisez l'option /D et non pas /J. Cela créera un lien symbolique et non pas une jonction.

Astuce Ajouter un espace (ou autre) tous les n caractères

Si vous souhaitez formater un numéro de téléphone, un IBAN, ou n'importe quelle chaîne en y ajoutant régulièrement un séparateur, cette fonction peut vous être utile :

/**
 * Formate une chaîne en ajoutant un séparateur tous les <code>length</code> caractères.
 * 
 * @param string Chaîne à formater
 * @param separator Séparateur à ajouter
 * @param length Taille des groupes de caractères à séparer
 * @return La chaîne formatée
 */
public static String addChar(String string, String separator, int length) {

    if (string != null && string.length() > length) {

        string = string.replaceAll("([^\\s]{" + length + "})", "$0" + separator);
    }

    return string;
}

Astuce Tester si une chaîne est vide ou ne contient que des espaces

Voici une méthode pour tester si une chaîne est vide ou contient uniquement des espaces :

/**
 * Retourne si la chaîne en argument est vide ou contient uniquement des espaces.
 * 
 * @param string Chaîne
 * @return <code>true</code> si la chaîne est nulle, vide, ou s'il ne contient que des caractères espaces (ex: \n \r \s, ...) y compris les espaces insécables.
 */
public static boolean isEmpty(String string) {

    boolean isEmpty = true;

    if (string != null) {

        isEmpty = "".equals(string.replaceAll("[\\s|\\u00A0]+", ""));
    }

    return isEmpty;
}

Remarque :

\u00A0 représente les espaces insécables. Si on utilise uniquement \s dans le remplacement, ils ne seront pas considérés comme des espaces.

Astuce Chiffrer et déchiffrer une chaîne en Java

Si vous avez besoin de chiffrer une chaîne de caractères en Java, vous pouvez utiliser ces deux méthodes :

/**
 * Chiffre la chaîne en argument en utilisant la clé fournie.
 * Ajoute le suffixe à la chaîne chiffrée puis convertit le tout en base64.
 * 
 * @param string Chaîne à chiffrer
 * @param keyString Clé de chiffrement
 * @param suffix Suffixe à ajouter à la chaîne (ex: la date au format yyyyMMdd)
 * @return la chaîne chiffrée + le suffixe, en base64
 * @throws RESTTechnicalException
 */
public static String encrypt(String string, String keyString, String suffix) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {

    String encryptedB64String = null;

    // Chiffrement de la chaîne
    Key key = new SecretKeySpec(keyString.getBytes("UTF-8"), "Blowfish");
    Cipher cipher = Cipher.getInstance("Blowfish");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] encryptedString = cipher.doFinal(string.getBytes("UTF-8"));

    // Ajout du suffixe
    encryptedString = JavaUtil.mergeArray(encryptedString, suffix.getBytes());

    // Encodage de la chaîne en base 64
    encryptedB64String = Base64.encodeBase64String(encryptedString);

    return encryptedB64String;
}

/**
 * Déchiffre la chaîne en argument en utilisant la clé fournie.
 * 
 * @param b64String Chaîne chiffrée + le suffixe, en base 64
 * @param keyString Clé de déchiffrement
 * @param suffix Suffixe à ajouter à la chaîne (ex: la date au format yyyyMMdd)
 * @return la chaîne déchiffrée
 * @throws RESTTechnicalException
 */
public static String decrypt(String b64String, String keyString, String suffix) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {

    String decryptedString = null;

    // Décodage de la chaîne en base 64
    byte[] string = Base64.decodeBase64(b64String);

    // Suppression du suffixe
    string = JavaUtil.truncateArray(string, suffix.length());

    // Déchiffrement de la chaîne
    Key key         = new SecretKeySpec(keyString.getBytes("UTF-8"), "Blowfish");
    Cipher cipher     = Cipher.getInstance("Blowfish");
    cipher.init(Cipher.DECRYPT_MODE, key);
    decryptedString = new String(cipher.doFinal(string));

    return decryptedString;
}

Explications :

  • La chaîne est (dé)chiffrée grâce à la bibliothèque Cipher de Java, en utilisant la technique de chiffrement Blowfish.
  • Le suffixe en argument est ensuite concaténée à la chaîne chiffrée.
  • La chaîne résultante est finalement convertie en base64.

Remarques :

  • La clé de chiffrement ne doit pas excéder 12 caractères, ou des paramètres doivent être changés dans la JVM.
  • Ces méthodes utilisent la bibliothèque org.apache.commons.codec, qui n'est pas forcément disponible dans le JDK.
  • Le suffixe permet de gérer l'expiration du chiffrement. Par exemple, pour une validité de 24h, il suffit de passer la date au format yyyyMMdd en argument.
  • La conversion en base64 n'est pas indispensable mais permet d'obtenir une chaîne de caractères plus simple et exploitable dans une URL par exemple.
  • Le code des méthodes JavaUtil.truncateArray() et JavaUtil.mergeArray() est disponible ci-dessous :

    /**
     * Tronque le tableau de byte en arguments.
     * 
     * @param array Tableau à tronquer
     * @param maxSize Taille maximale du tableau à conserver
     * @return le tableau tronqué
     */
    public static byte[] truncateArray(byte[] array, int maxSize) {
    
        int newArraySize = Math.min(array.length, maxSize);
        byte[] newArray = new byte[newArraySize];
        System.arraycopy(array, 0, newArray, 0, maxSize);
    
        return newArray;
    }
    
    /**
     * Merge les deux tableaux en arguments.
     * 
     * @param first Premier tableau
     * @param second Second tableau
     * @return
     */
    public static byte[] mergeArray(byte[] first, byte[] second) {
    
        byte[] result = Arrays.copyOf(first, first.length + second.length);
        System.arraycopy(second, 0, result, first.length, second.length);
    
        return result;
    }

Astuce Afficher la valeur de tous les champs via la méthode toString()

Lorsque vous créez une nouvelle classe en Java, elle hérite de la méthode toString() de la classe Object. Par défaut, cette méthode n'affiche rien de bien compréhensible.

Vous pouvez la surcharger pour afficher lisiblement les valeurs de tous les champs de votre objet de cette manière :

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}

Grâce à l'introspection et à la librairie org.apache.commons, ces quelques lignes de code fonctionneront pour toutes vos classes.

Astuce Afficher les tâches planifiées

Sous Linux, pour savoir les tâches planifiées pour l'utilisateur courant, utilisez la commande suivante :

crontab -l

Astuce Ajouter des variables d'environnement

Pour ajouter une variable d'environnement ou en modifier la valeur, utilisez la commande :

export INSTALL4J_JAVA_HOME='/var/lib/jdk1.6.0_33'

en remplaçant INSTALL4J_JAVA_HOME par le nom de la variable à définir et en modifiant la valeur entre 'quotes'.

Pour que cette variable soit définie automatiquement lorsque vous utilisez la console, il faut modifier le fichier .bashrc dans le dossier home de l'utilisateur pouvant utiliser cette variable. Pour l'utilisateur root par exemple, il s'agit du fichier /root/.bashrc.

Dans ce fichier, ajoutez la même commande :

export INSTALL4J_JAVA_HOME='/var/lib/jdk1.6.0_33'

Astuce Sauvegarder/Importer une base de données MySQL

Sauvegarder

Pour créer un dump de votre base de données, utilisez la commande suivante :

mysqldump --host=localhost --port=3306 --databases database1_name database2_name --user=my_user --password=my_password > path/to/dump.sql

Par défaut :

  • l'hôte utilisé est localhost
  • le port utilisé est 3306

Vous devez spécifier la ou les bases de données à sauvegarder, ainsi que les login et mot de passe d'un utilisateur ayant le droit de consultation de la base.

Importer

La commande d'import est similaire à celle de dump :

mysql --host=localhost --port=3606 --user=my_user --password=my_password --default_character_set utf8 database_name < path/to/dump.sql

Astuce Créer et extraire une archive tar.gz

Pour créer une archive tar.gz sans le dossier conteneur, utilisez la commande :

cd mon/repertoire/conteneur
tar -czf ../archive.tar.gz ./

Pour extraire une archive tar.gz, utilisez la commande :

tar -xvzf archive.tar.gz