Category: programming

  • 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.

  • Tutte le novità di Java 7

    A metà 2011 è stata rilasciata la versione 7 di Java [nickname Dolphin].
    Due sono le grandi novità di questo rilascio:

    • Java è ora marchiata Oracle (che ha acquisito Sun)
    • La reference implementation è ora OpenJDK (l’implementazione open-source di Java), mentre per le passate versioni rimane HotSpot, la versione di Sun Oracle.

    Le novità più interessanti, dal punto di vista delle API, sono:

    • Una (nuova) versione delle API NIO 2 per la gestione e la navigazione del file-system (come ad esempio: Path, Files)
    • Supporto al multiprocessing (ForkJoinTask / RecursiveTask)
    • La possibilità di usare instanze di String come argomento di switch:
      “`
      switch (s) {
      case "foo": break;
      case "bar": break;
      case "foobar": System.out.println("it's foobar!");
      }
      “`
    • Catturare diversi tipi di Exception con una sola catch [separando le Exception con un ‘|’]:
      “`
      try {
      FileInputStream fi = new FileInputStream("foo.txt");
      }
      catch(FileNotFoundException | IoException e) {
      log.error("error: not found or I/O Exception");
      }
      “`
    • try-with-resource [Automatic Resource Management]: dentro ai blocchi try/catch/finally si rimanda la chiusura degli stream/connessioni al finally. Grazie a try-with-resource è la stessa JVM che si occupa di fare ordine con le risorse utilizzate al termine del blocco.
      “`
      try (FileOutputStream fos = new FileOutputStream(f)) {
      fos.write(buf, 0, len);
      }
      catch (Exception e) {
      log.error(e);
      }
      “`
    • Diamond operator (solo sintassi, evitiamo la ripetizione della classe usando i Generics):
      “`
      List<String> foobar = new ArrayList<>();
      “`
    • Leggibilità dei valori numerici (specifichiamo un separatore ‘_’):
      “`
      long accountNumber = 1234_5678_9012L;
      “`
    • JDBC 4.1 (Annotazioni `@Select` e `@Update` per definire le query, `DataSet` sostituisce ResultSet)
  • zsh: perché non utilizzo bash

    Su tutte le macchine Linux e OSX che amministro non uso come shell di default la bash; uso invece zsh, perché:

    • zsh si offre di completare anche le opzioni e i parametri dei programmi più usati;
    • zsh fa spelling correction dei comandi digitati, chiedendo interattivamente se volete correggere il comando;
    • zsh offre una customizzazione più spinta della bash (vedremo tra poco il mio prompt);
    • zsh condivide la history tra più sessioni attive contemporaneamente;
    • zsh è già installata, di default, su OSX (ed è nei repo di Ubuntu, percui basta un aptitude install zsh).

    Se questi vantaggi non dovrebbero bastare, ecco il mio prompt:

    Ho scritto un tema ad-hoc, che funziona grazie a oh-my-zsh (un framework di customizzazione per zsh, che consiglio vivamente!). Cos’ha di speciale il mio prompt rispetto ad una semplice bash?

    • Colorazione diversa del prompt se siamo root
    • Colorazione del prompt in base all’esito positivo o negativo dell’ultimo comando utilizzato
    • Visualizzazione dello stato del repo git della directory attuale: branch + status (modifiche unstaged?)

    Ho caricato su github i due temi che ho creato per oh-my-zsh: michelebologna.zsh-theme è quello mostrato in questi screenshot. Ovviamente, prima dovete installare oh-my-zsh. Feedback benvenuti!

  • FizzBuzz reloaded: le differenze tra Java e Ruby

    Tempo fa vi ho parlato di FizzBuzz, un quiz spesso posto ai programmatori alle prime armi.

    Una variante è la seguente:

    Sommare tutti i numeri da 1 a 200 che non sono multipli di 4 e di 7

    La parte divertente sta nella differenza di espressività tra Java e Ruby per ottenere lo stesso risultato. In Java, infatti:

    public class FizzBuzzReloaded {
        public static void main(String[] args) {
            int sum = 0;
    
            for (int i = 1; i <= 200; i++) {
                if (i % 4 != 0 && i % 7 != 0) {
                                 sum += i;
                }
            }
            System.out.println(sum);
        }
    }
    

    In Ruby, invece, grazie alla funzionalità del linguaggio, possiamo semplicemente scrivere:

    (1..200).select {|n| n % 4 != 0 and n % 7 != 0}.inject(:+)
    
  • Formattare i decimali con Python

    Un problema che ho recentemente risolto usando Python e la logica binaria prevedeva di stampare i numeri binari usando lo stesso numero di cifre [ad esempio: nel caso di 8 bit, stampare le parole di 4 bit anteponendo zero per quattro volte]. Tecnicamente, gli zero a sinistra sono ininfluenti ma servono per uniformare la formattazione, e in gergo sono chiamati leading zeros.
    Questo ragionamento non vale solo per i numeri in binario, ma per tutti i casi in cui si vuole formattare l’output di Python.

    Veniamo al codice. Si può formattare la stringa tramite format, specificando il numero di leading zeros.
    Esempio:

    for i in range(1,101,1):
        print(format(i, "03d"))
    
    

    In questo caso vengono stampati i numeri usando 3 cifre: si parte quindi da 000 e si arriva a 100. E in più, abbiamo usato una sintassi già compatibile con Python3.

  • viaggiatreno-scraper: una libreria Ruby per accedere a viaggiatreno/trenitalia

    Un po’ per divertimento e un po’ perché volevo approfondire la mia conoscenza di Ruby e delle regex, oltre che delle espressioni XPath, ho deciso di rilasciare una libreria opensource Ruby che ho creato. Permette infatti di accedere ai dati di viaggiatreno che espone gli orari dei treni di Trenitalia in tempo reale.

    Come funziona?

    Un paio di anni fa avevo scritto un parser analogo in Python, ma molto meno robusto [proprio perché non utilizzavo le espressioni XPath e le regex]. Il nuovo scraper, scritto in Ruby con l’ausilio di nokogiri, è molto semplice da utilizzare; un esempio:

    irb(main):004:0> require './src/Train.rb'
    irb(main):005:0> train = Train.new(5033) # numero identificativo del treno (vedi Trenitalia.it)                               
    => 5033 (REG 5033): Il treno e' arrivato con 8 minuti di ritardo 
    (state: FINISHED, delay: 8, lastUpdate: )
    irb(main):007:0> train.status
    => "Il treno e' arrivato con 8 minuti di ritardo"
    irb(main):008:0> train.delay
    => 8
    irb(main):009:0> train.lastStop
    => "[X] BERGAMO = SCHEDULED: 07:46 ACTUAL: 07:53\n"
    irb(main):010:0> train.trainStops
    => [[X] LECCO = SCHEDULED: 07:03 ACTUAL: 07:04
    , [X] VERCURAGO S.GIROLAMO = SCHEDULED: 07:08 ACTUAL: 07:08
    , [X] CALOLZIOCORTE OLGINATE = SCHEDULED: 07:11 ACTUAL: 07:11
    , [X] CISANO CAPRINO BERGAMASCO = SCHEDULED: 07:22 ACTUAL: 07:21
    , [X] PONTIDA = SCHEDULED: 07:26 ACTUAL: 07:32
    , [X] AMBIVERE MAPELLO = SCHEDULED: 07:31 ACTUAL: 07:36
    , [X] PONTE S.PIETRO = SCHEDULED: 07:38 ACTUAL: 07:43
    , [X] BERGAMO = SCHEDULED: 07:46 ACTUAL: 07:53
    ]
    

    Di conseguenza, un programma alert per venire avvisati via sms (tramite tinsms) solo quando il treno è in ritardo per più di 10 minuti, o quando il treno non è ancora partito (scioperi, malfunzionamenti, etc.), diventa:

    require_relative 'src/Train.rb'
    require_relative '../sms-utils/sendsms.rb'
    
    RECIPIENT = 'num_tel'
    log = Logger.new('log/viaggiatreno-alert.log')
    log.level = Logger::DEBUG
    
    train = Train.new(ARGV[0])
    
    if train.delay.to_i >= 10 or train.status == "Il treno non e' ancora partito"
       send_sms(RECIPIENT, train)
       log.info(train)
    end
    

    Ho rilasciato i sorgenti su GitHub: viaggiatreno-scraper – il codice ha licenza GPL, e di conseguenza siete liberi di dire la vostra e soprattutto apportare migliorie!

    Un altro esempio di cosa si potrebbe fare?
    Ogni giorno alle 11:59PM, si potrebbe raccogliere la situazione di tutti i treni circolati sulla rete ferroviaria; in questo modo, si potrebbero estrarre delle curiose statistiche sul ritardo/anticipo medio, e tanto altro. Scrivere un task MapReduce/Hadoop che fa tutto questo non è per niente complicato…

  • Javascript Scope Quiz

    Se vi state cimentando nell’apprendimento di Javascript, vi segnalo l’interessante Javascript Scope Quiz, che vi metterà alla prova sugli scope delle variabili. Il quiz non è difficile, ma vi aiuta a capire le particolarità di Javascript per quanto riguarda gli scope, come questa domanda:

  • Impariamo git con un semplice tutorial

    GitHub, il social hoster di codice open source più famoso degli ultimi anni, ha messo a disposizione un semplice tutorial per imparare le basi di git, il SCM ideato da Linus Torvalds e lo standard de facto dei progetti open source.

    Il tutorial si trova su Code School – Try Git.

  • jVisualVM: il profiler Java incluso nella JDK

    Mi sono recentemente trovato a dover fare del profiling di prestazioni di un software Java SE. Tra le varie opzioni che avevo a disposizione per il profiling in ambito Java, ho scelto jVisualVM inizialmente perché già incluso nella JVM (a partire dalla versione 1.6, tutte le Sun Java JDK includono il profiler).

    L’esperienza con jVisualVM è stata davvero ottima: il profiler è semplice, facile e completo. Partiamo dall’avvio, molto semplice: da linea di comando si lancia jvisualvm. Ma niente paura, apparirà subito la finestra di profiling, che vi permetterà di fare un attach ai processi Java attualmente attivi sul vostro sistema e che volete monitorare:

    Una volta selezionato il processo che vogliamo monitorare, passeremo al dettaglio e potremo visualizzare l’uso di CPU e heap, nonché il numero di thread allocati dal programma. Possiamo anche fare un sempling del processo, raccogliendo in tempo reale informazioni sull’utilizzo di CPU e heap:

    In generale, jVisualVM è un ottimo profiler per programmi Java: presenta le informazioni in modo semplice e completo; grazie a queste informazioni sono riuscito a diagnosticare (e risolvere) i problemi di performance del programma che stavo analizzando. Non è da sottovalutare, inoltre, che jVisualVM è praticamente disponibile per tutte le piattaforme su cui gira la JVM.

    Vi segnalo infine che è anche possibile integrare anche il profiler con Eclipse.

  • Aggiornare tutte le Ruby gems installate

    Per aggiornare le gem installate suggerisco di:

    1. Aggiornare la versione di RubyGems installata:gem update --system
    2. Aggiornare tutte le gemme installate: gem update
    3. Rimuovere la versione “obsoleta” delle gemme installate: gem cleanup

    Può capitare che ci siano dei problemi di dipendenze durante la fase di cleanup:

    michele@delta:~ % gem cleanup [ 7:00PM]
    Cleaning up installed gems…
    Attempting to uninstall sprockets-2.1.2

    You have requested to uninstall the gem:
    sprockets-2.1.2
    actionpack-3.2.3 depends on [sprockets (~> 2.1.2)]
    If you remove this gems, one or more dependencies will not be met.
    Continue with Uninstall? [Yn]

    In questi casi vi sconsiglio di rimuovere la gem in questione in modo da non violare la dipendenza.