Archives mensuelles : août 2018

Top commandes linux #5 : vim, apropos, glances, gs, nl, sed /pattern/, timeout

Un rendez-vous que je vous donne chaque lundi pour découvrir des commandes. Pas de grandes formalités dans ces articles, juste des commandes souvent sur une ligne façon oneliner. Vous pouvez retrouver facilement les précédentes éditions des top commandes sur cette page.

# Vim : remplacement sur un range de lignes

:10,30s/";"/","/g

# Bash : apropos pour trouver les commandes similaires

:~$ apropos grep
grep-aptavail (1)    - Rechercher dans des fichiers de contrôle Debian
grep-available (1)   - Rechercher dans des fichiers de contrôle Debian
grep-dctrl (1)       - Rechercher dans des fichiers de contrôle Debian
grep-debtags (1)     - Rechercher dans des fichiers de contrôle Debian
grep-excuses (1)     - Rechercher les fichiers d'excuses pour testing d'un responsable
grep-status (1)      - Rechercher dans des fichiers de contrôle Debian
...

# Bash inverser un contenu

echo "salut" | rev
tulas

# GS : convertir un pdf en png

for f in *.pdf; do gs -dNOPAUSE -dBATCH -sDEVICE=png16m -sOutputFile="${f%.pdf}/${f%.pdf}%d.png" -r700x600 "$f" ;done

# Sed

Sélectionner des lignes à partir d’un pattern.

sed -n "/pattern/p" fichier

# NL

Afficher le numéro de ligne comme dans un cat option -n

nl fichier.txt

# Timeout

Lancer un timeout sur une commande au bout d’un certain laps de temps

timeout 30m ma_commande

# Glances
Découvrez Glances dans un bon article du blog geek mon petit nuage.

Et enfin les articles qui ont cartonnés sur le blog au cours de la semaine dernière :

[Bash] : lister et calculer les fréquences des erreurs apache depuis les logs… et un peu de SEO

Comment visualiser la santé d’un serveur web ? ou comment suivre son seo par les logs apache ?

Statistiques des logs apache

Dans le premier cas, une partie de la solution  pourrait être de commencer par lister les erreurs apache et de faire quelques statistiques avec. La plupart d’entre vous le savent, les logs apache ce situent dans /var/log/apache2/error.log.

Il peut exister des petites variantes en fonction de la configuration des vhost. Pour vérifier, je vous invite donc à vous rendre dans le vhost en question /etc/apache2/sites-enabled/monvhost. Ouvrez ce fichier et vérifiez la localisation des erreurs, c’est la ligne commençant par « ErrorLog. Parfois à la place de apache2 vous pouvez avoir du httpd suivant les daemons.

images

Par exemple, il peut être intéressant de lister les différentes erreurs et de voir celles qui reviennent le plus souvent. Voici comment éplucher /var/log/apache2/error.log à coup de awk. A adapter en fonction de la localisation des logs (à voir avec la conf de vos vhosts).

cat /var/log/apache2/error.log\
| awk '{out=$9;for(i=9;i<=NF;i++){out=out" "$i}; print out}'\
| sed s/,\ referer.*// | uniq -c | sort -nr

Donc :

  • on ouvre error.log
  • on remet en forme les erreurs
  • on limite les recherches aux lignes qui nous intéressent
  • on tri et on regroupe avec sort et uniq

Pour aller plus loin, n’oubliez pas que vous pouvez augmenter le niveau de log avec la variable « LogLevel » qui peut prendre la valeur (par ordre de criticité) :

  • emerg
  • alert
  • crit
  • error
  • warn
  • notice

Enfin, vous pouvez aussi améliorer les lignes de logs en redéfinissant les CustomLog.

Et le SEO là-dedans ?

L’idée est simplement d’expertiser le passage des crawler (google ou autres) sur vos url.

Pour ceux qui réalisent du SEO, vous pouvez aussi faire une analyse spécifique des logs. Voici un article spécifique sur ce domaine assez pointu. D’autres chercheront à supprimer les logs relatifs au bot SEO car ils leur apporteront peu d’informations utiles.

Et toujours dans le domaine du SEO, pour pousser toujours plus loin votre expertise, vous pouvez installer un conteneur docker intitulé oncrawl-elk. Ce conteneur s’installe en parallèle de votre apache. Il vous servira à analyser vos logs apache avec l’aide de kibana, logstash et elasticsearch.

[Python] : le point sur les dictionnaires et ne pas confondre avec la liste

Actuellement, c’est un des points qui m’ennerve le plus sur Python : les dictionnaires, les listes et les tuples. Quand je crois avoir bien retenu qui est qui et bien je me remélange les pinceaux et je dois me refaire le point régulièrement. Alors lorsque quelqu’un me reparle de « tableau de hashage » et de « nested list » j’en oublie les dictionnaires.

Alors, ce n’est que mon avis, mais en python oubliez les tuples. C’est peu utilisé et il y a assez à faire avec les 2 autres.

Quelques rappels sur les dictionnaires

dico = {
  clef:valeur,
  clef:valeur,
  clef:valeur,
}


Donc un tableau de hashage comme certains appellent cela.

Un exemple ?

age_personne = {
  'Xavki':'32',
  'Pierre':'40',
  'Paul':'53',
  'Jacques':'60',
}

ou

age_personne = dict(
  Xavki='32',
  Pierre='40',
  Paul='53',
  Jacques='60',
)


Contrairement au liste on ne peut pas appeler une clé/valeur par son index mais par sa clef :

>>> age_personne[1]
Traceback (most recent call last):
  File "", line 1, in 
KeyError: 1

>>> age_personne['Xavki']
'32'


et pour entrer une valeur ou mettre à jour une valeur :

age_personne['Xavki']=62
>>> age_personne
{'Xavki': 62, 'Paul': '53', 'Pierre': '40', 'Jacques': '60'}


Et mes listes ?

Alors comment reproduire le système de clef des listes ? faire en sorte que la clef soit un indice :

age_personne = {
  '1':'32',
  '2':'40',
  '3':'53',
  '4':'60',
}


Mais attention pas de slice comme dans les listes (c’est à dire d’utiliser des range d’index) et pas de append possible.

Pour le pratico pratique vous pouvez faire mieux avec les dictionnaires en y imbriquant des listes :

age_personne = dict(
Xavki=['32','informaticien','Paris'],
Pierre=['40','manager','Tours'],
Paul=['52','rh','Toulouse'],
Jacques=['63','informaticien','Paris'],
)


et là…. surprise :

>>> age_personne['Xavki']
['32', 'informaticien', 'Paris']

>>> age_personne['Xavki'][1]
'informaticien'


C’est plus kool déjà.

Et en plus on peut utiliser des actions spécifiques :

#on demande les résultats d'une clef avec get
>>> age_personne.get('Xavki')
['32', 'informaticien', 'Paris']

#on vide le dictionnaire
age.personne.clear()

#on transforme un dictionnaire en "nested lit"
liste_age=list(age_personne.items())

#on met dans une liste toutes les clefs
list(age_personne.keys())

#pareil sur les valeurs
list(age_personne.values())

#on supprime une clef
age_personne.pop('Xavki')


Comment alimenter simplement une liste ?

Soit on la créé avec des données que l’on peut entrer à la main facilement (en nombre limitées) :

maliste = [1,2,3,4,5]

Sinon on peut aussi utiliser les boucles for pour le faire :

For i in range(1,5):  maliste.append(i)

Ou encore lorsque l’on veut faire court et efficace :

maliste = [ i for i in range(1,5) ]

La dernière méthode est ma préférée pour éviter de mutliplier le nombre de lignes dans les scripts.

A votre tour de vous amuser. Avez vous des choses à ajouter ?

Comment utiliser gitignore pour faire une whitelist (un gitaccept lol) ? – Git

Gitignore est bien pratique car il permet à la base de dire je ne veux pas gitter tel ou tel répertoire ou tel ou tel fichier. Le problème c’est que l’on peut rapidement avoir à gérer une liste longue comme le bras. Voir même on a à gérer les nouveux répertoires et les ajouter dans .gitignore.

La solution c’est de faire l’inverse c’est à dire tout refuser sauf un ou plusieurs répertoires que je liste.

Pour faire cela il faut utiliser « ! » et ne pas utiliser tout par défaut, de cette manière :

# file .gitignore

/*

!/scripts/

Ainsi on git uniquement le répertoire « scripts ».

Vous pouvez retrouver plus de détails sur la page man de gitignore et un autre exemple ici.

Pendant que j’y suis je viens de découvrir un bon outil sur lequel je dois vous faire un article : tig. C’est un visuel sympa sur l’évolution de votre bracnhe git.