Quickloox

Dal mondo Apple all'universo digitale, in visualizzazione rapida dell'ovvio

25 ago 2009

AppleScript rotante

Una delle sfide che ho lanciato su Macworld in edizione estiva consisteva nel riscrivere in AppleScript il sistema di cifratura Rot13. Cifratura per ridere (si cambia ogni carattere con il carattere che sta tredici posti più in là nell’alfabeto di ventisei lettere), ma formalmente cifratura e buon esercizio di programmazione di base.

Paolo Falcoz ha raccolto la sfida e si è guadagnato settanta punti mela. Congratulazioni!

Il suo AppleScript segue qui sotto. Tutti i programmi del mondo possono essere migliorati e dunque si può fare buon esercizio a partire dal suo. Primi suggerimenti: un box di dialogo che informi dell’operazione compiuta e di dove si trova il file generato. Più impegnativo e interessante, la possibilità di scrivere direttamente un messaggio da convertire.

Siccome lo script è bello lungo, oltre a metterlo qui sotto l’ho reso disponibile in un Notebook di Google. Forse si copia e incolla meglio.

Non bastasse, il file Rot13 in AppleScript si trova nella cartella Public del mio iDisk, nome utente lux.

Ho detto abbastanza. Adesso manca la macchina Enigma in AppleScript! :-)

– dichiariamo le tabelle di lookup global lowerCharactersList global upperCharactersList global indexOfLowerA global indexOfUpperA

set lowerCharactersList to ¬ {“a”, “b”, “c”, “d”, “e”, “f”, “g”, “h”, “i”, “j”, “k”, “l”, “m”, “n”, “o”, “p”, “q”, “r”, “s”, “t”, “u”, “v”, “w”, “x”, “y”, “z”}

set upperCharactersList to ¬ {“A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K”, “L”, “M”, “N”, “O”, “P”, “Q”, “R”, “S”, “T”, “U”, “V”, “W”, “X”, “Y”, “Z”}

set indexOfLowerA to id of “a” set indexOfUpperA to id of “A”

try – chiediamo all’utente quale file vuole codificare/Decodificare set originalFileName to choose file with prompt ¬ “Choose file to encrypt” default location (path to documents folder) – creiamo un handler al file da codificare/decodificare set originalFileHandler to open for access originalFileName – leggiamo tutto il file – usa “read from 1” legge il file dalla prima posizione alla fine – usa “as text” per indicare come interpretare i dati set originalContent to read originalFileHandler as text – chiudiamo l’accesso al file close access originalFileHandler – inizializza output set encContent to “ – sostituiamo le lettere utilizzando la lookup – ciclo su tutti i caratteri repeat with i from 1 to length of originalContent – sostituisci i caratteri set encContent to encContent & lookUpChar(character i of originalContent) end repeat – creiamo un file .out con il testo codificato/decodificato set newFileName to (originalFileName as text) & “.out” set newFileHandler to open for access newFileName with write permission write encContent to newFileHandler as text close access newFileHandler on error errText number errnum display dialog “Error [” & errnum & “], " & errText end try

– funzione di lookup on lookUpChar(c) set lupC to “ considering case – considera solo caratteri alfabetici, case sensitive if c is in lowerCharactersList then – prendiamo codice ASCII e lo centriamo in zero set intC to (id of c) - indexOfLowerA – regola è (ch+13)mod lunghezza lista +1 set intC to (intC + 13) mod (count lowerCharactersList) + 1 – teniamo conto dello zero if intC = 0 then set intC to 1 end if set lupC to item intC of lowerCharactersList else if c is in upperCharactersList then set intC to (id of c) - indexOfUpperA set intC to (intC + 13) mod (count upperCharactersList) + 1 if intC = 0 then set intC to 1 end if set lupC to item intC of upperCharactersList else set lupC to c end if end considering return lupC end lookUpChar

Commenta