All posts by Paul

Il problema del consenso distribuito: l’algoritmo Paxos, step-by-step

Nei sistemi distribuiti, una serie di macchine sono in grado di raggiungere un consenso su una decisione che è estremamente importante. I sistemi di database, ad esempio, devono assicurare che tutte le macchine siano d’accorso se effettuare un commit o il rollback di una transazione, in modo che ogni macchina abbia una visione coerente dei dati (si immagini ad esempio il problema sul proprio conto bancario. Una macchina pensa che tu abbia 1000 euro sul tuo conto, ma un’altra macchina crede che tu abbia il conto vuoto).

Il consenso è difficile da raggiungere, perché i messaggi tra le macchine possono essere persi o ritardati in modo indefinito, oppure le macchine stesse possono fallire – come fa una macchina a sapere se un’altra macchina ha elaborato un messaggio?

Solitamente si utilizza il Commit a due fasi (Two-phase commit), ma ha un problema – se il nodo coordinatore di una transazione fallisce, il sistema rimane bloccato fino a quando questo nodo non si riavvia. Il commit a tre fasi risolve questo problema del blocco, ma fa sempre affidamento su un unico coordinatore.

In questo articolo, si discute Paxos, un protocollo distribuito alternativo al commit a due fasi e a quello a tre fasi. Paxos garantisce che i nodi sceglieranno sempre e solo un singolo valore (quindi garantisce la safety), ma non garantisce che un valore verrà scelto se la maggioranza dei nodi non sono disponibili (progress). Gli algoritmi di consenso hanno come obiettivo la safety, perché non importa se si faccia un commit o un rollback – ma è di fondamentale importanza che una sola risposta sia scelta.

Continue reading Il problema del consenso distribuito: l’algoritmo Paxos, step-by-step

Passare da Aruba a Bluehost (in 1 semplice mossa)

da server a serverCi sono dei nomi che ci fanno rizzare i capelli solo leggendoli e sentendoli pronunciare. Nel mio caso, si tratta di un’azienda, che mi ha fatto perdere letteralmente il lume della ragione. Aruba! Quando sento il nome Aruba mi vengono subito i brividi! Sto parlando di quel servizio di “hosting” (se così vogliamo chiamarlo!) che inizialmente proponeva domini e hosting linux o windows a prezzi stracciati, e magari, 6-7 anni fa, i servizi che offriva erano pure buoni. Oggi su Aruba si trovano solo “servizi” alla deriva, a prezzi anche esorbitanti per ciò che offrono, per niente giustificati, che faranno imprecare non poco il malcapitato che purtroppo avrà sottoscritto un piano di hosting con loro.

Circa 7 anni fa, feci il malsano errore di sottoscrivere un hosting linux+dominio con loro. I primi anni mi trovai bene, il blog che ospitavo era sempre online e non avevo particolari problemi, tranne per il fatto che Aruba era l’unico hosting sul quale wordpress ogni tanto dava problemi. Gli aggiornamenti automatici? Impossibili da eseguire se non si modificava prima qualche permesso a qualche file o cartella sull’FTP. Vabbè, problemi di poco conto rispetto a quelli di cui sto per parlarvi.

In sostanza, dopo circa 5 anni, decido di cambiare hosting perché inizia a starmi stretto. I motivi sono tanti, e tutti di notevole importanza. Li elenco per punti:

– Il ridicolo spazio per il database che ti forniscono (100MB, a 7€ l’anno solo per avere il database MySQL). Avevo superato tale soglia e pagavo un’enormità!

– I disservizi continuavano ad aumentare. Un giorno la sala server andò a fuoco, e rimasi un intero giorno offline. Un’altra volta l’orario del server che ospitava il mio sito web cambiò, impedendo così a me e agli altri autori di programmare la pubblicazione degli articoli per oltre 3 settimane.

– Se volevo ospitare un altro dominio sul mio server, dovevo pagare anche un nuovo piano di hosting!

– L’assistenza è indecente! Ai centralini occorrono ore di attesa prima che risponda qualcuno, e il sistema per avere assistenza online funziona solo tramite ticket, il che significa che rispondono quando meglio gli aggrada. Se io faccio la richiesta oggi, è possibile che passino anche 1-2 giorni prima di una risposta. Qualche ora dopo se vi va bene!

– Non esiste un pannello (c-panel o simil) che permetta di amministrare come dio comanda il proprio spazio. L’unico accesso consentito è l’FTP. Niente SSH, nulla di nulla. Niente shell. Non si ha il controllo che sarebbe auspicabile avere.

Ebbene, i problemi più grossi arrivano durante il trasferimento del sito web! In 5 anni ho accumulato circa 20GB di dati sul server, ma Aruba (mortacci loro!) non offrono alcun sistema per il trasferimento/backup di tutto il contenuto del server. Contatto l’assistenza e dopo giorni e giorni di discussione con loro (sempre via ticket), si arriva alla conclusione che l’unico modo è farlo via FTP. Cioè spostare tutto il contenuto prima sul mio PC e successivamente caricare il tutto (20GB!) sul nuovo server, questo ovviamente senza effettuare durante le operazioni di spostamento nessun aggiornamento al sito.

All’epoca (due anni fa) quando tentai l’operazione non ce la feci, era assolutamente impossibile cercare di spostare tutto il contenuto con una semplice ADSL 7MB di Telecom Italia. Rinunciai e rimandai di anno in anno, fino a qualche giorno fa.

Il rinnovo dell’hosting si avvicinava nuovamente alla scadenza, e non volevo rinnovare il tutto per il secondo anno consecutivo, mentre loro continuavano a non garantirmi nulla e a non fornirmi alcun servizio di mia utilità. Persino le email che ormai tutti gli hosting forniscono gratuitamente (o quasi), loro se le facevano pagare care e amare.

Decido così di tentare a trasferire (per la 2° o 3° volta) tutto il contenuto del server, da Aruba a Bluehost, hosting che utilizzo con soddisfazione fin dal loro esordio sul mercato.

indiana jones change server

Contatto nuovamente l’assistenza Aruba, e per mia fortuna sembra essere cambiato qualcosa! No, non sono diventati più veloci, semplicemente adesso possono fornirti nel tuo spazio FTP un file backup-spazio.tgz con tutto il contenuto del server. QUALCUNO (DIO?) SIA LODATO!

Rimane un problema. Il file compresso, pesa comunque la bellezza di 6,95GB. Come lo trasferisco? Via FTP o FXP è impensabile, impiegherei dei giorni. L’unica soluzione, è utilizzare la shell SSH dell’ottimo Bluehost, e iniziare a smanettarci!

Ho passato dei giorni a cercare di copiare il file, in quanto Aruba mi chiudeva sempre la connessione. Alla fine, siccome non c’era speranza di copiarlo in una sola volta senza che il server mi buttasse fuori, ho trovato il modo.

La procedura è abbastanza semplice.

Anzitutto connettetevi in SSH al vostro account Bluehost.

Fatto ciò, spostatevi nella path all’interno del vostro server Bluehost dove volete che venga posizionato il file. Utilizzate “cd” (change directory).

Quindi utilizzate questo semplice comando:

wget -c –ftp-user=mio_username –ftp-password=mia_password ftp://ftp.miodominio.com/cartella/backup_spazio.tgz

Spiego brevemente l’intero comando.

wget è un comando molto potente di SSH che vi permette di scaricare un file all’interno dello path che avete impostato precedentemente.

-c indica di continuare a scaricare il file da dove aveva terminato l’ultima volta. Esempio: se avete un file da 1000bit e la connessione è caduta al bit 500, invocando nuovamente il comando il file tornerà ad essere scaricato partendo dal bit 501. Nel mio caso, siccome pesa molti GB il file e il server mi buttava continuamente fuori ogni GB scaricato, ho invocato l’intero comando sopra riportato circa 6 volte, fino al completamento del file.

–ftp-user=mio_username lo utilizzo per impostare i dati di login al server ftp, in questo caso l’username.

–ftp-password=mia_password come sopra, ma per la password.

infine passo l’indirizzo ftp del mio server comprensivo della directory dove si trova il file da scaricare.

Alla fine dell’operazione vi troverete sul server bluehost il file .tgz.

Come scompattare il suo contenuto?

Posizionatevi nella direcotory del file da scompattare, quindi digitate

-tar -zxvf backup_spazio.tgz

ce l'ho fatta

 

Il mio “piccolo” sfogo-guida termina qui. Se ti è stato utile o ti ha fatto piacere leggerlo, fammelo sapere in un commento.

Mantenere dati e preferenze di un’app iOS quando l’utente effettua un aggiornamento da App Store

Ho di recente iniziato a sviluppare un’app di ricette per iOS, e come ogni buona app di questo tipo, vi è la possibilità di inserire una ricetta tra i preferiti.

Anche se la questione può sembrare semplice, in realtà la cosa è più complicata di quanto si pensi.

Analizzando il problema in profondità, dal punto di vista di uno sviluppatore, vi è il problema dell’aggiornamento dell’app.

Se io, utente, aggiorno la mia applicazione, e tra i preferiti avevo salvato 10 ricette, dopo l’aggiornamento, che fine fanno i preferiti? E’ lecito pensare, dal punto di vista di uno sviluppatore, che un aggiornamento comporti l’eliminazione della vecchia versione dell’app, dopodiché l’installazione della nuova release.

Questo problema, che può sembrare banale, in realtà non è così semplice. Ho dovuto cercare e alla fine capire da solo come risolvere il problema. Nemmeno Apple, nella sua documentazione, accenna al problema.

Andrò quindi ad analizzare la mia situazione, che può essere utile praticamente per tutte le app che necessitano della persistenza dei dati,  anche dopo un aggiornamento dell’app stessa tramite app store.

Analisi

L’applicazione sul quale ho affrontato il problema è così strutturata: ho un file .plist, contenente le mie ricette. Il plist è composto da un array, l’array al proprio interno contiene N dictionary, ognuno dei quali identifica una ricetta. Ogni dictionary (quindi ogni singola ricetta) ha al proprio interno i campi che costituiscono la ricetta (titolo, ingredienti, preparazione, categoria, etc…).

Questo .plist, verrà aggiornato di volta in volta dallo sviluppatore (da me), quando viene rilasciato un aggiornamento dell’applicazione su app store. E’ palese il fatto che NON possiamo inserire in questo caso un nuovo campo booleano “preferito” all’interno di ogni ricetta, poiché il file verrà sovrascritto durante l’aggiornamento, e quindi se l’utente aveva inserito delle ricette tra i preferiti, dopo l’aggiornamento tutti i campi “preferito” tornerebbero a FALSE, in sostanza: abbiamo perso tutti i preferiti.

plist app ricette

File System

Per comprendere a fondo il problema, è essenziale capire come funziona il file system su iOS.

La documentazione ufficiale di Apple, spiega in modo chiaro e semplice il funzionamento del file system.

In breve, ogni applicazione ha una Sandbox, ovvero un ambiente dove effettuare operazioni di IN/OUT, dove vi è la possibilità di memorizzare qualsiasi tipo di file. Lo sviluppatore, NON può accedere al di fuori della Sandbox, e ogni app ha una propria Sandbox.

sandbox di ios

All’interno della Sandbox, vi sono cinque directory, utili allo sviluppatore per lo storage dei dati. Di seguito vi è una traduzione italiana, presa da devapp, di ciò che trovate sulla guida ufficiale Apple.

ios File System directory

Siccome si presume che le nostre preferenze, che vogliamo ritrovare dopo ogni aggiornamento dell’app, siano anche “backuppate” da iTunes, dobbiamo utilizzare in questo specifico caso la directory “Documents”.

Aggiornamento da App Store

Come funziona l’aggiornamento di un’app secondo Apple? iTunes scarica l’aggiornamento in un una nuova directory, dopodiché sposta i dati contenuti nelle directory sopra elencate, dalla vecchia versione dell’app alla nuova. Se nella nuova versione dell’app, all’interno della directory Documents, viene scritta una nuova versione del nostro file (ad esempio del .plist contenente le ricette), automaticamente viene eliminata la vecchia versione. Ecco spiegato il perché non possiamo inserire i preferiti all’interno di ricette.plist. Non possiamo accedere contemporaneamente alla vecchia e alla nuova versione del file per fare un merge, dobbiamo adottare un’altra soluzione.

La soluzione

La soluzione è un secondo file (in questo caso ho utilizzato un altro .plist chiamandolo “Preferiti.plist”).

file preferiti plist struttura

In questo file, strutturato come un Dictionary contenente un solo Array di nome HandSet (che al suo interno conterrà solo tipi String), memorizzerò i titoli di ogni singola ricetta (o gli ID). Se la ricetta è all’interno di questo file, significa che è tra i preferiti, e se aggiornerò il file Ricette.plist, non dovrò occuparmi di quali ricette sono tra i preferiti o meno, perché è in un file a parte. Questo significa che se una ricetta era tra i preferiti, rimane dov’è, e all’utente viene data la possibilità di inserire nuove ricette tra i preferiti.


//Dichiaro la path del file Preferiti.plist presente nel bundle, che sarà

//successivamente scritta in Documents (all'interno della sandbox)

NSString *finalPath = [[NSBundle mainBundle] pathForResource:@"Preferiti" ofType:@"plist"];

/* PERMETTE DI SCRIVERE IL FILE "Preferiti.plist" NELLA CORRETTA CARTELLA "Documents" DELLA SANDBOX */

NSFileManager *fileManager = [NSFileManager defaultManager];

NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *DocPath = [documentsDirectory stringByAppendingPathComponent:@"Preferiti.plist"];

if ([fileManager fileExistsAtPath:DocPath] == NO) { //se Preferiti.plist non esiste (è la prima volta che l'app viene aperta) lo scrive.

[fileManager copyItemAtPath:finalPath toPath:DocPath error:&error];

NSLog(@"SCRITTO FILE INIZIALE Preferiti.plist");

}

//se invece è un aggiornamento, non deve fare nulla, perché significa che già esiste un file Preferiti.plist nella directory Documents

Quando effettuiamo un’operazione sul file .plist, dobbiamo stare ben attenti a prelevare ciò che era già presente al suo interno, dopodiché effettuare un merge tra i vecchi dati e quelli che stiamo andando ad inserire (in questo caso, un nuovo preferito). Sui file .plist non possiamo semplicemente aggiungere un oggetto, in quanto ogni volta che richiameremo

[dati writeToFile:path atomically:YES];

verrà creato e scritto un nuovo file (e se già presente, il vecchio sarà sovrascritto).

//AGGIUNTA DI UN NUOVO VALORE IN PREFERITI.PLIST
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *DocPath = [documentsDirectory stringByAppendingPathComponent:nomePlist];

NSMutableDictionary *addData = [NSMutableDictionary dictionaryWithContentsOfFile:DocPath];

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:DocPath];

NSArray *oldHandsets = [dict valueForKey:@"HandSet"]; //vecchi dati presente in preferiti.plist

NSArray *newHandsets = [[NSArray alloc]initWithObjects:@"nuovo preferito string", nil]; //nuovo oggetto-array di oggetti da inserire tra i preferiti

NSMutableSet *mergeHandsets = [NSMutableSet setWithArray:oldHandsets];

[mergeHandsets addObjectsFromArray:newHandsets]; //merge dei dati (vecchi e nuovi)

//aggiungo i nuovi oggetti al plist, nell'Array di nome HandSet

[addData setObject:[mergeHandsets allObjects] forKey:@"HandSet"];

//scrivo il nuovo file con i cambiamenti apportati

[addData writeToFile:DocPath atomically:YES];

E per eliminare un dato?


 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *DocPath = [documentsDirectory stringByAppendingPathComponent:nomePlist];

    NSMutableDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:DocPath];

    NSMutableArray *dataFromPlist = [dict valueForKey:@"HandSet"];

    [dataFromPlist removeObject:@"string da rimuovere"];

    [dict setObject:dataFromPlist forKey:@"HandSet"];

    [dict writeToFile:DocPath atomically:YES];

Ovviamente, prima di cancellare un dato dovete assicurarvi che sia presente, quindi tocca a voi gestire tutte le varie eccezioni che potrebbero essere generate.

Utilizzando questo sistema, possiamo memorizzare delle preferenze o un qualsiasi tipo di dato (e non per forza un file .plist), senza perdere informazioni durante un aggiornamento eseguito tramite app store.

Se questa guida ti è stata utile, fammelo sapere nei commenti! 😉

Cheers!

Big Data: esempio di codice Java per estrarre tweets da Twitter

Nell’ambito dei Big Data, le aziende investono milioni per estrarre più informazioni possibili da internet, e in particolare dai social network.

Al contrario di Facebook, dove le informazioni sono protette dal livello di privacy impostato dagli utenti, quasi tutti gli account di twitter sono liberi e accessibili da chiunque. La realtà dei fatti è che ogni vostro tweet è catturato da qualcuno e viene rivenduto per trarne profitto. Trarne profitto come? Analisi di mercato, statistiche e tanta altra roba che per le aziende è oro.

BigData - estrazione tweets da twitterImmaginiamo ad esempio che la Ferrero voglia analizzare il livello di gradimento di uno dei suoi prodotti, ad esempio la Nutella che tutti conosciamo. Attraverso l’estrazione dei tweets con alcune parole chiave ben studiate e l’analisi di questi dati (cosa tutt’altro che semplice), la Ferrero o chi per lei, riesce ad ottenere il feedback di gradimento del prodotto da parte degli utenti, oppure nello specifico, per cosa viene principalmente usata (spalmata sul pane, preparare torte, etc…). Sono infiniti i benefici che si possono trarre dai Big Data, e chi lavora in questo settore solitamente viene pagato fior di quattrini.

Il problema di lavorare con questo tipo di dati, è la mole di informazioni che si riescono a catturare, in quanto col passare del tempo le informazioni salgono in modo esponenziale e il vostro pc casalingo non riuscirebbe mai a gestire il lavoro in entrata (sia per quanto riguarda la potenza di calcolo (cpu), sia per lo storage di dati (che raggiunge anche petabyte ogni settimana), sia per la velocità di connessione alla rete).

Ad ogni modo, se ci si limita ai soli tweets, Twitter offre delle API REST, che attraverso delle chiamate JSON restituisce tutti i tweets con la query richiesta. Nell’esempio di codice java che segue sotto, mi limiterò ad usare il Public Stream fornito da Twitter, ma sappi che ci sono altri modi di accedere ai tweets (in modo più limitato, e utili ad esempio qualora si volesse scrivere un client).

Attenzione: Twitter agli account “semplici” limita questo tipo di utilizzo, e permette di accedere solo all’1% dei tweets mondiali, che ad ogni modo è una quantità enorme di informazioni. Se cercate quindi di estrarre tutti i tweets con la parola “Android”, e questi sono più dell’1% sul totale, alcuni tweets li perderete. Il lavoro di estrazione dei tweets è possibile eseguirlo anche su un comune PC, non vi è bisogno di avere delle super macchine.

Per l’estrazione dei tweets uso la libreria java (non ufficiale) Twitter4J. Grazie a questa libreria posso integrare facilmente all’interno delle mie applicazioni Java i servizi offerti da Twitter. La libreria è 100% codice java, e lavora con ogni versione superiore alla 5. Il framework lavora correttamente anche con la piattaforma Android e il Google App Engine.

Nel codice che vedi di seguito, ho utilizzato delle dipendenze Maven per importare la libreria Twitter4J. Se interessato, gli snippet sono i seguenti:


<dependency>
 <groupId>org.twitter4j</groupId>
 <artifactId>twitter4j-core</artifactId>
 <version>3.0.3</version>
 </dependency>

 <dependency>
 <groupId>org.twitter4j</groupId>
 <artifactId>twitter4j-stream</artifactId>
 <version>3.0.3</version>
 </dependency>

Passiamo al codice Java vero e proprio, abbastanza semplice da comprendere. Per ulteriori info su alcune classi utilizzate, fai riferimento alla documentazione.


//© Paolo Musolino - http://www.codeido.com
public class App
{
 public static void main( String[] args )
 {
 //ESTRAZIONE DEI TWEETS

 System.out.println( "www.codeido.com" );

 StatusListener listener = new StatusListener(){

 public void onStatus(Status status) {

 System.out.println(status.getUser().getName() + " : " + status.getText());

 }
 public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {}
 public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
 // System.out.print(numberOfLimitedStatuses+"\n"); //stampa il numero di tweets che vengono persi
 }
 public void onException(Exception ex) {
 ex.printStackTrace();
 }

public void onScrubGeo(long l, long l1) {
 throw new UnsupportedOperationException("Not supported yet.");
 }

public void onStallWarning(StallWarning sw) {
 throw new UnsupportedOperationException("Not supported yet.");
 }
 };
 ConfigurationBuilder cb = new ConfigurationBuilder();
 cb.setUser("vostro_username_twitter");
 cb.setPassword("vostra_password_account_twitter");

 TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance();
 twitterStream.addListener(listener);
 FilterQuery filtro=new FilterQuery();
 String[] arrayQuery={"codeido", "big data", "bigdata"}; //stringhe che verranno cercare all'interno dei tweets.
 filtro.track(paroleChiave);
 twitterStream.filter(filtro);

 }
}
 }

Fanne buon uso e ricordati di condividere questo articolo.

Alla prossima.

Paolo

Perchè scrivere una newsletter.

Le newsletter e le pagine web tradizionali hanno una “direzione” comune ma “versi” diversi. La direzione è quelle che va da chi pubblica un contenuto, che potrà essere di volta in volta informativo, piuttosto che promozionale, a chi lo legge, l’utente finale, che a sua volta può essere identificato come un semplice iscritto, un vecchio cliente, un follower, o in generale un individuo interessato per ragioni socioeconomiche a quello che viene pubblicato nella newsletter stessa.

Come detto cambia il “verso”. Sì perché nelle pagine web è l’utente che spontaneamente si muove verso le pagine web a cui è più interessato, preferendone alcune piuttosto che altre. Il problema con questo “verso” è che l’utente ha a disposizione 15 miliardi di diverse pagine web tra cui scegliere!

Al contrario con la newsletter il verso del contenuto informativo è da chi ha un messaggio da diffondere all’utente che dovrebbe leggerlo. In pratica rispetto ad un sito web tradizionale la probabilità di arrivare all’utente è “quasi” del 100%.

Quel “quasi” va sottolineato perché non tutte le email inviate vengono poi effettivamente lette dai destinatari, ma questo è un punto su cui è possibile lavorare avvalendosi delle collaborazione di esperti curatori della newsletter o più semplicemente aiutandosi con software appositi, come ad esempio quello che si trova nel sito Mailup.it.

Per il resto i benefici rispetto ad una pagina web sono evidenti. Il contatto con l’utente è diretto ed immediato. In pochi secondi è possibile recapitare promozioni ed informazioni a migliaia di utenti in tutto il mondo a costi praticamente nulli.

Gli unici veri costi da sostenere  sono due, quelli relativi alla creazione di un database di destinatari sempre più ampio, e le spese eventualmente sostenute avvalendosi di professionisti curatori dei contenuti.

I primi però sono costi “una tantum”, in quanto vengono sostenuti solo al momento della creazione della newsletter. Gli altri invece sono di natura periodica in quanto andranno poi sostenuti ad ogni singolo invio.

Your Fortune Cookie 1.2 rilasciato

E’ con grande piacere che comunico a tutti i lettori del blog il rilascio della versione 1.2 di Your Fortune Cookie. Non ho avuto ancora modo di parlarne qui, quindi questo è il momento giusto per farlo.

Your Fortune Cookie è la mia prima applicazione gratuita sviluppata per iOS, che porta i biscotti della fortuna allo step successivo. Le altre apps presenti su App Store erano troppo scarne, con poche funzionalità e una grafica blanda. YFC invece offre una bella grafica (realizzata da @tancro), un database di frasi selezionate in continua crescita (e per di più bi-lingue, italiano-inglese), la dettatura vocale (bi-lingue), la condivisione sui social network e le notifiche locali per ricevere il proprio biscotto della fortuna ogni giorno sul proprio iPhone.

L’aggiornamento 1.2 di YFC include le seguenti funzionalità e correzioni:

  • ✔  200 nuovi biscotti in lingua italiana
  • ✔  200 nuovi biscotti in lingua inglese
  • ✔  Introdotto pulsante per visualizzare la frase precedente
  • ✔  Notifiche locali
  • ✔  Nuovo font delle frasi
  • ✔  Splash screen
  • ☂ Risoluzione di bug minori

Potete scaricare YFC direttamente dall’App Store, gratuitamente! 

What most schools don’t teach

1 million of the best jobs in America may go unfilled… because only 1 in 10 schools teach students how to code. Whether you want to be a doctor or a rockstar, ask about a coding class at your school or learn online.

Learn about a new “superpower” that isn’t being taught in in 90% of US schools.

Starring Bill Gates, Mark Zuckerberg, will.i.am, Chris Bosh, Jack Dorsey, Tony Hsieh, Drew Houston, Gabe Newell, Ruchi Sanghvi, Elena Silenok, Vanessa Hurst, and Hadi Partovi. Directed by Lesley Chilcott.

Share this post.

Uno sviluppatore per lavorare in Italia deve conoscere 10 linguaggi di programmazione (e aver vissuto 150 anni).

23:00 di martedì 19 Febbraio 2013, Kijiji (sito by eBay), un annuncio recita più o meno così:

Cercasi web developer, con padronanza della lingua inglese, disponibile a spostarsi, che conosca gli strumenti di sviluppo di applicazioni mobile quali Android e iOS, Objective-C, Java, Web Services, C#, HTML/HTML5, CSS, jQuery, Ajax, PHP, MySQL, la programmazione ad oggetti e i design patterns, la padronanza dei framework e CMS più diffusi (ndr: quali sarebbero i frameworks più diffusi? Esistono dei frameworks più diffusi? Se si per quale linguaggio?). Avranno la precedenza coloro che conosceranno anche Unity3D e le metodologie di sviluppo Agile.

Gradita anche la conoscenza di 3D Studio Max o Maya e dei software di grafica più comuni (Photoshop, Illustrator) e di animazione (Flash).

Quindi, adesso, lasciatemi parlare. Questi tipi molto seri, che nell’annuncio non inseriscono nemmeno il compenso annuale/mensile (tipico dell’Italia), pretendono che un comune mortale che mediamente vive 70 anni, possa conoscere oltre 6 linguaggi di programmazione (parlo di conoscere seriamente un linguaggio di programmazione, non dopo aver letto gli how to di una qualche guida presa in edicola col giornale), e che possibilmente abbia conoscenza di un po’ di tutto… è persino gradita la conoscenza di 3D Studio Max o Maya, software di grafica 3D molto complessi che non hanno niente a che vedere con un developer (o quasi). Praticamente non si capisce perché cerchino un web developer che sviluppi ad esempio per iOS e Android (ma qual è l’attinenza???) e che abbia conoscenze di grafica 3D e 2D, quasi a volerti dire, programmerai un po’ di tutto, farai tutto tu il lavoro e ti occuperai anche dell’aspetto grafico di qualsiasi cosa tu faccia. Forse è uno scherzo?

All’estero le aziende cercano personale sempre più specializzato, che sappia fare “una sola cosa”, ma bene, d’altro canto in Italia, sembra che le cose viaggino nel senso opposto. Sarà perché qui si ragiona così, si preferisce risparmiare a discapito della qualità del prodotto finale (un ingegnere informatico appena assunto qui prende appena 24000 euro l’anno se gli va bene, in USA, si parte da 80000-85000 dollari, che fanno 7000 dollari al mese, al cambio attuale 5229 euro). Un informatico con tutte le conoscenze sopra citate dovrebbe quantomeno essere remunerato 200.000€ l’anno.. almeno.

Partendo dal presupposto che penso di conoscere il settore di cui parlo (quello Informatico), credo che la situazione italiana sia veramente critica. Chi assume non sa che personale cerca, chi cerca lavoro non sa da chi farsi assumere. Solo le grandi aziende a volte lavorano come si dovrebbe (Reply, Google, IBM, Intel, etc..) e sanno chi e cosa cercano (ma ci sono le dovute eccezioni).

E il bello sapete qual è? Che di annunci così la rete ne è piena, stra-piena! Mi viene quindi da chiedermi: ma in Italia veramente vogliono che ti rompi la schiena per prendere una laurea, espandere il più possibile le tue conoscenze, per poi avere delle competenze estreme che nessun altro ha e dover lavorare una vita come ultima ruota del carro, con un salario da impiegato alla posta (con tutto il rispetto per gli impiegati postali)? Se qualcuno nell’edilizia cerca di risparmiare sul materiale, nel mondo italiano dell’informatica qualcuno cerca di risparmiare sulle menti… a condizioni veramente estreme. Ma cosa pretendono? Vogliono la moglie ubriaca e la botte piena?

Personalmente parlando, non mi svenderò al primo offerente, e invito tantissimi colleghi a fare altrettanto. Manca il lavoro in Italia? No, mancano i datori di lavoro “onesti” che ti offrono una carriera promettente, un ambiente di lavoro frizzante e le giuste ricompense. E’ anche vero che il governo italiano salassa gli imprenditori di tasse, e questo non favorisce le assunzioni……  ….ma questa è un’altra storia.

 

Stage: entro luglio 2013 gli stage saranno rimborsati, ma quanto?

Non tutti lo sanno, ma la regolamentazione che disciplina gli stage è competenza delle Regioni. Il 24 gennaio è stata sottoscritta l’intesa fra Stato e Regioni, che dovrà essere trasformata in legge entro sei mesi.

La Repubblica degli stagisti ha elaborato il “Patto per lo stage” attraverso il quale chiede ai politici di impegnarsi per garantire alcuni punti fondamentali riguardo ai tirocini, migliorativi rispetto alle linee guide, a partire da due punti fondamentali:

  1. Indennità minima: un rimborso mensile di minimo 500 euro al mese, contro i 300 euro previsti dalle linee guida;
  2. Divieto di stage per mansioni di basso profilo: niente tirocini per fare solo fotocopie o comunque lavori non di concetto.

Si sa che sotto elezioni i candidati sono particolarmente inclini a prendere impegni per accaparrarsi voti, eppure sono ancora pochi quelli che hanno sottoscritto il “Patto per lo stage”.

Fa eccezione Umberto Ambrosoli, candidato del centrosinistra alla presidenza della Regione Lombardia nel dopo-Formigoni, che, come ci racconta La Repubblica degli Stagisti, ha dichiarato: «Ho letto il Patto per lo stage e lo trovo veramente molto interessante. Lo condivido punto per punto e ho deciso di sottoscriverlo».
Qui trovate l’elenco dei politici in carica e dei candidati che hanno formalmente deciso di impegnarsi per evitare che uno stage sia solo uno sfruttamento o, se va bene, una perdita di tempo.

Il mio prossimo progetto si chiama Soundboard.

Gli ultimi mesi del 2012 sono stati molti impegnativi per me. Ho ottenuto la laurea in Informatica presso l’Università di Messina (Ottobre) e adesso ho deciso di continuare gli studi in un’altra Università, precisamente alla Sapienza di Roma, dove vi è un corso di laurea d’eccellenza per quando riguarda il mio settore. Ho stilato il piano di studi, e per i prossimi due anni studierò per conseguire una laurea magistrale in Informatica (Computer Science) con indirizzo “Intelligenza Artificiale”. Wow..

Ed eccomi arrivato a Roma quindi, una città enorme, che ha risvegliato in me il mio lato da startupparo. Ho cominciato a studiare seriamente Objective-C e Cocoa (non ne ho mai avuto il tempo). Una settimana di studio dell’ambiente e ho iniziato a lavorare subito su diversi progetti, uno di essi è già online: Your Fortune Cookie (non ho ancora trovato il tempo di parlarne qui sul blog. La pagina ufficiale è qui). Objective-C è un linguaggio che trovo leggermente più ostico di Java (per non parlare di Python). Ad ogni modo fatta l’abitudine, il risultato è decisamente ottimo. Your Fortune Cookie nei primi 5 giorni ha raggiunto oltre 1000 download, una piccola soddisfazione, e continuerà a ricevere degli aggiornamenti.

Ho preso diversi libri con cui poter studiare il linguaggio e l’intero ambiente iOS in maniera più approfondita, sono ad un buon punto, e i prossimi progetti ne trarranno sicuramente beneficio.

Arrivato a Roma ho anche avuto la possibilità di conoscere Giovanni, UI Designer con cui sto collaborando alla realizzazione di alcune idee, che ha inoltre  disegnato la grafica di YFC. La sua pagina su Dribbble mostra meglio il suo talento.

Ad ogni modo, bando alle ciance, e torniamo al titolo di questo post. Subito dopo YFC, il prossimo progetto che vedrà la luce sarà “Soundboard”. Svelerò qualcosa in più strada facendo. Giovanni sta già lavorando alla veste grafica, vi aspetta un capolavoro di app sul vostro iPhone (e anche iPad questa volta).

Altro da dire? Si.. c’era un’app che avrebbe potuto rivoluzionare il mondo della scuola, ma a causa di alcuni competitor io e Giovanni abbiamo deciso che per adesso è meglio mettere da parte l’idea (solo da parte), per riprenderla successivamente. Non ha senso lanciare qualcosa di eccezionale, che finirà nel dimenticatoio dopo poco tempo.

Stay tuned e seguimi su… @pmusolino @codeido. Dimenticavo, Giovanni è anche su twitter.