Programmatore iOS / Android cercasi

La mia azienda sta cercando dei programmatori con esperienza in Objective-C, Swift e Java per lo sviluppo di applicazioni iOS ed Android.

Altralogica è un azienda con sede a Gorle in provincia di Bergamo. Attualmente stiamo portando avanti parallelamente lo sviluppo di prodotti sia interni sia per conto terzi.

Cerchiamo sia figure professionali che hanno già  una certa esperienza consolidata nel settore, sia ragazzi anche alle prime armi che hanno magari scritto la loro prima applicazione per iPhone o che hanno una passione per i videogiochi e per i device mobile ed una preparazione per quanto riguarda linguaggi come C, C++, Java, C#.

Per chi studia abbiamo a disposizione anche dei posti per stagisti, un’occasione in più per capire cosa sta succedendo nel mondo della tecnologia, con uno sguardo dall’interno.

Per un contatto lasciatemi un commento con il vostro indirizzo email o numero di telefono qui, oppure scrivetemi a iphone@altralogica.it

Backup istanze Amazon EC2

Non so se sono io che sono estremamente pignolo quando si tratta di scegliere un software per il backup o se capita più o meno a tutti. Ad ogni modo, ho passato un po’ di tempo a cercare un software per effettuare gli snapshot dei volumi di Amazon EC2 in quanto volevo automatizzare i backup delle mie istanze. Ho trovato diversi script e li ho provati, ma alla fine nonostante li abbia usati anche per lunghi periodi non ero contento.

Uno dei problemi principali è la gestione dei vecchi backup. Amazon è piuttosto aggressiva sulla tariffazione degli snapshot e lasciare tanti snapshot vecchi online dopo un po’ diventa un costo non indifferente. A me serviva un sistema per conservare almeno un backup di ogni mese e poi tenere quelli dell’ultima settimana, o qualcosa del genere.. il tutto senza impazzire e senza dovermi ricordare, ogni volta che creo una nuova istanza o che aggiungo un volume, di andarlo ad aggiungere anche nel software di backup.

Alla fine ho risolto scrivendo un mio programma in Go che utilizza le API di AWS e che mi permette di fare esattamente quello che serve a me. Pensando che possa tornare utile anche ad altri, l’ho pubblicato su GitHub a questo indirizzo: https://github.com/tanis2000/ec2backup

Se doveste trovarlo utile, fatemelo sapere. Se dovesse servire qualche modifica, ben venga! Sarò felice di metterci mano per migliorarlo.

Analisi di Shovel Knight

Shovel Knight

Mauro Fanelli (vi invito ad andare a vedere il sito del suo studio Mixed Bag, se non lo conoscete ancora) ha condiviso in un tweet un articolo di David D’Angelo, uno degli autori di Shovel Knight.
In questo articolo D’Angelo racconta come è andato il primo mese di vendite del suo gioco. Di fatto è un’analisi interessante per capire quali sono i costi stimati per lo sviluppo di un videogame da parte di un piccolo studio e quali sono stati gli effettivi ricavi e dove stanno i punti deboli. L’ho trovato interessante soprattutto per avere un termine di paragone quando i clienti chiedono la quotazione per un videogame senza sapere, nello specifico, a cosa vanno incontro.

Alcuni fatti:

  • Shovel Knight è un gioco sviluppato per Wii U e 3DS (solo negli Stati Uniti) e per PC in tutto il resto del mondo.
  • Sia per le piattaforme Nintendo sia per PC è stato scelto di distribuire il gioco solo in formato digitale (niente scatola in negozio). Nel caso del PC, la piattaforma di distribuzione è quella di Steam.
  • Il gioco è stato inizialmente finanziato tramite una campagna su Kickstarter (e donazioni tramite PayPal).
  • Il team è composto da 6 persone

Il risultato dello sviluppo del gioco lo potete vedere direttamente dal sito degli sviluppatori, dove trovate il press kit completo.

L’idea iniziale del team era di sviluppare l’intero videogame, comprensivo di tutte le extended feature promesse durante la campagna su Kickstarter, nel giro di 24 mesi. Alla scadenza della campagna, il totale delle donazioni era di circa 328k$, che corrisponde all’incirca a 245k€. Da questa somma vanno tolte le percentuali che trattengono Kickstarter e PayPal. Facendo finta che il finanziamento sia tutto su Kickstarter, vorrebbe dire eliminare il 5% che è quello che tengono loro ed un altro 5% che è quello che trattiene Amazon. Di fatto si arriverebbe attorno ai 220k€ effettivamente utilizzabili.

Il costo previsto per lo sviluppo era di 10k$ al mese per ogni membro del team. Di fatto vuol dire 1.440M$, quindi 1.076M€. Una bella cifra che comprende anche tutti i costi vivi della società, per cui oltre agli stipendi ci sono di mezzo tasse, bollette, tenute contabili, hardware, affitto, ecc…
Comparata a quanto hanno raccolto su Kickstarter è una cifra esorbitante, però è abbastanza realistica considerando che il costo medio di uno sviluppatore di videogame, almeno negli Stati Uniti, viaggia effettivamente attorno ai 120k$ l’anno.

Il piano finale è quindi variato in questo modo: uno dei 6 membri del team ha deciso di prendere la sua parte solo al termine dello sviluppo (il membro che si è occupato di musica e di effetti sonori). Gli altri 5 hanno optato per prendere la metà di quanto deciso inizialmente, quindi 5k$ al mese. In più, tutte le caratteristiche extra del gioco sarebbero slittate al secondo anno, in modo di poter recuperare dei fondi dopo la messa in vendita della prima versione del gioco.
Il conto diventa quindi 12 mesi x 5 persone x 5k$, ovvero 300k$ che corrispondono a 225k€, una cifra già più vicina a quella incassata su Kickstarter.

Quello che è poi successo nella realtà è che anzichè impiegare 12 mesi, ne hanno impiegati 17, di cui 5 senza pagarsi uno stipendio. Il gioco è comunque uscito ed è in vendita al costo di 14,99$ e ne hanno vendute 180k copie nel giro del primo mese. Da queste vanno tolte le circa 15k promesse ai finanziatori su Kickstarter. Facendo due conti, l’incasso per le copie vendute è attorno ai 2.475M$. A questi vanno tolte le fette di Nintendo e di Steam di cui non conosco i dettagli. Ho letto in giro per la rete che su Steam di solito si aggira attorno al 30%, mentre per Nintendo non ne ho proprio idea. Ma da quel che ho potuto capire, è una percentuale che viene decisa insieme allo sviluppatore caso per caso.
Ipotizzando che in media, tra Steam e Nintendo, rimanga anche solo il 50% di quella cifra, sono comunque 925k€ che, sommati ai 245k€ iniziali portano il conto a 1.170M€ che è poco più che superiore rispetto alla cifra ipotizzata inizialmente per l’intero sviluppo nell’arco dei due anni. Di conseguenza, dopo solo un mese di vendite, tutto quello che è venduto in più è puro guadagno per questo prodotto, ammesso che invece di 24 mesi non arrivino a 24+5+X dove X non si sa quanto possa essere.

Per me, a parte le valutazioni del fatto che sia stato un investimento che ha portato profitto o meno, quello che è interessante è la valutazione dell’effort necessario per un gioco senza troppe pretese. Nel mio caso, tendenzialmente si tratta di un team di tre persone, un programmatore un game designer ed un artista. Prendendo le stesse cifre di cui sopra, per un progetto di 12 mesi, vorrebbe dire un investimento di 10k$ x 12 x 3 = 360k$ = 269k€. Per un progetto molto contenuto, diciamo di tre mesi, 90k€.

L’altra cosa interessante è rapportare le cifre stimate per le risorse Statunitensi con quelle Italiane. 10k$ = 7,4k€. Calcolando che, in genere, il costo medio aziendale per una risorsa è del 47% (prendo come riferimento uno studio di Assolombarda relativo al 2011), vuol dire che al netto vanno 3.9k€ alla risorsa che, tutto sommato, è una cifra che può essere credibile per un senior.

Sarei curioso di sentire cosa ne pensano anche altre persone. I commenti cono ben accetti!

Jenkins: come aggiornare in automatico i Google Play Services

A volte capita che un progetto abbia come dipendenze i Google Play Services o altre librerie che fanno parte del Google Repository.

In questo caso, Jenkins non si accorge delle dipendenze e dà un errore sulla falsariga di questo:

> Could not find com.google.android.gms:play-services:4.3.23.

La soluzione più semplice è di aggiungere negli script il seguente comando:

android update sdk --no-ui --all --filter "extra-google-m2repository"

Istanza EC2 Windows che non riparte dopo un riavvio

Non è la prima volta che in Altralogica sperimentiamo problemi con le istanze di EC2. Qualche anno fa c’era stato un disservizio piuttosto pesante nel data center Irlandese mentre ieri, nostro malgrado, ci siamo imbattuti in un altro problema piuttosto pesante.

Di fatto, di recente, Amazon ha cominciato ad aggiornare il proprio parco macchine host su cui girano le virtual machine di EC2. Il che è un bene perché l’hardware nuovo è più veloce. Peccato, però, che non abbiano avvisato nessuno che le istanze Windows un po’ vecchiotte (per intenderci qualsiasi cosa precedente a Windows Server 2012, non parliamo di sistemi arcaici) non hanno i driver di rete per i nuovi host.

Questo cosa significa? Che se, per caso, quando riavviamo un’istanza, questa viene fatta partire su un host nuovo, la nostra virtual machine non andrà!

E’ incomprensibile come un colosso come Amazon non avvisi i propri clienti in queste situazioni. Ad ogni modo, dopo una concitata sessione al telefono con il loro staff tecnico, siamo riusciti a venirne a capo.

Riporto qui sotto la soluzione per chi, come me, dovesse incappare in questo problema di punto in bianco e non sappia da che parte guardare per trovare aiuto.

  • Scaricare l’ultima versione di EC2Config da qui: http://aws.amazon.com/developertools/5562082477397515
  • Scaricare i driver aggiornati della scheda di rete Citrix (contiene anche lo script per eliminare i vecchi driver RedHat): http://aws.amazon.com/developertools/2187524384750206
  • Stoppare l’istanza che non parte più.
  • Fare un detach del volume root della macchina.
  • Lanciare un’istanza (anche t1.micro o m1.small, non importa) di Windows 2003 su cui andrà montato il disco di root che non parte. E’ importante che sia un’istanza di 2003 perché così non fa casino con il disco di boot. Per trovarla, basta cercare Windows_Server-2003-R2_SP2 nelle community AMI.
  • Fare un attach del volume di root alla nuova istanza.
  • Collegarsi alla macchina Windows 2003. Il disco dovrebbe già essere visibile. Se non lo fosse, basta usare il Disk Manager per metterlo online ed assegnargli una lettera di unità.
  • Scaricare i due pacchetti di cui sopra su questa macchina e copiarli in una cartella citrix sul disco della macchina che non parte. (ad es. E:\citrix). Mettete pure tutti i file insieme, tanto non c’è nulla con lo stesso nome.
  • Date permessi full control all’utente everyone per quella cartella, giusto a scanso di equivoci
  • Lanciate regedit
  • Aprite il ramo HKEY_LOCAL_MACHINE
  • Dal menù file selezionare Load Hive…
  • Selezionate il file SOFTWARE dalla cartella E:\Windows\System32\config (ricordate che E: è il percorso assegnato nel mio caso, nel vostro potrebbe essere differente)
  • Chiamate questo hive 00Software
  • Navigate in HKEY_LOCAL_MACHINE\00Software\Microsoft\Windows\CurrentVersion\RunOnce
  • Create una nuova chiave di tipo stringa e chiamatela 01EC2Config e come valore mettete c:\citrix\ec2install -q
  • Create una nuova chiave di tipo stringa e chiamatela 02RHPurge e come valore mettete C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -file C:\citrix\Purge.ps1
  • Create una nuova chiave di tipo stringa e chiamatela 03Citrix e come valore mettete C:\citrix\Citrix_Xensetup.exe /S
  • A questo punto navigate in HKEY_LOCAL_MACHINE\00Software\Microsoft\WindowsNT\CurrentVersion\Winlogon
  • Create una nuova chiave di tipo stringa e chiamatela  AutoAdminLogon e come valore mettete 1
  • Create una nuova chiave di tipo stringa e chiamatela DefaultUsername e come valore mettete Administrator
  • Create una nuova chiave di tipo stringa  e chiamatela DefaultPassword e come valore mettete la vostra password di Administrator (va messa in chiaro)
  • A questo punto tornate su 00Software e andate su File -> Unload Hive..
  • Chiudete regedit e fate il logoff dalla macchina Windows 2003.
  • A questo punto, dalla console di EC2, fate un detach del disco dalla macchina Windows 2003 e fate un attach sulla vostra vecchia macchina che non parte più, mettendo come nome del device /dev/sda1
  • Riavviate la vostra vecchia istanza e lasciatela andare per qualche minuto. Si dovrà riavviare un paio di volte (di solito è automatico) togliere i vecchi driver di rete, installare quelli nuovi ed aggiornare EC2Config. Una volta finito sarà di nuovo online.
  • Buona fortuna!

Caricamento di file con dimensioni maggiori di 30Mb con ASP.NET 4

Visto che me lo dimentico sempre, lo appunto qui. Da IIS7 in poi c’è un limite di 30Mb sui file che possono essere inviati in POST ed un timeout di 2 minuti sulla richiesta. Una volta bastava modificare l’httpRuntime. Adesso bisogna anche mettere mano alla sezione security di system.webServer

I post originali sono questi:

http://blog.twinharbor.com/2011/07/28/fixing-iis7-maximum-upload-size/
http://www.cyprich.com/2008/06/19/fixing-file-upload-size-limit-in-iis-7/

E qui c’è cosa fare, giusto per averlo a portata di mano:

In system.web:

<httpruntime executionTimeout="100000"
  maxRequestLength="2000000" />

In system.webServer:

<security>
 <requestfiltering>
  <requestlimits maxAllowedContentLength="2000000000" />
 </requestfiltering>
</security>

Quanto costa sviluppare un’app iOS?

Diversi mesi fa ero incappato in una discussione su StackOverflow riguardante il costo per lo sviluppo di un’applicazione iOS tipo Twitterific.

Volevo scrivere qualcosa a riguardo prendendo come riferimento il mercato italiano, ma me ne sono dimenticato.. tanto per cambiare. Nel frattempo è passato altro tempo e finalmente mi sono deciso.

La discussione verteva principalmente sul capire quanto potesse costare un’applicazione iOS simile a Twitterific (la domanda è stata posta nel 2008 ed i prezzi sono sicuramente cambiati, vista la crisi mondiale, anche se alcune risposte abbastanza recenti danno un’idea del costo del lavoro attuale o quasi negli Stati Uniti).

Uno dei programmatori di Twitterific, nel 2010, ha aggiunto il suo commento alla domanda portando come esempio il porting dell’app da iPhone ad iPad. Nel loro caso si trattava di portare l’app in 60 giorni. A conti fatti, prendendo come riferimento 6 giorni lavorativi alla settimana, per 10 ore al giorno, con due risorse dedicate, si arriva a 1.100 ore. Calcolando che la loro tariffa media per i clienti è di 150$/ora, si arriva ad una stima di 165.000$, a cui va aggiunto il costo di ciò che era già stato sviluppato e che è stimato in circa 35.000$. Si arriva ad un totale di 200.000$, senza tenere conto del design e del project management. Con quelli si arriva tranquillamente a circa 300.000$.

Questo stesso personaggio, porta come esempio anche il fatto che Instagram si sia fatto finanziare 500.000$ da un venture capitalist per rifare frontend e backend.
Altri sviluppatori hanno commentato rimanendo sempre nel range dei 150$/ora uomo. Ora non so dire se negli Stati Uniti ci siano pochi programmatori iOS, poche società che sviluppano per iOS, un mercato talmente grande che giustifica certe cifre o che altro, ma confrontate con quelle che sono le tariffe medie italiane, sono dei numeri esageratamente importanti.

Parlando con altri sviluppatori, sono arrivato alla cifra di 50€/ora come tariffa media per lo sviluppo puro. Che, diciamocelo, di questi tempi è anche un buon prendere. Ritornando al calcolo relativo a Twitterific, se l’avessimo fatto in Italia, il risultato sarebbe di 1.100 ore x 50€/ora = 55.000€ di solo sviluppo dell’aggiornamento per iPad. Sempre senza includere project management e design.

La realtà è, a mio avviso, che in Italia nessuno avrebbe investito una cifra del genere solo per portare un’app da iPhone ad iPad. La realtà è che, se si chiede 1/5 di quella cifra, si è ancora ancora concorrenziali.. e deve includere anche design e project management, altrimenti si è completamente fuori target.

Mi piacerebbe sentire l’opinione anche di altri sviluppatori che si muovono nell’ambito delle app mobile qui in Italia, per capire se siamo anche noi coinvolti dal momento di crisi che prima o poi passerà, o se c’è qualcosa di male nel sistema del mercato dello sviluppo, soprattutto tenendo conto che spesso e volentieri dobbiamo scontrarci con i lavoratori dell’est Europa che hanno prezzi estremamente concorrenziali ma che, allo stesso tempo, sono difficili da gestire, fanno perdere un sacco di tempo per spiegare che cosa si vuole e, in gran parte dei casi, il prodotto finale non è nemmeno lontanamente all’altezza di ciò che si voleva.

Contattatemi, anche in privato se preferite, per approfondire l’argomento.

 

iTablo Dekstop Designer 2 BETA

L’evoluzione di iTablo Desktop Designer è entrata in fase di BETA testing.

iTablo Desktop Designer è il tool che permette a chiunque di creare documenti interattivi multimediali fruibili su iPad ed iPhone, partendo da un qualsiasi documento PDF.

La versione 2 di questo tool è basata sul framework di Eclipse e sfrutta tutte le ottimizzazioni derivanti da SWT, oltre ad avere un’interfaccia più moderna e tutta una serie di funzionalità nuove che mancavano nella versione precedente.

Per l’occasione ho realizzato un paio di video (niente di professionale) per mostrare cosa si può fare con iTablo e tutta la suite di prodotti e servizi che compongono questa soluzione.

iTablo PDF+ Viewer per iOS

iTablo Desktop Designer 2 per OS X (e Windows)

iTablo per iPhone

iTablo è ora disponibile anche in versione per iPhone (e, chiaramente, come Universal Binary per iPhone/iPad).

Vista la richiesta di una versione anche per il terminale più diffuso di casa Apple, abbiamo sviluppato una versione del nostro lettore di PDF con contenuti multimediali anche per iPhone. Le caratteristiche sono le stesse della versione iPad, con una grafica diversa e più adatta alle dimensioni ridotte del display.

In più, non volendo farci mancare nulla, abbiamo anche aggiunto il supporto per il Newsstand Kit. E’ ora possibile far apparire la propria app nel Newsstand ed inviare aggiornamenti automatici agli utenti che l’hanno scaricata.

A breve andrà online anche la nuova versione del nostro iTablo PDF+ Viewer che è la versione gratuita del nostro lettore.

Gestione rotazione dei device iOS

Ultimamente mi sono dovuto scontrare, per l’ennesima volta, nel delirio del cambio di orientamento dei device iOS. Per quanto in Apple si siano dati da fare per semplificare la vita agli sviluppatori, questo tema è ancora un buco nero. Ci sono diversi sistemi per gestire il cambio di orientamento, di cui uno
Chiaramente, il mio obiettivo è di scrivere meno codice possibile, utilizzare Interface Builder per permettere ai designer di modificare la geometria delle interfacce senza dover intervenire sul codice, ridurre al minimo i calcoli delle posizioni degli elementi all’interno dei controller.ufficiale e presentato da Apple come esempio sul sito developer. Il problema è che, per quanto sia ufficiale, non soddisfa le mie esigenze. Oltre alla rotazione, ho anche il problema di dover presentare interfacce diverse a seconda dell’orientamento e del device (iPhone o iPad).

Alla fine ho optato per un sistema con un UIViewController di base da cui derivano i vari controller portrait e landscape. I controller sono tutti agganciati ad un UINavigationController che si prende cura di mandare i messaggi di willRotate e didRotate ai vari controller collegati senza che dobbiamo gestirceli noi a mano.

Il controller di base contiene anche tutti gli outlet che vengono collegati in IB agli oggetti disegnati nell’interfaccia, così possiamo tenere il codice di gestione di azioni e interazione con gli oggetti al minimo.
Per chi volesse vedere come funziona questo sistema, ho aperto un repository su GitHub chiamato RotationExample