Tag: programming

  • Checkstyle and DetailAST

    If you are running Checkstyle (for checking Java style) and you are stuck with this error:

    checkstyle:
    [checkstyle] Running Checkstyle 6.11.2 on 2324 files
    [checkstyle] Can't find/access AST Node typecom.puppycrawl.tools.checkstyle.api.DetailAST
    

    which is a cryptic error with no whatsoever Google result on how to fix it, stand back: I have the solution!

    You probably have these packages installed in your system:

    % rpm -qa | grep -i antlr
    ant-antlr-1.9.4-9.2.noarch
    antlr-java-2.7.7-103.38.noarch
    antlr-2.7.7-103.38.x86_64
    

    To fix your problem, just remove ant-antlr package from your system.

  • ZeroTurnaround’s Java Tools and Technologies Landscape Report 2016

    As of every year, ZeroTurnaround released the yearly report of their survey about Java and Java-related technologies among professional developers. I find this report very interesting, and I usually compare (or discover) existing technology solutions.

    For example, right now I’m currently thinking about moving to Intellij IDEA.

    How do you measure up against the report?

  • iOS Bootcamp al TAG di Bergamo

    Ieri sera ho partecipato all’incontro “iOS Bootcamp” organizzato dalla community di #pragma mark presso il TAG di Bergamo.
    Non era la prima volta che frequentavo il TAG: un luogo dove incontrare giovani startupper e persone interessanti con cui discutere di tecnologia ed innovazione in un ambiente stimolante e creativo.

    Era la prima volta, però, che partecipavo ad un talk tecnico presso il TAG. L’organizzazione è stata impeccabile: è stato usato EventBrite per gestire gli inviti ed i tickets di ingresso [il talk non aveva alcun costo], la sala era spaziosa, i tempi rispettati, e la dotazione tecnologica a disposizione ha permesso di seguire il talk in completa autonomia. Essendo un talk prettamente tecnico, la sala si è rapidamente trasformata in un covo di nerds, ma rispetto ad altre conferenze non ci sono stati incidenti.

    Incontravo la community di pragma mark e i suoi quattro fondatori: il talk che hanno tenuto ha spaziato lungo tutto l’ecosistema Apple per lo sviluppo di applicazioni iOS e OSX, passando dai provisioning profiles [più croce che delizia per i developers] fino ad arrivare al message-passing tipico di Objective-C [derivante da SmallTalk].
    Il talk è stato presentato in maniera logica, chiara e anche divertente: il trivia che spiega come è nato il nome della community è stato un piacevole break.
    I presentatori sono stati molto disponibili: nella parte di Q&A ho posto alcune domande su ARC e manual memory management e le risposte sono state molto esaustive e chiare.

    L’impressione che ho avuto, quindi, è molto positiva: sicuramente parteciperò ai prossimi talk organizzati da #pragma mark presso il TAG, e ho già sottoscritto il feed RSS dei rispettivi blog.

  • Linguaggio C, seconda edizione (K&R): la mia recensione

    In pochi giorni ho letto una pietra miliare dei libri della programmazione, il famoso K&R (dagli autori Kernighan & Ritchie); si tratta del libro più famoso per quanto riguarda la programmazione C.

    linguaggio_C

    In libro è molto breve (in totale 340 pagine, ma le ultime ~100 pagine di appendice sono una reference manual condensata). Il libro è adatto a chi ha già una buona base di programmazione, perché vengono presentati e implementati concetti non banali usando puntatori e struct. Tutti i concetti e i paradigmi del C sono sviscerati e spiegati all’utente. Nella parte finale del libro, vengono presentate anche le basi della programmazione C in ambiente UNIX.

    I due autori sono molto chiari e spiegano in modo molto approfondito le scelte tecniche e i paradigmi utilizzati.

    In definitiva, essendo un pilastro della programmazione, consiglio la lettura a tutti i programmatori: a mio avviso è un libro è indispensabile nella libreria di ogni programmatore.

  • PHP5 e MySQL, la guida: la mia recensione

    php_mysql_guida

    Per ripassare le mie nozioni di PHP5, ho deciso di leggere il libro di McGraw-Hill, “PHP5 e MySQL, la guida“, composto da circa 1100 (!) pagine. Perché proprio PHP? Peché, PHP è un linguaggio di successo, sebbene non venga presentato nei migliori dei modi (“è un linguaggio per principianti”). Ecco almeno 4 ragioni per cui conoscere PHP è un plus:

    1. è attualmente il quarto linguaggio più diffuso in termini di codebase OSS;
    2. il più utilizzato e diffuso social network lo utilizza (anzi, lo migliora!);
    3. i CMS più famosi (WordPress e Drupal) sono sviluppati in PHP;
    4. sapevate che anche Wikipedia lo utilizza?
    Passiamo al libro: la lettura non è molto agevole (ci sono errori di battitura, traduzioni forzate dall’inglese, snippet di codice senza alcun syntax highlighting [non parlo del colore, ma almeno del bold!]) ma tutto sommato riesce a spiegare esaurientemente bene tutte le peculiarità di un linguaggio di successo quale PHP.
    Il libro passa in rassegna ogni aspetto del linguaggio, quali:
    • le basi del linguaggio
    • i tipi e la OOP con PHP5
    • la connessione ai database MySQL/PostgreSQL/Oracle
    • il package manager PEAR
    • l’utilizzo di sessioni e cookie
    • l’implementazione di servizi REST e SOAP

    Il libro termina con una serie di esempi svolti e analizzati. In definitiva il libro è un ottimo manuale per imparare (da zero) il PHP. In alcuni punti è spesso prolisso e ripetitivo; rappresenta tuttavia una buona miniera di informazioni e di reference per quando si deve sviluppare in PHP. La parte relativa all’approfondimento relativo all’integrazione con i database è lasciata a 3 capitoli (sebbene molti esempi siano presenti in tutto il libro); soluzione che ritengo comprensibile, visto il proliferare di ORM (come Doctrine) che “nascondono” i tweaking un tempo necessari per la connessione al db).

    In definitiva, un libro buono, ma non indispensabile: esistono libri più economici (e soprattutto più compatti!) che permettono di ottenere la stessa infarinatura di PHP.

  • Python: scriviamo un HTTPS downloader simile a wget (con urllib2, optparse e getpass)

    Per ragioni di semplicità di utilizzo e immediatezza (e anche per imparare qualcosa di nuovo), la settimana scorsa ho dovuto scrivere un downloader da linea di comando simile a GNU wget, ma con alcuni requisiti personalizzati:

    • l’accesso alla pagina di download è protetto da userid e password (autenticazione HTTPDigestAuth);
    • il protocollo di accesso è HTTPS;
    • una volta ottenuto l’accesso, è necessario fare il GET di alcuni files ben particolari e crearli su hard disk.

    Per realizzare questo wget-like in Python, usiamo il modulo urllib2 che ci permette di accedere a risorse esterne tramite i protocolli più svariati. Per aprire una connessione HTTPS e autenticarci correttamente usiamo i seguenti statement:

        passman.add_password(None, url, username, password)
        authhandler = urllib2.HTTPDigestAuthHandler(passman)
        opener = urllib2.build_opener(authhandler)
    

    Affinché la gestione delle varie opzioni sia più semplice possibile, usiamo anche il modulo optparse (che permette di passare le opzioni al programma in modo simile alle utility GNU):

    parser = optparse.OptionParser()
    parser.add_option("-u", "–username")
    parser.add_option("-d", "–date")
    parser.add_option("-t", "–target", default="logs")
    options, arguments = parser.parse_args()
    

    Visto che dovremo gestire anche l’autenticazione tramite username e password, la scelta di passare la password come argomento del programma è una scelta non ottimale: una semplice ricerca nella history della shell utilizzata potrebbe permettere ad un attaccante di risalire alla password. Per questo ci viene incontro il pacchetto getpass che, in modo simile ai programmi UNIX che si rispettino, chiede interattivamente la password (senza stamparla, ovviamente!). Per richiedere l’inserimento della password all’utente è sufficiente:

    password = getpass.getpass()
    

    Torniamo ora all’inizio: abbiamo ottenuto dall’utente username (passato come argomento) e password (richiesta interattivamente): ora possiamo aprire una connessione verso l’hostname di riferimento e richiedere il download del file (salvando su file lo stream del file in ricezione tramite i metodi standard di Python):

    passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
    passman.add_password(None, url, options.username, password)
    authhandler = urllib2.HTTPDigestAuthHandler(passman)
    opener = urllib2.build_opener(authhandler)
    download = opener.open(file)
    logging.debug('downloading %s ...' % file)
    fo = open(options.target + os.sep + targetFileName, 'w')
    fo.write(download.read())
    fo.close()
    

    Abbiamo quindi ottenuto un semplice downloader di file scritto in Python, molto più semplice di wget ma al tempo stesso molto più customizzabile.

  • Misurare la quantità di codice di un progetto

    In questo post affronto un argomento abbastanza delicato: come si misura la quantità di codice di un progetto?

    La soluzione più immediata è quella di contare le linee di codice (Source Lines of Code, SLOC). Un esempio che ho personalmente applicato per contare le righe di codice di un progetto Java a partire dalla root del progetto, usando gli strumenti che Linux ci mette a disposizione:
    find . -type f -name *.java | xargs wc -l

    Un tool che svolge lo stesso compito, più raffinato e con un supporto ad un numero maggiore di linguaggi, è sloccount [sicuramente consigliato].

    Ma quanto è indicativo il numero delle righe di codice per indicare un progetto? A mio avviso dipende da molti fattori, come:

    1. lo stile con cui si programma (un’istruzione condizionale, tipo if può occupare 3 righe come ne può occupare una, a discrezione del programmatore).
    2. l’utilizzo di librerie esterne e framework (il codice è effettivamente utilizzato ma le righe di codice non vengono conteggiate)
    3. il conteggio deve includere i test?

    In definitiva, il conteggio delle righe di codice (e/o di altre metriche relative al codice) è una grandezza che non riesce ad esprimere in modo chiaro ed esauriente la grandezza di un progetto software.
    Esistono altre metriche che ci possono aiutare nella stima della dimensione di un progetto? Voi cosa ne pensate?

  • QR Codes e la Google Chart API

    Piccola intro: i QR Codes sono analoghi ai “normali” codici a barre, ma rappresentano un’evoluzione: possono contenere più dati (a parità di dimensione) e possono essere letti da una serie più ampia di dispositivi, come gli smartphone (su iOS segnalo l’ottima e gratuita QR Reader for iPhone). Dopo aver scaricato un lettore di QR Codes per il vostro smartphone, fate una fotografia all’oggetto qui accanto: il browser del vostro telefonino vi porterà nella pagina più visitata di questo sito…

    Fatto! Avete utilizzato il vostro primo QR Code. Ma come si generano?

    A questo proposito, segnalo quest’utilissima API di Google per generare QR Codes: è molto semplice da utilizzare e in modalità RESTful (specificate i parametri direttamente nell’URL della chiamata); la tabella di documentazione di Google è estremamente chiara a riguardo. Consigliatissima!

  • Python e il metodo setdefault

    Note to self (pun intended): questo post rappresenta una sorta di appunto mentale per ricordarmi il funzionamento di setdefault in Python, visto che puntualmente mi trovo ad utilizzarlo.

    setdefault è utilizzato sui dizionari (dict) e permette di impostare una chiave di default durante una set. Mi spiego meglio con un esempio:

    >>> D
    {1: 'leonard', 2: 'sheldon', 3: 'wolowitz', 4: 'rajesh'}
    

    Vediamo come funziona il metodo setdefault:

    >>> D.setdefault(1, 'penny')
    'leonard'
    >>> D
    {1: 'leonard', 2: 'sheldon', 3: 'wolowitz', 4: 'rajesh'}
    >>> D.setdefault(5, 'penny')
    'penny'
    >>> D
    {1: 'leonard', 2: 'sheldon', 3: 'wolowitz', 4: 'rajesh', 5: 'penny'}
    

    Ovvero, setdefault valuta la chiave passata come primo argomento:

    • se è già presente nel dizionario, viene ritornato il valore della chiave presente nel dizionario;
    • altrimenti viene aggiunta al dizionario con il valore specificato come argomento.

    in termini pythonici:

    def setdefault(d, key, val):
        if key in d:
            return d[key]
        else:
            d[key] = val
    
  • Eclipse: impostare un template per l’inserimento di un Logger log4j

    Mi capita spesso, in Eclipse, di inserire il codice per abilitare il logging di una classe tramite log4j:

    private static Logger logger = Logger.getLogger(Klass.class);
    

    Utilizzano i templates, una funzionalità di Eclipse, possiamo evitare di riscrivere tutte le volte questa semplice istruzione. Per impostare un template, in Eclipse, è sufficiente recarsi su: Window > Preferences > Java > Editor > Templates e creiamo un nuovo template.

    Nel campo pattern inseriamo:

    private static Logger logger = Logger.getLogger( ${enclosing_type}.class );
    ${:import(org.apache.log4j.Logger)}
    

    A questo punto, per inserire il logger, è sufficiente utilizzare lo shortcut CTRL+Space per visualizzare gli autocompletamenti, e selezionare “logger” dal menu.