Un pò di sapere è pericoloso: “Ars longa, vita brevis”

Da quando ho messo su questo blog articoli tecnici, mi arrivano spesso mail per informazioni sulla risoluzione di problemi di programmazione, soprattutto quelli legati all’iOS di Apple, visti alcuni processi “rognosi” in cui spesso ci si sbatte.
La mia idea è che si sta procedendo verso quella che definirei “standardizzazione” del linguaggio, che facilita la programmazione, portando anche i non esperti del settore a “cimentarsi” nello sviluppo dei software.

Quella che scrivo è una riflessione che si può applicare ai settori lavorativi più disparati, ma che qui vorrei particolareggiare per quello in cui opero, quello dello sviluppo di software appunto.

Innanzitutto, parto da una citazione famosa di Socrate: “Scio ne sapio” (“Io so di non sapere”). La citazione è rivolta (e venne rivolta) con un atteggiamento polemico contro coloro che pretendono di sapere troppo. Ma il “non” sapere è uno stato normale dell’uomo.
La presente riflessione è nata dopo aver letto una mail, e di cui qui vi riporto un estratto:

[…] So utilizzare abbastanza bene Windows 7; non sono un programmatore, ma mi interesserebbe prendere delle lezioni sull’utilizzo dello smartphone e tablet Apple (rispettivamente iPhone e iPad). Sono appassionato di questi apparecchi, ma non so utilizzarli. […]

Cosa ho pensato? La curiosità è lecita, ma non si può pretendere di imparare a programmare così da un giorno all’altro e, sicuramente, non è il caso di partire da Objective-C per farlo.

Il punto di partenza potrebbe essere quello di trovare un “linguaggio padre”, come può essere C/C++/Java per i linguaggi “tipati” o Python/PHP per quelli “non tipati”.
L’importante è iniziare a pensare alla programmazione. Non programmare.

Mi ha molto affascinato l’articolo di Peter Norvig (padre dell’intelligenza artificiale) dal titolo: “Teach Yourself Programming in Ten Years“, e di cui riporto il link all’ottima traduzione di Fabio Tessitore): Imparara a programmare in 10 anni…perchè vanno tutti di fretta?

Vi invito a leggerlo tutto di un fiato. Io da qui ho estrapolato le seguenti frasi/citazioni:

  • La conclusione è che le persone vanno molto di fretta quando devono imparare qualcosa sui computer, oppure che i computer sono qualcosa di favolosamente facile da imparare rispetto a qualsiasi altra cosa.
  • Non ci sono libri su come studiare Beethoven, la Fisica dei Quanti o perfino l’Addestramento dei Cani in pochi giorni.
  • Come disse Alexander Pope, “un po’ di sapere è pericoloso“.
  • Qual è il punto? Alan Perlis una volta disse: “Un linguaggio che non influenza il modo di pensare la programmazione, non vale la pena di essere conosciuto. È possibile che debba imparare una piccola parte del C++ (o più probabilmente, qualcosa del tipo JavaScript o Flash) perché hai bisogno di interfacciarti con qualcosa di esistente per portare a termine un compito specifico. Ma allora non stai imparando a programmare; stai imparando a completare quel compito”.
  • Alcuni ricercatori (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) hanno dimostrato che sono necessari circa dieci anni per sviluppare esperienza in una gran varietà di campi, inclusi il gioco degli scacchi, la composizione musicale, la telegrafia, la pittura, il suonare il pianoforte, il nuoto, il tennis, le ricerche in neuropsicologia e in topologia.
  • La chiave è la pratica intenzionale: non semplicemente farlo ancora e ancora, ma impegnarsi in un compito appena oltre le proprie abilità, provare, analizzare il proprio rendimento mentre e dopo l’esecuzione e correggere gli errori. Quindi ripetere. E ripetere ancora. (Vedi l’articolo “Lo sgobbone batte l’intelligente“)
  • Samuel Johnson (1709-1784) pensava ci volesse anche di più: “L’eccellenza in un campo qualsiasi può essere raggiunta solo attraverso il lavoro di una vita; non si può acquistare ad un prezzo inferiore“. E Chaucer (1340-1400) aggiunse La vita è così breve, l’arte così lunga da imparare. Ippocrate (c. 400 AC) è noto per la massima “Ars longa, vita brevis“, che è parte della citazione più lunga “Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile, che in Italiano suona come” –  [La vita è breve, l’arte è lunga, l’occasione è fugace, l’esperienza ingannevole, il giudizio difficile]. Sebbene in Latino, “ars” può significare sia arte che mestiere, nell’originale Greco la parola “techne” significa solo abilità, non arte.
  • Lavora su progetti insieme ad altri programmatori. Sii il miglior programmatore in alcuni progetti; sii il peggiore in altri. Quando sarai il migliore potrai testare le tue abilità di guidare un progetto e ispirare gli altri con la tua visione. Quando sarai il peggiore imparerai cosa fanno i maestri, e cosa non piace fare loro (perché lo faranno fare a te).
  • Perlis dice che i migliori hanno un talento che prescinde dall’allenamento. Ma da dove viene questo talento? È innato? O viene sviluppato con la diligenza? Auguste Gusteau (lo chef di Ratatouille) dice: “Tutti possono cucinare, ma solo gli impavidi possono essere grandi.” Penso sia volontà di dedicare una larga parte della propria vita alla pratica. Ma forse “impavidi” è un termine per sintetizzare questo concetto. Oppure, come dice Anton Ego, il critico di Gusteau: “Non tutti possono diventare grandi artisti, ma un grande artista può venir fuori da ovunque“.

Non c’è altro da aggiungere penso. Occorre aver la coscienza di non sapere le cose, per studiarle, provarle e confrontarsi con gli altri, migliorandosi continuamente. Comunque, il segreto per sopportare lo sforzo è quello di fare le cose con passione.

 

[BigData] Il Big Data Forum 2012 a Roma: le soluzioni ICT per un vantaggio competitivo

Il 21 Novembre scorso si è tenuta a Roma la 2° edizione del Big Data Forum, dallo slogan “Big Data Forum 2012: per fare chiarezza sul fenomeno dell’esplosione dei dati e scoprire le soluzioni ICT che consentono di trasformarlo in vantaggio competitivo“.

L’evento, pubblicizzato da ICT4Executive, con partner di eccezione come Microsoft, Oracle e Informatica Software, è stato condotto da relatori di riguardo, particolarmente distinti sia nel campo della ricerca ICT (in particolare, nella Business Intelligence), che in quello strategico aziendale.

Ho partecipato all’evento e vi riporto un resoconto dettagliato delle tematiche affrontate ed estrapolate dagli interventi dei relatori presenti.

 

La Big Data Analysis

Il moderatore Carlo Vercellis, responsabile dell’Osservatorio di Business Intelligence & Big Data Analytics e professore alla School Management del Politecnico di Milano, ha sottolineato che il BigData è un tema di attualità molto in voga nell’ultimo periodo, come il cloud computing del resto, ma che da fenomeno del momento deve trasformarsi in innovazione tecnologica, in grado di cambiare gli attuali schemi e paradigmi del modo di trattare le informazioni su Internet.
Come non citare lo slogan di Tim Berners-LeeROW DATA, NOW!“. Dati grezzi da trattare, che sono diventati (e diventeranno ancora) troppi e dai cui è difficile poter estrarre informazione. Un fenomeno di cui si vocifera particolarmente nell’ultimo periodo, visti gli impegni delle varie iniziative di Open Data e eGov, che “impongono” ai detentori illegittimi di dati (ndr. come pubbliche amministrazioni) di distribuire informazioni di proprietà dei cittadini.

 

I dati diventano “interessanti” solo se siamo capaci di estrarre da essi un contenuto utile, da trasformare in servizio per gli utenti finali.

 

Continua la lettura

La crisi dei piccoli Comuni: sempre meno servizi nelle aree interne

Su LuBannaiuolu.net si leggono due notizie negative per il mio paese:

Addirittura, fino a qualche mese fa, si parlava di installare un inceneritore nella piana del Sele. Un paese che con il Terremoto del 1980, di cui è appena trascorso il 32° anniversario, è stato distrutto quasi interamente e che si è visto segnare il destino di una Comunità che non si è più risvegliata.

In merito all’ultimo episodio della chiusura dell’ufficio postale di Quaglietta, ecco cosa penso. Ennesima “mazzata” nei confronti di una Comunità che perde un altro servizio, come tanti altri che si è vista sottrarre da anni a questa parte.
Stanno chiudendo scuole, uffici pubblici/privati, fabbriche, ecc. Mettiamo in conto anche che il servizio “Provincia” si allontanerà ancora di più dai nostri centri…
Ma i nostri paesini hanno già perso quella che è la vera forza, costituita dai propri giovani che non ritornano più a casa, per cercar “fortuna” altrove. Dove la “fortuna” al giorno d’oggi è il lavoro.

Quindi, la domanda è: “Che senso ha avere servizi se poi nn c’è gente sufficiente che ne possa usufruire?“.  La risposta “logica” e più realistica potrebbe essere: “Si, occorre togliere quel servizio, risparmiare, non poter far altrimenti, anche se vorrebbe dire creare disagio a quelle poche persone che sono rimaste“. La direzione verso cui si sta andando, in un periodo come questo, è il risparmio …i cosiddetti tagli dei costi nelle “aree interne” e che si stanno spopolando.

La protesta è lecita, ma l’accorpamento/detrazione dei servizi è purtroppo giustificabile. Dove si può agire? Dal basso, come sempre. Dando lavoro, opportunità/spazio, un incitamento e una pacca sulla spalla ad un giovane…

[21 Novembre 2012] Big Data Forum 2012 a Roma

Big Data Forum 2012

Per fare chiarezza sul fenomeno dell’esplosione dei dati e scoprire le soluzioni ICT che consentono di trasformarlo in vantaggio competitivo

21 NOVEMBRE 2012 – ROMA

Ore 9.30 – Centro Congressi Roma Eventi – Piazza della Pilotta, 4 – Roma

  • Quali sono le opportunità ed i benefici derivanti dall’utilizzo di soluzioni ICT per la gestione dei Big Data?
  • Qual è l’impatto sulla competitività dell’impresa?
  • Come gestire ed analizzare dati destrutturati derivanti da fonti esterne (siti Web, social media, ecc.)?
  • In quali settori si stanno diffondendo maggiormente tali soluzioni?
  • A supporto di quali attività dell’impresa?
  • Quali sono le soluzioni infrastrutturali che abilitano la gestione dei Big Data?

Il 21 novembre a Roma si terrà Big Data Forum, un evento nel corso del quale si cercherà di rispondere a queste e altre domande, focalizzandosi sul contributo di alcune soluzioni ICT nel miglioramento dei processi decisionali strategici e operativi.

La capacità di analizzare un’elevata mole di informazioni – spesso non strutturati – può rappresentare per le imprese operanti in alcuni settori una chiara fonte di vantaggio competitivo e di differenziazione.

Questo perché in proporzione all’aumento di nuove tipologie di informazione come i social media e il mondo Internet of Things, caratterizzate da un ciclo di vita molto breve (basti pensare che, secondo alcune stime, il 90% dei dati utilizzati oggi dalle imprese è stato creato negli ultimi 2 anni), aumenta anche l’esigenza di gestirle dal punto di vista della velocità, della varietà e della complessità.

Per far fronte a queste esigenze, le aziende dovranno dotarsi di nuove soluzioni ICT, sia a livello infrastrutturale che applicativo, per gestire e immagazzinare un’ampia quantità di dati e migliorare le proprie capacità di analisi e di previsione.

BIG DATA FORUM, propone un confronto su queste tematiche e su quali siano le migliori soluzioni da adottare per aumentare la competitività dell’impresa.

Il sito con le informazioni sull’evento e per registrarsiICT4Executive

————————————————————————

Vi linko anche all’articolo che spiega bene il fenomeno: Big Data: l’infografica per capire cosa sono e perchè possono cambiare il mondo

[iOS] Come effettuare chiamate asincrone

La modalità sicuramente più performante per richiamare dei servizi online di back-end da una vostra app è quella delle chiamate asincrone.

1° METODO (con dispatch_async). Il classico metodo in iOS, che definirei “nativo”, è quello che utilizza il dispatch_async:

// Add to top of file
#import <;dispatch/dispatch.h>;

// Use it
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
     NSData* responseData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://tuo-sito/servizio"]];

/* ... your code here ...*/

});
}

Non occorre importare nessuna libreria. Nella responseData vi è la risposta HTTP, da cui potete recuperare i vostri dati. Tale metodo richiama il Grand Central Dispatcher per eseguire la chiamata e ricevere una risposta (asincrona) dal server in background. Intanto, la vostra app continua ad eseguire sul thread principale il lavoro, senza bloccarsi in attesa dei dati del servizio richiamato.

2° METODO (con ASIHTTPRequest ). Il metodo che, invece, preferisco è quello che utilizza l’utilissima libreria ASIHTTPRequest, che ci permette di effettuare in modo semplice chiamate HTTP (sincrone e asincrone) e interagire con servizi REST (vedi l’articolo “La filosofia REST“, su questo blog). E’ una libreria particolarmente utile per effettuare anche upload e download di file, chiamate con autenticazione sicura HTTPS, e molto altro … e vi consiglio vivamente di provarla.

La potete scaricare direttamente dal sito ufficiale: ASIHTTP-request downloads

Come si spiega qui: Setup-Instructions, per installarla nel vostro progetto, occorre importare le seguenti librerie/framework (che trovate direttamente in xCode – click sulla root di progetto >> Build Phases >> Link Binary With Libraries):

  • CFNetwork,
  • SystemConfiguration
  • MobileCoreServices
  • libz.dylib (attualmente c’è libz.1.2.5.dylib)
Ecco un esempio di chiamata in POST ad un servizio REST che restituisce un JSON:
//import libs
#import "ASIFormDataRequest.h"

/* ... your code in controller ...*/

- (void)fetchedData:(NSData *)responseData {

    NSArray* json = [NSJSONSerialization
                     JSONObjectWithData:responseData
                     options:kNilOptions error:nil];

    NSMutableArray *postTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];

    for (NSDictionary *dict in json) {
        Post *post = [[Post alloc] init];
        post.titolo = [dict objectForKey:@"titolo"];
        post.articolo = [dict objectForKey:@"articolo"];
        post.snippet = [dict objectForKey:@"snippet"];
        post.urlImage = [dict objectForKey:@"urlImage"];
        post.urlThumb = [dict objectForKey:@"urlThumb"];
        [postTMP addObject:post];
    }

    //mi assicuro che l'array non possa essere modificato.
    self.posts = [postTMP copy];
    NSLog(@"posts count: %d",[self.posts count]);

    [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}

- (void)requestFinished:(ASIHTTPRequest *)request {

    NSLog(@"Response %d ==>; %@", request.responseStatusCode, [request responseString]);
    NSData *responseData = request.responseData;

    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:responseData waitUntilDone:YES];

}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    //[progressAlert release];
    NSError *error = [request error];
    NSLog(@"ERROR %@",error);

    if ([[request error] code] == ASIConnectionFailureErrorType  ||
        [[request error] code] == ASIRequestTimedOutErrorType){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ERROR", nil) message:NSLocalizedString(@"CONNECTION_FAILED",nil)
            delegate:self cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
        [alert release];
        //return;

    }
    else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ERROR",nil) message:
        NSLocalizedString(@"GENERIC_ERROR",nil)
            delegate:self cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
        [alert release];
        //return; 
    }  
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"http://francescoficetola.it/services/test.php"];

    ASIFormDataRequest *myRequest = [ASIFormDataRequest requestWithURL:url];

    [myRequest setDefaultResponseEncoding:NSUTF8StringEncoding];
    [myRequest setResponseEncoding:NSUTF8StringEncoding];
    [myRequest setRequestMethod:@"POST"];
    [myRequest setPostValue:@"valueMyParameter" forKey:@"myParameter"];

    [myRequest addRequestHeader:@"Accept" value:@"application/json"];
    [myRequest addRequestHeader:@"Content-Type" value:@"application/json; charset=UTF-8;"];
    [myRequest setDelegate:self];

    [myRequest startAsynchronous];

}
Nel metodo viewDidLoad, si prepara la richiesta asincrona in POST, settando i valori da inserire nell’header HTTP, come il Content-Type, lo User-Agent e la codifica da utilizzare. Con il comando startAsynchronous, la richiesta viene inviata al servizio specificato nella URL. Per effettuare una chiamata in GET, occorre modificare in setRequestMethod:@”GET”

 

Occorre definire poi i due metodi di success ed error callback:
  • requestFailed: è il metodo che viene richiamato se la risposta non è andata a buon fine. E’ possibile intercettare anche il relativo status code, per visualizzare i relativi messaggi di errore all’utente;
  • requestFinished: è il metodo che viene richiamato in caso di ricezione con successo della risposta, raccolta dalla variabile responseData. L’elaborazione di quest’ultima viene effettuata con un metodo (che non fa parte della libreria ASIHTTPRequest) che, in un thread di background, estrae dal JSON una lista di oggetti (in questo esempio, i post di un forum), ricaricandoli poi in una UITableView (con il metodo nativo reloadData).
In alternativa, è possibile dichiarare le funzioni di callback di successo ed errore direttamente prima della chiamata asincrona, definendo dei blocks:
/*  ...  */   

   [request setDelegate:self];
   [request setCompletionBlock:^{         
        NSString *responseString = [request responseString];
        NSLog(@"Response: %@", responseString);

        /* your code here in success case */

    }];
    [request setFailedBlock:^{
        NSError *error = [request error];
        NSLog(@"Error: %@", error.localizedDescription);

       /* your code here in error case */

    }];

   [request startAsynchronous];

/*  ...  */
Direi che entrambi i metodi sono abbastanza semplici, ma quello con la ASIHTTPRequest offre sicuramente maggiore controllo e un ricco set di funzionalità per la connettività ai nostri servizi. Eccole tutte: http://allseeing-i.com/ASIHTTPRequest/How-to-use
Creative Commons License
This work by Francesco Ficetola is licensed under a Creative Commons Attribution 4.0 International License.
Based on a work at www.francescoficetola.it.
Permissions beyond the scope of this license may be available at http://www.francescoficetola.it/2012/11/03/ios-come-effettuare-chiamate-asincrone/.

[iOS] La risoluzione delle icone nelle app iOS, con link utili da dove scaricarle

Eccovi un pò di riferimenti e di link utili per scaricare delle iconcine da inserire nelle vostre app iOS (e non solo). Innanzitutto, il riferimento per la risoluzione delle “custom icon“, da inserire nelle tabbar, toolbar, come badges o sulla springboard…e quant’altro, è quello ufficiale di Apple: Custom Icon and Image Creation Guidelines

Leggete anche questo articolo su DevApp.it (anche se non aggiornato): Linee guida per la creazione di icone e splashscreen per applicazioni iPhone e iPad

Alcuni siti utili da dove scaricare (sia gratuitamente che a pagamento) i set di icone per le vostre app sono i seguenti:

Se ne conoscete altri, segnalateli nei commenti. Grazie! 😉