venerdì 30 maggio 2008

i-SOBOT shoots an arrow.

Che sia ora di imparare da lui a tirare con l'arco?

giovedì 29 maggio 2008

PGDay 2008

L'organizzazione del PGDay 2008 procede, anche quest'anno io mi occuperò di coordinare il gruppo per la revisione degli interventi.
Devo dire che mi aspettavo sarebbe stato più semplice il lavoro, avendo già molta roba da ereditare da quello precedente, ma anche quest'anno c'è parecchio da fare. Ma la voglia non manca!

venerdì 16 maggio 2008

Tributo a Darrell Pace

Resto sempre ipnotizzato da questo video, e soprattutto dal rilascio di Mr. Pace che appare così rilassato e naturale da fare veramente invidia.

Non credo sia semplice per chiunque raggiungere questo tipo di rilascio così naturale con la mano che scivola dietro alla testa senza mai allontarsi troppo dal collo e le dita che naturalmente si aprono rilassate. Impressionante poi l'istante in cui scatta il clicker, e qualche attimo dopo la freccia che parte velocissima senza interferenze. Veramente un grandissimo tiratore!
Attenzione che i primi frame non mi sembrano riferiti al clicker di Pace, il video per me diventa spettacolare dal secondo 0:09 in poi.

Bloccare le connessioni MSN

Quello che mostro qui di seguito è uno script shell che aggiunge delle regole ad un gateway Linux dotato di iptables per bloccare le connessioni MSN. Da notare che prima viene creata una catena di log, sulle quali sono poi loggate le connessioni, e poi si procede a bloccare le connessioni verso i principali host del servizio MSN.

#!/bin/bash

# Blocca le connessioni MSN

IPTABLES_CMD=`which iptables`
FIREWALL= # indirizzo IP del gateway
EXT_INTF=eth1
INT_INTF=eth0
LAN=192.168.1.0/255.255.255.0 # indirizzo della lan
PORT=1863
LOG_CHAIN="log_messenger" # nome della catena di log
LOG_PREFIX=`basename $0` # prefisso da attribuire ai messaggi di log, pari al nome
# di questo script, cosi' e' facile individuare lo script che blocca

echo "Creazione del blocco per MSN..."

$IPTABLES_CMD -N $LOG_CHAIN -v
$IPTABLES_CMD -A $LOG_CHAIN -j LOG --log-level debug --log-prefix "{ $0 } " -v
$IPTABLES_CMD -A $LOG_CHAIN -j DROP -v


echo "non viene utilizzato il blocco per MSN, riabilitare il file $0"
exit

# Drop della porta standard di MSN per i forward
$IPTABLES_CMD -A FORWARD -p tcp --dport $PORT -j DROP

# creo una nuova catena per bloccare MSN
$IPTABLES_CMD -N MSNDENY > /dev/null
$IPTABLES_CMD -F MSNDENY
$IPTABLES_CMD -I MSNDENY -d 65.54.183.203 -j ACCEPT # login.live.com
$IPTABLES_CMD -I MSNDENY -d 65.54.179.203 -j ACCEPT # login.live.com
$IPTABLES_CMD -I MSNDENY -d 65.54.208.221 -j ACCEPT # help.live.com
$IPTABLES_CMD -A MSNDENY -d 64.4.13.0/24 -j $LOG_CHAIN
$IPTABLES_CMD -A MSNDENY -d 64.12.163.0/24 -j $LOG_CHAIN
$IPTABLES_CMD -A MSNDENY -d 65.54.0.0/16 -j $LOG_CHAIN
$IPTABLES_CMD -A MSNDENY -d 152.163.241.0/24 -j $LOG_CHAIN
$IPTABLES_CMD -A MSNDENY -d 207.46.1.0/24 -j $LOG_CHAIN
$IPTABLES_CMD -A MSNDENY -d 207.46.110.0/24 -j $LOG_CHAIN
$IPTABLES_CMD -A MSNDENY -d 207.46.96.153 -j $LOG_CHAIN # messenger.hotmail.com
$IPTABLES_CMD -A MSNDENY -d 80.67.86.64/28 -j $LOG_CHAIN # msgr.dlservice.microsoft.com
$IPTABLES_CMD -A MSNDENY -d 193.238.160.0/24 -j $LOG_CHAIN # www.ebuddy.com
$IPTABLES_CMD -A MSNDENY -d 8.6.13.62 -j $LOG_CHAIN # www.ebuddy.com
$IPTABLES_CMD -A MSNDENY -d 66.150.161.128/28 -j $LOG_CHAIN # www.webmessenger.co.uk
$IPTABLES_CMD -A MSNDENY -d 69.25.27.160/28 -j $LOG_CHAIN # www.webmessenger.co.uk
$IPTABLES_CMD -A MSNDENY -d 216.129.112.0/24 -j $LOG_CHAIN # www.meebo.com
$IPTABLES_CMD -A MSNDENY -d 65.19.140.246/24 -j $LOG_CHAIN # www.meebo.com
$IPTABLES_CMD -A MSNDENY -d 216.32.64.0/19 -j $LOG_CHAIN # iloveim.com
$IPTABLES_CMD -A MSNDENY -d 209.67.208.0/20 -j $LOG_CHAIN # iloveim.com
$IPTABLES_CMD -A MSNDENY -d 72.232.0.0/16 -j $LOG_CHAIN # iloveim.com
$IPTABLES_CMD -A MSNDENY -d 72.36.128.0/17 -j $LOG_CHAIN # iloveim.com
$IPTABLES_CMD -A MSNDENY -d 194.109.193.71 -j $LOG_CHAIN # www.onlinemessenger.nl
$IPTABLES_CMD -A MSNDENY -d 72.36.128.0/17 -j $LOG_CHAIN # iloveim.com

# blocco MSN
$IPTABLES_CMD -I FORWARD -j MSNDENY


venerdì 9 maggio 2008

Sostituzione di stringhe tramite espressione regolare

PostgreSQL mette a disposizione una comoda funzione, regexp_replace, che come la sua cugina replace consente di cambiare una stringa con un'altra facendo un azione di pattern matching basato su espressione regolare POSIX.

Supponiamo di dover cambiare tutti i campi codice di una tabella ove i codici finiscano con la stringa ABCDEFG oppure DEFG, sia in minuscolo che in maiuscolo. Una soluzione può essere la seguente:

update myTable set codice = regexp_replace( upper(codice), '(ABC)*DEFG$', '')
where upper(codice) ~ '(ABC)*DEFG$'
dove si ricercano i record che finiscono con ABCDEFG oppure solo DEFG e si sostituisce l'occorenza trovata con una stringa vuota. Per riuscire a fare la sostituzione sia nel caso di maiuscole/minuscole, si noti come il codice viene comunque trasformato in maiuscolo (tramite upper) e come si confronti la stringa con una espressione regolare in maiuscolo.

Va notato che nel caso la stringa da sostituire sia presente più di una volta, come ade esempio DEFGDEFG, è necessario usare un quantificatore nell'espressione regolare, che quindi diventa:

update myTable set codice = regexp_replace( upper(codice), '(ABC)*(DEFG)+$', '')
where upper(codice) ~ '(ABC)*(DEFG)+$'
in questo caso viene sostituita ogni occorrenza (da una a più) della stringa DEFG.

Ovviamente è bene eseguire questo update all'interno di una transazione.

giovedì 8 maggio 2008

Organizzare i file sulla base del loro nome

Il programma che presento qui è un semplice script shell che organizza i file in cartelle a seconda del loro nome, che viene usato come chiave parlante.

Supponendo di avere una serie di file in formato PDF (e con estensione .pdf), il cui nome è composto da un prefisso identico (statistiche-), da un codice che identifica una tipologia (es. 03000123), e dalla data di generazione del file o della statistica (in formato gg_mm_yyyy_) , tutti contenuti nella medesima cartella. Questi file devono essere archiviati in una directory diversa, con nome pari all'anno presente nel file (yyyy) e al suo interno a sua volta in una cartella con nome pari al codice del file. In altre parole il file:

statistiche-03000123-19_07_2008.pdf

deve essere archiviato come segue (creando le eventuali directory che non esistono):

2008/03000123/statistiche-03000123-19_07_2008.pdf

Di seguito lo script che opera lo spostamento. Da notare l'utilizzo del comando sed(1) per la separazione della stringa nome file nelle sue componenti, come pure la creazione delle directory con flag -p.


#!/bin/bash

# directory base ove lavorare
BASE_DIR=/mnt/pdf
ANNO=`date +'%Y'`


# se l'utente specifica un argomento allora
# considero che il primo argomento sia la directory
# di lavoro
if [ $# -ge 1 ]
then
BASE_DIR=$1
fi


# controllo che la directory di lavoro esista
if [ ! -d "$BASE_DIR" ]
then
echo "La directory di lavoro $BASE_DIR non esiste"
exit 1
fi


# entro nella directory di lavoro
cd "$BASE_DIR"

for f in *.pdf
do
# nome di base del file, dal quale ricavare le informazioni
FILE=`basename "$f" ".pdf"`

# etsraggo il codice dal nome del file
CODICE=`echo $FILE | sed 's/statistiche-\(.*\)-\(.*\)/\1/'`

# estraggo l'anno di pertinenza dalla data di stampa contenuta
# nel nome del file
ANNO=`echo $FILE | sed 's/statistiche-\(.*\)-[0-9][0-9]_[0-9][0-9]_\([0-9][0-9][0-9][0-9]\)/\2/'`

# la directory di destinazione di questo file
# e' data dall'anno e dal codice
DIR=$ANNO/$CODICE

if [ ! -d "$DIR" ]
then
mkdir -p $DIR >/dev/null 2>&1
fi

# sposto il file
mv $f $DIR -v
done


lunedì 5 maggio 2008

Considerazioni su varargs

Con l'avvento di Java 5 sono comparse le funzioni varargs, ossia metodi che accettano un numero indefinito di parametri. In questo post non mi soffermo sui dettagli tecnici, bensì su alcune considerazioni concettuali.

Mediante varargs molti programmatori hanno erroneamente capito che per passare un numero qualsiasi ed eterogeneo di parametri si dovesse dichiarare un metodo come varargs. FALSO! Esistono molti modi per passare più di un parametro ad un metodo, primo fra tutti l'uso di una mappa o dictionary (ad esempio Properties), che risulta più compatto, più leggibile, uniforme, estendibile e altrettanto efficiente. Inoltre va considerato che tipicamente un metodo dovrebbe avere 3-4 parametri, per motivi di leggibilità ed efficienza, e quindi mi sento di sconsigliare l'utilizzo di metodi varargs ove non strettamente indispensabile, preferendo a questi metodi che accettino contenitori di parametri (come appunto i dizionari).

Smontare cartelle SMB bloccate

Mi è capitato spesso di avere condivisioni SMB montate da un server Linux in locale che, per problemi di stabilità della rete, risultassero bloccate. Qualsiasi operazione di apertura/lettura/scrittura di un file risultava in un I/O error. Smontare la cartella risultava impossibile poiché altri processi stavano tendando di aprire file sulla condivisione, e nemmeno un umount -f riusciva nello scopo.

Ho poi scoperto che l'opzione -l di umount funziona per il mio scopo: con quella opzione il kernel viene ingannato, nel senso che pensa che il filesystem sia stato smontato, anche se le ultime sincronizzazioni con il file system remoto non sono avvenute. In questo modo è possibile procedere ad un remount immediato e ottenere il file system nuovamente funzionante.

Un'opzione pericolosa, ma utile in diverse situazioni!