Trovare le preferenze nascoste di un'applicazione.

Quella che segue è la libera traduzione dell’articolo di Rob Griffiths: How to find hidden preference settings Come trovare le impostazioni nascoste delle preferenze.

Spesso mi viene chiesto: “Dove si trovano queste preferenze nascoste?”
La mia risposta è che non è poi così difficile trovarle… se si sa dove guardare!

Prima di partire alla ricerca delle preferenze nascoste ci sono alcune avvertenze: per motivi di sicurezza è preferibile lavorare non sui file originali, ma su copie oppure, nei casi più delicati, consiglio di operare su un altro Sistema (può essere un HD esterno collegato via FireWire o proprio un altro Mac).
È anche indispensabile dotarsi di un editor di testo che supporti la funzione “Find all” (trova tutto) che mostra tutti i risultati di una ricerca in un’unica finestra; vanno molto bene due editor di testo gratuiti come Smultron o TextWrangler.
Infine c’è bisogno del Terminale… e di un po’ di spirito di avventura!
Chiarito che i processi descritti sono potenzialmente pericolosi, come esempio userò la nuova versione iTunes 8, ma il metodo descritto si può applicare a quasi tutti i programmi per OS X.

Ottenere i dati
La prima cosa da capire a proposito di preferenze nascoste è che, perché possano funzionare, devono essere inserite proprio nel codice del programma e così andremo alla ricerca di tutto il testo disperso dentro il codice per poi spulciarlo a caccia di qualche indizio.
Ovviamente non si può pretendere di aprire iTunes (l’applicazione vera e non il “pacchetto”… vedi più oltre) direttamente con TextWrangler: il risultato sarebbe una lunga serie di segni confusi e incomprensibili. Ciò perché gli editor di testo non sono fatti per leggere dati binari.

Per fortuna esiste un comando Unix chiamato strings che è in grado di tirar fuori tutto il testo da un file binario.

Ma procediamo con ordine e partiamo alla ricerca del codice binario.

Lanciamo il Terminale e digitiamo
cd /Applications/iTunes.app/Contents/MacOS e poi premiamo Invio.

Con questo comando ci siamo trasferiti (cd = change directory = cambiare directory) dentro la cartella Applicazioni e poi dentro il pacchetto iTunes e poi dentro la cartella Contents e infine dentro la cartella MacOS (un po’ come quando, con il tasto destro del mouse o con “Controllo Clic” scegliamo “Mostra contenuto del pacchetto” e ci inoltriamo nel cuore dell’applicazione).
Ora siamo dentro la cartella che ospita il file binario di iTunes 8.
Con lo stesso procedimento avremmo potuto trasferirci dentro il cuore di una qualsiasi applicazione come quella che si chiama Che Schianto Di Programma, con l’avvertenza di digitare nel Terminale il percorso esatto che porta a Che Schianto Di Programma e, nel caso di nomi che, come questo, contengono degli spazi, di chiudere il nome tra virgolette (ad esempio: “Che Schianto Di Programma.app”).

Nota: qualcuno si potrebbe chiedere se la parola “Applications” vada cambiata con “Applicazioni”. No. Il comando da Terminale funziona lasciando le parole originali inglesi.

Ora useremo il comando strings e gli diremo di scaricare il risultato del suo lavoro in un file di testo (stringhe_di_iTunes.txt) che lui stesso creerà sulla scrivania.
strings – iTunes >~/Desktop/stringhe_di_iTunes.txt

(dopo il segno “maggiore” (>) vi è la “tilde” (~); ricordo che la tilde (~) si ottiene premendo Opzioni 5).

Dopo qualche secondo (il tempo dipende dalla velocità del vostro Mac) ricompare il “prompt” cioè il rettangolino nero del Terminale che indica il punto di inserimento del testo: ciò significa che il Terminale ha svolto il suo lavoro e il file stringhe_di_iTunes è pronto per essere analizzato.

Rovistare nei dati
Da qui in avanti tutto dipende da quel che voi sapete sul bersaglio elusivo delle preferenze nascoste. Nel caso peggiore, quello di un programma completamente nuovo per il quale vi domandate se il programmatore non abbia nascosto qualcosa nel codice… beh, si tratta di un compito improbo, perché non si sa esattamente cosa cercare!
Nell’editor di testo di vostra scelta aprite il file di testo appena creato e scorretelo alla ricerca di qualche parola o frase dall’aria interessante; ma quali parole, quali frasi esattamente?
È una domanda alla quale è pressoché impossibile rispondere perché i programmi sono molto diversi l’uno dall’altro…
L’unico consiglio che posso dare è quello di tenere d’occhio le frasi-fatte-da-parole-legate-da-trattini oppure StringheDiParoleTutteAttaccateConInizialiMaiuscole.

Per esempio immaginiamo che abbiate trovato la stringa EnableTranslucentWindow (AbilitaFinestraTranslucida), se ora andate a controllare nelle preferenze del programma e non trovate nessun riferimento alle finestre translucide, è possibile che abbiate scoperto una preferenza nascosta (leggete più avanti per sapere come testarla).
Se invece di procedere alla cieca state cercando di mettere a confronto due versioni (precedente e successiva) di un medesimo programma, nel Terminale potete usare il comando diff per confrontare le due diverse stringhe, il che agevola un pochino il lavoro.

Per fortuna il caso più facile è proprio quello che abbiamo scelto noi: iTunes 8.
Memori delle preferenze che esistevano nella precedente versione 7 (che sono sparite nella 8 ), possiamo usare come parole chiave proprio le parole di quelle preferenze mancanti per facilitare enormemente la ricerca.
Consideriamo la questione delle frecce (arrow links) che indirizzano verso il negozio (store); in iTunes 7 questi collegamenti si potevano mostrare o nascondere agendo su una preferenza che si chiamava Show/Hide Links to the iTunes Store.
Facendo tesoro di questo ricordo ho usato TextWrangler per aprire il file di stringhe di iTunes appena creato; poi con Mela F ho aperto la finestra di ricerca, ho digitato links ma, invece di premere Find (che, per passare in rassegna tutti i risultati, mi avrebbe obbligato ad usare Find Again [= trova ancora] chissà quante altre volte) ho premuto Find All (trova tutto).

Find All raccoglie in una sola pagina tutti i risultati della ricerca, rendendo molto più agevole il passarli in rassegna tutti.
Scorrendo la lista dei risultati uno in particolare mi è saltato all’occhio:

Mi è bastato leggere le parole show-store-arrow-links per capire che dovevano essere quel che cercavo. Ancor meglio è la parte inferiore della finestra, che mostra il risultato nel contesto dell’intero file. Tutto attorno al mio risultato ci sono altre voci interessanti, ciascuna delle quali corrisponde ad una preferenza che è sparita in iTunes 8… è sempre bello quando si trova quel che si cerca al primo colpo!

Fare la prova
E adesso? Come si fa per sapere se queste parole trovate hanno un significato o se sono solo dei rimasugli della versione precedente, senza alcuna utilità nella versione attuale?
Bisogna provare!
Bisogna reintrodurre le preferenze dentro l’applicazione e poi lanciare il programma e vedere se il particolare che stiamo cercando di modificare è cambiato davvero.
Per fare ciò, nel Terminale bisogna usare il comando defaults write.
La complicazione qui sta nell’individuare che tipo di valore bisogna attribuire ad una data preferenza.
Semplificando un po’, una preferenza può avere fondamentalmente tre tipi di valori:
1) Booleano. È il tipo più comune e corrisponde ad un’impostazione “sì o no”. Per esempio la questione delle frecce del negozio di iTunes era un’opzione “sì o no”: c’erano (“sì”) o non c’erano (“no”). Così è possibile che “show-store-arrow-links” si aspetti un valore booleano.
2) Numerico. La preferenza si aspetta un numero (sia intero che decimale). Questo è il caso per esempio delle Preferenze di Sistema per Tastiera e Mouse nel pannello Tastiera, alla voce “Velocità ripetizione tasti”.
3) Testo. La preferenza si aspetta una stringa di testo; per esempio le preferenze del Finder per le Etichette sono righe di testo.

Per fissare la preferenza si deve usare una variante alla forma generale della sintassi del comando defaults write che è la seguente:
defaults write dominio_della_applicaz nome_della_preferenza tipo_di_valore valore

Il dominio_della_applicaz si trova andando a guardare nella Casetta/Libreria/Preferenze fino a trovare il file di preferenze associato ad una certa applicazione: per iTunes il file di preferenze è com.apple.iTunes.plist. Per ricavare il dominio basta eliminare “.plist” alla fine e così il dominio è com.apple.iTunes (attenzione che le maiuscole contano!).
Il nome_della_preferenza è la stringa appena trovata con TextWrangler e che si vuole testare.
Il tipo_di_valore è:
–bool per Booleano
-int per numero intero
–float per numero decimale
–string per riga di testo.
Infine valore è il valore che si vuole assegnare alla variabile; nel nostro caso (tutti valori booleani) il valore deve essere TRUE (vero) o FALSE (falso).

Wow! Che fatica! In pratica ho scoperto che la maggior parte delle preferenze nascoste (comprese tutte quelle di iTunes 8 ) tendono ad essere booleane.
Il passo finale prima di assegnare un valore consiste nel determinare quale valore il programma stia attualmente usando per la preferenza in questione. Nel caso dei collegamenti all’iTunes Store, essi sono abilitati, in altre parole il loro valore booleano è TRUE (vero). È per questo motivo che, per vedere se ho trovato davvero la preferenza nascosta che regola questa caratteristica, devo disabilitarli cambiando il valore booleano in FALSE.
Ecco dunque il comando da digitare nel Terminale:
defaults write com.apple.iTunes show-store-arrow-links –bool FALSE
Ora si preme Invio.
Dopo aver lanciato iTunes ed aver fatto clic su un elemento della libreria non ho più visto le frecce e così ho capito che avevo scovato la preferenza che ne è responsabile.

Ma… e se avessi fallito? Se le frecce fossero state ancora lì?
Bene, avrei capito che non era quello il comando giusto e quindi avrei dovuto eliminarlo chiudendo prima iTunes e digitando nel Terminale:
defaults delete com.apple.iTunes show-store-arrow-links (seguito da Invio).
Un comando che non funziona non fa alcun danno, però è sempre preferibile eliminare i tentativi falliti.
Ora avrei dovuto riprendere il file di stringhe di testo e tuffarmici dentro alla ricerca di qualche altro candidato…

Conclusione
Sguazzare dentro il codice binario di un’applicazione probabilmente non è il passatempo più interessante per tutti, però se avete per le mani la nuova versione di un’applicazione che avete molto amato e che sembra mancare di una caratteristica a cui avete sempre tenuto, chissà, può darsi che la caratteristica ci sia ancora, sepolta da qualche parte…

Tutorial di Hartz
Discussione sul Forum