Archivio tag: Linux

Effetti collaterali spaziotemporali

Per chi non l’avesse capito, quanto scritto nell’articolo immediatamente precedente questo, è da interpretare come un effetto collaterale della data. Insomma, è un pesce d’aprile. Poco credibile, visto che SuperPunk lo ha smascherato dopo appena pochi minuti, mentre Serendippo c’era quasi cascato, ma poi si è ripreso. Spero di non aver seriamente traumatizzato nessuno.

La mia posizione su Vista è ancora molto prudente. Le mie idee le conoscete già (vedi qui, qui, qui, qui e qui).

Certamente le critiche che vanno per la maggiore a Vista sono, secondo me, ovvio, insostenibili. Nel senso che si contestano difetti che in realtà difetti non sono. Ci si lamenta che le cose non sono al solito posto, ma lo stesso è successo per Windows XP, e per Windows 2003 server. Ci si lamenta che è lento e richiede molte risorse, ma si dimentica di fare il normale “tuning” che si fa in ogni sistema operativo appena installato. Ci si lamenta delle nuove misure di sicurezza, troppo “intrusive”.

Ora, a parte la classica inclinazione, a quanto pare non solo italiana, a lamentarsi di tutto, ci sono delle critiche da fare a Vista, ma da tutto un altro punto di vista (scegliere un altro nome no, eh Bill?).

Le mie personali critiche riguardano tre punti principali: le strategie di sicurezza, l’uso smodato della crittografia e il “tutto installato, tutto acceso”.

Le strategie di sicurezza potevano essere finalmente indirizzate verso la corretta gestione da parte dell’utilizzatore finale degli account amministrativi, ossia educare gli utenti a non essere sempre e comunque amministratori, che è la prima causa di tutti i problemi di sicurezza di tutte le versioni di Windows. Invece no. La strada scelta è di aggiungere controllori “automagici” che rilevano una operazione potenzialmente pericolosa e chiedono conferma all’utente prima di proseguire. Strada seguita ad esempio dai personal firewall, che quando arriva una cosa nuova che vuole uscire chiedono all’utente, che spesso ne sa meno di loro, che di solito clicca su “abilita” e “ricorda impostazione”. Alla fine è inutile. Ce ne sono altri di esempi, ma il succo è questo: si poteva andare in una direzione nuova, ma si è scelto di blindare la vecchia. Le conseguenze saranno evidenti fra qualche tempo, quando i creatori di malware avranno preso confidenza con Vista, e Windows XP perderà una consistente fetta delle installazioni per obsolescenza. Il che vuol dire: quando Vista diventerà l’unico bersaglio dei creatori di malware. Non dovremo aspettare molto.

La crittografia è uno dei pilastri portanti in Vista: viene usata dappertutto. Firme crittografiche, certificati, cifratura, ma la parte più consistente, quella che ha richiesto più lavoro e che si mangia più risorse, è la gestione della protezione del diritto d’autore, ossia la verifica di autenticità dei contenuti multimediali. Il DRM (con il cugino TPM) sono in Vista due pachidermi obesi di crittografia. Per i meno preparati, la crittografia è un mostro mangiatore di risorse di elaborazione: processore e memoria. La pesantezza di Vista e la grande richiesta di risorse necessaria per il funzionamento è in gran parte da imputare alla presenza di queste tecnologie per la protezione dei diritti di altri. Ecco uno dei motivi della pesantezza di Vista.

Al momento dell’installazione ben poca scelta viene lasciata, secondo la filosofia (in parte giustificata…) che l’utente non solo non ne sa abbastanza, ma non è in grado di decidere. Quindi viene installato e attivato tutto. Ma proprio tutto. Succede fin dai tempi di Windows XP e con Vista peggiora. Ora, a parte l’effettiva utilità di molti componenti, il fatto che non sia messo a disposizione dell’utente un modo per togliere i componenti inutilizzati lo trovo estremamente limitante, oltre a portare lo spazio occupato sui dischi a livelli mai visti prima. Ed il dover ricorrere a programmi di terze parti come vLite per alleggerire la situazione non è certo la strada migliore, oltre ad essere molto probabilmente fuori da qualsiasi best practice di Microsoft.

In conclusione, se vogliamo criticare Vista, di motivi ce ne sono, ma certamente non quelli più spesso letti e sentiti in giro.

Per approfondire

Le strategie di sicurezza in Vista: Joanna Rutkowska, badvista, Coding Horror.

Vista e DRM/content protection: Bruce Schneier, no1984.org e il costo del DRM.

Database, campi ad autoincremento ed INSERT

Mi trovo, mio malgrado, a sviluppare una applicazione web in PHP per gestire un impianto. Le ragioni che mi hanno portato a questo sono troppo lunghe da spiegare, per cui andiamo al sodo.

Alle spalle dell’applicazione vi è un database PostgreSQL per mantenere lo stato e la coerenza del flusso di lavorazione (è una applicazione di gestione di processo). Alcune tabelle nel database hanno un campo ad autoincremento, che in PostgreSQL è definito dal tipo serial (esiste anche in MySQL ed è un alias equivalente a: BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE). Questo campo ha la caratteristica interessante che al momento di una query INSERT se viene omesso dai dati da inserire nel nuovo record, viene assegnato automaticamente da PostgreSQL con l’intero successivo all’ultimo usato, partendo da 1. Per intenderci: il primo INSERT lo assegnerà al valore 1, il secondo al 2, il terzo a 3 e via così. Questo garantisce che non vi saranno duplicati, e quindi il campo si può usare come identificativo univoco. Tant’è che nelle tabelle in questione il campo l’ho chiamato ID, con la solita mancanza di fantasia.

Fin qui nulla di strano, ma… Dopo una query di INSERT, a parte controllare se sia andata a buon fine, se mi serve di sapere quale ID è stato assegnato al record inserito come faccio? Sulle prime avevo ingenuamente (e molto inespertamente) pensato di fare una query con gli stessi valori inseriti e vedere che ID mi restituiva. Ma vi potevano essere record con valori uguali tranne l’ID, quindi questa soluzione non va. Poi ho pensato di usare il MAX sull’intera colonna degli ID, ed anche qui vi potevano essere parecchie controindicazioni.

Poi, come sempre accade, invece di smanettare a cervello spento, mi sono fatto la domanda chiave: possibile che non esista una funzione nativa apposita? Ebbene, esiste ed è proprio quello che serve, oltre ad essere assolutamente corretta anche in caso di inserimenti multipli concorrenti sulla stessa tabella. La funzione è currval in PostgreSQL e LAST_INSERT_ID in MySQL. In entrambi i database la funzione è isolata per connessione al database, quindi anche in caso di utilizzo concorrente con query di INSERT parallele, il valore restituito è coerente. Se si avessero dei dubbi, basta consultare la documentazione in merito, e alla peggio ricorrere ad una transazione per isolare l’operazione.

Come si usa è presto detto: appena dopo una query di INSERT, si controlla se è andata a buon fine, poi si esegue questa query (per PostgreSQL):


SELECT currval(tabella_id_seq) as id;

che andiamo a spiegare. Al momento della creazione di una tabella che contiene un campo di tipo serial, PostgreSQL crea implicitamente un oggetto sequence, che altro non è che un numero intero che conserva l’ultimo valore usato nel rispettivo campo di tipo serial. Il nome assegnato all’oggetto sequenza è il nome della tabella, seguito dal nome del campo e dalla stringa “seq”, separati da un segno di underscore. Se ad esempio la tabella si chiama libri ed il campo al suo interno di tipo serial si chiama idlibro, la sequenza implicitamente creata avrà come nome: libri_idlibro_seq. Quindi la query specifica per questa tabella per conoscere l’ultimo valore di idlibro generato da PostgreSQL sarà:


SELECT currval(libri_idlibro_seq) as ultimoid;

Molto più semplice che inventarsi funzioni apposite (dal funzionamento quanto mai incerto), o peggio inventare l’acqua calda, ossia scrivere codice per una funzione che esiste già nativa sul software che andiamo ad utilizzare.

Riferimenti

  • Il manuale di PostgreSQL
  • Il manuale di MySQL
  • Il manuale di PHP, alla voce pg_last_oid(), che indirizza alla funzione giusta, ossia currval

VPN tra SonicWall e Linux con OpenSWAN

Per accedere al server Linux di un cliente mi sono stati forniti un client VPN ed i dati di accesso. Ovviamente il client è solo per Windows, e dovendo scambiare file con il server Linux ero costretto a fare il reboot del computer e passare a Windows, dopo aver lavorato i file con Linux. Insomma, un bagno di sangue.

Smanettando per qualche ora sono riuscito a far funzionare OpenSWAN con l’appliance SonicWall, di cui, per non precisati motivi di sicurezza, non mi è stato fornito alcun dettaglio: modello, configurazione, tipo di VPN, algoritmi. Praticamente ho dovuto fare tutto da solo.

Ecco il risultato della battaglia.

Continua a leggere

Aggiungere interfacce grafiche agli script shell #3

In questa terza puntata vediamo come Zenity ci può aiutare con i file.

L’opzione è --file-selection, ed accetta l’opzione generale --title per dare il titolo alla finestra che appare:


$ zenity  --file-selection --title="Prendi un file"

Questo il risultato:

Zenity File Selection 1

Al solito il valore di ritorno è true, ossia zero, se si preme il pulsante OK, false, diverso da zero, se si preme il pulsante Annulla o si chiude la finestra. Il file scelto viene stampato sullo standard output con il path completo. Se dalla finestra mostrata in figura scelgo il file avatar.png all’uscita di Zenity con la pressione del tasto OK viene stampato:


$ zenity  --file-selection --title="Prendi un file"
/home/mario/Desktop/avatar.png

Ecco un breve script shell che mostra come usare la selezione file di Zenity:


#!/bin/bash

# mostra la finestra di selezione file e assegna il file scelto 
# che zenity manda allo standard output alla variabile "filescelto"
# notare i "backtick" -> ` `
filescelto=`zenity --file-selection --title="Zenity: seleziona un file"`

# prende il valore di ritorno del comando precedente
ritorno=$?

# controlla se si è premuto OK o Annulla
if [ "$ritorno" -ne 0 ]; then
  # è stato premuto annulla o chiusa la finestra
  zenity --warning --title="Test di Zenity" --text="Hai annullato"
  exit 1
else
  # è stato premuto OK
  zenity --info --title="Test di Zenity" --text="Hai scelto il file: '$filescelto'"
fi

Lo script è disponibile qui.

La directory di partenza è quella attuale, ma è possibile cambiarla a piacimento usando l’opzione --filename=FILE, mettendo al posto di FILE il percorso voluto, completo di barra finale se è una directory:


$ zenity  --file-selection --title="Prendi un file" --filename=/usr/share/doc/

Mostra questa finestra:

Zenity File Selection 2

Usato in questo modo permette di scegliere un solo file. Se vogliamo selezionare più file possiamo usare le due opzioni --multiple e --separator=C dove C è il carattere che vogliamo venga utilizzato per separare i file fra loro nell’output, quello predefinito è la barra verticale (il pipe, ‘|‘). Per selezionare più file basta tenere premuto il tasto Control (Ctrl) mentre si puntano i file con un clic del mouse.

Se invece vogliamo restringere la selezione solo alle directory, si usa l’opzione --directory. In questo caso i file saranno visualizzati in grigio e non saranno selezionabili. Vale anche per le directory l’opzione --multiple.

Se intendiamo salvare un file, le finestre di dialogo mostrare non aiutano, perché non permettono di digitare il nome di un file. Basta però utilizzare l’opzione --save, ed appare la consueta finestra di dialogo del salvataggio file. Il file non viene creato, e si può controllare l’esistenza di un file con lo stesso nome includendo l’opzione --confirm-overwrite. In questo caso se viene scelto un file già esistente viene proposto un messaggio di avvertimento:

Zenity File Selection 3

Se si risponde Annulla si rimane nella finestra di selezione e si può scegliere un altro nome, mentre se si preme Sostituisci, Zenity ritorna con il nome del file scelto. Il file non viene comunque toccato, sta a noi decidere il suo destino nel resto dello script shell.

Combinando invece le due opzioni --save e --directory, il comportamento cambia: il nome che viene scritto è inteso come nome di directory, che viene creata immediatamente alla pressione del tasto OK.

Invece l’opzione --multiple è incompatibile con la modalità salvataggio, ed è ignorata con l’emissione di un messaggio di avvertimento.

Aggiungere interfacce grafiche agli script shell #2

Nella prima parte abbiamo visto come porre una semplice domanda e come notificare all’utente lo stato dell’esecuzione in uno script shell.

In questa seconda parte ci occuperemo della possibilità offerta da Zenity di manipolare l’input e l’output di testo.

Per avere un input dall’utente in forma di testo scritto, l’opzione da usare è --entry, in questo modo:


$ zenity --entry --title="Un input di testo" --text="Inserisci qualcosa"

Il cui risultato è:

Zenity Entry Dialog 1

Possiamo decidere la dimensione della finestra di dialogo con l’opzione --width=N dove N è la larghezza totale in pixel, e possiamo fornire un testo predefinito già inserito nella casella con l’opzione --entry-text=stringa, come in questo esempio:


$ zenity --entry --width=300 --title="Un input di testo" --text="Inserisci qualcosa" --entry-text="Questo è già dentro"

Il cui risultato è:

Zenity Entry Dialog 2

Il testo digitato viene stampato nello standard output alla pressione del pulsante OK, mentre niente viene restituito se si preme il pulsante Annulla. Contestualmente, il valore di ritorno è zero (true) se si preme OK e diverso da zero se si preme annulla o si chiude la finestra dal pulsante nella barra del titolo.

Ecco un pezzetto di codice in Bash che distingue fra le varie situazioni:


#!/bin/bash

# mostra la finestra di dialogo e assegna quello che zenity manda allo
# standard output alla variabile "varstringa"
# notare i "backtick" -> ` `
varstringa=`zenity --entry --width=300 --title="Zenity: input di testo" --text="Inserisci qualcosa"`

# prende il valore di ritorno del comando precedente
ritorno=$?

# controlla se si è premuto OK o Annulla
if [ "$ritorno" -ne 0 ]; then
  # è stato premuto annulla o chiusa la finestra
  zenity --warning --title="Test di Zenity" --text="Hai annullato"
  exit 1
else
  # è stato premuto OK
  zenity --info --title="Test di Zenity" --text="Hai scritto: '$varstringa'"
fi

Il codice è anche qui.

Una ulteriore opzione, --hide-text, permette di nascondere il testo durante la digitazione come durante l’inserimento di una password:


$ zenity --entry --title="Input nascosto" --text="Inserisci una password" --hide-text

Il cui risultato, digitando qualcosa, è:

Zenity Entry Dialog 3

Se invece di una singola riga vogliamo mostrare un testo lungo, come ad esempio un file di log, l’opzione da usare è --text-info, nella sua forma più semplice:


$ zenity --text-info --title="Vedere un intero file" --filename zenity-entry-02

che mostra il file zenity-entry-02 all’interno di una finestra:

Zenity Text 1

L’opzione --filename permette di specificare un file da mostrare. Se si vuole poter cambiare il contenuto mostrato si può usare l’opzione --editable che consente modifiche al testo mostrato, con queste limitazioni:

  • Non si ha praticamente nessuna funzione avanzata di editing.
  • Le righe troppo lunghe vengono spezzate solo a video, mandandole a capo. Nell’output rimangono invece integre.
  • Il file non viene modificato. Il testo completo viene stampato sullo standard output, e tocca a noi catturarlo e dirigerlo su un altro file.

Se poi avete esperienza di shell script saprete anche che usando questo comando:


$ zenity --text-info --filename zenity-entry-02 --editable > zenity-entry-02

si giunge ad un risultato ben diverso da quello atteso: il file zenity-entry-02 viene svuotato del contenuto e la finestra di Zenity viene mostrata vuota, perché nella ridirezione dell’output il file zenity-entry-02 viene aperto in scrittura e troncato a zero byte prima di eseguire il comando Zenity.

Il testo mostrato può anche essere fornito dinamicamente:


$ find / -name "*.pdf" | zenity --text-info --title="I file pdf sul tuo disco" 

che produce questo:

Zenity Text 2

con la lista dei file PDF che viene allungata man mano che il comando find ne trova altri.

Per ora chiudiamo qui, ma Zenity ci riserva molte altre sorprese.

Disco USB cifrato con Fedora

Dopo il furto subito poco prima di Natale 2006, dove ho perso anche un disco USB con parecchi dati dentro (i dati non li ho persi, santo backup del backup…), ho cominciato a riflettere su come evitare che in simili frangenti uno sconociuto possa venire in possesso di dati per lo meno strettamente personali, se non riservati.

Dalla mailing lista di Fedora mi è giunto un articolo sulla cifratura trasparente di dischi interi usando un sistema introdotto dalla Core 5, che ora è praticamente giunto alla maturità.

Il risultato è che il mio nuovo disco USB è cifrato, ed ho scritto anche questo articolo.

Buona lettura.

Aggiornamento del 3 ottobre 2007
Il tutto funziona sulle ultime versioni di Fedora.

Installare Flash Player 9 in Fedora Core 6

N.B.

Per versioni più recenti di Fedora e del plugin Flash, esiste un articolo aggiornato qui.

Andare sul sito di Adobe™ e scegliere il link Download per Flash Player 9. Se Firefox o Mozilla sono impostati correttamente appare una pagina che permette di scegliere fra due metodi: con file di tipo .tar.gz e con file di tipo RPM. Il secondo è certamente più pratico per chi ha Fedora.

Continua a leggere