Di come un bug in uno script PHP possa mettere in ginocchio un sito

Il sito in questione è il mio, tuttoeniente.net, che ha un sistema creato da me per visualizzare le ultime notizie in ogni pagina. Per ovvie ragioni di spazio non posso visualizzare la notizia completa, quindi la tronco a 70 caratteri.

Tagliare brutalmente porterebbe ad avere 9 volte su 10 parole a metà, quindi avevo scritto uno stupidissimo script che taglia allo spazio successivo. Eccolo:

function ultime_news($notizie = 2, $forumid = 10, $cut = 70){
    $news = '';
    $q_news = mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT $notizie");
    while($notizia = mysql_fetch_array($q_news)){
       $lenght = strlen($notizia['testo']);
       if($lenght > $cut){
            while(substr($notizia['testo'], $cut, 1) != ' '){
                $cut++;
            }
            $testo = substr($notizia['testo'], 0, $cut).' [...]';
        }else{
            $testo = substr($notizia['testo'], 0, $cut);
        }
        $data = strftime("%d/%m/%Y", $notizia['data']);
        $news .= "<p><a href=\"/news/$notizia[id]-".encode_for_url($notizia['titolo']).
                 ".html\"><span class=\"news-title\">$notizia[titolo]</span></a> ".
                 "<span class=\"news-date\">($data)</span><br />".
                 "<span class=\"news-text\">$testo</span></p>";
    }
    return $news;
}

Tutto bene, se non fosse che l’ultima notizia che ho inserito è “Si aggiungono nuove barzellette alla nostra collezione, corri a leggerle!”, 74 caratteri. A 70 caratteri siamo giusto a metà della parola “leggerle”, quindi avanziamo alla ricerca di uno spazio. Lettera, lettera, lettera, punto esclamativo. Fine. Nessuno spazio. Risultato? Loop infinito e sito KO. Peccato che quando ho inserito la notizia non ci ho fatto caso, e oggi ho dovuto smadonnare non poco prima di trovare la ragione del sito fuori uso…
La solulzione? Una banalissima limitazione dello spostamento del taglio fino alla lunghezza totale della notizia.
In pratica while(substr($notizia['testo'], $cut, 1) != ' '){ diventa while(substr($notizia['testo'], $cut, 1) != ' ' && $cut <= $lenght){

Confrontare le prestazioni di due server DNS

Con l’uscita dei Google Open DNS ho sentito la necessità di confrontare in modo oggettivo le loro prestazioni con gli OpenDNS che usavo  in precedenza, così ho recuperato le mie vecchie e scarse conoscenze di BASH e ho creato un piccolo script.

CompareDNS-mini

Lo script, che trovate qui, sfrutta il comando dig per risolvere per 5 volte gli IP collegati a 3 domini (google.com, ubuntu.com e kernel.org) con ciascuno dei 2 DNS passati come argomenti allo script, e facendo poi la media dei risultati.

Mi rendo conto che lo script è molto inelegante ed efficiente, ma fa il suo lavoro. Sono accettati consigli su come migliorarlo.

Schermo nero dopo il resume dal suspend

Ecco, lo sapevo. La mia professoressa di inglese mi ha contagiato. Mischio inglese e italiano. Pazienza, l’importante è risolvere questo fastidioso problema.

Schermo nero
Ecco cosa si vede dopo il resume

A volte capita che inspiegabilmente lo schermo del portatile resti nero dopo il risveglio dalla sospensione. A me è successo improvvisamente, prima andava tutto, forse è stato qualche aggiornamento del kernel di Intrepid Ibex.
Ho notato che il portatile funzionava perfettamente (schermo a parte), infatti potevo tranquillamente ssharmici dentro.
La soluzione al problema è semplice: spegnere e riaccendere lo schermo. Su un portatile però non c’è il bottoncino… Bisogna quindi affidarsi a DPMS (Display Power Management Signaling), che da Linux si gestisce tramite il tool vbetool.
In sintesi:

sudo vbetool dpms off
sudo vbetool dpms on

Si può automatizzare il processo mettendo uno script in /etc/pm/sleep.d

#!/bin/sh

/usr/lib/pm-utils/functions

sleep 1
case "$1" in
        thaw|resume)
                vbetool dpms off
                vbetool dpms on
                ;;
        *)
                ;;
esac

Diamogli un nome intelligente, tipo 99-dpms-off-on.sh e rendiamolo eseguibile: sudo chmod +x /etc/pm/sleep.d/99-dpms-off-on.sh

Fatto. 😀

Wcat: cat web files

Ho da parecchio tempo nel mio .bashrc un comodissimo alias che mi permette di usare il fantomatico comando wcat per visualizzare file su internet, ad esempio file di testo.

Ho pensato di renderlo disponibile al mondo tramite questo pacchetto deb, presente nel LuBlog Repository, il mio repo per Ubuntu.

Chi fosse troppo pigro per installare il pacchetto a mano può sempre aggiungere il repo al sources.list e installare il pacchetto da lì:
echo 'deb http://repo.tuttoeniente.net/ binary/' | sudo tee -a /etc/apt/sources.list
sudo apt-get install wcat

Oppure, più semplicemente ancora:
echo "alias wcat='wget -q -O-'" >> ~/.bashrc

Come si usa? Semplice: wcat [URL]

SongLogger per AmaroK

Oggi, immerso nel cazzeggio più totale, mi è venuta la brillante idea di scrivere uno scriptino che loggasse tutte le canzoni ascoltate con AmaroK.

Logo di AmaroK

Con l’estrema fantasia che mi contraddistingue, ho deciso di chiamarlo SongLogger. Se a qualcuno interessasse, lo può trovare qui, l’ho postato su Kde-Apps.org, sezione AmaroK Scripts.