[gull] Truc et astuces: Ascii-art... en bash.
felix
felix at f-hauri.ch
Sun Nov 10 19:08:27 CET 2013
On Wed, Nov 06, 2013 at 03:22:44AM +0100, Arnaud wrote:
> C'est un programme qui a fait ce ascii-art ?
Oui et non...
Le script à été écrit ``normalement'', avec des variables nommées etc.
puis
perl -MO=Xref ascii-clock.pl
m'a permi de créer un petit perl, qui à généré un sed script pour
modifier tous les noms des variables:
...
s/analog/a/g;
s/angle/b/g;
s/array/c/g;
s/clockheight/d/g;
s/clockwidth/e/g;
s/color/f/g;
s/constPi/g/g;
s/cpos/h/g;
...
pour créer un ``obfuscator.sed''
(J'étais bien content de voir ``analog'' remplacé par ``a'' car si cela a
modifié l'attitude du script: l'option n'est plus ``-analog'', mais ``-a''
Nota: Si cela n'avais pas été le cas, j'aurrais modifié le script à la main)
Supprimer TOUS les espaces et sauts de lignes inutiles (ou supprimables).
Au final, je me suis trouvé avec un perl (qui fonctionne toujours):
$ wc -Ll ascii-clock-o.pl
2 1124 ascii-clock-o.pl
(oui, 2 lignes a cause du shebang que j'ai ajouté à la main pour vérif.)
$ head -c 100 ascii-clock-o.pl
#!/usr/bin/perl -s
use Time::HiRes qw|sleep time|;$k=11;$k=$ARGV[0]if$ARGV[0];$g=atan2(1,1)/7.5;$e=
$ ls -l ascii-clock-o.pl
-rwxr-xr-x 1 felix felix 1144 nov 4 10:40 ascii-clock-o.pl
Le ascii-art à été créé à partir d'un SVG:
perso.f-hauri.ch/~felix/svg/mondaine.svg
que j'ai positionné à 10h10 et épaissit les traits (strike-width),
puis
gs -sDEVICE=pnmraw -dNOPAUSE -r32 -sOutputFile=- -q "$DIR/mondaine.ps" -c quit |
pnmscale .445 | pnmgamma .25 | ppmtopgm | pgmtopbm -th | pbmtoascii |
sed '/^$/d;s/[^ ]/#/g'
Ai joué avec les valeurs ``strike-width''(svg), ``-r'' (gs), ``pnmgamma''
et ``pnmscale'' jusqu'à obtenir une largeur < 80cols et un nombre de ``#''
d'au moins 30 caractères supérieur au nombres de caractères de mon script
(afin de pouvoir modifier quelques strings, event ajouter: ``"".'' ou
encore remplacer ``"o"'' par ``"o"x1'', pour meubler..)
$ ./ps2shape.sh | tr -d [0-9]\\n\ |wc -c
1175
Puis, simplement ``cat shape.txt ascii-clock-obfuscated.pl >ascii-clock-final.pl''
... et ``emacs''.
Je me suis finalement ``tapé à la main'' les 40 lignes du script final.
Le ``shape'' étant fait de ``#'', lorsque je pratiquais une césure susceptible
de poser problème. Je n'avais qu'à essayé le script dans sa version intermédiaire.
J'ai alors pu constater que, par exemple:
print "Blah${variable}." peut être écrit: print "Blah$ {
variable
}."
si la variable contient `bla', le résultat sera `Blahbla.' sans le
moindre espace.
Dé-obfuscation:
Pour transformer ceci en quelque chose de plus lisible, voici
un petit script qui le fait:
#!/bin/bash
sedscript() {
array=(analog angle array clockheight clockwidth color constPi cpos I
factor halfwidth handl old prctlen ray ref string R tpos)
sedform=" s/\([\$@]\)%s\([^a-z0-9].*\|\)$/\\\\1%s\\\\2/g;\n"
sedform+=" s/\([\$@]\){\(['\"]\|\)%s\\\\2;\\\\?}/\\\\1{%s}/g;\n"
for ((i=0;i<${#array[@]};i++));do
printf -v ltr \\\\x%02x $((97+i)) && printf -v ltr "%b" $ltr
printf "$sedform" $ltr ${array[i]} $ltr ${array[i]}
done
}
sed -e :a -e "$(sedscript)" -e ta < <(
perl -MO=Deparse ascii-clock.pl
) |
perltidy
--
Félix
More information about the gull
mailing list