Sam & Max » perl http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 CLOC it 37 http://sametmax.com/cloc-it/ http://sametmax.com/cloc-it/#comments Fri, 13 Jun 2014 10:42:51 +0000 http://sametmax.com/?p=10476 apt-get cloc, et un cloc /home/sam/work plus tard, on obtient un rapport sur le nombre de fichiers / lignes de code par langage.]]> CLOC est un petit prog Perl qui retourne des stats sur le code qu’on a dans un dossier.

Sur Ubuntu, ça s’installe avec un sudo apt-get install cloc, et un cloc /home/sam/work plus tard, on obtient un rapport sur le nombre de fichiers / lignes de code par langage :

---------------------------------------------------------
Language            files      blank    comment      code
---------------------------------------------------------
HTML                10585     392921      49870   2909814
Javascript           1497     118180     220836    656645
Python               3132     104173     129888    517995
CSS                   399      23324      10117    164944
XML                  2860       7435      16148     89942
Java                  194       7364      34214     30960
XSLT                   83       3902       1992     25842
Bourne Shell           91       1998       2511     16263
C                      48       2824       4020     11810
C/C++ Header          167       4256       7775     10015
SQL                    59       1640       1347      8961
LESS                   50       1371       1308      5884
C++                    35       1244        782      5772
make                   41        806        283      3691
QML                    56        413        906      2458
Visualforce Page       17        175         22      1253
Bourne Again Shell     17        109        145       883
m4                      2         99         22       707
SASS                   20        127         41       596
ActionScript            1         71        121       553
DOS Batch               8         63         19       359
DTD                     5        159        280       355
PHP                     2         58        250       315
D                       2         32         -2       171
CMake                   4         28         11       124
Ruby                    5         37          9       120
CoffeeScript            1         30         10        95
Teamcenter def          1          0          0        91
XSD                     3         10          0        78
YAML                    5          7          0        49
Arduino Sketch          1         17         27        41
IDL                     2         12          0        38
MATLAB                  1         21         62        35
C Shell                 1          8          6        18
Visual Basic            1          0          0        18
ASP.Net                 1          4          0         9
---------------------------------------------------------
SUM:                19397     672918     483020   4466904
---------------------------------------------------------

Pour le HTML, on a compris que j’étais un dev très orienté Web. Mais, horreur, coderai-je plus de Javascript que de Python ?

Non, je vous rassure. C’est juste que mon dossier de travail contient moult documentation Web dumpées pour être consultées hors ligne, de nombreuses libs JS dupliquées (j’aime pas les CDN) et aucun de mes virtualenv.

Rien que la doc d’angular :

find -iname "*.js"  | grep angular | wc
632

On notera qu’il y a deux fois plus de fichiers Python (3132 c’est pas énorme quand on y pense) que de fichiers JS, mais un peu moins de lignes malgré tout, ce qui reflète bien la tendance à tasser beaucoup de code dans un seul gros fichier en JS.

2860 fichiers XML ? Bordel, mais d’où viennent-ils ?

find -iname "*.xml" | grep docker | wc
2790

Ah, ok.

Je serais curieux de savoir ce que ça donne pour un dev scientifique, un sys admin, un débutant, un chevronné, etc.

]]>
http://sametmax.com/cloc-it/feed/ 37
Remplacer sed, awk, cut et Perl par Python (= orgasme pour sysadmin) 26 http://sametmax.com/remplacer-sed-awk-cut-et-perl-par-python-orgasme-pour-sysadmin/ http://sametmax.com/remplacer-sed-awk-cut-et-perl-par-python-orgasme-pour-sysadmin/#comments Sat, 14 Dec 2013 08:28:41 +0000 http://sametmax.com/?p=8261 La force de Perl c’est qu’il permettait de piper des données directement via la ligne de commande pour faire des manipulations rapides.

C’est pour cela que c’était devenu les choix des sysadmins. Parce que jusqu’ici, le choix c’était soit de faire un truc simple en connaissant par coeur la tool box GNU, soit ouvrir un fichier et faire un script.

Python ne permet pas de piper des données directement dans la commande, mais des projets ont vu le jour pour le faire.

Il y a le projet pyp, que l’on doit à Sony Pictures Imageworks qui avait besoin de se simplifier l’automatisation des tâches de build pour ses films.

Et il y a pyped, dont j’avais brièvement parlé ici (article qui mérite d’être mis à jour vu que j’ai remplace dateutils par arrow).

Les deux étaient sympas, mais avait des syntaxes alambiquées, n’étaient pas compatibles python 3 et manquaient d’imports auto. Cependant, pyped est récemment passé en v1.0, donc stable, et a une toute nouvelle approche de syntaxe qui rend la bestiole super agréable à utiliser.

Présentation.

Stdin, ligne à ligne

L’installation est bateau, c’est du pip :

pip install --user pyped

Et derrière, on obtient la commande pyp. Elle s’utilise essentiellement à la suite d’une autre commande. Typiquement :

cat /etc/fsta | pyp "un truc"

L’astuce, c’est que “un truc” peut être n’importe quelle expression Python. Généralement une expression qui print() quelque chose.

Or, Pyped met automatiquement à disposition de cette expression deux variables :

  • La ligne en cours, dans la variable x.
  • Le numéro de la ligne en cours, dans la variable i.

L’expression Python est appelée une fois pour chaque ligne.

Par exemple, supposons que j’ai un fichier “fortune.txt” contenant :

bitcoin (btc) : 5
euros () : 100
dollars ($) : 80

Si je veut tout mettre en majuscule, je fais :

$ cat fortune.txt | pyp "print(x.upper())"
BITCOIN (BTC) : 5
EUROS () : 100
DOLLARS ($) : 80

On peut mettre plusieurs expressions d’affilé. Ainsi, si je veux récupérer la somme et le symbole uniquement :

$ cat fortune.txt | pyp "devise, sign, _, value = x.split()" "sign = sign.strip('()')" "print('%s%s' % (value, sign))"
5btc
10080$

Ok, c’est plus long que perl, mais vachement plus facile à écrire et à relire. Et j’utilise un langage que je connais déjà. Et pas besoin de faire un mix incompréhensible de sed, awk et autre cut.

Si j’ai vraiment besoin de lisibilité, je peux même le mettre sur plusieurs lignes :

$ cat fortune.txt | pyp "                                                                                                 
devise, sign, _, value = x.split() 
sign = sign.strip('()') 
print('%s%s' % (value, sign))  
"
5btc
10080$

Vous aurez noté que j’utilise print() et que je semble ne pas me soucier de l’unicode. C’est parceque pyped fait ça au début du script :

from __future__ import print_function, unicode_literals, division, absolute_imports

Du coup, on est bien en Python 2.7, mais on bénéficie de la division améliorée, de la fonction pour printer, des imports absolus et surtout, de l’unicode partout. D’ailleurs pyped vous transforme x pour que ce soit un objet unicode.

Dans tous les cas, pyped est compatible Python 3.

Tout traiter d’un coup

Parfois, on a besoin d’avoir accès à toutes les lignes, pas juste les lignes une à une. pyped permet cela avec l’option -i. Les variables x et i disparaissent au profit de la variable l, qui contient un itérable sur toutes les lignes.

Par exemple, envie de trier tout ça ?

cat fortune.txt | pyp -i "
lignes = (x.split() for x in l)
lignes = sorted((v, s.strip('()')) for d, s, _, v in lignes)
for ligne in lignes: print('%s%s' % ligne)
"
100€
5btc
80$

Moar options

Lisez la doc, car il y a d’autres options du genre éviter que pyped vous strip automatiquement le ligne break, forcer l’encoding, etc.

Parmi les trucs les plus utiles, il y a l’option -b qui permet de lancer un code avant la boucle. Pratique pour importer des trucs genre le module tarfile pour extraire une archive avant d’utiliser son contenu.

Néanmoins la plupart du temps on a rien besoin d’importer car pyped importe déjà automatiquement les modules les plus utiles : maths, datetime, re, json, hashlib, uuid, etc.

]]>
http://sametmax.com/remplacer-sed-awk-cut-et-perl-par-python-orgasme-pour-sysadmin/feed/ 26