Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 15 avril 2018

Rechercher rapidement dans le code source avec ack

Rechercher dans du code source est une des activités principales du développeur.

Dans les logiciels aux architectures incertaines et maintenant avec la "méthode" Agile, il est souvent diffcile de savoir rapidement ou est gérée telle ou telle fonctionnalité dans le code.

Pendant longtemps, rechecher dans le code ressemblait à ça:

find . -name "*.java" -exec grep HashMap {} \; -print

Certains me diront:

Bahhhhh, Qu'est-ce que c'est compliqué ?

Où encore l'excuse qui n'en est pas une:

Mais moi je suis sous Windows ...

Heureusement, il existe maintenant des outils plus rapides à l'usage que les commandes find et grep combinées.

J'ai découvert il y a quelques années la commande ack-grep ou ack qui est précisément faites pour notre besoin: chercher des motifs dans une base de code.

Je vous passe ici l'installation d'ack: ack est un script Perl qui s'installe très simplement ; évitez le package de votre distribution afin d'avoir la version la plus récente.

Maintenant, notre commande précédente s'écrit comme suit:

ack --java HashMap

C'est quand même plus court !

J'ai précisé à la commande que je voulais chercher dans des sources Java. Dans types de fichiers sont prédéfinis dans ack:

 ack --help-types
Usage: ack [OPTION]... PATTERN [FILES OR DIRECTORIES]

The following is the list of filetypes supported by ack.  You can
specify a file type with the --type=TYPE format, or the --TYPE
format.  For example, both --type=perl and --perl work.

Note that some extensions may appear in multiple types.  For example,
.pod files are both Perl and Parrot.

    --[no]actionscript .as .mxml
    --[no]ada          .ada .adb .ads
    --[no]asm          .asm .s
    --[no]asp          .asp
    --[no]aspx         .master .ascx .asmx .aspx .svc
    --[no]batch        .bat .cmd
    --[no]cc           .c .h .xs
    --[no]cfmx         .cfc .cfm .cfml
    --[no]clojure      .clj
    --[no]cmake        CMakeLists.txt; .cmake

Si vous utilisez un type de fichier non connu d'ack, vous pouvez le définir.

Ensuite, de nombreuses options de la commandes ack sont reprises de celles de grep:

       -i, --ignore-case
           Ignore case distinctions in PATTERN
       -v, --invert-match
           Invert match: select non-matching lines

ou les classiques:

       -l, --files-with-matches
           Only print the filenames of matching files, instead of the matching text.

       -L, --files-without-matches
           Only print the filenames of files that do NOT match.

ack permet comme grep d'afficher les lignes de contexte autour du motif trouvé:

       -A NUM, --after-context=NUM
           Print NUM lines of trailing context after matching lines.

       -B NUM, --before-context=NUM
           Print NUM lines of leading context before matching lines.

ce qui facilite la lisibilité de la sortie.

Par défaut, ack va parcourir tous les sous-répertoires du répertoire courant. Ce comportement peut-être changé par:

       -r, -R, --recurse
           Recurse into sub-directories. This is the default and just here for compatibility with grep. You can also use it for
           turning --no-recurse off.

Enfin, ack peut utiliser un fichier de configuration ~/.ackrc.

Pour créer celui utilisant les options par défaut:

ack --create-ackrc > ~/.ackrc

vendredi 13 mai 2016

Installer proprement Java sur Debian

Pour installer Java sous Linux, vous avez le choix entre les façons de faire suivantes:

  • Installer un paquet JRE ou JDK de l'OpenJDK fourni par votre système,
  • Télécharger Java sur le site d'Oracle et l'installer à la main

On s'intéressera dans ce billet à la deuxième façon de faire. Si vous utilisez Red Hat, comme Oracle fournit un paquet au format rpm, l'installation sera simple.

En revanche, lorsque vous avez une archive .tar.gz du JDK ou du JRE, c'est le cas si votre système est Debian, deux solutions s'offrent à vous:

  • décompresser la tarball dans le répertoire $HOME de votre utilisateur,
  • le faire dans /opt et avoir ainsi Java disponible pour tous les utilisateurs de votre système

Encore une fois on s'intéressera ici à la deuxième façon de faire, mais on ne se contentera pas de décompresser l'archive à la main.

En effet, il existe dans la section contrib du dépôt Debian un paquet nommé java-package avec lequel on peut fabriquer un paquet au format .deb à partir de la tarball du JRE ou du JDK.

On procédera donc comme suit:

Etape 1: Ajouter la section contrib au fichier /etc/apt/sources.list

deb http://ftp.fr.debian.org/debian/ jessie main contrib
deb-src http://ftp.fr.debian.org/debian/ jessie main contrib

Etape 2: Installer le paquet java-package

sudo apt-get install java-package

Etape 3: Créer un paquet Debian à partir du JDK ou JRE d'Oracle

fakeroot make-jpkg Téléchargements/jdk-8u73-linux-x64.tar.gz

On voit qu'on ne le fait pas en root, on aurait une erreur sinon.

Etape 4: Installer le paquet Debian qu'on vient de générer

dpkg -i oracle-java8-jdk_8u73_amd64.deb

La procédure décrite ici pour installer Java à partir d'un paquet Debian .deb que l'on génère présente les avantages suivants:

  • Java est disponible pour tous les utilisateurs
  • Etant installé via un paquet natif du système, il peut être facilement supprimé
  • On peut très facilement passer d'une version de Java à une autre avec la commande update-java-alternatives

mercredi 2 mars 2016

Passer facilement d'une version de Java à l'autre sous Linux

On a vu dans un billet précédent comment installer Java sur Linux en utilisant les JDK ou JRE fournis par le système.

Par exemple sur Debian Wheezy, j'ai la configuration suivante:

which java | xargs readlink -e
/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java

Imaginons maintenant que j'ai installé l'OpenJDK en versions 6 et 7 et que je travaille sur deux projets, un en Java 7 et l'autre en Java 6. Je vais avoir besoin de passer facilement d'une version de Java à l'autre.

Le paquet java-common est là pour ça. Ce paquet fournit la commande update-java-alternatives qui permet de:

update-java-alternatives
usage: update-java-alternatives [--jre-headless] [--jre] [--plugin] [ -t|--test|-v|--verbose]
           -l|--list [<jname>]
           -s|--set <jname>
           -a|--auto
           -h|-?|--help

Lister les JDK ou JRE installés sur le système:

update-java-alternatives --list
java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64
java-1.7.0-openjdk-amd64 1051 /usr/lib/jvm/java-1.7.0-openjdk-amd64

Changer le JDK ou JRE par défaut du système:

update-java-alternatives -s java-1.7.0-openjdk-amd64

SI vous regardez un petit peu, vous verrez que la commande update-java-alternatives modifie tous les liens dans /etc/alternatives pointant vers un binaire fourni par le JDK ou le JRE.

Dernière chose update-java-alternatives doit être lançée depuis le compte root.

- page 1 de 2