Blog

  • Come mandare un segnale SIGINT (Ctrl-C) ad un programma che gira nella console di Eclipse

    Quando si sviluppa un programma che deve girare ininterrottamente nella console, non ci sono problemi se si lancia il programma da console e lo si termina tramite la più classica delle combinazioni: Ctrl-C. Ma come si termina lo stesso programma se lo si è lanciato da Eclipse?

    Si deve lanciare un segnale al processo, e più in particolare un SIGINT (interruzione): apriamo una console:

    kill -s INT pid

    o, se usiamo pkill:

    pkill -s INT <nome dell’interprete che sta runnando il programma: Java, Ruby, Python, etc.>

  • proctools: (pgrep, pkill): gli strumenti per operare sui processi

    Quando ci si trova davanti ad un terminale e si deve operare sui processi, si filtra l’output di ps auxw con grep (ed eventualmente con kill). Ad esempio:

    michele@delta:~ % ps auxw | grep -i yes [ 6:20PM]
    michele 92888 8.7 0.0 2434788 372 s002 S+ 6:20PM 0:00.52 yes
    michele 92914 0.0 0.0 2425580 296 s005 R+ 6:20PM 0:00.00 grep -i yes

    In alcuni casi, l’operazione più comune che segue la grep è quella di kill:

    michele@delta:~ % kill -9 92888 [ 6:20PM]
    michele@delta:~ % ps auxw | grep -i yes [ 6:21PM]
    michele 92934 0.0 0.0 2425480 244 s005 R+ 6:22PM 0:00.00 grep -i yes

    Gli autuori di proctools hanno pensato bene di introdurre 3 utility che ci possono venire incontro per questi casi:

    • pgrep <pattern>: effettua una ricerca all’interno dei processi attivi, ritorna il PID dei processi che matchano il pattern specificato come argomento:

      michele@delta:~ % pgrep yes [ 6:28PM]
      93026
      93053

    • pkill <pattern>: è l’equivalente di kill (quindi bisogna specificare il tipo di signal da passare al processo) ma applicato ai processi: assicuratevi di specificare un pattern univoco, perché tutti i processi che matchano il pattern riceveranno il kill:

      michele@delta:~ % pkill -9 yes [ 6:28PM]

    proctools (il pacchetto che contiene i due comandi citati) è (solitamente) installato di default su Linux (se non è così, cercate proctools tra i pkg della vostra distro). Su MacOSX, invece, va installato (ma scriverò un post a riguardo).
    L’utilizzo che ve ne ho descritto è basic: per ulteriori informazioni, vi rimando alla manpage.

  • Installare Java Development Kit 7 (JDK 7) su Ubuntu

    La tanto attesa versione 7 di Java è disponibile per Windows e per Linux: tra le funzionalità più importanti, sottolineo il supporto per i linguaggi dinamici e una maggiore velocità di esecuzione del codice interpretato.

    Per Ubuntu è disponibile un pacchetto ppa per avere Java 7. Per installarla è sufficiente aggiungere il ppa e installare il pacchetto corrispondente:

    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update
    sudo mkdir -p /usr/lib/mozilla/plugins
    sudo apt-get install oracle-jdk7-installer

    Ed il gioco è fatto. Per controllare che abbiate installato correttamente la nuova versione di Java, lanciate un java -version e controllate che sia la 7. Se così non fosse, lanciate sudo update-alternatives --config java e scegliete la versione corretta di Java.

  • Installare più plugin contemporaneamente su Eclipse

    Installare più plugin contemporaneamente su Eclipse

    Eclipse è il mio IDE preferito per tutti gli sviluppi. Per migliorare le funzionalità di Eclipse, utilizzo alcuni plugin che semplificano il processo di sviluppo (ma dei plugin che utilizzo ve ne parlerò in un altro post). Un piccolo accorgimento che mi è stato utile è quello di installare più plugin contemporaneamente (dopo l’installazione di un plugin, Eclipse richiede un riavvio):

    1. Create un account su Eclipse Marketplace;
    2. Una volta loggati su MarketPlace, cercate i plugin che volete installare e marcateli come favorite
    3. Andate in “My MarketPlace” e copiate Update Site URL
    4. In Eclipse, andate su Help -> Install New Software e usate l’URL appena copiato come repository di installazione

    Nel repository potete trovare tutti i plugin marcati come favoriti e li potrete installare in una sola sessione di installazione: semplice e veloce!

  • Validazione dei form: jQuery o HTML5?

    Quando si realizza una form in HTML, è d’obbligo implementare una validazione dei dati inseriti (sia per verificare l’effettiva correttezza dei dati inseriti, sia per una questione di sicurezza). La validazione può essere realizzata lato client (tipicamente via JavaScript) o lato server. Nella mia esperienza, la soluzione migliore è quella di utilizzare un approccio ibrido: validazione lato client (via jQuery) e validazione lato server (tramite un linguaggio dipendente dall’applicazione realizzata); questo approccio garantisce una migliore distribuzione dell’onere di validazione, sia una maggiore robustezza del controllo (cosa succede se un browser non supporta/disabilita JavaScript?).

    Attualmente, la migliore soluzione per la validazione lato client è quella di usare jQuery in combinazione con un plugin di validazione (io ho sempre utilizzato Validation). L’utilizzo del plugin è veramente semplice: basta dichiarare le regole di validazione (eventualmente usando una regexp) e chiamare il metodo validate() sulla form che vogliamo validare. Il plugin si preoccuperà di evidenziare con un bordo rosso i campi non correttamente validati, è offrirà la possibilità di inserire un messaggio custom per guidare l’utente nella corretta compilazione del campo.

    Un approccio molto più recente, e adatto ai browser che già supportano HTML5, è quello di utilizzare la validazione nativa offerta dai componenti, ad esempio: il tag input, specificando il type implementa una validazione nativa in base al tipo passato come argomento, come ad esempio l’email.

    <input type="email" name="email" size="20" maxlength="28">
    

    In particolare segnalo l’attributo pattern che permette di specificare una regexp per la validazione (proprio come nel plugin per jQuery).
    Per l’inserimento di eventuali messaggi di errore, si sfruttano le proprietà CSS3, vi rimando a questo interessante post per l’approfondimento.
    La soluzione via HTML5 è senz’altro preferibile ma apre un problema di compatibilità: cosa succede con i browser più datati? Ancora una volta, un approccio ibrido sembra essere la soluzione ideale: jQuery per la validazione sui browser più datati e HTML5 per i browser più evoluti.

  • 10 cose da fare prima e dopo aver installato MacOSX Lion

    Dopo un po’ di tempo di assestamento, ho aggiornato il sistema operativo che utilizzo principalmente a MacOSX Lion 10.7 (attualmente giunto alla revision 3, 10.7.3). Visto che ho optato per un’installazione from scratch (dopo aver acquistato Lion su App Store, ho creato un DVD di backup utilizzando le innumerevoli guide di cui la rete è piena), ho dovuto riapplicare tutte le customizzazioni che ho applicato man mano che acquisivo confidenza con MacOSX. Facciamo un passo indietro: di cosa bisogna fare il backup prima di passare a Lion? Ecco alcune idee:

    • Le applicazioni installate su iTunes
    • La libreria di iTunes (audio, video, libri, audiolibri, podcast)
    • I contatti su AddressBook
    • La libreria fotografica di iPhoto (~/Pictures/) e/o di Picasa
    • Bookmarks ed estensioni di Chrome e Safari
    • Il folder dei Documenti (~/Documents)
    • Le chiavi private di ssh (~/.ssh/)
    • Una lista delle applicazioni installate (ls -l /Applications)
    • Le mail archiviate su Mail.app (~/Library/Mail)
    • Eventuali altre directory che avete creato nella vostra home (es. ~/Development)

    Una volta fatto il backup di tutte queste informazioni, possiamo avviare l’installazione di Lion. Ora, una volta ottenuta un’installazione pulita di Lion, non ci resta che re-importare tutte le nostre impostazioni e i nostri dati.

    Inoltre, avendo effettuato alcune customizzazioni, le dobbiamo riapplicare. Nel mio caso:

    • Nascondere l’icona che vi porta allo Store accanto ad ogni traccia di iTunes: defaults write com.apple.iTunes invertStoreLinks -bool YES
    • Mostrare il menu di debug in Safari: defaults write com.apple.safari IncludeDebugMenu -bool YES
    • Fare in modo che iTunes mostri una notifica sulla Dock della canzone che stiamo ascoltando: defaults write com.apple.dock itunes-notifications -bool TRUE
    • Disabilitare il restore dei documenti allo startup di Preview e QuickTime: defaults write com.apple.Preview NSQuitAlwaysKeepsWindows -bool false
      defaults write com.apple.QuickTimePlayerX NSQuitAlwaysKeepsWindows -bool false

    E abbiamo finito. Consiglio un riavvio e buon utilizzo di Lion!

  • FizzBuzz: una sfida per programmatori

    Un quesito che viene spesso richiesto ai programmatori è quello di scrivere un programma FizzBuzz:

    Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.

    La difficoltà principale, se così vogliamo chiamarla, è quella di leggere attentamente i requisiti e trasformarli in if condizionali del linguaggio scelto. Nel mio caso, Java:

    import junit.framework.Assert;
    
    public class FizzBuzz {
        public static void main(String args[]) {
            for (int i = 1; i <= 100; i++) {
                if (i % 3 == 0 && i % 5 == 0) {
                    System.out.println("fizzbuzz");
                    Assert.assertTrue(divisibleBy3(i) && divisibleBy5(i));
                } else if (i % 3 == 0) {
                    System.out.println("fizz");
                    Assert.assertTrue(divisibleBy3(i) && !divisibleBy5(i));
                } else if (i % 5 == 0) {
                    System.out.println("buzz");
                    Assert.assertTrue(!divisibleBy3(i) && divisibleBy5(i));
                } else {
                    System.out.println(i);
                    Assert.assertTrue(!divisibleBy3(i) && !divisibleBy5(i));
                }
    
            }
        }
    

    L’algoritmo si può complicare a piacere. In una curiosa implementazione, viene richiesto di non usare operazioni come la moltiplicazione e la divisione. L’autore del post risolve il problema utilizzando una coda circolare, sfruttando il fatto che i numeri seguono un comportamento periodico.
    Nel risolvere lo stesso problema, ho deciso di utilizzare un approccio diverso. Infatti, mi sono ricordato che esistono dei criteri per stabilire a priori se un numero è divisibile per determinati numeri (in particolare per 3 e per 5). E così ho scritto due metodi per testare se un numero passato come parametro è divisibile per 3 o per 5:

        public static boolean divisibleBy3(int num) {
            String s = new Integer(num).toString();
            while (s.length() != 1) {
                int j = 0;
                for (int i = 0; i < s.length(); i++) {
                    j += Integer.parseInt(s.substring(i, i + 1));
                }
                s = new Integer(j).toString();
            }
            if (s.equals("3") || s.equals("6") || s.equals("9"))
                return true;
            return false;
        }
    
        public static boolean divisibleBy5(int num) {
            String s = new Integer(num).toString();
            String lastDigit = s.substring(s.length() - 1, s.length());
            if (lastDigit.equals("5") || lastDigit.equals("0"))
                return true;
            return false;
        }
    }
    

    E applicarlo al FizzBuzz è un’operazione elementare.

  • django: come fare il deploy di un’applicazione su Apache

    Una volta che avete terminato lo sviluppo di un’applicazione basata su django, è il momento di installarla in produzione. Nel mio caso, ho utilizzato django 1.3.1 e ho scelto di utilizzare Apache e mod_wsgi. Vediamo come fare il deploy passo-passo:

    • Fortunatamente mod_wsgi richiede Apache mpm-worker (anziché il meno performante prefork) che su Debian/Ubuntu è facilmente installabile tramite sudo apt-get install libapache2-mod-wsgi
    • Spostiamo l’applicazione sotto un path di sistema, tipo /usr/share/app
    • Aggiungere a /etc/httpd.conf la direttiva WSGIScriptAlias / /usr/share/app/django.wsgi dove il primo parametro (/) rappresenta il path a cui django dovrà rispondere (in questo caso la root), mentre il secondo parametro rappresenta un file che scriveremo nel prossimo step, e che descrive a WSGI come interpretare l’applicazione django che abbiamo scritto
    • Aprite il file che abbiamo definito al punto precedente (django.wsgi) e inserite il seguente codice Python:
      “`
      import os
      import sys
      import django.core.handlers.wsgipath = '/usr/share/app'
      if path not in sys.path:
      sys.path.append(path)

      os.environ['DJANGO_SETTINGS_MODULE'] = 'app.settings'

      application = django.core.handlers.wsgi.WSGIHandler()
      “`

      Ricordatevi di settare correttamente il path e i settings (che corrisponde al settings.py di django)

    • Riavviare apache: service apache2 restart

    Aprite il browser andando a settare l’URL in corrispondenza di quanto definito al punto 1 di questo tutorial (il context-path) e controllate che sia tutto a posto (diversamente, controllate l’error log di Apache).
    Una soluzione aggiuntiva sarebbe quella di introdurre un reverse proxy (scelta personale: nginx) davanti ad Apache per servire i files statici (js, css, png, etc.). Ma questo sarà un altro post.

  • Ksplice: aggiornare il kernel di Ubuntu senza riavviare

    Segnalo che con Ksplice (ora Oracle) è possibile applicare gli aggiornamenti di sicurezza (in particolare quelli del kernel) senza dover riavviare. Un’opportunità davvero interessante per tutti i server che devono mantenere un certo uptime e che, di conseguenza, non possono essere riavviati facilmente. Il servizio è disponibile a pagamento per le versioni di Ubuntu server, mentre è gratuito per le versioni desktop. Ecco come installarlo:

    1. Richiedere una chiave di accesso che vi verrà recapitata via email
    2. Loggatevi come utente root, e create il file /etc/apt/sources.list.d/ksplice.list
    3. Incollate nel file le seguenti direttive che servono ad aggiungere le sorgenti dei pacchetti da installare:
      deb https://www.ksplice.com/apt oneiric ksplice 
      deb-src https://www.ksplice.com/apt oneiric ksplice
    4. Lanciate i seguenti comandi, che servono ad installare i pacchetti di Ksplice:
      apt-get install ca-certificates
      wget -N https://www.ksplice.com/apt/ksplice-archive.asc
      apt-key add ksplice-archive.asc
      apt-get update
      apt-get install uptrack
    5. Modificate il file /etc/uptrack/uptrack.conf impostando l’opzioneautoinstall al valore yes
    6. Lanciate il comando uptrack-upgrade -y

    Tutti gli updates di sicurezza  del kernel verranno quindi installati automaticamente, senza dover riavviare. Comodo, vero? Dal 2005 al 2008, Ksplice ha applicato con successo 64 patch senza dover riavviare.

    Per i più curiosi: come funziona Ksplice? Il segreto sta nel fatto che Ksplice aggiorna dinamicamente il kernel, direttamente in memoria, grazie ad un confronto sugli oggetti ELF allocati in memoria. Questo processo è di per sé rischioso e deve essere fatto con la massima attenzione: prima di fare un patch “a caldo” di un oggetto, viene freezata l’esecuzione del processo che accede a tale oggetto, sostituita la chiamata ai vecchi oggetti con la chiamata ai nuovi oggetti, e viene quindi ripresa l’esecuzione.

  • Summify: un riassunto personalizzato delle notizie a cui siamo interessati

    Grazie anche al fenomeno dei social media, stiamo sperimentando una rivoluzione dei contenuti: sempre più  il cosiddetto information overload è sempre più dietro l’angolo. Le fonti di informazione che utilizzo sono:

    Summify è un aggregatore di notizie simile a Flipboard, ma che si basa su un meccanismo sociale: le notizie che i nostri amici condividono sui social network. Il presupposto fondamentale è che sui nostri profili di Facebook, Twitter, LinkedIn aggiungiamo contatti che hanno i nostri medesimi interessi, e di conseguenza il flusso di notizie generato dai nostri contatti sarà personalizzato in base ai nostri interessi. Le notizie selezionate vengono poi incr

     

    ociate con le notizie più condivise (globalmente, su tutti i social network) per ordinarle in base alla popolarità.

    Mentre con Flipboard le notizie sono in formato pull (l’utente deve accedere all’app per leggere le notizie), Summify gestisce le notizie in formato push: all’ora specificata il servizio vi invierà una mail contenente gli articoli selezionati per voi (oppure aggiornerà il feed RSS corrispondente).

    Summify è davvero un servizio interessante che permette di avere a colpo d’occhio la lista delle notizie più interessanti, personalizzate in base ai nostri interessi. Grazie a Flipboard, è un modo comodo e veloce per combattere l’information overload.