Archivio

Articoli taggati ‘Informatica’

Content scraping con Python: l’area News dell’homepage del sito della facoltà di Lettere e Filosofia dell’Università di Palermo

27 Settembre 2009 Lascia un commento

Due anni fa, con una dose di brio in gran parte ingiustificato, vi ho parlato di come avevo estratto le news dal sito del mio corso di laurea. Dopo poco tempo sono successe due cose:

  1. Il sito di cui sopra è stato rifatto totalmente, e viene offerto un feed nativamente (cosa che è sempre la migliore).
  2. È venuto alla ribalta Yahoo! Pipes, un servizio di Yahoo! che permette di fare molte manipolazioni su contenuti disponibili sul web con grande facilità, usando un’interfaccia davvero intuitiva per la creazione di applicazioni ad-hoc, chiamate pipe.

M’interessava rendere fruibile tramite feed la sezione news del sito della facoltà di Lettere e Filosofia dell’Università di Palermo. In realtà, avrei usato una pipe anche stavolta, se non fosse che chi ha creato il sito, credo per evitare l’indicizzazione dei contenuti da parte dei motori di ricerca, ha deciso di utilizzare JavaScript per generare i link contenenti le notizie. Inoltre, i link generati aprono una pagina contenente un frame in linea, entro il quale si trova la notizia vera e propria.

Il problema principale risiede nel fatto che il componente del framework atto al prelievo delle pagine sembra rendere palese il fatto che, non essendo un browser vero e proprio, non supporta JavaScript. Se fosse possibile prelevare le pagine senza effettuare alcuna elaborazione, il problema sarebbe facilmente risolvibile; dal momento che non è questo il caso, bisogna ricorrere a soluzioni esterne.

Per continuare nella mia serie di incompiute, ho messo mano a Python. Quel che segue è il mio primo script, siate indulgenti: il fatto che sembri funzionare e fare ciò che cercavo non implica che sia il modo migliore in cui questo tipo di dati possa essere gestito.

Continua a leggere…

Spam: Poste Italiane, centering.co.kr e ilrestodelmondo.it

10 Giugno 2009 4 commenti

Sulla falsariga dei post di Giovanni – ma sicuramente con meno brio – segnalo una probabile minaccia di spam (e parziale phishing) che ho avuto l’onore di ricevere.

Se avete registrato un indirizzo @poste.it per l’uso con i servizi web di Poste Italiane, potrebbe arrivarvi un’email, apparentemente da un indirizzo di servizio di Poste Italiane, composta di sole immagini e senza alcun link ad una versione alternativa “solo testo” (già questo è sospetto: facciamo finta di nulla, altrimenti non c’è gusto) più o meno simile a questa:

In effetti, il look sembra richiamare, almeno nei “colori sociali”, Poste Italiane. Devo dire che all’inizio ero piuttosto contento di aver finalmente vinto qualcosa in un concorso, per di più senza essermi iscritto. Dopo qualche minuto la mia felicità scema, notando che:

  1. Poste Italiane utilizza il CamelCase per riferirsi agli account degli utenti (se vi deve contattare, o voi dovete loggarvi, l’identificativo è Nome.Cognome@poste.it, non Nome.cognome@poste.it.
  2. L’orario di ricezione del messaggio nel futuro (magari il mio client stavolta ha sbagliato a tenere conto dei fusi orari)
  3. Bisogna confermare la vincita su un sito con nome di dominio di secondo livello coreano (centering.co.kr). Non ho verificato cosa ci fosse effettivamente di malevolo sul sito, visto che navigo con Firefox e NoScript abilitato, per giunta su una macchina non Windows o MacOS X. Al momento il browser non me lo identifica come sorgente di phishing.
  4. Viene tirato in ballo un sito italiano (ilrestodelmondo.it) che, per quanto mi sembri offrire un programma di premi quanto e forse più sospetto di questo messaggio di posta elettronica, non mi sembra c’entri nulla.

Di seguito riporto, censurando i dati personali a me riconducibili, il contenuto vero e proprio del messaggio:

Infine, sempre nello stile del mio mentore in tema di delazioni spammose, vi rinvio ai dati pubblicamente disponibili sui due nomi di dominio coinvolti,, centering.co.kr e ilrestodelmondo.it, presenti nei database WHOIS dei NIC coreano ed italiano, rispettivamente.

1234567890

12 Febbraio 2009 3 commenti
Ho fatto lo screenshot nel momento esatto, per una volta

Ho fatto lo screenshot nel momento esatto, per una volta

Invece di perdere tempo andando a festeggiare con il/la vostro/a partner la ridicola festa di S. Valentino, o di dormire (aspettando di andare a rimorchiare in locali equivoci per la festa di S. Faustino) potete unirvi a milioni di altri sfigati (e non) nel festeggiare una ricorrenza topica del mondo UN*X.

Alle ore 00:31 del 14 Febbraio 2009 (ora italiana) la system call time(long*) di ogni sistema di tipo UN*X restituirà 1234567890. Tanti secondi saranno passati dalla mezzanotte di Giovedì 1° Gennaio 1970.

Sempre con il fuso orario italiano (UTC+1), le prossime ricorrenze interessanti sono:

  • Ore 1:53 del 10 Aprile 2021: time(long*) restituirà diciamo così la sezione aurea (1618033988);
  • Ore 4:33:20 del 18 Maggio 2033: time(long*) passerà da 1999999999 a 2000000000;
  • Ore 4:14:08 del 19 Gennaio 2038: verranno esauriti i 32 bit dell’intero a disposizione di time(long*) per la misurazione dei secondi, e sarà come esseri tornati al 1970 (link).

Bella la vita, no?

P.S. Se non vi sentite a vostro agio con la riga di comando, un buontempone si è preso la briga di creare un contatore web-based che può venirvi in aiuto. Eccolo.

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

15 Novembre 2008 Commenti disabilitati

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.

Avviare rtorrent al boot su FreeBSD

26 Agosto 2008 Commenti disabilitati

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"

Firewall humour

20 Agosto 2008 1 commento

Stavo cercando un articolo da affiancare alla pagina dell’handbook di FreeBSD riguardante la configurazione di IPFW. Non ho trovato nulla di lontanamente paragonabile, ma questa pagina merita una menzione per il suo punto n° 4:

4. Create & install a warning banner. Use vi to replace your /etc/motd file with the following text (or some other equivalent legal disclaimer). Make sure that you add a line that says ‘update_motd=”NO”‘ at the end of your /etc/rc.conf file when you’re done…otherwise your changes will be overwritten each time the system reboots.

* * * * * * * * * * * * W A R N I N G * * * * * * * * * * * * *
THIS SYSTEM IS RESTRICTED TO AUTHORIZED USERS FOR AUTHORIZED USE
ONLY. UNAUTHORIZED ACCESS IS STRICTLY PROHIBITED AND MAY BE
PUNISHABLE UNDER THE COMPUTER FRAUD AND ABUSE ACT OF 1986 OR
OTHER APPLICABLE LAWS. IF NOT AUTHORIZED TO ACCESS THIS SYSTEM,
DISCONNECT NOW. BY CONTINUING, YOU CONSENT TO YOUR KEYSTROKES
AND DATA CONTENT BEING MONITORED. ALL PERSONS ARE HEREBY
NOTIFIED THAT THE USE OF THIS SYSTEM CONSTITUTES CONSENT TO
MONITORING AND AUDITING.
* * * * * * * * * * * * W A R N I N G * * * * * * * * * * * * *

LOL. Fa quasi più ridere del metatag GENERATOR della pagina stessa (andate a vedere).

Obiettivi formativi

16 Agosto 2008 2 commenti

Rileggevo, un po’ per diletto, un po’ per autolesionismo, questo:

Obiettivi formativi

Capacità di progettazione, esecuzione e gestione dei sistemi tipici dell’Ingegneria Informatica; capacità di tradurre i principi teorici fondamentali delle differenti discipline in applicazioni professionali; saper tenere in conto i criteri di qualità come la sicurezza, la funzionalità, l’impatto economico, sociale, culturale ed ambientale dei sistemi da realizzare; sviluppo di abilità relazionali che favoriscano il lavoro all’interno di un gruppo, ma anche la capacità di coordinare gli altri; sviluppo di una cultura d’impresa.

Alla fine dei tre anni quindi sarò come lui:

Babbo Natale esiste. E io ho trovato una scusa per postare la sigla di MacGvyer.

The Pirate Bay e i “fascisti”

12 Agosto 2008 2 commenti

Il navigatore medio italico è per ora preoccupato (a torto, vista la natura decentralizzata della rete Internet – ma a quale utente importa saperlo, no?) delle restrizioni d’accesso che l’autorità giudiziaria ha instaurato nei confronti di The Pirate Bay, che si autodefinisce “il più vasto tracker BitTorrent al mondo”.

Chiaramente, la reazione dei gestori è stata, comprensibilmente, stizzita:

Siamo abbastanza abituati a stati fascisti che impediscono la libertà di parola. Molte piccole nazioni governate da dittatori decidono di bloccare il nostro sito perchè possiamo dare una mano a diffondere delle informazioni che potrebbero danneggiare quei dittatori.

Stavolta tocca all’Italia. Gli Italiani soffrono per una situazione molto seria dal momento che un organismo simile all’IFPI1 è stato costituito durante gli anni del fascismo, ed ora un fascista è al potere in quello stato, Silvio Berlusconi. Berlusconi è anche il personaggio più potente nell’ambito dei media italiani, dal momento che possiede molte ditte che sono in competizione con The Pirate Bay e vuole restare in questa condizione di predominio – così uno dei suoi sottoposti, Giancarlo Mancusi, ha ordinato la chiusura del nostro nome di dominio e del nostro indirizzo IP in Italia per rendere più difficile contrastare l’impero di Berlusconi. [...]

Il testo in corsivo è stato aggiunto da me per migliorare la resa in Italiano.

Tralasciando subito la constatazione, ai limiti del delirio, secondo cui The Pirate Bay sarebbe un rivale delle ditte di Berlusconi – sarebbe come ammettere che l’attività del tracker ha scopo di lucro: decisamente una posizione che io non sosterrei in tribunale -, e pur essendo totalmente d’accordo  sul fatto che l’attuale governo, come del resto quelli di mezza Europa e degli Stati Uniti, siano retti dagli eredi dei fascisti – pur preferendo a questo il più “civile” termine di conservatori, con il ribrezzo della buonanima di Montanelli -, apprendo che The Pirate Bay non è del tutto estranea a questo tipo di frequentazioni “esecrabili”2:

Dopo aver visto questo filmato, la frase “Siamo abbastanza abituati a stati fascisti” mi risuona molto… sinistra3.


1Si riferiscono alla S.I.A.E.

2Potete trovare qualche informazione su Sverigedemokraterna in inglese qui. Se e quando avrò del tempo, potrei tradurre la voce su Carl Lundström e sul partito per Wikipedia Italia; modificherò i riferimenti finali dell’articolo.

3Gioco di parole non cercato, ma con un minimo d’effetto distopico che non manca d’intrigarmi.

Risolvere il problema dell’audio gracchiante nelle applicazioni che usano la libreria SDL se PulseAudio è in esecuzione (su Fedora)

30 Luglio 2008 1 commento

Il problema, in realtà, non è specifico di Fedora, ma l’ho visto accadere su un bel po’ di distribuzioni orientate al pubblico consumer. La soluzione che propongo è applicata a Fedora perchè questa è la distribuzione che ho sottomano al momento, ma – come sempre per quel che riguarda i miei articoli – il principio generale che vi sta dietro non è da essa dipendente.

Il concetto è sempre lo stesso: di default, e per compatibilità con le vecchie versioni di SDL, il driver (sarebbe più corretto dire, in questo caso, la libreria a collegamento dinamico) utilizzato per la riproduzione è quello adatto al funzionamento con EsounD. PulseAudio, essendo stato progettato come il sostituto di EsounD per il desktop environment GNOME, mantiene un livello di compatibilità con quest’ultimo per permettere il funzionamento di applicazioni legacy. Purtroppo, almeno per quanto ho potuto vedere, la sua interazione con le applicazioni che usano SDL è buona sino ad un certo punto.

La buona notizia in questo quadro abbastanza grigio è che le versioni più recenti della libreria SDL supportano direttamente PulseAudio, senza bisogno di passare per l’emulazione EsounD. La notizia un po’ meno buona è che molte distribuzioni mainstream, nelle loro ultime release, non sempre se ne sono accorte.

Il caso che considero è quello di Fedora 9 – per quel che può importare, su architettura x86_64: per poter utilizzare appieno il supporto audio di prboom e DOSBox ho dovuto effettuare le poche operazioni che seguono:

  1. Aprire una finestra di terminale.
  2. Digitare
    sudo nano /etc/profile.d/SDL_pulseaudio_hack.sh
  3. Modificare
    export SDL_AUDIODRIVER=esd

    in

    export SDL_AUDIODRIVER=pulse

    quindi salvare.

  4. Digitare
    sudo nano /etc/profile.d/SDL_pulseaudio_hack.csh
  5. Modificare
    setenv SDL_AUDIODRIVER esd

    in

    setenv SDL_AUDIODRIVER=pulse
  6. Chiudere il terminale, effettuare il logout, e quindi nuovamente il login.

Tutto è poi andato a posto.

Aggiornare i pacchetti vulnerabili di FreeBSD con un piccolo trucco

30 Giugno 2008 Commenti disabilitati

Non è niente di che, in realtà; volevo trovare il modo di aggiornare automaticamente tutti i pacchetti che portaudit(1) classifica come vulnerabili, insieme a loro eventuali dipendenze. Questo script sembra assolvere lo scopo: se c’è un modo migliore, fatemelo sapere.

#!/usr/local/bin/bash

# psupgrade: Aggiorna i port rilevati come insicuri da portaudit(1)
# utilizzando portmanager(1).

me=$(basename $0)

awk=$(which awk)
echo=$(which echo)
grep=$(which grep)
pkg_info=$(which pkg_info)
portaudit=$(which portaudit)
portmanager=$(which portmanager)
uniq=$(which uniq)

function perror()
{
        $echo $1 >>/dev/stderr
}

for tool in $awk $echo $grep $pkg_info $portaudit $portmanager $uniq; do
        if [ ! $tool ]; then
                perror "$me: Non è possibile eseguire $me, dal momento che manca uno dei seguenti tool:"
                perror "awk\n\grep\npkg_info\nportaudit\nportmanager\nuniq\n\n".
                perror "Assicuratevi che siano installati in una directory del PATH di sistema prima di rieseguire lo script."
                exit 1
        fi
done

echo "$me: Rilevo quali pacchetti necessitano di un aggiornamento..."
packages=$($portaudit -a | $awk '/Affected package:/ {print $3}' | $uniq -)

if [ ! $packages ]; then
        perror "$me: Sembra che non ci siano pacchetti da aggiornare."
        exit 2
fi

echo "$me: Riferisco i pacchetti ai port d'origine..."
ports=$($pkg_info -o $packages | $awk '/Origin:/ {getline; print}' | $uniq -)

if [ ! $ports ]; then
        perror "$me: Si sono verificati degli errori nel reperire i port da aggiornare."
        exit 3
fi

echo "$me: Lancio $portmanager..."
$portmanager $ports -y