Skip to content
Archive of posts filed under the Technology category.

Cosa domandare all’azienda durante un colloquio di lavoro

Job InterviewArriva sempre, in un colloquio di lavoro, il momento in cui l’esaminatore chiede al candidato se ha qualche domanda da fare a proposito dell’azienda. Un momento fondamentale per approfondirne la conoscenza dato che, a meno di avere amici che gia’ ci lavorano, e’ difficile reperire in giro queste utilissime informazioni da “internals”, da cui potrebbe anche dipendere la vostra scelta finale.

Se si e’ alle prime esperienze, spesso questo momento e’ accompagnato da un completo vuoto mentale. Pessimo, questa inversione dei ruoli e’ troppo importante per permettersi di sprecarla. Se volete lavorare nel campo dello sviluppo software, ecco alcuni spunti per non rimanere a bocca chiusa.

Un esempio semplice e rapido per iniziare a farsi un’idea puo’ essera dato da una lista di domande pensate precedentemente, che definiscono alcune pratiche aziendali per noi importanti. La risposta non deve essere descrittiva, ma di tipo si/no. Ad ogni risposta affermativa si guadagna un punto, nessun nessun punto per quelle negative. Terminate le domande si sommano i punti ottenuti. Piu’ questo totale sara’ alto e piu’ l’azienda sara’ per noi desiderabile. Dodici utili punti con i quali partire sono contenuti in The Joel Test: 12 Steps to Better Code:

1. Do you use source control?
2. Can you make a build in one step?
3. Do you make daily builds?
4. Do you have a bug database?
5. Do you fix bugs before writing new code?
6. Do you have an up-to-date schedule?
7. Do you have a spec?
8. Do programmers have quiet working conditions?
9. Do you use the best tools money can buy?
10. Do you have testers?
11. Do new candidates write code during their interview?
12. Do you do hallway usability testing?

Piu’ il punteggio e’ alto, piu’ indichera’ una propensione dell’azienda alla strutturazione del metodo di lavoro, un’attenzione alla qualita’ del codice prodotto e all’adozione di un processo di gestione del ciclo di vita delle applicazioni articolato e completo sotto ogni aspetto. Se i punti ottenuti sono pochi, non passera’ molto tempo prima di trovarsi a picchiare la testa per cercare di capire chi ha fatto una modifica che ha rotto l’applicazione, quando e’ stata fatta, come mai non se ne e’ mai accorto nessuno e perche’ ora siete voi che dovete metterci una pezza. O a dovervi inventare strani e artigianali strumenti per mettere un po’ di ordine delle miriade di release, backup, componenti da collegare tra loro senza sapere con precisione come fare, ma tentando, tentando, tentando… Ne vale la pena, soprattutto se gli straodinari non sono pagati?

Continue reading ‘Cosa domandare all’azienda durante un colloquio di lavoro’ »

Piccoli problemi quotidiani con Eclipse

Open Type (Ctrl-Shift-T) non riesce a trovare nessuna classe

Capita che il task di indicizzazione di Eclipse si corrompa di tanto in tanto, quindi Open Type e altre funzioni non riescono piu’ a tirare fuori i risultati aspettati. Per risolvere il problema, cancellare tutti i file nella directory <Workspace>/.metadata/.plugins/org.eclipse.jdt.core. Maggiori dettagli qui.

 

L’autocomplete di Eclipse 3.6 Elios e’ lento con il plugin Android ADT (freezing code assist)

Capita che in alcune installazioni di Eclipse con il plugin per sviluppare con Android, l’autocomplete si blocchi per diversi secondi (anche 30) per poi riprendersi, e solo sugli oggetti che fanno parte del package Android. Problema fastidioso, e la soluzione proposta e’ alquanto bizzarra, ma sembra funzioni a diversi. Per la cronaca, a me magiamente e’ apparso, magicamente e’ scomparso (e dopo qualche aggiornamento dell’ADT). Comunque sembra sia stata risolta dalla versione 3.6 SP2 di Eclipse.

 

Inoltre, un utile post su alcune delle shortcut per Eclipse piu’ usate.

Diablo II Lord of Destruction su Linux con Wine

In attesa del terzo capitolo della saga, con i miei amici ci stiamo divertendo, di tanto in tanto, a fare qualche partita con Diablo II Lord of Destruction. Creato nell’ormai lontano 2001, oggi anche il piu’ banale dei netbook puo’ farlo girare senza problemi, compreso l’host di partite in LAN. Ho comunque voluto installarlo sulla mia Ubuntu Maverick 10.10 a 64 bit, utilizzando wine e qualche configurazione aggiuntiva.

Avendo delle immagini dei cd di installazione, ho installato CDemu prendendolo dall’apposito PPA:
sudo add-apt-repository ppa:cdemu/ppa
sudo apt-get install gcdemu
Ho riavviato il pc e ho aggiunto nella barra di Gnome il widget per CDemu, un piccola icona che mi permette agevolmente di montare /smontare immagini di dischi senza ricorrere alla riga di comando.

Avevo gia’ installato wine con tutte le configurazioni necessarie (drives, alcune librerie caricate con winetricks ecc), quindi mi e’ bastato “fare doppio click sul Setup.exe” una volta montata l’immagine del primo disco e ripetere il processo con quello dell’espansione e la patch 1.13c. Ho installato tutto in C:\Program Files\Diablo II

Il gioco funziona ad una risoluzione di 640×480 oppure 800×600, quindi se si fara’ girare in fullscreen su molti dei computer odierni, che non hanno piu’ un monitor con un rapporto 4:3, questo risultera’ schiacciato e brutto da vedere, oltre ad avere un grosso problema di freeze totale quando si passa ad un’altra finestra e si ritorna poi a quella del gioco. Per risolverli entrambi, ho lanciato wineconfig e ho configurato delle impostazioni particolari per eseguire Diablo 2:
Tab Applications – Add Application – navigare fino a seleziona Game.exe nella cartella di installazione del gioco.
Windows version: Windows XP
Tab Graphics – deselezionare Allow the window manager to control the windows, deselezionare Emulate a virtual desktop

Infine, per lanciare il gioco, ho usato questa riga di comando (fondamentale il parametro -w per il windowed mode):
wine /opt/wine/drive_c/Program\ Files/Diablo\ II/Game.exe -w
che ho inserito come icona nel menu’ Game di Gnome.

Continue reading ‘Diablo II Lord of Destruction su Linux con Wine’ »

Android Advanced Programming al Codemotion

Online video e slide dell’intervento che ho fatto a Marzo durante il Codemotion: “Sopravvivere felicemente ad un anno e mezzo di sviluppo Android”

Continue reading ‘Android Advanced Programming al Codemotion’ »

Che editor usare per Appcelerator Titanium?

Configurato l’ambiente di sviluppo, e’ ora di scrivere la prima applicazione con Appcelerator Titanium. Una volta creato il progetto, ci si accorge pero’ che non c’e’ modo di editarlo. Quindi niente autocompletamento del codice, niente reference dei metodi e documentazione inline mentre si scrive, niente refactoring e facilitazioni varie. A meno di qualche trucchetto.

In primis, si puo’ usare Notepad++ con un’apposito plugin che permettera’ l’autocompletamento del codice.

Se invece si cerca qualcosa di piu’ integrato, si puo’ passare ad Eclipse, utilizzando Aptana Studio ed alcune configurazioni aggiuntive. Aptana perche’ mette a disposizione un editor per file Javascript sia in versione standalone, sia come plugin per Eclipse, e perche’ di recente e’ stata acquistata proprio da Appcelerator, una mossa che fa presagire una futura forte integrazione tra i due.

Scaricato ed installato il plugin di Aptana per Eclipse, l’autocompletamento del codice piu’ essere ottenuto grazie a questo utile post in cui c’e’ un programma php per convertire le API doc di Appcelerator Titanium nell’header JavaScript. Per generare quello relativo al Mobile SDK 1.5.1 ecco cosa ho fatto:

wget http://jamesdlow.googlecode.com/svn/trunk/Eclipse/Aptana/Titanium/titanium.php
wget http://developer.appcelerator.com/apidoc/mobile/1.5.1/api.json
sudo apt-get install php-cli
php titanium.php > timobile.js

Il seguente video mostra invece come configurare Eclipse ed abilitare quindi l’autocompletamento:

Continue reading ‘Che editor usare per Appcelerator Titanium?’ »

Nokia e Microsoft: il terzo polo del mondo mobile

L’unione tra Nokia e Microsoft in una partnership dove la l’azienda finlandese produrra’ “cellulari” equipaggiati con Windows Phone 7 mi ha toccato abbastanza profondamente per una serie di motivi.

Innanzitutto l’importanza strategica di una decisione del genere: dal mio punto di vista Nokia negli ultimi anni avra’ anche prodotto nuovi telefoni, ma non e’ riuscita ad innovare sul software. Esattamente un anno fa annuncio’ al Mobile World Congress del 2010 l’alleanza con Intel per creare la piattaforma Meego, ma dopo 363 giorni esatti non si e’ visto un solo prototipo pronto per il mercato. Microsoft, dal canto suo, dopo aver lanciato Windows Phone 7, sta cercando con il massimo interesse sviluppatori che realizzino applicazioni per il suo nuovo sistema operativo, ma la diffusione sul mercato di quest’ultimo e’ ancora bassissima, quindi e’ poco appetibile. Entrambe hanno qualcosa che all’altra interessa, e sono interessate all’altra per qualcosa che gli manca: Nokia possiede device e utenti fidelizzati, Microsoft software e strumenti per lo sviluppo. Una collaborazione cosi’ perfettamente incastrata e simbiotica tra i due giganti e’ capace di grandi cose, se poi Nokia viene pure pagata da Microsoft per la partnership…

Stiamo parlando di due aziende che hanno una poderosa batteria di cannoni a disposizione dei reparti marketing e commerciale: con un’intelligente mossa che e’ andata oltre la visione a breve periodo che le vedeva concorrenti per le molliche del mobile (Symbian-MeeGo vs WP7),  qualcuno ha capito che nel medio-lungo periodo l’unione fa la forza, e che e’ inutile sprecare munizione una contro l’altra per prendersi gli avanzi, ma e’ molto piu’ profiquo impiegarle assieme per fiaccare la concorrenza (Apple e Android) e tentare di mordere la torta intera. Utenti, sviluppatori e partner commerciali si trovera’ il modo per convincerli, pubblicita’ dopo pubblicita’, iniziativa dopo iniziativa, mossa dopo mossa.

Dopo questo annuncio e a meno di strani cambiamenti, sono abbastanza convinto che Windows Phone 7 ora abbia tutte le carte giuste per diventare il terzo polo nel mondo dello sviluppo per mobile.

Poi certo, ogni grande allenza, se fatta nel mezzo di una battaglia, porta con se’ morti e feriti. Alcuni di questi potrebbero essere:

Continue reading ‘Nokia e Microsoft: il terzo polo del mondo mobile’ »

Appcelerator Titanium su Ubuntu 10.10 64bit

Incuriosito dalla possibilita’ di sviluppare applicazioni multipiattaforma per Android e iPhone, ho provato ad installare Appcelerator Titanium sulla mia Linuxbox, una Ubunto 10.10 a 64 bit. Di seguito i passi seguiti.

Ho scaricato il runtime di Titanium Developer per Linux 64 bit. La versione corrente e’ la 1.2.2. L’ho scompattato e l’ho lanciato. Alla richiesta del percorso di installazione, sotto la mia home oppure in /opt/titanium, ho scelto la seconda opzione, e il programma si e’ chiuso senza altri segni di vita. Per farlo funzionare, sono stato costretto a far partire l’installer con
sudo ./Titanium\ Developer
eseguendo poi a fine installazione un cambio di permessi delle cartelle create con il comando
sudo chown -R rainbowbreeze:rainbowbreeze /opt/titanium

Scaricati i due pacchetti necessari, l’installer si chiude di nuovo con l’errore
symbol lookup error: /usr/lib/libgdk-x11-2.0.so.0: undefined symbol: g_malloc_n
che sembra essere ben documentato e risolto:
cd /opt/titanium (oppure cd ~/.titanium se l’avete installato nella vostra home)
rm runtime/linux/1.0.0/libgobject-2.0.*
rm runtime/linux/1.0.0/libglib-2.0.*
rm runtime/linux/1.0.0/libgio-2.0.*
rm runtime/linux/1.0.0/libgthread-2.0.*

Superato anche questo ostacolo, ho rilanciato l’installazione, accettato le condizioni di contratto e mi trovo davanti un nuovo errore:
icedteanp plugin error: Failed to run /etc/alternatives/../../bin/java.  For more detail rerun “firefox -g” in a terminal window.
anche questo errore e’ documentato e risolto:
sudo aptitude remove openjdk-6-jre icedtea6-plugin
sudo aptitude install sun-java6-jre sun-java6-plugin sun-java6-fonts

Continue reading ‘Appcelerator Titanium su Ubuntu 10.10 64bit’ »

Hackitaly, Beintoo e le OVI Maps Rendering API di Nokia

5 Febbraio, Milano: Stefano Bernardi e Massimo Ciociola hanno organizzato davvero una bella iniziativa: l’Hackitaly, una competizione dove sviluppatori di tutti i generi si trovano per una full-immersion di 10 ore di programmazione, alla ricerca del mashup tra le tante API presentate da diverse aziende e startup.

Assieme a Antonio e Sam, improvvisati compagni di team trovati la mattina stessa, abbiamo creato Contestr, un’idea che ho buttato giu’ su un foglio di carta paglia la sera prima al pub: qualcosa per organizzare delle gare, dei contesti appunto, ognuno dei quali composta da diverse prove da superare: originariamente pensato per lo snowboard, queste contemplavano gare di velocita’, gare di distanza percorsa, gare di trick eseguiti (180, 360 ed altro), tutti controllati e trasmessi automaticamente per mezzo di uno smartphone dotato di gps e accelerometro. Nel corso della mattinata poi, sono diventati task di checkin (trovarsi in un certo punto data una foto del luogo), task di velocita’ e task di record (registrare un dato suono). Ognuno di questi task, se eseguiti, fanno guadagnare dei punti che si possono controllare nella classicia del contest. Oltre al divertimento, i migliori partecipanti guadagnano punti sul sistema di gamification di Beintoo, con la possibilita’ di ricevere regali, coupon e altri benefit.

Mentre Magnum si e’ occupato del sito e Sam dell’interfacciamento del nostro sistema con Beintoo, io ho realizzato il client per Android. Scopo del client visualizzare i contest presenti, sceglierne uno e poi risolvere i task di cui e’ composto. 10 serratissime ore di programmazione, idee ed adrinalina.

Continue reading ‘Hackitaly, Beintoo e le OVI Maps Rendering API di Nokia’ »

Eventi ed incontri per sviluppatori, prevedo mesi di fuoco!

Da qui a Giugno ci aspettano un bel po’ di eventi interessanti, tutti dedicati allo sviluppo: ad alcuni partecipero’ di sicuro, altri cerchero’ di seguirli da lontano.

  • 5 Febbraio, Milano – HackItaly: date un po’ di API, libero sfogo per realizzare qualunque applicazioni che le usa, da presentare in un contest finale ricco di premi. Presente.
  • 19 Febbraio, Milano – UGIALT.net Conf: dedicata principalmente al mondo .Net, ci sara’ modo di dare uno sguardo a diverse tecnologie, anche complementari, per chi lavora ogni giorno nel mondo Microsoft.
  • 5 Marzo, Roma – Codemotion: dalle ceneri del Javaday, nasce un nuovo evento, aperto a tutti i linguaggi di sviluppo. Presente.
  • 18 Marzo, Bologna – MeeGo Italian Day: sviluppatori italiani per MeeGo a raccolta.
  • 25 Marzo, Brescia: NoSQL: MongoDB, RavedDB, CouchDB vi dicono qualcosa? Positiva o negativa che sia la vostra risposta, non potete perdervi questo evento sui database non relazionali.
  • 26 Marzo, Roma – DotNetCampus: ASP.Net MVC, Azure, Windows Phone 7 e design: un evento tutto incentrato sul mondo Microsoft.
  • 9 Aprile, Milano – DotNetCampus: Idem come sopra, ma a Milano. Potrei anche esserci.
  • 11-12 Maggio, Verona – jsday: esordio per questa nuova conferenza tutta dedicata allo sviluppo JavaScript. Dagli stessi organizzatori dell’evento successivo. A pagamento.
  • 12-14 Maggio, Verona – phpDay: l’annuale e ormai consueta conferenza sul mondo php. Non ha bisogno di ulteriori presentazioni. A pagamento
  • 21-22 Maggio, Milano: WhyMCA: l’evento italiano dedicato alla programmazione per il mobile, multipiattaforma e multiveduta. Quest’anno, oltre ai 2 giorni di conferenze su tutte le piattaforme, cercheremo di fare un hackaton notturno, modello OverTheAir, con presentazioni e premiazione delle app piu’ particolari il 22. Presente, e organizzatore ;)
  • 10 Giugno, Milano: RubyDay: una giornata dedicata interamente ad un linguaggio molto in voga al momento. Presente!
  • 18-19 Giugno, Milano – Arduino Camp Italia: un evento dedicato alla piattaforma Arduino e alle sue molteplici applicazioni: presentazioni, progetti fatti realizzati dalla comunità italiana, gruppi di discussione, mini workshops e un hackday. Se riesco, anche un solo giorno, vado!
  • 20-26 Giugno, Firenze – EuroPython: la conferenza europea dedicata a Phyton. I primi 5 giorni di convegni, gli ultimi 2 di hacking con questo linguaggio. A pagamento
  • 27-28 Giugno, Firenze - BetterSoftware: non e’ proprio la conferenza piu’ tecnica tra quelle citate, ma e’ comunque piena di spunti interessanti sulle metodoligie agili e XP, un bagagli che ogni programmatore dovrebbe avere. A pagamento. Se mi vorranno come blogger anche quest’anno, ci saro’!

Forzare l’uso della connessione mobile (3G o GPRS) con il WiFi in Android

In Android, l’attivazione della connessione WiFi porta immediatamente alla disattivazione delle altre connessioni, compresa quella mobile, e tutto il traffico dati viene instradato su di essa. Assieme ad una serie di vantaggi, come l’indubbio risparmio per connessioni dati a consumo e il guadagno di velocita’, questo comportampo porta ad alcuni problemi, principalmente:

  • La sospensione senza preavviso di connessioni gia’ in piedi sulla rete dati mobile
  • L’impossibilita’ di accedere a quei servizi legati alla SIM. Ad esempio, un operatori telefonico potrebbe effettuano un accredito direttamente all’utente basandosi sulla SIM che genera il traffico. Con il Wifi, non si puo’ ottenere questa informazione.

Quindi, per quanto l’utilita’ di forzare l’uso della connessione dati mobile per raggiungere un certo indirizzo all’interno della proprio applicazione possa sembrare scontata, purtroppo Android non mette a disposizione nessuna API documentata e sicura per farlo, ma occorre passare per una serie di workaround che funzionano solo dalla versione 2.2.

/**
 * Enable mobile connection for a specific address
 * @param context a Context (application or activity)
 * @param address the address to enable
 * @return true for success, else false
 */
private boolean forceMobileConnectionForAddress(Context context, String address) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (null == connectivityManager) {
        Log.debug(TAG_LOG, "ConnectivityManager is null, cannot try to force a mobile connection");
        return false;
    }

    //check if mobile connection is available and connected
    State state = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
    Log.debug(TAG_LOG, "TYPE_MOBILE_HIPRI network state: " + state);
    if (0 == state.compareTo(State.CONNECTED) || 0 == state.compareTo(State.CONNECTING)) {
        return true;
    }

    //activate mobile connection in addition to other connection already activated
    int resultInt = connectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableHIPRI");
    Log.debug(TAG_LOG, "startUsingNetworkFeature for enableHIPRI result: " + resultInt);

    //-1 means errors
    // 0 means already enabled
    // 1 means enabled
    // other values can be returned, because this method is vendor specific
    if (-1 == resultInt) {
        Log.error(TAG_LOG, "Wrong result of startUsingNetworkFeature, maybe problems");
        return false;
    }
    if (0 == resultInt) {
        Log.debug(TAG_LOG, "No need to perform additional network settings");
        return true;
    }

    //find the host name to route
    String hostName = StringUtil.extractAddressFromUrl(address);
    Log.debug(TAG_LOG, "Source address: " + address);
    Log.debug(TAG_LOG, "Destination host address to route: " + hostName);
    if (TextUtils.isEmpty(hostName)) hostName = address;

    //create a route for the specified address
    int hostAddress = lookupHost(hostName);
    if (-1 == hostAddress) {
        Log.error(TAG_LOG, "Wrong host address transformation, result was -1");
        return false;
    }
    //wait some time needed to connection manager for waking up
    try {
        for (int counter=0; counter<10; counter++) {
            State checkState = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
            if (0 == checkState.compareTo(State.CONNECTED))
                break;
            Thread.sleep(1000);
        }
    } catch (InterruptedException e) {
        //nothing to do
    }
    boolean resultBool = connectivityManager.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI, hostAddress);
    Log.debug(TAG_LOG, "requestRouteToHost result: " + resultBool);
    if (!resultBool)
        Log.error(TAG_LOG, "Wrong requestRouteToHost result: expected true, but was false");

    return resultBool;
}

In pratica, se non lo e’ gia’, viene attivata la connessione mobile grazie alla chiamata
startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, “enableHIPRI”)
per poi creare una route all’indirizzo da raggiungere che forza il passaggio sulla connessione mobile
requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI, hostAddress)

Continue reading ‘Forzare l’uso della connessione mobile (3G o GPRS) con il WiFi in Android’ »