Les paradis artificiels

Xifratge de CŔsar

Perl, Criptografia — 12 Agost 2009, 10:19

El xifratge de Cèsar, o Caesar cipher en anglès, és un senzill xifrat de substitució en què cada lletra de l'alfabet es substitueix per una altra situada a tres posicions de distància. Així, la A es substitueix per la D, la B per la E, la Y per la B i la Z per la C. Es pot expressar fàcilment substituint cada lletra per la seva posició (A=1, B=2, etc.) i sumant-li 3 mòdul 26. Per desencriptar n'hi ha prou amb restar 3 a cada lletra. El xifrat no és segur, es pot trencar fàcilment amb un anàlisi de freqüència de les lletres del text xifrat.

De totes maneres, per aprofitar a trastejar una mica amb el Perl i aprendre alguna cosa he fet un petit script que permet encriptar i desencriptar text utilitzant el xifratge de Cèsar, o l'equivalent desplaçant un altre número de posicions. Com que és molt curt, el poso directament aquí per si algú el troba interessant:

#! /usr/bin/perl -s

if ($h) {   print<<"INFO"; $0 - Caesar cypher Usage: $0 [-d] [NUM] Reads from stdin, outputs to stdout. NUM is the letter shift (default is 3). Use -d for decypher. INFO   exit 0; }
$f = $d ? -1 : 1; $s = shift; $s = 3 unless defined $s;
while (<>) {   y/a-z/A-Z/;   y/A-Z//dc;   $o .= $_; }
$o .= 'X' while length ($o)%5; $o =~ s/./chr((ord($&)-ord('A')+$f*$s)%26+ord('A'))/eg; $o =~ s/(.{5})/$1 /g; print "$o\n";

Tallant i enganxant pdfs des de la lÝnia de comandes

Perl — 26 Marš 2009, 23:08

Accade a volte... que has d'agafar una pàgina o dues d'un pdf i fer-ne un de nou, o enganxar-les amb dues altres pàgines d'un pdf. La cosa es pot arribar a fer pesada, creieu-me, si tens uns quants arxius. Així que se t'acut: anem a fer un petit script per anar rapidets i acabar aviat la feina. Busques una mica i trobes que hi ha una PDF Concatenation and Extraction Tool escrita en perl molt útil. Llavors fas un petit script que la cridi i l'utilitzi per agafar la primera i l'última pàgina de tots els pdfs d'un directori i les enganxi una darrera l'altra, utilitzant el meravellós mòdul PDF::API2:

#! /usr/bin/perl
 
use PDF::API2;
 
$suf = "-firstlast";
 
@fs = `ls -1`;
$num = $#fs+1;
$i = 1;
$in = "";
 
print "Processing $num files:\n";
 
foreach $f (@fs) {
    chop ($f);
    print "[$i/$num] $f "; ++$i;
    $pdf = PDF::API2->open($f);
    $lastp = $pdf->pages;
    $out = $f;
    $out =~ s/\.pdf//;
    $out .= $suf . ".pdf";
    system ("pdfcat",
        "--input", "$f",
        "--pages", "1,$lastp",
        "--output", "$out");
    print "---> $out\n";
    $in .= " --input " . $out;
}
 
print "Concatenating all to `all-firstlast.pdf'\n";
 
`pdfcat $in --output all-firstlast.pdf`;
 
print "Done\n";

En fi, és molt útil. Però al final no l'he pogut fer servir pel que necessitava, així que espero que almenys a algú li estalviï una mica més de temps que a mi.


Noms d'arxiu amb espais en el latex2html

LaTeX, Unix, Perl — 13 Marš 2009, 23:46

LaTeX2HTML és un convertor que processa arxius .tex de LaTeX i genera pàgines web HTML. Està molt bé, però té un bug: quan es processa un arxiu amb espais en el nom o en la ruta té problemes i retorna un error:

texexpand V2002-2-1 (Revision 1.11)
texexpand: Error: More than one input file specified.
texexpand  failed: No such file or directory

He preparat un petit script en perl que rudimentàriament soluciona el problema fent un link des d'un directori temporal que no tingui espais en el nom, corrent el latex2html en aquell directori i movent els resultats cap al directori inicial. Espero que sigui útil.

Per utilitzar-lo n'hi ha prou amb guardar-lo en un directori des d'on es pugui exectuar. Jo, per exemple, el tinc al directori bin del meu home, ~/bin, i al ~/.bashrc hi tinc afegida la línia

export PATH=${PATH}:${HOME}/bin

Ho tinc en aquest ordre perquè en general sempre és més recomenable buscar els executables als directoris per defecte, com /bin, /usr/bin, etc. Llavors definint un alias

if [ -x $HOME/bin/latex2html ]; then
    alias latex2html="$HOME/bin/latex2html"
fi

n'hi ha prou per a que cada vegada que cridem el latex2html des de la consola ens executi el nostre petit script.


Powered by LifeType