Spigolature/1

Con questo post introduco una nuova “rubrica”, Spigolature, in cui pubblico testi, immagini e altri contenuti in genere trovati in giro su Internet, che mi hanno particolarmente colpito (usualmente in negativo). Non si tratta di niente di particolarmente innovativo, è solo che non mi va di aprire un tumblelog appositamente.

Le fotografie ed i file in genere sono scelti preferibilmente tra quelli distribuiti con licenza libera.

A questo proposito, c’è qualche novità per il nuovo sito della moschea di Milano?

No, è tutto fermo, e le dico chiaramente che non c’è nessuna intenzione di farla. Vogliamo scherzare? Combatteremo su questo fino all’ultimo perché si tratta di un atto di inciviltà nei confronti dell’identità lombarda e milanese. Milano e la Lombardia sono cristiane, cattoliche e rigorosamente di ceppo nordico-asburgico. Non abbiamo niente da imparare da gente che lapida una bambina perchè è stata stuprata da un gruppo di uomini. Berlusconi ha pienamente ragione quando dice che noi abbiamo una civiltà superiore. La nostra civiltà è superiore.

[via]

Impostare lo stato ed il messaggio di stato di Pidgin con uno script

Questo post è più un appunto che un vero HOWTO. Con lo script di cui presento il codice è possibile ottenere degli aggiornamenti mirati del messaggio di stato (e dello stato stesso) in occasione di eventi prestabiliti, ad esempio la riproduzione di un file multimediale. Per accostarvi allo scenario potete pensarlo come una versione un po’ più rozza dei plugin che, in altri programmi di messaggistica istantanea, prelevano il titolo della canzone in riproduzione da un player.

L’utilizzo di uno script esterno permette ad applicazioni che non dispongono naturalmente di una tale capacità (come il mio attuale player audio, Audacious) di cambiare il messaggio di stato di Pidgin.

Perchè tutto funzioni correttamente, è necessario che DBUS sia attivato e supportato dalla vostra copia di Pidgin. Ecco il sorgente dello script:

#!/bin/bash
APPNAME=$(basename $0)
PARAMETERS="$2 $3 $4 $5 $6 $7 $8 $9"

GREP=$(which grep)
AWK=$(which awk)
SED=$(which sed)
ECHO=$(which echo)
PURPLE_REMOTE=$(which purple-remote)
PURPLE_SEND=$(which purple-send)
PS=$(which ps)
CAT=$(which cat)
RM=$(which rm)

CURRENT_STATUS=$($PURPLE_REMOTE getstatus)
TEMPFILE_STATUS_MESSAGE=$HOME/$APPNAME.dbus-$($PS ax | $GREP -m1 "dbus-daemon" | $AWK '{ print $1 }').status-message
TEMPFILE_STATUS=$HOME/$APPNAME.dbus-$($PS ax | $GREP -m1 "dbus-daemon" | $AWK '{ print $1}').status

case "$1" in

"--backup-status" )
	if [ -f $TEMPFILE_STATUS ]; then
		$RM $TEMPFILE_STATUS
	fi
	$ECHO $CURRENT_STATUS >> $TEMPFILE_STATUS
	;;

"--backup-status-message" )
	if [ -f $TEMPFILE_STATUS_MESSAGE ]; then
		$RM $TEMPFILE_STATUS_MESSAGE
	fi
	CURRENT_STATUS_ID=$($PURPLE_SEND PurpleSavedstatusGetCurrent | $GREP int32 | $AWK '{ print $2 }')
	CURRENT_STATUS_MESSAGE=$($PURPLE_SEND PurpleSavedstatusGetMessage int32:$CURRENT_STATUS_ID | $GREP string | $SED -e "s/string//g" -e "s/\"//g" -e "s/    //g")
	$ECHO $CURRENT_STATUS_MESSAGE >> $TEMPFILE_STATUS_MESSAGE
	;;

"--set-status" )
	$PURPLE_REMOTE setstatus?status="$2"
	;;

"--set-status-message" )
	$PURPLE_REMOTE setstatus?status=$CURRENT_STATUS\&message="$PARAMETERS"
	;;

"--safe-set-status" )
	if [ ! -f $TEMPFILE_STATUS ]; then
		$0 --backup-status
	fi
	$0 --set-status $2
	;;

"--safe-set-status-message" )
	if [ ! -f $TEMPFILE_STATUS_MESSAGE ]; then
		$0 --backup-status-message
	fi
	$0 --set-status-message $PARAMETERS
	;;

"--clear-status" )
	$0 --set-status ""
	;;

"--clear-status-message" )
	$0 --set-status-message ""
	;;

"--restore-status" )
	OLD_STATUS=$($CAT $TEMPFILE_STATUS)
	$0 --set-status "$OLD_STATUS"
	if [ -f $TEMPFILE_STATUS ]; then
		$RM $TEMPFILE_STATUS
	fi
	;;

"--restore-status-message" )
	OLD_STATUS_MESSAGE=$($CAT $TEMPFILE_STATUS_MESSAGE)
	$0 --set-status-message "$OLD_STATUS_MESSAGE"
	if [ -f $TEMPFILE_STATUS_MESSAGE ]; then
		$RM $TEMPFILE_STATUS_MESSAGE
	fi
	;;

*)
	$ECHO "$APPNAME: Wraps itself around the Pidgin command line utilities to (re)set, backup and restore"
	$ECHO "the status message."
	$ECHO ""
	$ECHO "Hacked together by Emanuele Cipolla <bugs @emanuelecipolla.net>, 2008."
	$ECHO "This script is released into the public domain."
	$ECHO ""
	$ECHO "WARNING: You _have to_ use a single option per run, no verification or simultaneous execution"
	$ECHO "is made."
	$ECHO ""
	$ECHO "SYNOPSIS: $APPNAME [--backup-status]"
	$ECHO "[--backup-status-message]"
	$ECHO "[--set-status] [[status]]"
	$ECHO "[--set-status-message] [[message]] [[...]]"
	$ECHO "[--clear-status]"
	$ECHO "[--clear-status-message]"
	$ECHO "[--restore-status]"
	$ECHO "[--restore-status-message]"
	$ECHO ""
	$ECHO "--backup-status                 Backups the current status to $TEMPFILE_STATUS."
	$ECHO "--backup-status-message         Backups the current status message to $TEMPFILE_STATUS_MESSAGE."
	$ECHO "--set-status                    Sets the status."
	$ECHO "--set-status-message            Sets the status message."
	$ECHO "--safe-set-status               Sets the status after backing up the old one."
	$ECHO "--safe-set-status-message       Sets the status message after backing up the old one."
	$ECHO "--clear-status                  Resets status to \"Online\"."
	$ECHO "--clear-status-message          Sets a blank status message."
	$ECHO "--restore-status		Restores back the status from $TEMPFILE_STATUS."
	$ECHO "--restore-status-message        Restores back the status message from $TEMPFILE_STATUS_MESSAGE."
	;;
esac

Ecco, invece, come si presenta Audacious dopo essere stato configurato per l’utilizzo dello script, in seguito all’attivazione del plugin Song Change:

Lo screenshot è stato ritagliato, ma il comportamento dell'applicazione è quello

Lo screenshot è stato ritagliato

Enjoy.

Content for English-speaking readers in the works

I repeatedly noticed that a significant part of traffic coming to this website was from online translation services like Google Translate and Yahoo! Babel Fish. While the latter is completely automated, and no corrections - whether needed or not - can be submitted, I considered suggesting better translations to the service offered by Google, but I felt the whole thing was a bit awkward, so I started planning on publishing translations by my own.

They won’t be blind translations - I am going to revise the content, to avoid wasting time with information that might not be true any more or aren’t likely to be read. My statistics will be extremely helpful in figuring out what posts will get top priorities.

I think I’m not going to translate the whole site, either. While I’m mainly started looking at that  because I haven’t “fresh” new content to publish in my mother language, my time and body energies are very limited, and so are likely to be in the very near future. There are no deadlines; this posts only states that some translations will be published sometime in the future.

I’d also like to ask fellow users to post relevant comments using the language my post was written in (English, Italian, maybe Klingon) to keep the communication flow intact and make me happy. My contact form is there for you to tell me (nearly) everything else.

Esperimenti di crossposting II

Se l’esperimento andrà a buon fine, questo post (e tutti quelli che lo seguiranno) sarà sincronizzato, con un ritardo di 15 minuti al massimo, con il mio Windows Live Spaces privato.

Il feed RSS del mio sito verrà prelevato dalla copia di rss2email che il mio serverino casalingo manda in esecuzione temporizzata grazie a cron e mandato via e-mail (naturalmente usando sendmail) all’indirizzo generato da Windows Live per la pubblicazione differita di “interventi” (termine Microsoft per post) tramite dispositivo portatile. Semplice, no?

I commenti saranno attivati solo sul mio sito: sarà visualizzato un link nel corpo del post ripubblicato che condurrà direttamente al form.

Iscrizione a Bloghissimo.it

Presto i miei post di argomento informatico saranno visibili anche su Bloghissimo.it, un nuovo servizio di pubblicazione tematica secondaria (altresì detto aggregatore di feed)  che permette di ampliare il bacino di utenti del vostro sito.

Come per altri servizi di questo tipo, è possibile segnalare il proprio sito o blog - a patto che sia dotato di un feed di qualunque tipo - riempiendo un form con i dati essenziali, affinchè lo staff di Bloghissimo possa valutarne il contenuto e decidere a quale categoria/e farlo afferire. Ciò che viene chiesto in cambio è di inserire un banner o un antipixel in una locazione visibile della vostra homepage.

Naturalmente, per evitare il proliferare di contenuti difformi nelle categorie stesse, è bene che i creatori di contenuti forniscano dei feed ristretti solo alle categorie che potrebbero risultare d’interesse per i nuovi lettori, specie se utilizzano piattaforme per la pubblicazione, quali WordPress, che permettono di generare feed dinamicamente.

Potete visitare Bloghissimo.it facendo click qui.

Ritorno al passato (grafico)

Niente di grave: ho solo comprato il Custom CSS upgrade, un po’ per giocare, e ho attivato il tema Sandbox. Mentre termino di decidere che aspetto dare al sito, avrete l’impressione di essere tornati ad usare Netscape 2.0. Non è grave.

La matematica dei voti d’esame (e non solo)

Non mi sento di condividere più di tanto l’algoritmo (o almeno, non la funzione votazione()); io mi limiterei a dire che il voto è un numero che ha 2279460347 improbabilità contro 1 di essere veritiero e democratico. Voglio però celebrare la chiarezza di pensiero del commentatore Luca, che ci regala due perle che, se avessi denaro da buttare per una cornice, metterei in un quadretto sulla scrivania:

La matematica è un’opinione, ma quando qualcuno ha un’opinione molto più fica di quella di tutti gli altri questa viene universalmente accettata e prende il nome di teorema.

Per scoraggiare la nascita di eventuali opinioni più fiche, ogni teorema viene contornato dalle cosiddette dimostrazioni, cioè calcoli molto fichi che nessuno capisce (ma comunque tutti, per sembrare fichi, fanno finta di sì) e che nessuno ha quindi voglia di contraddire.

[via Uno, nessuno, centomila 2.0]

Due istantanee della realtà

1. La prima descrive, da quarant’anni a questa parte e ovviamente anche di più, che cosa pensano rettori e docenti della carne da macello che istruiscono ed esaminano, e della visione della formazione universitaria come fabbrica di semilavorati ad uso e consumo delle “aziende” e del “mercato”:

Colpiti particolarmente dall’aumento delle tasse saranno i molti che… già impiegati desiderano una laurea per passare da una categoria ad un’altra, ed ottenere così aumenti di autorità, di prestigio, di stipendio; coloro che (…) non possono tenersi al corrente con gli esami essendo già insegnanti – con stipendi discreti – nella scuola media dell’obbligo…: tutte categorie di studenti, queste, alle quali l’aumento delle tasse può certamente dispiacere, ma che sono in grado di affrontarlo agevolmente. L’università perdera studenti? Se appartenenti alle categorie suddette ne sarà oltremodo lieta.

Ma se si tratta di un’élite del merito, della capacità, dell’intelligenza (come dovrebbe esserlo ogni università), non sarà invece [l'aumento delle tasse] un enorme passo avanti, che anche le università statali potrebbero imitare fruttuosamente? Non sarebbe un fermarsi – finalmente – nella corsa verso il traguardo del “tutti laureati” (anche dei molti incapaci che ripetono un esame cinque-dieci volte, e che la legge non consente siano allontanati dalle aule universitarie) cui è diretta la nostra civiltà del benessere?

[brani di interventi dell'allora rettore dell'Università Cattolica del Sacro Cuore, Ezio Franceschini, tratti da Lettera a mio figlio sul Sessantotto di Mario Capanna, Baldini Castoldi Dalai, 2005]

2. La seconda, invece, è un’interessante statistica sulla “velocità” nel laurearsi (mutatis mutandis, la laurea triennale somiglia oramai molto ad una graduate school).

Anni che ci vogliono prima che tu possa pensare di laurearti (immagine © Jorge Cham)

Anni che ci vogliono prima che tu possa pensare di laurearti
(immagine © Jorge Cham)

[via PHD Comics]

Loro sì che hanno un amore romantico

Dico davvero.

Edit: Qui trovate altri video del programma.

Avviare rtorrent al boot su FreeBSD

rtorrent è un client BitTorrent con interfaccia testuale molto leggero che può essere lanciato in background con l’ausilio di screen o dtach. Persino la wiki ufficiale del progetto suggerisce esplicitamente come si possa avviare il programma automaticamente al boot su un sistema GNU/Linux.

Sia rtorrent che screen/dtach funzionano perfettamente anche su FreeBSD: manca però un script di init funzionante.

Quel che segue è un tentativo in tal senso che dovrebbe soddisfare le esigenze di un buon numero di utenti; le differenze rispetto ai suoi omologhi per GNU/Linux riguardano principalmente i parametri di lancio: ritengo che uno script di init non debba essere un secondo file di configurazione, che, nella fattispecie, è .rtorrent.rc.

Segue il contenuto dello script. Per utilizzarlo, piazzatelo in /usr/local/etc/rc.d/rtorrent e dategli i permessi di esecuzione con chmod +x /usr/local/etc/rc.d/rtorrent.

#!/bin/sh
#
# rtorrent RCng startup script
# by Emanuele Cipolla (mail at emanuelecipolla dot net)
# Shamelessly ripped off the aMule startup script by Gabriele Cecchetti (amule.org forum)
# 

# PROVIDE: rtorrent
# REQUIRE: NETWORKING SERVERS
# BEFORE: DAEMON
# KEYWORD: shutdown

#
# Add the following lines to /etc/rc.conf to enable rtorrent at startup
# rtorrent (bool): Set to "NO" by default.
#                Set it to "YES" to enable rtorrent
# rtorrent_user (str): Set to user running rtorrent
#                    (default 'rtorrent')
# rtorrent_home (str): Set to home directory of user running rtorrent
#                    (default /home/${rtorrent_user})

. /etc/rc.subr

name="rtorrent"
rcvar=`set_rcvar`

load_rc_config $name

[ -z "$rtorrent_enable" ] && rtorrent_enable="NO"
[ -z "$rtorrent_user" ] && rtorrent_user="rtorrent"
[ -z "$rtorrent_home" ] && rtorrent_home="/home/${rtorrent_user}"

required_dirs=${rtorrent_home}
required_files="${rtorrent_home}/.rtorrent.rc"

start_cmd="${name}_start"
stop_cmd="${name}_stop"

rtorrent_start()
{
        if [ ! -f /var/run/${name}.run ]
        then
      cd ${rtorrent_home}
       su ${rtorrent_user} -c "/usr/local/bin/screen -dmS rtorrent_init /usr/local/bin/rtorrent"
      touch /var/run/${name}.run
          echo "Started ${name}."
          echo `date` : "Started ${name}." >> /var/log/${name}.log
        else
          echo "${name} seems to be already running -- remove /var/run/${name}.run manually if needed."
        fi
}

rtorrent_stop()
{
        if [ -f /var/run/${name}.run ]
        then
          killall -INT $(echo -n 'ps aux | grep rtorrent | grep -v rtorrent_init') 2>>/var/log/${name}.log >>/var/log/${name}.log
          rm -f /var/run/${name}.run
          echo "Stopped ${name}."
          echo `date` : "Stopped ${name}." >> /var/log/${name}.log
        else
          echo "${name} doesn't seem to be running -- create /var/run/${name}.run if needed."
        fi
}

run_rc_command "$1"